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);