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);
}
/**
* 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);
}
OpenvSwitch 2.1.2 安裝完成後 啟動 與 停止 shell腳本 http://www.linuxidc.com/Linux/2014-09/106284.htm