OVS源碼--端口抽象層次(二十三)

struct vport抽象的是OVS中datapath層的每個端口,通過它將ovs中的各種數據結構與Port關聯起來,而結構體netdev_vport 就是vport和底層真實網絡設備結構net_device的入口,關鍵數據結構如下:
在這裏插入圖片描述

struct vport {
     struct rcu_head rcu; //RCU callback head for deferred destruction.
     u16 port_no;          //端口號是dp中ports數組的索引;
     struct datapath     *dp; //這個端口所屬的datapath;
     struct kobject kobj;  // Represents /sys/class/net/<devname>/brport
     char linkname[IFNAMSIZ]; 
     u32 upcall_portid;   //在這個端口收到的包如果匹配流表失敗會通過這個netlink port傳至用戶空間;

     struct hlist_node hash_node; //  vport.c中的哈希表dev_table使用;
     struct hlist_node dp_hash_node; //是結構體datapath->ports中的構成元素,將所有vport連接起來;
     const struct vport_ops *ops;   //核心,定義vport的類型(能做的操作);

     struct vport_percpu_stats __percpu *percpu_stats;  //指向每個CPU的統計信息;

     spinlock_t stats_lock;      //自旋鎖,保護下面倆字段的訪問;
     struct vport_err_stats err_stats; //錯誤的統計信息;
     struct ovs_vport_stats offset_stats;  //過時了;
};
/***
* 對網絡設備的封裝。
*/
struct netdev_vport {
     struct rcu_head rcu; // 鎖機制read copy update
     struct net_device *dev;//存儲特定網絡設備的所有信息
};

那麼如何由vport訪問到具體的真實設備呢?ovs實現中把在vport的私有存儲區中存儲了其對應的netdev_vport,這樣便可以在需要的時候直接獲取,方法如下:

/**
*     vport_priv - 訪問這個vport的私有數據區
* 因爲在create 這個vport的時候分配的私有數據區的大小sizeof(struct netdev_vport),
* 所以就可以把vport對應的netdev_vport存在裏面,便於發佈。
*/
static inline void *vport_priv(const struct vport *vport)
{
     return (u8 *)vport + ALIGN(sizeof(struct vport), VPORT_ALIGN);
}

原文鏈接:https://www.webfalse.com/read/204742/1377567.html

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