首页 > 代码库 > OpenvSwitch中端口的抽象层次结构
OpenvSwitch中端口的抽象层次结构
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); }
转载注明出处:http://blog.csdn.net/vonzhoufz/article/details/39317547
OpenvSwitch中端口的抽象层次结构
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。