歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenvSwitch中端口的抽象層次結構

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

Copyright © Linux教程網 All Rights Reserved