他們分別返回IP頭和MAC頭嗎?我有點困惑,因爲只是看着實現,他們返回的指針是skb-> head + skb-> network_header等等。爲什麼不通過做skb-> network_header來獲得網絡標題?sk_buff函數skb_network_header()和skb_mac_header()做什麼?
謝謝!
他們分別返回IP頭和MAC頭嗎?我有點困惑,因爲只是看着實現,他們返回的指針是skb-> head + skb-> network_header等等。爲什麼不通過做skb-> network_header來獲得網絡標題?sk_buff函數skb_network_header()和skb_mac_header()做什麼?
謝謝!
#ifdef NET_SKBUFF_DATA_USES_OFFSET
static inline unsigned char *skb_network_header(const struct sk_buff)
{
return skb->head + skb->network_header;
}
#else
static inline unsigned char *skb_network_header(const struct sk_buff *skb)
{
return skb->network_header;
}
基本上2個版本中,如果NET_SKBUFF_DATA_USES_OFFSET是在效果(例如,對於64位體系結構),.network_header
是一個從起始位置的偏移。
我假設你看內核源代碼somewhere like this
如果我們削減了一些代碼,我認爲它變得像這樣:
#ifdef NET_SKBUFF_DATA_USES_OFFSET static inline unsigned char *skb_network_header(const struct sk_buff *skb) { return skb->head + skb->network_header; } static inline unsigned char *skb_mac_header(const struct sk_buff *skb) { return skb->head + skb->mac_header; } #else /* NET_SKBUFF_DATA_USES_OFFSET */ static inline unsigned char *skb_network_header(const struct sk_buff *skb) { return skb->network_header; } static inline unsigned char *skb_mac_header(const struct sk_buff *skb) { return skb->mac_header; } #endif /* NET_SKBUFF_DATA_USES_OFFSET */
爾加 - 你打我吧! +1 –
哦,我明白了,謝謝,我沒有看到其他定義。這現在是有道理的! – stakSmashr