watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdm9uemhvdWZ6/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

同一主机上的OVS中能够创建多个网桥(即多个datapath实例),每一个bridge能够通过patch ports互联,而netdev ports是OVS对底层物理port的抽象封装。internal 类型的port比較不好理解,能够看做每一个OVS交换机有个能够用来处理数据报的本地port。能够为这个网络设备配置
IP 地址(比方在把eth0增加某个bridge的时候,它的IP地址就失效了。能够把IP地址赋给br,这就是internal port的地址)等等。

     以下列出vport相关的数据结构,尽管前面的文章有涉及。可是不够集中全面。
/**
* struct vport抽象的是datapath中的每一个端口,
*/
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 vport_parms - parameters for creating a new vport
* 端口參数。当创建一个新的vport端口是要传入的參数
*/
struct vport_parms {
const char *name;
enum ovs_vport_type type; //端口的类型
struct nlattr *options; //保存从netlink msg中得到的属性 /* For ovs_vport_alloc(). */
struct datapath *dp; //端口属于哪个datapath(网桥)
u16 port_no; //端口号
u32 upcall_portid; //和用户空间通信的netlink 端口
}; /**
* struct vport_ops -定义虚拟端口的类型(能做的操作)
*/
struct vport_ops {
enum ovs_vport_type type; // 类型值,OVS_VPORT_TYPE_*。
u32 flags; // VPORT_F_*,影响通用虚拟端口层怎样处理这个vport。 /* Called at module init and exit respectively. */
int (*init)(void); // 模块初始化;假设设置了标识VPORT_F_REQUIRED,那么该函数运行失败后
//停止模块载入。否则仅仅是导致不创建这种类型的vport。 void (*exit)(void); //模块卸载之时。 /* Called with RTNL lock. */
struct vport *(*create)(const struct vport_parms *);
//依据运行參数来创建一个新的vport,失败则返回相应的 ERR_PTR() 值;
void (*destroy)(struct vport *);
// 销毁这个vport,必须调用vport_free()释放(由于利用的是RCU。所以等到 RCU grace period之后实际运行) int (*set_options)(struct vport *, struct nlattr *); //配置这个vport,假设不支持改动,就把该函数指针置为Null。
int (*get_options)(const struct vport *, struct sk_buff *);//获得这个vport相关的配置属性到sk_buff中; int (*set_addr)(struct vport *, const unsigned char *);//设置MAC地址; /* Called with rcu_read_lock or RTNL lock. */
const char *(*get_name)(const struct vport *); // 设备名
const unsigned char *(*get_addr)(const struct vport *);
void (*get_config)(const struct vport *, void *);
struct kobject *(*get_kobj)(const struct vport *);//获得这个设备关联的kobj对象; unsigned (*get_dev_flags)(const struct vport *);//设备标志;
int (*is_running)(const struct vport *);
unsigned char (*get_operstate)(const struct vport *); //设备的工作状态 int (*get_ifindex)(const struct vport *);//和这个设备关联的接口号(system interface index ) int (*get_mtu)(const struct vport *);//设备的MTU,假设像tunnel这种就没有MTU,返回null; int (*send)(struct vport *, struct sk_buff *); //在该设备上发送一个packet,返回发送的长度;
}; /* List of statically compiled vport implementations. Don't forget to also
* add yours to the list at the top of vport.c. */
extern const struct vport_ops ovs_netdev_vport_ops;
extern const struct vport_ops ovs_internal_vport_ops;
extern const struct vport_ops ovs_patch_vport_ops;

版权声明:本文博客原创文章,博客,未经同意,不得转载。

正确openvSwitch不同种类port认识的更多相关文章

  1. OpenvSwitch代码分析之bridge和port

    ovs-vsctl add-br br0 会在数据库里面加入新bridge的信息ovs-vsctl add-port br0 eth0 会在数据库里面加入新的port信息 void bridge_ru ...

  2. Python基础知识学习_Day8

    一.类的扩展方法 1.静态方法 语法:@staticmethod,静态方法不能访问公有属性,不能访问类.可在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量. class eat( ...

  3. python开发学习-day08(socket高级、socketserver、进程、线程)

    s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  4. python---异常处理与反射

    一.异常处理 1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except ...

  5. 040.集群网络-CNI网络模型

    一 CNM网络模型 1.1 网络模型 生产环境中,跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址.一个容器多个IP地址.多个子网隔离.ACL控制策略.与SDN集成等.目前主流的 ...

  6. Maven 代理设置

    在maven的安装目录下 %MAVEN_HOME%/conf/setting.xml 中进行设置 <proxies>    <!-- proxy     | Specificatio ...

  7. 在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客

    尽管Grand Central Dispatch(GCD)已经存在一段时间了,但并非每个人都知道怎么使用它.这是情有可原的,因为并发很棘手,而且GCD本身基于C的API在 Swift世界中很刺眼. 在 ...

  8. Consul

    1. 什么是consul? 是一个服务管理软件. 支持多数据中心下,分布式高可用的,服务发现和配置共享. consul支持健康检查,允许存储键值对. 一致性协议采用 Raft 算法,用来保证服务的高可 ...

  9. Spring/Hibernate 应用性能优化的7种方法

    对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能.此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法.本文系 O ...

随机推荐

  1. jquery关于表格隐藏和显示问题

    1. 关于指定表格指定列隐藏显示 $(":checkbox[name*=month]").each(function(){ if(!$(this).attr("check ...

  2. CentOS 7 命令备忘录

    1 查看目录下有什么文件/目录 >ls //list 列出目录文件信息 >ls -l 或ll //以“详细信息”查看目录文件 >ls -a //-all 查看目录“全部”(包含隐藏文 ...

  3. 利用SVNKit进行版本库的树的导出

    public List searchByTree(String userName,String passwd,String SVNServerUrl,String dirUrl){ //这里有点像 s ...

  4. linux操作提示:“Can&#39;t open file for writing”或“operation not permitted”的解决的方法

    在linux上使用vi命令改动一个文件内容的时候,发现无法保存,每次写完使用":q!"命令能够正常退出可是使用":wq!"命令保存文件并退出时出现一下信息提示: ...

  5. cocos2d-x 精灵的创建和基本使用

    在cocos2d-x中.精灵能够说是一个最重要的组成元素,它代表游戏中一个最小的可见单位.同一时候也是CCNode一个最为灵活的子类,由于它能够通过装载一个平面纹理,从而具有丰富的表现力. 在进一步说 ...

  6. Holding Bin-Laden Captive!(杭电1085)(母函数)

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  7. WPF DataGrid_SelectChanged获取单元内容

    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)        {          ...

  8. Javadoc的Html文件传输chm

     Javadoc的Html文件转chm 工具下载地址:http://msdn.microsoft.com/en-us/library/ms669985.aspx 两篇相关文章: MyEclipse ...

  9. 轻松管理您的网络password

    在互联网在现在这个时代,,我们注册了很多帐户.支付宝账号password,各种宝账户password.微信,QQ,电话password,购买各种网站,金融password,它是不是让孩子们的鞋子瞬间淡 ...

  10. 【小白的java成长系列】——顶级类Object源代码分析

    首先来说一下api文档使用,api这个词对有一定开发经验的java编程人员来说是非常喜爱的~ java当然也提供了api开发文档,下载地址:http://www.oracle.com/technetw ...