网桥子系统
文章平均质量分 73
redwingz
这个作者很懒,什么都没留下…
展开
-
网桥本地链路组播控制group_fwd_mask
在创建网桥时,可指定组播转发掩码值group_fwd_mask,如下0xff00。掩码中的位表示的为链路本地地址(01:80:C2:00:00:0X)的最后一个4位的值,即X的值,其范围为0到15,所以,group_fwd_mask的值为16比特。网桥下的子接口可以设置自身的group_fwd_mask掩码值。$ sudo ip link add name br1 type bridge group_fwd_mask 0xff00$ $ cat /sys/devices/virtual/net/br原创 2021-02-04 23:02:27 · 1294 阅读 · 1 评论 -
STP与LLC协议接收路径
网桥初始化函数br_init使用stp_proto_register注册stp协议,此处注册的stp_proto结构体仅包含一个rcv回调函数:br_stp_rcv。static int __init br_init(void){ err = stp_proto_register(&br_stp_proto); if (err < 0) { pr_...原创 2019-08-14 20:23:49 · 2391 阅读 · 0 评论 -
配置静态L2TPv3隧道传输non-IP报文
L2TP网络拓扑如下,两个系统Host-A与Host-B直连互通,网段为192.168.1.0/24。会话session设备不再配置独立的IP地址,而是与网口eth0桥接在同一个网桥br0下,这样进入网口eth0的数据报文(包括非IP报文)都将被转发到l2tpeth0接口上,最终通过L2TP隧道由eth1发出。 Host-A ...原创 2019-05-23 20:50:03 · 1497 阅读 · 0 评论 -
网桥工作在集线器(hub)模式
集线器hub不同于Linux网桥实现的交换机,集线器不学习数据包的MAC地址,没有二层转发表FDB,对于接收到的数据包总是泛洪到所有的子接口上。相当于没有学习到任何MAC地址(FDB为空)的网桥交换机。两个思路修改网桥为HUB工作模式,一是保持FDB表为空,不添加任何表项,将FDB添加表项函数去除;另外也可以单独写一个网桥接收处理函数,直接调用flood功能函数。以下代码采用第一种方式,实现也比较...原创 2018-07-13 23:55:06 · 2102 阅读 · 0 评论 -
网桥VLAN与tunnel隧道映射
VLAN tunnel隧道映射根据tunnel id为数据包添加vlan信息。 以下bridge配置命令采用iproute2的版本4.17.0,低版本bridge命令可能不完全支持vlan_tunnel功能。使能接口eth0的vlan与tunnel映射功能:bridge link set dev eth0 vlan_tunnel on或者:ip link set dev eth0 type bri...原创 2018-07-06 18:06:43 · 3685 阅读 · 3 评论 -
网桥泛洪时减少1次skb克隆
一般情况下,网桥在泛洪时将数据包发送每一个子接口,每次发送前需要clone一份skb数据包。在遍历到最后一个子接口的时候,由于skb不再需要进行其它的处理了,可以不clone,直接使用原skb,处理完成后安全释放。在br_flood函数中,通过prev变量保存前一个遍历的子接口,实现以上的功能。static void br_flood(struct net_bridge *br, struct s...原创 2018-07-12 15:24:09 · 587 阅读 · 0 评论 -
网桥接口的混杂模式
网桥接口的混杂模式取决于三个因素,一个是自身的混杂模式设置;第二是vlan过滤是否开启;最后是处于自动状态(auto_port)的子接口的数量。网桥的混杂模式管理函数br_manage_promisc如下:void br_manage_promisc(struct net_bridge *br){ if ((br->dev->flags & IFF_PROMISC) ...原创 2018-06-29 09:43:59 · 9166 阅读 · 3 评论 -
网桥VLAN GROUP组
网桥新加入的VLAN group功能,替换了之前用bitmap来保存接口vlan信息的设计,bitmap主要用来做vlan filtering功能。加入VLAN group之后,不仅可以做vlan filtering,还可以实现global per-vlan features, but not for filtering。另外增加了vlan隧道功能,根据tunnel id为没有vlan的数据包添加...原创 2018-07-16 12:36:29 · 5017 阅读 · 1 评论 -
网桥接口非混杂模式下数据包转发
网桥接口处在非混杂模式下,只能接收目的MAC地址为自身的数据包,也就是说如果数据包的目的MAC为其它地址,将会被丢弃掉。对于单网口的设备这样没有问题,但是对于存在多个网卡的交换设备,如果从一个网口接收到的数据包为需要转发的数据包,其去往另外一个接口,由于目的mac不等于接收网卡的MAC地址就会被丢弃导调导致网络不通。Linux内核为了处理这一问题,采取了为一个非混杂模式的接口,添加多个硬件单播MA...原创 2018-07-02 17:37:43 · 2405 阅读 · 0 评论 -
linux命令brctl与ip(vconfig)配置交换机功能
默认情况下,所有物理接口都是VLAN 1的子接口brctl addbr vlan_default_1brctl addif vlan_default_1 <all physical interfaces>以下更改接口VLAN的操作,都需要先把接口从vlan 1中删除brctl delif vlan_default_1 <ethx>1)创建VLAN接口 VLAN接口的创建实现...原创 2018-06-08 18:21:34 · 5495 阅读 · 0 评论 -
网桥的vlan filtering过滤功能
网桥的VLAN Filtering功能,顾名思义实现对入口与出口数据包依据VLAN信息的过滤。vlan filtering功能默认是关闭的,可通过如下命令开启:echo 1 > /sys/class/net/brx/bridge/vlan_filtering或者ip link set brx type bridge vlan_filtering 1初始化VLAN过滤Linux网桥在初始化时,...原创 2018-06-15 13:54:50 · 14178 阅读 · 5 评论 -
数据包VLAN标签的剥离和添加
使用vconfig或者ip命令创建的802.1q虚拟设备,并不会负责vlan标签的剥离和添加。其操作位于数据包的接收和发送流程中。vconfig add eth0 10或者ip link add link eth0 eth0.10 type vlan id 10vlan标签的剥离是在数据包接收函数__netif_receive_skb_core中处理,skb_vlan_untag函数最终执行unt...原创 2018-06-22 18:11:34 · 12440 阅读 · 0 评论 -
Linux网桥中的伪造路由
内核中在新建一个网桥时,为其分配一个伪造的路由表项(fake_rtable)。之所以是伪造,因为并不是通过查询FIB路由表而得出,而是手动创建并且不能用于路由数据包,其操作函数集中大部分函数为空,目前仅fake_mtu函数会返回一个相关网络设备device的mtu值,其它函数诸如fake_redirect等都为空。static unsigned int fake_mtu(const struct ...原创 2018-06-20 22:35:15 · 1227 阅读 · 0 评论 -
内核获取网络设备的网桥接口
Linux内核中有两种获取网络设备的桥接口方法,其中一种是在控制路径上;另一种是在数据路径上。控制路径用户平面的程序brctl下发控制命令,比如setpathcost和setportprio命令以port number为参数下发到内核,内核使用br_get_port函数遍历网桥上的接口列表,最终找到对应的网桥接口。br_get_port函数需要在获得了网桥spinlock锁后调用,防止对port_...原创 2018-05-21 12:32:38 · 2193 阅读 · 0 评论 -
Linux实现交换机的另一种方法
需要涉及到内核的两个模块:bridge网桥和802.1q VLAN。二层交换首先创建全局网桥br_test。将所有物理接口添加到网桥下。此时,相当于一个纯二层交换机。brctl addbr br_testbrctl addif br_test eth0brctl addif br_test eth1三层交换利用Linux的802.1q模块实现三层交换机。首先为网桥配置管理IP地址。ifconf...原创 2018-05-07 12:02:12 · 7009 阅读 · 0 评论 -
网桥fdb与物理接口状态变化
Linux网桥代码中并没有检测物理接口up/down变化的代码,所以在接口down掉后,并不能马上清除与此接口关联的MAC转发表项(可通过brctl showmacs命令查看)。内核中有两种方式处理这些表项。超时处理这些残留的表项会通过fdb的超时处理清除。默认超时时间为300秒,可通过命令brctl setageing修改。static inline int has_expired(const ...原创 2018-04-28 17:43:36 · 1469 阅读 · 1 评论 -
Linux网桥MAC地址的选择
网桥创建在网桥创建时(brctl addbr br_test),内核为其生成一个随机的mac地址,并保证此地址的多播位为零(首字节第一个bit位:addr[0] &= 0xfe),并且设置上首字节的第二个bit位,表明为本地生成的mac地址(addr[0] |= 0x02)。static inline void eth_hw_addr_random(struct net_device *d...原创 2018-05-04 10:24:22 · 7024 阅读 · 0 评论