在skbuff.h中,与mac相关的函数在linux内核中是如何工作的?

在skbuff.h中,与mac相关的函数在linux内核中是如何工作的?,c,linux-kernel,network-protocols,C,Linux Kernel,Network Protocols,我读了源代码,但确实把我弄糊涂了。例如,下面代码中的第三个函数sib\u mac\u header函数,sib->head是指向已分配缓冲区头的指针,sib->mac\u header是指向该缓冲区中mac\u头地址的指针。为什么两个地址相加的结果是指向MAC以太结构的指针 skbuff.h中的源代码如下所示: 1609 static inline void skb_reset_network_header(struct sk_buff *skb) 1610 { 1611 skb

我读了源代码,但确实把我弄糊涂了。例如,下面代码中的第三个函数sib\u mac\u header函数,sib->head是指向已分配缓冲区头的指针,sib->mac\u header是指向该缓冲区中mac\u头地址的指针。为什么两个地址相加的结果是指向MAC以太结构的指针

skbuff.h中的源代码如下所示:

1609 static inline void skb_reset_network_header(struct sk_buff *skb)
1610 {
1611         skb->network_header = skb->data - skb->head;
1612 }
1613 
1614 static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
1615 {
1616         skb_reset_network_header(skb);
1617         skb->network_header += offset;
1618 }
1619 
1620 static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
1621 {
1622         return skb->head + skb->mac_header;
1623 }

你误读了密码
skb->mac_头
不是直接指针。。。它存储mac头从skb->head的偏移量。事实上,在64位体系结构上,sk_buff_data_t是无符号int,
struct sk_buff
的许多成员都是显式偏移量(这个技巧通过将信息存储在4字节字段而不是8字节指针中来节省内存)