网桥新加入的VLAN group功能,替换了之前用bitmap来保存接口vlan信息的设计,bitmap主要用来做vlan filtering功能。加入VLAN group之后,不仅可以做vlan filtering,还可以实现global per-vlan features, but not for filtering。另外增加了vlan隧道功能,根据tunnel id为没有vlan的数据包添加tunnel绑定的vlan id。

之前网桥与子接口相关的vlan信息都由net_port_vlans结构保存。一个接口配置的所有vlan id都按照tag/untag属性保存在不同的bitmap中。

struct net_port_vlans {
    u16             pvid;
    unsigned long   vlan_bitmap[BR_VLAN_BITMAP_LEN];
    unsigned long   untagged_bitmap[BR_VLAN_BITMAP_LEN];
    u16             num_vlans;
};

VLAN GROUP加入之后,去掉了以上的net_port_vlan结构体,网桥及其子接口的结构体都新增了一个net_bridge_vlan_group成员,用来保存所有配置的vlan表项(net_bridge_vlan)信息,vlan单个表项结构体名字上虽带有bridge,但是不只网桥,子接口也是使用net_bridge_vlan表示自己的单个vlan表项。

struct net_bridge_vlan_group {
    struct rhashtable       vlan_hash;
    struct rhashtable       tunnel_hash;
    struct list_head        vlan_list;
    u16             num_vlans;
    u16             pvid;
};

新的VLAN GROUP的定义,去掉了net_port_vlan中的bitmap结构,改为链表保存vlan表项信息。其中flags变量中的bit2位用来区分vlan是tag还是untag:

#define BRIDGE_VLAN_INFO_UNTAGGED   (1<<2)  /* VLAN egresses untagged */

既然网桥与子接口共用net_bridge_vlan结构表示vlan表项,就涉及到如何区分二者。其定义中有两个联合体用来标识此vlan为网桥或者子接口vlan时,具有的不同成员。当为网桥的vlan表项时,第一个联合体中br指针指向网桥(net_bridge),port指针为空;否则为子接口vlan表项时,port指针指向子接口,br指针为空。

如果flags设置了BRIDGE_VLAN_INFO_MASTER标志,第一个联合体中br指针指向网桥(net_bridge);如果flags没有MASTER标志,br无效,port指针指向网桥子接口的数据结构。当此vlan做为一个子接口的vlan表项,brvlan指向此接口所属网桥的VLAN GROUP中具有相同vlan id的vlan表项。

struct net_bridge_vlan {
    struct rhash_head       vnode;
    u16             vid;
    u16             flags;
    union {
        struct net_bridge   *br;
        struct net_bridge_port  *port;
    };
    union {
        refcount_t      refcnt;
        struct net_bridge_vlan  *brvlan;
    };

}

网桥VLAN的添加

VLAN的添加分为2种,一个是为网桥添加VLAN(br_vlan_add),另一种是为网桥子接口添加VLAN(nbp_vlan_add)。为网桥自身添加vlan时,flags中设置BRIDGE_VLAN_INFO_MASTER标志,如果此vlan也可用于vlan过滤功能需要设置BRIDGE_VLAN_INFO_BRENTRY标志。以上两个标志表示此vlan为网桥vlan组中的vlan并且要用于vlan过滤。使用bridge命令为网桥添加master的vlan时,内核默认此vlan做过滤使用(自动加上BRIDGE_VLAN_INFO_BRENTRY标志)。

ip link add br_test type bridge
ip link set eth0 master br_test

bridge vlan add dev br_test vid 10 self
bridge vlan add dev br_test vid 20 master

函数br_vlan_should_use完成以上的判断。之后将可用作过滤的vlan所对应的子接口的mac地址与vlan id添加到FDB转发表中。 另外VLAN GROUP中的vlan个数(num_vlans),只会在判断添加的vlan为可用时增加。所谓可用的vlan,即可用于二层转发数据包。

static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
{if (br_vlan_is_master(v)) {return (br_vlan_is_brentry(v) ? true : false);}return true;
}
static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
{if (br_vlan_should_use(v)) {br_fdb_insert(br, p, dev->dev_addr, v->vid);vg->num_vlans++;}
}

在数据包接收过程中,检查数据包携带的vlan id,如果在group中能找到此id,并且group中的vlan可用于过滤功能,允许此数据包通过。

static bool __allowed_ingress(const struct net_bridge *br, struct net_bridge_vlan_group *vg, struct sk_buff *skb, u16 *vid)
{v = br_vlan_find(vg, *vid);if (!v || !br_vlan_should_use(v))goto drop;
}

子接口VLAN添加

为子接口添加vlan时,首先要得到一个相同id的主VLAN,在函数br_vlan_get_master中如果没有找到主VLAN,随即创建一个,由于子接口VLAN要引用此主VLAN,在返回主vlan前,增加其引用计数。注意此时的主VLAN并不用作过滤功能!!

如果设置了BRIDGE_VLAN_INFO_MASTER表示此vlan要同时在网桥上做vlan过滤,需要额外增加一个网桥主vlan,设置BRIDGE_VLAN_INFO_BRENTRY标志做过滤。

static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
{if (p) {/* need to work on the master vlan too */if (flags & BRIDGE_VLAN_INFO_MASTER) {err = br_vlan_add(br, v->vid, flags | BRIDGE_VLAN_INFO_BRENTRY, &changed);}masterv = br_vlan_get_master(br, v->vid);v->brvlan = masterv;}
}

纯粹主VLAN添加

纯粹的不用作过滤的主vlan,目前看还不能通过ip命令直接创建。其是在创建子接口vlan时,通过指定BRIDGE_VLAN_INFO_MASTER标志附带创建出来的。不做vlan过滤,也没看到起有其它功能。仅可见所有子接口的stats字段(struct br_vlan_stats)都是指向master的stats字段,可汇总所有子接口的vlan统计信息。

static int __vlan_add(struct net_bridge_vlan *v, u16 flags)
{masterv = br_vlan_get_master(br, v->vid);v->brvlan = masterv;v->stats = masterv->stats;
}

内核版本

Linux-4.15

网桥VLAN GROUP组相关推荐

  1. Cadence Allegro解散Group组图文教程及视频演示

    在布局过程中,有时会发现创建的Group不太合理,需要解散后重新创建.本文简单介绍Allegro软件解散Group组的方法. 第1步:选中需要解散的Group组 第2步:单击右键选择"Dis ...

  2. Linux小实验11|添加组group,添加用户aa、bb并加入group组 (2)新建文件/abc.txt (3)设置用户aa对文件拥有读、写和执行权限

    12.根据以下要求完成对文件/目录权限的设置 (1)添加组group,添加用户aa.bb并加入group组 (2)新建文件/abc.txt (3)设置用户aa对文件拥有读.写和执行权限 (4)设置组g ...

  3. Python读取netCDF中的group/组中的变量

    netCDF group中变量的读取 网络通用数据格式netCDF的广泛使用已经成为一种趋势,读取其文件中的变量已经有很多的示例,本篇介绍一种读取NC文件中 group中的变量及其属性. with D ...

  4. 部署KVM虚拟化(单网桥与多网桥VLAN模式)

    本案例单网桥模式实验在虚拟机中部署 1.开启虚拟机虚拟化功能 2.关闭selinux和firewalld 3.通过命令查看server是否支持虚拟化 -- egrep '(vmx|svm)' /pro ...

  5. openwrt 配置网桥 vlan 多个wan口 以及web界面配置总结

    版本:MTK7620n 如题.现在对近两天对于openwrt的网桥配置进行总结.以备后用. 参考的资料:http://blog.csdn.net/jk110333/article/details/45 ...

  6. RequiredFieldValidator 根据group组来触发验证

    今天在开发过程中遇到了这样一个问题 在这个用户添加界面中,我使用了多个验证控件RequiredFieldValidator,分别控制用户名密码.在默认情况下,当单击"检查用户名"时 ...

  7. IGMP Snooping和组播VLAN技术原理

    IGMP Snooping: 诞生原因: 由于IGMP报文是封装在IP报文内,属于三层协议报文,而二层设备不处理报文的三层信息,所以这个过程它并不知道,而且通过对数据链路层数据帧的源MAC地址的学习也 ...

  8. 实验四 VLAN 实验——实现同一个vlan组下PC互通,不同vlan组下的不能互通

    实验四 VLAN 实验 一.实验内容:华为系列交换机 VLAN 配置方法 二.实验目的:掌握 Huawei 系列中低端交换机端口的 VLAN 配置方法 三.实验设备:Huawei交换机,PC 机,Co ...

  9. 消费者组consumer group详解-Kafka从入门到精通(九)

    上篇文章说了,kafka可以通过实现partitioner自定义分区,producer拦截器,拦截器是在producer发送消息之后,回调之前调用,里面主要重写两个方法,一个是onSend,可以重新定 ...

最新文章

  1. 自己整合优化的一个Android框架
  2. iar 堆栈设置_IAR MSP430设置合理堆栈大小(the stack pointer for stack is outside the stack range)...
  3. 判断闰年 php,PHP怎么判断一年是否为闰年?
  4. 纹理和基元_通过粘性仙人掌基元进行延迟加载和缓存
  5. C++:15---异常机制
  6. 位枚举(Bit Flags)
  7. jpa 托管_java – jpa非托管实体
  8. php 获取季度起始日期,php获取昨天、今天、上周、本周、上月、本月、上季度、本季度、今年的起始时间...
  9. ie8升级到ie11 操作系统不受支持
  10. 斐波那契查找算法中为什么需要把数组长度扩充到f[k]-1而不是f[k]或者f[k+1]
  11. 学习成果区块链问世,中科宇创为人才能力认证提供权威账本
  12. 数据结构与算法之图的深度优先遍历(DFS)
  13. 网吧无盘服务器连接交换机,网吧为什么要使用万兆交换机
  14. iOS小技能:合并mp3格式的文件
  15. linux meld 中文乱码,linux下paste、diff、meld的使用
  16. 只有两种直播:淘宝直播和其它直播
  17. route命令添加永久路由
  18. 【Pytest篇】pytest生成报告的几种方式
  19. lol老是闪退到桌面_win10
  20. ITK入门教程(15)向量作为像素类型

热门文章

  1. Tweet with Disaster(Kaggle NLP项目实战)
  2. 云队友丨陆奇:在未来,究竟哪种职业创造财富的机会最大?
  3. 互联网日报 | QQ正式上线QID功能;高通骁龙888处理器正式发布;嫦娥五号成功落月...
  4. 面试完还呗、拼多多、蚂蚁金服、趣头条、京东到家之后,我知道了这些
  5. 《c语言程序设计》实验报告,C语言程序设计实验实验报告_wenkub
  6. 终于读完了《Essential C++》
  7. windows系统目录programdata和program file(x86)
  8. win10如何设置定时关机?
  9. u8链接提示计算机拒绝,用友u8软件error错误拒绝访问
  10. 【C语言】ISBN识别码判断