preface
linux核心對網路驅動程式使用統一的介面,並且對於網路裝置採用物件導向的思想設計。
linux核心採用分層結構處理網路資料報。分層結構與網路協議的結構匹配,既能簡化資料報處理流程,又便於擴充套件和維護。
核心網路結構
在linux核心中,對網路部分按照網路協議層、網路裝置層、裝置驅動功能層和網路媒介層的分層體系設計。
網路驅動功能層主要通過網路驅動程式實現。
在linux核心,所有的網路裝置都被抽象為乙個介面處理,該介面提供了所有的網路操作。
net_device結構表示網路裝置在核心中的情況,也就是網路裝置介面。網路裝置介面既包括軟體虛擬的網路裝置介面,如環路裝置,也包括了網路硬體裝置,如乙太網卡。
linux核心有乙個dev_base的全域性指標,指向乙個裝置鍊錶,包括了系統內的所有網路裝置。該裝置鍊錶每個節點是乙個網路裝置。
在net_device結構中提供了許多供系統訪問和協議層呼叫的裝置方法,包括初始化、開啟關閉裝置、資料報傳送和接收等。
與網路有關的資料結構
核心對網路資料報的處理都是基於sk_buff結構的,該結構是核心網路部分最重要的資料結構。
網路協議棧中各層協議都可以通過對該結構的操作實現本層協議資料的新增或者刪除。使用sk_buff結構避免了網路協議棧各層來回複製資料導致的效率低下。
sk_buff結構可以分為兩個部分,一部分是儲存資料報快取,在圖中表示為packertdata,另一部分是由一組用於核心管理的指標組成。
sk_buff管理的指標最主要的是下面4個:
資料報的大小在核心網路協議棧的處理過程中會發生改變,因此data和tail指標也會不斷變化,而head和tail指標是不會發生改變的。
對於乙個tcp資料報為例,sk_buff還提供了幾個指標直接指向各層協議頭。mac指標指向資料的mac頭;nh指標指向網路協議頭,一般是ip協議頭;h指向傳輸層協議頭,在本例中是tcp協議頭。
對各層設定指標的是方便了協議棧對資料報的處理。
net_device結構
linux核心中網路裝置最重要的資料結構就是net_device結構了,它是網路驅動程式最重要的部分。
net_device結構儲存在include/linux/netdevices.h標頭檔案,理解該結構對理解網路裝置驅動有很大幫助。
核心中所有網路裝置的資訊和操作都在net_device裝置中,無論是註冊網路裝置,還是設定網路裝置引數,都用到該結構。
下面是主要資料成員。
資料報接收流程
在linux核心中,乙個網路資料報從網絡卡接收到使用者空間需要經過鏈路層、傳輸層和socket的處理,最終到達使用者空間。
以dm9000網絡卡為例,當網絡卡收到資料報以後,呼叫中斷處理函式dm9000_interrupt(),該函式檢查中斷處理型別,如果是接收資料報中斷,則呼叫dm9000_rx()函式接收資料報到核心空間。
dm9000_rx()函式收到資料報完成後,核心會繼續呼叫netif_rx()函式,函式的作用是把網絡卡接收到資料提交給協議棧處理。
協議棧使用net_rx_action()函式處理接收資料報佇列,該函式處理資料報後如果是 ip資料報則提交給ip_recv()函式處理。ip_recv()函式主要是檢查乙個資料報ip頭的合法性,檢查通過後交給ip_local_deliver()和ip_local_deliver_finish()函式處理,之所以分開處理是因為核心中有防火牆相關的**需要動態載入到此處。
ip頭處理完畢後,以udp資料報為例將交由udp_recv()函式處理,與 ip_recv()函式類億,該函式檢查 udp頭的合法性,然後交給udp_queue_recv()函式處理,最後提交給sock_queue_recv()函式處理。
資料報進入 socket部分的第乙個函式是skb_recv_datagram(),該函式從核心的 socket佇列取出資料報,交給 socket部分的udp_recvmsg()函式,該函式負責處理udp的資料,sock_recvmsg()處理提交給sock_read()函式。
sock_read()函式讀取接收到的資料緩衝,把資料返回給sys_read()系統呼叫。sys_read()函式呼叫最終把資料複製到使用者空間,供使用者使得。
資料報傳送流程
以udp資料報傳送流程為例,在dm9000網絡卡上如何傳送乙個資料報。
當使用者空間的應用程式通過 socket函式sento()傳送乙個udp資料後,會呼叫核心空間的sock_writev()函式,然後通過sock_sendmsg()函式處理。sock_sendmsg()函式呼叫inet_sendmsg()函式處理,inet_sendmsg()函式會把要傳送的資料交給傳輸層的udp_sendmsg()函式處理。
udp_sendmsg()函式在資料前加入udp頭,然後把資料交給ip_build_xmit()函式處理,該函式根據 socket提供的目的 ip和埠資訊構造ip頭,然後呼叫output_maybe_reroute()函式處理。out_maybe_reroute()函式檢查資料報是否需要經過路由,最後交給ip_output()函式寫入到傳送佇列,寫入完成後由ip_finish_output()函式處理後續工作。
鏈路層的dev_queue_xmit()函式處理傳送佇列,呼叫 dm9000網絡卡的傳送資料報函式dm9000_xmit()傳送資料報,傳送完畢後,呼叫dm9000_xmit_done函式處理傳送結果。
linux 網絡卡驅動
如何安裝linux網絡卡驅動呢,看看下面的說明。適用機型 所有xseries 205 所有xseries 206 所有xseries 225 所有xseries 226 所有xseries 235 所有xseries 236 所有xseries 255 所有xseries 305 所有xseries...
Linux檢視網絡卡驅動 更新驅動
擴充套件卡為82599es網絡卡,通過查詢得知82599es為x520型別。驅動為ixgbe 將網絡卡驅動公升級至2.4.10版本 tar zxf i40e 2.4.10.tar.gz cd i40e 2.4.10 src make install rmmod i40e modprobe i40e ...
linux 核心網路雜燴
linux核心網路驅動屬於iso的第二層,資料鏈路層 其中sk buff在資料報的收發中起關鍵性作用,作為資料的載體,經由每一層其資料區域都在變化,關於sk buff相關資料,以下幾篇很不錯,主要講解sk buff的結構以及在每一層的變化過程,學習網路驅動,sk buff是重要的乙個結構體,必須足夠...