好久沒有隨筆了,帖下昨天的一部分筆記吧,現在在研究 linux bridge 部分,希望實現與硬件switch的完美結合。
以下是內核 bridge 模塊初始化部分分析,內核版本是 2.6.23.9。只涉及到入口點,STP部分及其他細節部分沒有在這裏談及。通過這些入口,大致可以瞭解 linux bridge部分的流程了。Hope its useful. Any comment is welcome.
1. 模塊入口(br_init)
該函數初始化網橋模塊及入口點函數。
1.1. 初始化
- br_fdb_init()
- br_netfilter_init()
- register_netdevice_notifier()
- br_netlink_init()
- brioctl_set(br_ioctl_deviceless_stub) bridge與用戶態接口之一,另一個是dev_ioctl
- br_fdb_get_hook/br_fdb_put_hook 爲其他內核模塊提供的接口
1.2. 入口點流程
- br_stp_rcv
1 處理BPDU報文,如果STP是內核態,就交給內核STP協議棧處理。
- br_handle_frame
1 處理報文,包括br_stp_rcv沒有處理的BPDU;
2 能進入這個函數一定是bridge上的一個port,也就是收到報文的是網橋的一個端點;
3 對於目標地址是802.1D規定的保留地址的報文並且STP開啓,該函數執行NF_HOOK(NF_BR_LOCAL_IN),如果無人關心這個報文,即返回給上層函數,繼續走流程,報文離開bridge。
4 對於3沒有處理的報文,並且端點狀態是轉發或者學習狀態的報文進行處理,處理將進入br_handle_frame_finish。
- br_handle_frame_finish
1 網橋處於混雜模式或者報文目標地址是組播地址,該報文會走br_pass_frame_up流程。
2 同時,如果報文目標地址不是本網橋上的某一端點(!dst->is_local),該報文可能將複製,並進行forward。
- br_pass_frame_up
1 注意到,該函數切換skb->dev,並執行NF_HOOK(NR_BR_LOCAL_IN, netif_receive_skb),相當於重新接收報文,但是skb->dev是br,非port,因此進不到bridge處理流程,果真是pass up。