2012年(19)
分类:
2012-01-12 15:33:13
原文地址:Linux Bridge 分析(五):MAC地址表管理 作者:zhmlinux
|
|
|
* 该函数调用 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() 此时通过钩子调用相应的函数创建设备的硬件表项。 * /
* 此函数被 EXPORT_SYMBOL(br_fdb_cleanup)。
* br_fdb_put() 通过钩子调用相应的函数删除设备的硬件表项。
* br_fdb_put() 通过钩子调用相应的函数删除设备的硬件表项。
错误信息(网络上可能有设备的 MAC 地址与新设定的 桥端口 MAC 地址相同,MAC地址表中存在非本地表项, 表示这可能是从收到的数据包中学习到的)。 br_fdb_put() 通过钩子删除设备的硬件表项。 * 之后调用 fdb_create() 创建并插入新的 MAC 地址表项,注意新表项 * 被设为本地静态表项。 * 同样,fdb_create() 此时通过钩子调用相应的函数创建设备的硬件表项。 ******************************************************************** * /
|
/* 此函数在 MAC 地址表中插入一个本地静态表项。 * 此函数在向桥上新增端口时使用,使用新增端口的 MAC 地址构造本地静态表项。 * 此函数由 br_if.c: br_add_if() 调用。 * 此函数调用 fdb_insert() 插入新的本地静态 MAC 地址表项。 * 同样,fdb_create() 此时通过钩子调用相应的函数创建设备的硬件表项。 * /
* 端口相同,则更新该表项,使此表项属于其它端口(表项的 dst)。
* 这时,br_fdb_put() 通过钩子删除设备的硬件表项。 ******************************************************************** * 注意:MAC 地址表中的本地表项一般添加桥端口时通过 fdb_insert() 创建。 * 本地表项一般都是静态表项,桥通过学习得到的是非本地非静态表项, * 但可以手工向 MAC 地址表中增加非本地静态表项。 * 当 do_all 为0时,忽略静态表项,此时本地表项也被忽略, * 当 do_all 为1时,静态表项不被忽略,也要被 fdb_delete() 删除, * 而本地静态表项则按上述讨论处理。 * /
* 删除该表项,再调用 fdb_add() 插入新的非本地静态表项。 * 如果没找到表项,调用 fdb_add() 插入新的非本地静态表项。 * 注意,fdb_add() 通过钩子调用相应的函数创建设备的硬件表项。 * br_fdb_put() 通过钩子删除设备的硬件表项。 * /
* br_fdb_put() 通过钩子删除设备的硬件表项。 * /
* 此函数不再调用其他内部接口函数。 * /
* 这两个钩子在 ATM 中使用。 * /
|
/* 此函数 通过钩子调用相应的函数删除设备的硬件表项。 * 并且检查该表项的引用计数,为0时释放该表项。 * 此函数被 * 此函数不再调用其他内部接口函数。 */
/* 此函数删除 MAC 地址表中的表项。 * 并调用 br_fdb_put * br_fdb_put() 通过钩子删除设备的硬件表项。 * 此函数为删除 MAC 地址表项的唯一接口,被多出调用。 * /
* 当端口加入桥时,或者桥端口 MAC 地址改变时,桥得到本地静态表项 * 这通过 * * 桥只有通过手动配置能得到非本地静态表项 * 这通过 * /
* * 此函数不再调用其他内部接口函数。 * /
* MAC 地址相同,MAC地址表中存在非本地表项,表示这可能是 * 从收到的数据包中学习到的。 * br_fdb_put() 通过钩子删除设备的硬件表项。 * 之后调用 fdb_create() 创建并插入新的本地静态 MAC 地址表项。 * 此函数被 br_fdb_changeaddr() 和 br_fdb_insert() 调用。 * /
* 此函数不再调用其他内部接口函数。 ********************************************************************** * 此函数与 __ * __ * fdb_find() 由调用者根据 MAC 地址计算 Hash 值,此函数不忽略过期表项。 * __ * fdb_find() 维护 MAC 地址时使用,根据源 MAC 或设备 MAC 维护地址表。 * /
|