linux kernel bridge entrance

好久沒有隨筆了,帖下昨天的一部分筆記吧,現在在研究 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->devbr,非port,因此進不到bridge處理流程,果真是pass up

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章