一、分層抽象
1、ofproto class
openflow交換機實現類,用來實現一個openflow交換機。主要包括創建、構造、操作openflowflow等相關方法。
2、dpif class
datapath接口類,用來和datapath交互。主要包括datapath的open、run、端口操作、端口數據監聽等相關方法。datapath是數據面的一種抽象。
3、netdev class
網絡設備抽象類,用來和網絡設備交互。主要包括網卡的設置、網卡結構的抽象、數據包發送接收等相關方法。
bridge網橋通過ofproto class構造一個openflow交換機。再通過dpif class打開(如果沒有對應類型的datapath,就創建一個)對應類型的datapath通路。使用netdev class構造一個抽象網絡設備,上層抽象爲端口,然後對網絡設備收發包等操作。
需要說明的是,datapath是按類型分類的,現在ovs有兩種類型的datapath:system(對應linux內核數據通路)、netdev(dpdk用戶態數據通路)。所以使用同一種datapath類型的ovs網橋共享同一個datapath對象。如下圖所示。
二、主要數據結構關係
該部分說明的內容是關於dpdk類型的datapath。
注:AB,表示A是一個變量而非指針,它的結構和內容是B。
流程解釋如下:
1、bridge層
struct bridge對應每個ovs網橋最上層的結構。它通過成員指針變量ofproto,聯繫到struct ofproto交換機結構內容。
2、ofproto層
由於聯繫到的struct ofproto內容是struct ofproto_dpif結構的一個up成員變量。所以通過struct ofproto地址可以cast到struct ofproto_dpif結構內容,通過該內容和dpif層交互。
通過struct ofproto_dpif的成員指針變量dpif_backer,聯繫到struct dpif_backer結構內容。該結構是dpif操作的入口點。
3、dpif層
通過struct dpif_backer的成員指針變量dpif,聯繫到struct dpif結構內容。
由於struct dpif結構內容是struct dpif_netdev結構的dpif成員變量,所以通過struct dpif地址可以cast到struct dpif_netdev結構內容。
struct dpif_netdev結構內容中有指針成員變量dp,通過dp可以聯繫到struct dp_netdev結構內容。該內容是datapath的抽象結構內容。
4、 datapath層
struct dp_netdev的成員指針變量ports是一個表結構,它聯繫着多個port端口內容。端口的結構是struct dp_netdev_port。struct dp_netdev另外一個成員指針變量netdev,聯繫着dp層的struct netdev結構內容,該結構內容是網卡的邏輯抽象。
struct dp_netdev_port的指針成員變量rxqs也是一個表結構,它聯繫着多個隊列內容。隊列的結構是struct dp_netdev_rxq.它的成員變量core_id表示該隊列所在的core。
通過struct dp_netdev_rxq的成員指針變量rxq,聯繫到dp層的struct netdev_rxq結構內容。structdp_netdev_rxq的成員變量queue_id表示該隊列id。
5、netdev層
由於struct netdev結構內容是struct netdev_dpdk結構的一個up成員變量。所以通過struct netdev地址可以cast到struct netdev_dpdk結構內容。
通過struct detdev_dpdk結構內容的成員指針變量netdev_class和dpdk類型網卡交互。
由於struct netdev_rxq結構內容是struct netdev_rxq_dpdk結構內容的一個up成員變量。所以通過struct netdev_rxq地址可以cast到struct netdev_rxq_dpdk結構內容。該內容是dpdk類型的netdev_rxq,它的成員變量port_id是dpdk網絡設備的port。