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

时间: 2024-10-09 02:46:35

OpenvSwitch中端口的抽象层次结构的相关文章

对openvSwitch中不同类型端口的理解

同一主机上的OVS中可以创建多个网桥(即多个datapath实例),每个bridge可以通过patch ports互联,而netdev ports是OVS对底层物理端口的抽象封装,internal 类型的端口比较不好理解,可以看做每个OVS交换机有个可以用来处理数据报的本地端口,可以为这个网络设备配置 IP 地址(比如在把eth0加入某个bridge的时候,它的IP地址就失效了,可以把IP地址赋给br,这就是internal port的地址)等等. 下面列出vport相关的数据结构,虽然前面的文

解决Myeclipse中端口占用,导致tomcat无法启动的问题。(Linux)

本文出自:http://blog.csdn.net/svitter 引文:http://www.2cto.com/os/201305/209285.html { ubuntu查看占用某端口的程序 查看端口使用情况,使用netstat命令. 查看已经连接的服务端口(ESTABLISHED netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap 查看8080端口,则可以结合grep命令:netstat -ap | grep 8080 如查看8888端

编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间

建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比如猫(Cat).Cat可以有Name,这就是属性:Cat有一个恶习ScratchSofa(挠沙发),这就是行为.我们把这些属性和行为结合起来,就称为一个类型: class Cat { public string Name { get; set; } public void ScratchSofa()

PHP中静态与抽象的概念

静态//普通成员//普通成员是属于对象的 //静态成员//静态成员属于类的 类中的静态属性非常类似于函数的全局变量.类中的静态成员是不需要对象而使用类名来直接访问的. //关键字:static//self关键字:在类里面代表该类(代表自身)//在静态方法里面不能调用普通成员//在普通方法里面能够调用静态成员 /*class FenBi{ public $length; //粉笔的长度 public static $color; //粉笔的颜色  static function show() { 

深入浅出:重温JAVA中接口与抽象的区别

抽象类:声明一个抽象类,就是在类的声明开头.在Class关键字的前面使用关键字abstract 下面定义一个抽象类,代码如下: abstract class A{ abstract void callme(); void callmetoo(){ System.out.println("This is a concrete method."); } } class B extends A{ void callme(){ System.out.println("B‘s impl

Android中的设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory) 先上类图吧,自己懒得画了,找了个现成的 抽象工厂的引入是根据需求而产生的,说到这里先要提到一个名字-产品族(Product Family),还是以生产汽车为例,我想要一个上汽的汽车工厂能够同时生产一款MPV,一款SUV和一款Sedan,那比如说它就是上海通用别克的工厂啦,可以生产MPV GL8,生产SUV 昂科威,可以生产Sedan 君威,这几款产品就算是一个产品族.作为公司高层,肯定是希望工厂能够有能力同时生产这三款车,将这个工程抽象出来,就成

java中端口号被占用的解决办法

第一步,命令提示符号,执行命令:netstat -ano 可见,占用1099端口的进程的PID是10460. 第二步,命令提示符号,执行命令:tasklist(通过pid 10460定位) 可见,该占用8080端口的进程是Java.exe第三步,通过任务管理器,终止进程java.exe 第四步,重新启动tomca/或者重新打开一个工程,即可正常启动 ps : Linux系统查看端口的占用进程,例如查看端口8080占用: lsof -i:8080 如果有占用,直接使用kill -9 进程号

CentOS6.6防火墙中端口的开启和关闭

1.开启端口(以7777端口为例) vi /etc/sysconfig/iptables  打开配置文件加入如下语句: -A INPUT -p tcp -m state --state NEW -m tcp --dport 7777 -j ACCEPT 重启防火墙 /etc/init.d/iptables restart 修改完成 2.关闭端口(以7777端口为例) vi /etc/sysconfig/iptables  打开配置文件加入如下语句: -A INPUT -p tcp -m stat

CentOS防火墙中端口的开启和关闭

1.开启端口(以80端口为例) 方法一: /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 写入修改 /etc/init.d/iptables save 保存修改 service iptables restart 重启防火墙,修改生效 方法二: vi /etc/sysconfig/iptables  打开配置文件加入如下语句: -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j