2012年1月12日 星期四

[Linux] skb_reserve(2)

我們都知道
skb_reserve(2)

是為了把Ethernet 頭部對齊以增加效率(14+2)

但其實
dev_alloc_skb()...
這funciton 本身也預留了一個
NET_SKB_PAD 大小空間在 headroom,通常是
#define NET_SKB_PAD 32

所以skb_push推的時候...  不要再推過頭啦!!!(痛...

有時各家的driver 會預留不同大小的NET_SKB_PAD,一般是拿來做特製的Buffer Tag(如夾帶特別的Flag,又不想影響封包的內容),這樣skb_copy() 就會複製下去,自己修改skb struct 增加項目是比較麻煩的唷,這樣改要修改其他部分。
參照: __copy_skb_header()
即可知道

當然偷偷使用skb->cb欄位也可以,要注意沒有其他地方也偷用就是XD

--
另外
ip_header()
net_header()
兩個頭部取用的function 要記得
skb->network_header
skb->transport_header

已經init 好位置.... O__Q 棍...