- 論壇徽章:
- 13
|
本帖最后由 karma303 于 2016-07-06 17:19 編輯
本來想更新到這篇舊帖子里的,但覺得這部分有點(diǎn)兒“地理大發(fā)現(xiàn)”的感覺,就專門貼出來,跟各位交流。
我說的“地理大發(fā)現(xiàn)”,是說wiki上的ip header的布局圖,它們用0,1,2,3,4,5,6,7細(xì)分出每個字節(jié)的bit,但wiki上的0,1,2,3,4,5,6,7,分別對應(yīng)常規(guī)思維的7,6,5,4,3,2,1,0。
1.png (49.58 KB, 下載次數(shù): 194)
下載附件
2016-07-06 17:16 上傳
到這里我才發(fā)現(xiàn),原來wiki上給出的布局圖,是徹徹底底的按照“大端思維“來走的。
其實(shí)wiki就從RFC里摘的圖,1981年的文檔,那時的程序員為什么會反著看bit?(是沒經(jīng)過x86的洗禮嗎?)
題外話:
在上一篇帖子里,我貼了一點(diǎn)關(guān)于bitfield跨字節(jié)的測試。
其實(shí)今天意識到這個問題,也是從ip header里的offset成員開始的,我發(fā)現(xiàn)沒辦法用bitfield來表示這個成員。
2.png (33.41 KB, 下載次數(shù): 216)
下載附件
2016-07-06 17:16 上傳
如果編譯目標(biāo)是小端機(jī)器,gcc是沒有辦法用bitfield來表示offset這個成員的。
所以linux內(nèi)核里,很粗暴的定義成:
__be16 frag_off;
__be16就是unsigned short。
然后在代碼里再分解它:
offset = ntohs(ip_hdr(skb)->frag_off);
flags = offset & ~IP_OFFSET;
offset &= IP_OFFSET;
offset <<= 3; /* offset is in 8-byte chunks */ |
評分
-
查看全部評分
|