当前位置:文档之家› openflow协议以及协议的代码实现

openflow协议以及协议的代码实现

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

相关主题