linux 3.18.1 Bridge 代码学习
1.网桥部分的代码在linux/net/bridge/目录下
网桥模块的初始化在br.c:br_init()函数中开始:
a. 注册生成树协议(STP)到stp.c:stp_proto 变量中
由于以后处理BPDU协议报文
b. bridge转发表memcache的初始化(即二层地址表),
struct net_bridge_fdb_entry
c. 注册网桥对应net namespace的初始化和退出的操作函数
网桥只注册了退出操作函数
d. 注册netdevice的事件通告处理函数
对于是网桥设备接口的事件,要进行相关的处理
例如网桥设备移除,添加等都有进行mac地址表的更新
e. 网桥netlink的初始化,
注册br_af_ops 到rtnl_af_ops
注册br_link_ops 到link_ops list
f. 设置ioctl的hook函数br_ioctl_hook = br_ioctl_deviceless_stub
在网桥模块的初始化有如下代码(br_netlink.c):
rtnl_af_register(&br_af_ops);
rtnl_link_register(&br_link_ops);
这两个注册的操作函数,主要供rtnetlink.c
下面注册的如下netlink协议消息的处理函数使用
rtnl_register(PF_UNSPEC, RTM_GETLINK, rtnl_getlink,
rtnl_dump_ifinfo, rtnl_calcit);
rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, NULL);
rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, NULL);
rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, NULL);
net/core/dev.c:Netif_rx() -> netif_rx_internal()-> enqueue_to_backlog()
->加入到每个cpu对应的软件中断softnet_data.input_pkt_queue中
最后产生一个软中断.
在net/core/dev.c:net_dev_init() 中注册了收包软件中断的处理函数
net_rx_action() 最后调用softnet_data.backlog.poll = process_backlog()
来处理报文
在net/core/dev.c:process_backlog()会从先前的队列中获取报文
交给__netif_receive_skb()处理
在net/core/dev.c:__netif_receive_skb() ->__netif_receive_skb_core()
进行vlan处理 ptype_all下所有list的处理
handle_ing()处理(TC流量控制在这里实现的?)
dev->rx_handler()处理,每个网络设备dev有个相关的
rx_handler处理函数(bridge是在这里处理的,
网桥设备dev都注册了自己的rx_handler函数)
ptype_base list的处理
阅读(3110) | 评论(0) | 转发(0) |