天天看點

多隊列網卡簡介以及Linux通過網卡發送資料包源碼解讀

首先我們看一下一個主流多隊列網卡(E1000)跟多核CPU之間的關系圖:

非多隊列:

linux的網卡由結構體net_device表示,一個該結構體對應一個可以排程的資料包發送隊列。

資料包的實體在核心中以結構體sk_buff(skb),形如:

多隊列:

一個網卡可以擁有多個隊列

接下來,看看TX引擎是如何工作的(注:對于發送和接收資料包有兩個名詞,分别應對TX,RX)

解釋:

函數-dev_queue_xmit():入隊一個buffer以傳輸到網絡驅動裝置。

配合該函數的源碼來解釋上圖的傳輸過程:

步驟一:可以看到如果裝置支援隊列,則資料包入裝置隊列。在入隊操作前後,有加鎖和釋放隊列鎖的過程。

步驟二:調出裝置的qdisc(該對象是隊列的排隊規則)

QDisc(排隊規則)是queueingdiscipline的簡寫,它是了解流量控制(traffic

control)的基礎。無論何時,核心如果需要通過某個網絡接口發送資料包,它都需要按照為這個接口配置的qdisc(排隊規則)把資料包加入隊列。然後,核心會盡可能多地從qdisc裡面取出資料包,把它們交給網絡擴充卡驅動子產品。最簡單的QDisc是pfifo它不對進入的資料包做任何的處理,資料包采用先入先出的方式通過隊列。不過,它會儲存網絡接口一時無法處理的資料包。

步驟三:重置skb的隊列映射,置為0

步驟四:tx lock->hard_start_xmit

到這裡,我們好像沒有看到tx_lock、hard_start_xmit函數,反而我們在無隊列的裝置分支中看到了這些:

Dev_hard_start_xmit的定義:

很明顯我們應該撥開雲霧看到一些本質,再次回到裝置支援隊列的分支中(這才是我們關心的):

不管怎麼樣,你總該有發送的函數調用吧,就是下面圈起來的這個:

果不其然,這是一個封裝函數:

參考:

<a href="http://www.landley.net/kdocs/ols/2007/ols2007v2-pages-305-310.pdf" target="_blank">http://www.landley.net/kdocs/ols/2007/ols2007v2-pages-305-310.pdf</a>

<a href="http://vger.kernel.org/~davem/davem_nyc09.pdf" target="_blank">http://vger.kernel.org/~davem/davem_nyc09.pdf</a>

<a href="http://www.chineselinuxuniversity.net/kerneldocs/networking/API-dev-queue-xmit.html" target="_blank">http://www.chineselinuxuniversity.net/kerneldocs/networking/API-dev-queue-xmit.html</a>

<a href="http://apps.hi.baidu.com/share/detail/36206005" target="_blank">http://apps.hi.baidu.com/share/detail/36206005</a>

<a href="http://cache.baidu.com/c?m=9d78d513d98017f419bc837f7d01d0120e55f0237b8bc7150ec3e54c84145d563164f4cd25351174c4b5777075d95e2cebe74703234460e99492ce0c9fac935b3295776a2d499141658243f4971532c157c304b2ff4ab7e9e732e4ff8f8cc2040d97061832daabc8015c41ca65ed4771a5fdc816424240b8fa3013a4537d2c992742b750f997682858df&amp;p=ce7ddc1187904eac59b5c4710e14d625&amp;user=baidu&amp;fm=sc&amp;query=qdisc_run+%D6%B4%D0%D0%B9%FD%B3%CC&amp;qid=f6ae9cf00151dde4&amp;p1=1" target="_blank">http://cache.baidu.com/c?m=9d78d513d98017f419bc837f7d01d0120e55f0237b8bc7150ec3e54c84145d563164f4cd25351174c4b5777075d95e2cebe74703234460e99492ce0c9fac935b3295776a2d499141658243f4971532c157c304b2ff4ab7e9e732e4ff8f8cc2040d97061832daabc8015c41ca65ed4771a5fdc816424240b8fa3013a4537d2c992742b750f997682858df&amp;p=ce7ddc1187904eac59b5c4710e14d625&amp;user=baidu&amp;fm=sc&amp;query=qdisc%5Frun+%D6%B4%D0%D0%B9%FD%B3%CC&amp;qid=f6ae9cf00151dde4&amp;p1=1</a>

<a href="http://lwn.net/Articles/289137/" target="_blank">http://lwn.net/Articles/289137/</a>

原文釋出時間為:2012-04-21

繼續閱讀