OpenFlow 是用于管理交换机流表的协议,ovs-ofctl 则是 OVS 提供的命令行工具。在没有配置 OpenFlow controller 的模式下,用户可以使用 ovs-ofctl 命令通过OpenFlow 协议去连接 OVS,创建、修改或删除 OVS 中的流表项,并对 OVS 的运行状况进行动态监控。
一、openflow 连接建立
在bridge_reconfigure()函数中调用bridge_configure_remotes 进行openflow 连接的相关处理,主要创建两个对象:ofconn 作为客户端负责和远端conntroller 主动建立连接;ofservice 作为服务器提供被动式的监听服务,主要数据结构及流程如下图:
二、ofconn 报文处理
入口函数ofproto_run(),主要调用流程如下:
三、ofservice 报文处理
四、flow_mod 消息格式
openflow协议消息处理入口函数是handle_openflow(),其中最重要的是flow_mod流表项的处理,flow_mod流表的报文格式主要有四部分组成:openflow头部、flow_mod固定字段、match字段和instruction字段。
match分为OFPMT_STANDARD和OFPMT_OXM两种类型,可以包含多个oxm,instruction可以包含多个action,也可以没有。抓包示例可参考如下:
五、match字段处理
match字段的解析处理入口函数为ofputil_pull_ofp11_match(),其中的核心处理函数为nx_pull_raw(),主要流程是解析出flow_mod的match字段,和flow中的match相关参数做一些合法性检测,最后使用解析出的value更新flow中的match。
目前match匹配域用的较多的是OXM即TLV格式,字段解析结构示意图如下:
核心流程处理如下:
六、instruction 字段处理
instruction 字段的解析处理入口函数ofpacts_pull_openflow_instructions(),主要流程是解析出flow_mod 的instruction 字段,根据不同的instruction 做不同的处理,其中函数decode_openflow11_instructions()解析出所有instruction 并按照不同类型放入ofp11_instruction *insts[N_OVS_INSTRUCTIONS]数组中,N_OVS_INSTRUCTIONS 根据OVS_INSTRUCTIONS 定义推导出值为6(即instruction 支持的所有类型)。
其中最重要的宏OVS_INSTRUCTIONS 完成了主要的数据生成和转换,根据它的定义可推导出instruction 的类型和后续主要的处理函数对应关系:
ofpacts_decode()函数完成actions 的解析,字段解析结构示意图如下:
最后调用ofpacts_check_consistency()进行参数的有效性检查。
七、flow_mod 处理流程
以增加流表OFPTYPE_FLOW_MOD 为例整理函数处理流程如下: