一、分层抽象
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。
注:A
B,表示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。