Linux网桥的br设备的mac地址[原创]

getmoon's picture

今天一个同事问我,br设备的mac地址到底是如何分配的。这里分析一下:

br_if.c

/* called under bridge lock */
int br_add_if(struct net_bridge *br, struct net_device *dev)
{
struct net_bridge_port *p;

if (dev->br_port != NULL)
return -EBUSY;

if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
return -EINVAL;

if (dev->hard_start_xmit == br_dev_xmit)
return -ELOOP;

dev_hold(dev);
if ((p = new_nbp(br, dev)) == NULL) {
spin_unlock_bh(&br->lock);
dev_put(dev);
return -EXFULL;
}

dev_set_promiscuity(dev, 1);

br_stp_recalculate_bridge_id(br);
br_fdb_insert(br, p, dev->dev_addr, 1);
if ((br->dev->flags & IFF_UP) && (dev->flags & IFF_UP))
br_stp_enable_port(p);

return 0;
}

void br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
const unsigned char *addr, int is_local)
看这个函数中的br_fdb_insert(br, p, dev->dev_addr, 1);
从这句话上我们可以看出,单一个设备加入到一个vlan的时候,会讲该设备的mac地址加入到fdb表中,并且设置成静态。br_fdb_insert最后一个参数为1表示是local , 是静态。

0
Your rating: None

Comments

再思考几个问题

1: 桥的mac地址和桥里面设备的地址有什么联系?有什么区别?
2:桥是否需要自动广播自己的mac地址?是广播桥的mac地址,还是桥端口的mac地址?
3: 桥如何判断一个包需要向ip层发送?向ip层发送后,这个包还是否需要向所有的端口广播?
4:桥在响应arp请求时,用的是桥的mac地址,还是端口的mac地址?

wangyi

李兄,我个人认为大概如下,不知道正确与否,请讨论.

1、 你说的不严谨 ,无法作答

2、桥可以自动广播自己的mac ,但该广播不是必须的,也就是说,可以广播也可以
不广播。

广播的因该是桥本身的mac,而非桥port上的mac。

3、一个帧的目的mac如果是桥本身的mac,则判定传给ip层。
一个帧的目的mac不是桥本身,则直接从链路层转发。
当一个帧发给ip层后,不应该再向所有端口广播

4、桥在响应arp时,个人认为是用桥自身的mac。