转发数据库模块,即二层MAC-端口转发表处理模块 初始化:
->br_fdb_init() 创建 net_bridge_fdb_entry结构的高速缓存
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; 是否是静态,不会老化
};
释放: ->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)