最近开发有需求需要linux bridge能够转发EAPOL 和BPDU 多播包,EAPOL Multicast 包的dst mac 地址为: 01-80-C2-00-00-03。BPDU包的目的mac地址为:01-80-C2-00-00-00。
在设置 sys/class/net/br-lan/bridge/group_fwd_mask 为0x9将这两种多播mac地址fwd enable的时候,发现以下error。
echo 9 > sys/class/net/br-lan/bridge/group_fwd_mask? ash: write error: Invalid argument
查看后原因为BR_GROUPFWD_RESTRICTED规定了不能设置的3个转发位,分别为STP报文,PAUSE帧,和LACP聚合协议报文。
#define BR_GROUPFWD_RESTRICTED (BR_GROUPFWD_STP | BR_GROUPFWD_MACPAUSE | BR_GROUPFWD_LACP)
因此修改net/bridge/br_sysfs_br.c 中的group_fwd_mask_store()函数中屏蔽对val的check.
static ssize_t group_fwd_mask_store(struct device *d,
struct device_attribute *attr,
const char *buf,
size_t len)
{
struct net_bridge *br = to_bridge(d);
char *endp;
unsigned long val;
if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
return -EPERM;
val = simple_strtoul(buf, &endp, 0);
if (endp == buf)
return -EINVAL;
#if 0
if (val & BR_GROUPFWD_RESTRICTED)
return -EINVAL;
#endif
br->group_fwd_mask = val;
return len;
}
此时group_fwd_mask 设置成功,bpdu转发成功,但是eapol仍然不能转发,进一步查看后发现工程中打了如下openwrt patch。取消改patch后eapol可以转发到bridge其他port.
https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob_plain;f=target/linux/generic/patches-3.18/640-bridge_no_eap_forward.patch;hb=7eeb254cc49c4e9f837c980826ec112b9404f341
?
|