首先是大藍圖
linux
而後是心得:網絡
linux每一個真實設備在報文來時可由硬件中斷觸發netif_rx,而後由上半段軟件中斷觸發下半段的net_rx_action處理上半段收到的報文,這時會調用設備對應的rx_handler回調函數. 重點來了,由於這個硬件設備被綁定在虛擬的網橋設備中,因此他的接受處理函數被換掉了.因而調用rx_handler實際是調用br_handle_frame.函數
br_handle_frame中就會使用報文信息進行網橋相關的處理了,最重要的網橋學習和生成樹協議都會在這裏處理。學習
網橋相關的處理完成後會將該報文的入口設備換成虛擬網橋的設備,而後主動調用netif_recive_skb。看吧,如今對外表現就像虛擬網橋收到一個報文同樣了而且網橋設備的rx_handler是網絡設備默認的入口函數netdev_frame_hook。而後按傳統流程處理就好了..net
綜上,網橋在原有報文接收處理流程上追加了一個環路。blog
與網橋關聯的報文的發送和接收相似,會在原有的發送流程上追加一個環路,當在環路中完成網橋相關處理後會將報文綁定爲合適的真實設備.
ci
最後,網橋的學習能夠看作兩類,主動和被動。被動型是根據傳輸過的報文的源mac來構建後續報文的傳輸路徑,而主動型則是最小生成樹協議,這個主要是解決路由環路的問題。路由
最小生成樹能夠參考這個文章http://my.oschina.net/u/572632/blog/284010。回調函數
linux-3.6
面碼io