一、通过brctl addif br xxx命令间接调用到br_add_if函数。
br_add_if => br_if.c
{
....
//此处修改了dev对应收包处理函数为br_handle_frame。
netdev_rx_handler_register(dev, br_handle_frame, p);
....
}
二、收包函数br_handle_frame。
br_handle_frame => br_input.c
{
//1、is_link_local_ether_addr函数判断目的mac是否是特殊地址(stp等),是则转入本地处理。
//2、获取skb->dev指向的数据struct net_bridge_port *p。
//3、p->state == BR_STATE_FORWARDING :先执行ebtables-broute表规则,再执行下面BR_STATE_LEARNING相关部分。
//4、p->state == BR_STATE_LEARNING : 先执行 NF_BR_PRE_ROUTING 链规则,之后进入br_handle_frame_finish。
}
三、函数br_handle_frame_finish。
br_handle_frame_finish
{
//1、根据目地mac地址寻找出口。分三种情况,广播mac地址,多播mac地址,fdb表查询mac地址
//2、如果找到出口,执行br_forward函数,否则执行br_flood_forward,将遍历网桥下的所有接口(不包含当前收入接口),逐个接口发送数据包。
//3、如果是发往本地的执行 br_pass_frame_up。
}
未完,待续。。。