openflow openflow协议
openflow协议
•of 协议支持三种消息类型:controller-to-switch,asynchronous(异步)和symmetric(对称),每一类消息又有多个子消息类型。
•controller-to-switch 消息由控制器发起,用来管理或获取switch 状态;•asynchronous 消息由switch 发起,用来将网络事件或交换机状态变化更新到控制器;•symmetric 消息可由交换机或控制器发起。
controller-to-switch
•Features
•在建立传输层安全会话(Transport Layer Security Session)的时候,控制器发送feature请求消息给交换机,交换机需要应答自身支持的功能。
•Configuration
•控制器设置或查询交换机上的配置信息。交换机仅需要应答查询消息。•Modify-state
•控制器管理交换机流表项和端口状态等。
•Read-state
•控制器向交换机请求一些诸如流、网包等统计信息。
•Send-packet
•控制器通过交换机指定端口发出网包。
•Barrier
•控制器确保消息依赖满足,或接收完成操作的通知
asynchronous
•Packet-in
•交换机收到一个网包,在流表中没有匹配项,则发送Packet-in 消息给控制器。如果交换机缓存足够多,网包被临时放在缓存中,网包的部分内容(默认128 字节)和在交换机缓存中的的序号也一同发给控制器;如果交换机缓存不足以存储网包,则将整个网包作为消息的附带内容发给控制器。
•Flow-removed
•交换机中的流表项因为超时或修改等原因被删除掉,会触发Flow-removed 消息。
•Port-status
•交换机端口状态发生变化时(例如down 掉),触发Port-status 消息。
symmetric
•Hello
•交换机和控制器用来建立连接。
•Echo()
•交换机和控制器均可以向对方发出Echo 消息,接收者则需要回复Echo reply。该消息用来测量延迟、是否连接保持等。•Vendor
•交换机提供额外的附加信息功能。为未来版本预留。
ofpt 协议头
•struct ofp_header {
•uint8_t version; /* 协议版本*/
•uint8_t type; /* 消息类型*/
•uint16_t length; /* 消息长度*/
•uint32_t xid;/* 该报文的ID,要求返回的报文ID相同,以使它们配对*/
•};
代码的大体结构
•涉及报文传输与生成的mian函数•udatapath.c 负责datapat •controller.c 负责controller •secchan.c 负责安全通道•dpctl.c 负责管理dp
接受报文后的处理
•secchan负责连接controller和udatapath,controller和switch的数据交互要经过secchan。
•如果网络的拓扑结构发生变化,导致IP地址的变化,secchan调用ofp-discover重新连接IP变化的peer
•dpctl.c可以发出任何协议包,所以它可以用来修改switch的一些状态,比如生成树什么的。echo只能由dpctl发出。setting的参数由它设置。
controller协议报文相关
•controller的大体流程
调用do_switching(struct switch_ *sw)/*返回发出的报文总数、读取报文、分析header、处理报文、并且维护连接。
调用lswitch_process_packet(sw-
>lswitch, sw->rconn, msg)
读取报文,根据报文的类型处理报文
•type为:OFPT_ECHO_REQUEST
调用:process_echo_request(…,…,*rp)调用queue_tx()排队,最多排10对
调用make_echo_reply()创建一个
echo_reply的消息,这个消息跟rp中的消息匹配
•OFPT_FEATURES_REPLY
调用:process_switch_features 交换机返回自身状态datapath_ID、能力
调用:process_phy_port了解交换机的port状态
stp:listening、learning、forwarding、blocking、disable
non-stp:forwarding
•OFPT_PACKET_IN
调用函数process_packet_in 根据报文的长度判断报文打给controller的原因:流表项指定发给controller(max-len);查不到匹配流表项(miss-send-len字节)。
源端口是保留的广播地址、stp显示源端口不能接受节点、源端口和目的端口是同一个端口时,drop it。
若成功,发出,setup new flow
交换机有无缓存报文
不setup flow 只能指定一次
•报文为:OFPT_PORT_STATUS 调用process_port_status
调用process_phy_port 修改port的状态port为stp时:P_LISTENING、
P_LEARNING、P_FORWARDING、
P_BLOCKING、P_DISABLED。
非stp:P_FORWARDING