linux mac地址表 大小,Linux Bridge 分析(五):MAC地址表管理

kernel 2.6.21.7 /net/bridge/br_fdb.c

/* 此函数处理 MAC 地址学习。

* 此函数在桥处理接收到的数据包时调用,br_input.c。

********************************************************************

*  br_input.c: br_handle_frame() 处理桥收到的数据包。

*  对于目的 MAC 为 01:80:C2:00:00:0X 的包,它调用 br_handle_local_finish(),

*      该函数调用 br_fdb_update() 学习源 MAC,然后由上层继续处理,

*  对于其它的包,它调用 br_br_handle_frame_finish()处理,

*该函数调用 br_fdb_update() 学习源 MAC,然后 或转发或洪泛或交协议栈。

********************************************************************

*  此函数首先调用 fdb_find() 在 MAC 地址表中查找对应的表项。

*  如已存在该表项,如果该表项为本地 MAC 地址表项,则打印警告信息,

*"%s: received packet with own address as source address\n"

*如前所述,桥不可能通过学习得到本地 MAC 地址(收到源 MAC 地址等于设

*备自己的 MAC 地址的包是一个错误)。否则,刷新该表项,设置该表项中

*的端口为本次接收到数据包的端口,重置老化时间(ageing_timer)。

*对于我们的设备,此时通过钩子调用相应的函数刷新设备的硬件表项。

*  如不存在该表项,则调用 fdb_create() 创建并插入新的 MAC 地址表项,注意

*新表项被设为非本地非静态表项。

*同样,fdb_create()此时通过钩子调用相应的函数创建设备的硬件表项。

* /

void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,

const unsigned char *addr);

/* 此函数清理 MAC 地址表中的过时表项,重置有效表项。

* 此函数由内核定时器驱动,创建桥时将创建此定时器,net_bridge.gc_timer。

*此函数被 EXPORT_SYMBOL(br_fdb_cleanup)。

* 此函数遍历整个 MAC 地址表,检查每个表项是否过期(静态表项永不过期)。

* 对于没有过期的表项,此函数不做任何处理。

* 对于过期表项,此函数通过钩子调用相应函数检查设备中的硬件表项是否有效。

*如果有效,则重置该表项的老化时间(ageing_timer)。

*如果无效,则调用 fdb_delete() 删除该表项。

*fdb_delete() 又调用 br_fdb_put() 做进一步处理。

*br_fdb_put()通过钩子调用相应的函数删除设备的硬件表项。

* 并且检查该表项的引用计数,决定是否释放该表项。

* /

void br_fdb_cleanup(unsigned long _data);

/* 桥端口的 MAC 地址改变时,此函数被触发,br_notify.c: br_device_event()。

* 此函数插入新的 MAC 地址表项,删除或修改原 MAC 地址对应的表项。

* 此函数遍历整个 MAC 地址表,寻找桥端口对应的本地 MAC 地址表项。

*如果存在该表项,当桥上还有其它端口具有原 MAC 地址,则更新表项,使此

*表项属于其它端口(表项的dst)。如果没有其它端口具有原 MAC

*地址,则调用 fdb_delete() 删除该表项。

*br_fdb_put()通过钩子调用相应的函数删除设备的硬件表项。

* 之后调用 fdb_insert() 插入新的本地静态 MAC 地址表项。

********************************************************************

*fdb_insert() 首先在 MAC 地址表中查找新 MAC 地址对应的表项。

如果存在对应的本地表项,什么也不做,函数返回。

如果存在非本地表项,则调用 fdb_delete() 删除该表项,并打印

错误信息(网络上可能有设备的 MAC 地址与新设定的

桥端口 MAC 地址相同,MAC地址表中存在非本地表项,

表示这可能是从收到的数据包中学习到的)。

br_fdb_put()通过钩子删除设备的硬件表项。

*之后调用 fdb_create() 创建并插入新的 MAC 地址表项,注意新表项

*被设为本地静态表项。

*同样,fdb_create()此时通过钩子调用相应的函数创建设备的硬件表项。

********************************************************************

* /

void br_fdb_changeaddr(struct net_bridge_port *p,

const unsigned char*newaddr);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值