OpenvSwitch中端口的抽象层次结构


struct vport抽象的是OVS中datapath层的每个端口,通过它将ovs中的各种数据结构与Port关联起来,而结构体netdev_vport 就是vport和底层真实网络设备结构net_device 的入口,关键数据结构如下:

OpenvSwitch中端口的抽象层次结构

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脚本 

本文永久更新链接地址:

相关内容