sk_buff函数skb_network_header()和skb_mac_header()有什么作用?

时间:2014-02-25 18:38:36

标签: c linux networking kernel

他们分别返回IP头和mac头吗?我有点困惑,因为只看实现,他们返回的指针是skb-> head + skb-> network_header等。为什么不通过skb-> network_header?

获取网络标头

谢谢!

2 个答案:

答案 0 :(得分:1)

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是从开始的偏移量。

答案 1 :(得分:0)

我假设您正在查看内核源代码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 */