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、disablenon-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报文头部:OFPT_STATS_REPLY(流、网包等统计信息的反馈)调用process_stats_reply(读取交换机的信息,比如最后reply的时间)调用process_flow_stats(根据读取的信息判断流表是否应该删除)调用make_openflow以及rconn_send发出type为(OFPT_FLOW_MOD或者OFPFC_DELETE_STRICT的报文)报文头部为:OFPT_FLOW_REMOVED NUlludatapath.c •udatapath.c大体流程•调用dp-run()调用netdev-recv 接收报文,放入buffer中调用fed-port-input (接受报文,遍历流表寻找匹配的流表项,没有就发给controller)调用run-flow-through-table(遍历流表,并且处理报文)调用dp-output-control 负责组建ofp-packet-in 报文、确定发多少数据给controller(根据reason和switch的缓存能力)调用remote-run(做一些保持连接的处理,并且接受remote发来的报文并且处理它们,最高迭代50次,以防止其他进程饿死。
)调用fwd-controller-input读取报文,分析报文头部,判断是否是来自controller的报文,并且处理来自controller的报文•报文头部:OFPT_BARRIER_REQUEST 调用recv_barrier_request先make_barrier_reply后send_openflow_buffer分析接受数据,判断Send back to the sender或者是Broadcast to all remotes•OFPT_FEATURES_REQUEST调用recv_features_request调用dp_send_features_reply先make_openflow_reply后将sw的状态放入报文datapath_id、n_tables 、n_buffers、capabilities、actionssend_openflow_buffer报文头部:OFPT_GET_CONFIG_REQUEST 调用recv_get_config_request先make_openflow_reply后flags、miss_send_len•OFPT_SET_CONFIG调用recv_set_configflags、miss_send_len的赋值•OFPT_PACKET_OUT判断通过调用execute_actions判断通过调用do_output判断目标调用dp_output_port调用dp_output_control•OFPT_FLOW_MOD调用recv_flowOFPFC_ADD add_flowOFPFC_MODIFY || OFPFC_MODIFY_STRICT mod_flowOFPFC_DELETE 先flow_extract_match 后chain_deleteOFPFC_DELETE_STRICT 先flow_extract_match后判断priority = key.wildcards 再chain_delete•OFPT_PORT_MOD•OFPT_STATS_REQUEST•OFPT_ECHO_REQUEST•OFPT_ECHO_REPLY•OFPT_QUEUE_GET_CONFIG_REQUEST •OFPT_VENDOR•报文type都是以上类型•调用dp-send-error-msg调用make-openflow-reply(ofpt-error)报文的产生secchan•vconn-openflow 读取ofp-version•调用relay-run调用rconn-send调用try-send调用vconn-send调用vconn-connect调用vsc-send-hello发出hello报文(调用vcs-recv-hello接受hello报文)。