【发布时间】:2014-02-25 18:38:36
【问题描述】:
它们是否分别返回 IP 标头和 MAC 标头?我有点困惑,因为只看实现,它们返回的指针是 skb->head + skb->network_header 等。为什么不直接通过 skb->network_header 获取网络头呢?
谢谢!
【问题讨论】:
标签: c linux networking kernel
它们是否分别返回 IP 标头和 MAC 标头?我有点困惑,因为只看实现,它们返回的指针是 skb->head + skb->network_header 等。为什么不直接通过 skb->network_header 获取网络头呢?
谢谢!
【问题讨论】:
标签: c linux networking kernel
skb_network_header()有2个版本
#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;
}
基本上,如果 NET_SKBUFF_DATA_USES_OFFSET 有效(例如,对于 64 位架构),.network_header 是从开始的偏移量。
【讨论】:
我假设您正在查看内核源代码somewhere like this
如果我们删掉一些代码,我认为它会变成这样:
#ifdef NET_SKBUFF_DATA_USES_OFFSET 静态内联无符号字符 *skb_network_header(const struct sk_buff *skb) { 返回 skb->head + skb->network_header; } 静态内联无符号字符 *skb_mac_header(const struct sk_buff *skb) { 返回 skb->head + skb->mac_header; } #else /* NET_SKBUFF_DATA_USES_OFFSET */ 静态内联无符号字符 *skb_network_header(const struct sk_buff *skb) { 返回 skb->network_header; } 静态内联无符号字符 *skb_mac_header(const struct sk_buff *skb) { 返回 skb->mac_header; } #endif /* NET_SKBUFF_DATA_USES_OFFSET */【讨论】: