亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 7073 | 回復: 7
打印 上一主題 下一主題

[LINUX][DRIVER]網卡(千兆網卡)是如何檢驗checksum的? [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-06-03 18:32 |只看該作者 |倒序瀏覽
這個話題是提問linux中支持硬件檢驗和的網卡是如何檢驗checksum的?

TCP/UDP協(xié)議收到數據包后, 會檢查checksum。UDP層檢驗checksum時,
檢查的內容包含一個偽頭,UDP頭部,以及負載。格式如下:

---------------------------------------------------+
bits         0 – 7         8 – 15   16 – 23     24 – 31    |
0                    Source address                   |  
32                    Destination address               |
64         Zeros |        Protocol |              UDP length          |
---------------------------------------------------+
96         Source Port         |     Destination Port       |
128         Length         |          Checksum          |
---------------------------------------------------+
                                                     |
                   Data                            |
                                                   |
---------------------------------------------------+
偽頭:就是前面8個字節(jié)
udp頭:就是中間的8個字節(jié)。
負載: 就是DATA部分。注意data的長度不一定等于udp頭部的length值,而等于所有負載的長度,即等于skb中l(wèi)en。


當一個網卡收到數據包時,是如何進行進行checksum的?下面是我的猜測:
收到數據包后,識別開IP頭,UDP頭,然后僅僅是對UDP頭部length所指向的數據長度,結合udp頭部的checksum進行校驗。
如果checksum正確,就設置skb中的ip_summed為CHECKSUM_UNNECESSARY,就是告訴UDP層不要再進行檢驗校驗和了。

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
2 [報告]
發(fā)表于 2010-06-04 09:30 |只看該作者
可以找一下內核中支持硬件計算校驗和的驅動代碼看一下

論壇徽章:
0
3 [報告]
發(fā)表于 2010-06-04 10:24 |只看該作者
"支持硬件檢驗和的網卡是如何檢驗checksum的?"

如果是E1000, 在硬件中直接做掉了,在RCV DESCRIPTOR中有一個BIT,表示CHECKSUM是否通過。再往OS傳就不清楚鳥。

可以直接看 PCI/PCI-X Family of Gigabit Ethernet
Controllers Software Developer’s
Manual

論壇徽章:
0
4 [報告]
發(fā)表于 2010-06-05 23:04 |只看該作者
你好,謝謝的回復。
我只看懂了下面的代碼,還沒有找到網卡驅動是如何計算checksum的。


e1000e的網卡是支持硬件檢驗checksum。那這部分工作應該是硬件來完成的,而不是驅動來完成。
驅動中有計算 checksum的代碼嗎?

下面的代碼是檢查完checksum之后,用來設置skb->ip_summed值的。
  1. drivers/net/e1000e/netdev.c
  2. /**
  3. * e1000_rx_checksum - Receive Checksum Offload for 82543
  4. * @adapter:     board private structure
  5. * @status_err:  receive descriptor status and error fields
  6. * @csum:        receive descriptor csum field
  7. * @sk_buff:     socket buffer with received data
  8. **/
  9. static void e1000_rx_checksum(struct e1000_adapter *adapter, u32 status_err,
  10.                               u32 csum, struct sk_buff *skb)
  11. {
  12.         u16 status = (u16)status_err;
  13.         u8 errors = (u8)(status_err >> 24);
  14.         skb->ip_summed = CHECKSUM_NONE;

  15.         /* Ignore Checksum bit is set */
  16.         if (status & E1000_RXD_STAT_IXSM)
  17.                 return;
  18.         /* TCP/UDP checksum error bit is set */
  19.         if (errors & E1000_RXD_ERR_TCPE) {  <===checksun錯誤
  20.                 /* let the stack verify checksum errors */
  21.                 adapter->hw_csum_err++;
  22.                 return;
  23.         }

  24.         /* TCP/UDP Checksum has not been calculated */
  25.         if (!(status & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS)))
  26.                 return;

  27.         /* It must be a TCP or UDP packet with a valid checksum */
  28.         if (status & E1000_RXD_STAT_TCPCS) {
  29.                 /* TCP checksum is good */
  30.                 skb->ip_summed = CHECKSUM_UNNECESSARY; //這里檢驗和計算正確。也就是說網卡已經檢查了L4層的偽頭,L4層頭部,L4層負載以及L4層中所包含的checksum字段。這就告訴L4層不要再check checksum了。
  31.         } else {
  32.                 /*
  33.                  * IP fragment with UDP payload
  34.                  * Hardware complements the payload checksum, so we undo it
  35.                  * and then put the value in host order for further stack use.
  36.                  */
  37.                 __sum16 sum = (__force __sum16)htons(csum);
  38.                 skb->csum = csum_unfold(~sum);
  39.                 skb->ip_summed = CHECKSUM_COMPLETE;
  40.         }
  41.         adapter->hw_csum_good++;
  42. }
復制代碼
可以找一下內核中支持硬件計算校驗和的驅動代碼看一下
Godbach 發(fā)表于 2010-06-04 09:30

論壇徽章:
0
5 [報告]
發(fā)表于 2010-06-05 23:10 |只看該作者
硬件直接做的是CRC檢驗吧。CRC和checksum校驗是不同的。
硬件檢查完L4層的checksum是OK的,則L4層就可以不再檢查checksum了。

"支持硬件檢驗和的網卡是如何檢驗checksum的?"

如果是E1000, 在硬件中直接做掉了,在RCV DESCRIPTOR中有 ...
accessory 發(fā)表于 2010-06-04 10:24

論壇徽章:
0
6 [報告]
發(fā)表于 2010-06-05 23:27 |只看該作者
有點不清楚LZ你想問啥。下面是E1000硬件手冊里關于CHECKSUM部分

2.7.1 Checksum Offloading
The Ethernet controller provides the ability to offload the IP, TCP, and UDP checksum requirements
from the software device driver. For common frame types, the hardware automatically
calculates, inserts, and checks the appropriate checksum values normally handled by software.
For transmits, every Ethernet packet might have two checksums calculated and inserted by the
Ethernet controller. Typically, these would be the IP checksum, and either the TCP or UDP
checksum. The software device driver specifies which portions of the packet are included in the
checksum calculations, and where the calculated values are inserted via descriptors (refer to
Section 3.3.5 for details).
For receives, the hardware recognizes the packet type and performs the checksum calculations and
error checking automatically. Checksum and error information is provided to software through the
receive descriptors (refer to Section 3.2.9 for details).


ref:
http://download.intel.com/design ... s/8254x_GBe_SDM.pdf

論壇徽章:
0
7 [報告]
發(fā)表于 2010-06-07 22:30 |只看該作者
你好, 非常謝謝你的文檔。
我重新?lián)Q個角度問個問題吧。

網卡自動檢查TCP/UDP層的checksum,這個是硬件來實現(xiàn)的。
另外, 協(xié)議也是有能力來檢查TCP/UDP層的checksum, 這個稱為軟件方式。
對于同一個數據包,硬件和軟件檢查的結果,應該是相同的。

對于UDP協(xié)議、檢查checksum的方式是:將偽頭, UDP頭,以及UDP頭部中l(wèi)ength所指向的負荷, 二進制數取反求和, 如果結果為1,則說明UDP層的checksum是正確的。
但是現(xiàn)在我發(fā)現(xiàn)如果skb->len比UDP的length的值大時(比如UDP的負荷總長度是20字節(jié),而UDP頭部的length是16. UDP頭部的checksum包含了20字節(jié)的負荷),硬件和軟件所計算出來的checksun是不一致的。

所以, 我想問的是硬件檢查checksunm時, 究竟是只驗證了UDP頭部中l(wèi)ength所指向的負荷還是整個負載?


有點不清楚LZ你想問啥。下面是E1000硬件手冊里關于CHECKSUM部分

2.7.1 Checksum Offloading
The Ethern ...
accessory 發(fā)表于 2010-06-05 23:27

論壇徽章:
0
8 [報告]
發(fā)表于 2010-06-07 23:43 |只看該作者
具體細節(jié)就不清楚了。

不過有幾個問題,也許有幫助:

“如果skb->len比UDP的length的值大時”, 這個是正常情況么?如果是,在相關的RFC(假設有RFC的情況)中定義了標準的行為么?如果有,那么應該都是按照標準做的。如果沒有,那就看每個硬件具體的實現(xiàn)了,RTFM.
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP