好久沒有隨筆了,帖下昨天的一部分筆記吧,現在在研究 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。