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

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