转发数据库模块,即二层MAC-端口转发表处理模块
初始化:
->br_fdb_init() 创建net_bridge_fdb_entry结构的高速缓存
0,
SLAB_HWCACHE_ALIGN, NULL);
br_fdb_cache = kmem_cache_create("bridge_fdb_cache",
sizeof(struct net_bridge_fdb_entry),0,
SLAB_HWCACHE_ALIGN, NULL);
struct net_bridge_fdb_entry
{
struct hlist_node hlist;
struct net_bridge_port *dst; 目的出接口
struct rcu_head rcu;
unsigned long ageing_timer; 用于判断老化的相关时间戳
mac_addr addr; MAC地址
unsigned char is_local;
unsigned char is_static; 是否是静态,不会老化
};
{
struct hlist_node hlist;
struct net_bridge_port *dst; 目的出接口
struct rcu_head rcu;
unsigned long ageing_timer; 用于判断老化的相关时间戳
mac_addr addr; MAC地址
unsigned char is_local;
unsigned char is_static; 是否是静态,不会老化
};
释放:
->void br_fdb_fini(void)
->kmem_cache_destroy(br_fdb_cache)
更新:
->br_fdb_update()
->struct hlist_head *head = &br->hash[br_mac_hash(addr)]; 从hash表中获得头节点 addr为报文的源MAC地址
->fdb = fdb_find(head, addr); 匹配源地址
->找到:fdb->dst = source; fdb->ageing_timer = jiffies; 收到该MAC地址的报文,更新时间戳 source为入接口
->未找到:fdb_create(head, source, addr, 0); 创建一个新的表项
创建:
->fdb_create()
->fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); 申请新的节点
设置表项成员变量
是否老化:
->__br_fdb_get()
->has_expired(br, fdb)