OVS源码--openflow(四)

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 为例整理函数处理流程如下:
在这里插入图片描述

原文链接:https://www.sdnlab.com/my_sdnlab/wp-content/uploads/2017/02/cntctfrm_1a5b490b5708a374ad0d207df48ec29e_Openvswitch%E6%BA%90%E7%A0%81%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章