/*标识payload是否被单独引用,不存在协议首部*/
nohdr:1,
/*防火墙使用*/
nfctinfo:3;
/*桢类型,分类是由二层目的地址来决定的,对于以太网设备
来说,该字段由eth_type_trans()初始化*/
__u8 pkt_type:3,
/*当前克隆状态*/
fclone:2,
ipvs_property:1;
/*从二层设备角度看到的上层协议,即链路层承载的三层协议类型*/
__be16 protocol;
/*skb析构函数指针,在释放skb时被调用,完成某些必要的工作*/
void (*destructor)(struct sk_buff *skb);
/*在数据结构中定义的宏不能编译成模块;
原因在于内核编译之后,开启该选项所得
的多数结果为不可逆的,一般而言,任何
引起内核数据结构改变的选项,都不适合
编译成一个模块,编译选项和特定的#ifdef
符号相配,以了解一个代码区块什么时候
会包含到内核中,这种关联在源码树的
Kconfig文件中*/
#ifdef CONFIG_NETFILTER
/*防火墙使用*/
struct nf_conntrack *nfct;
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
struct sk_buff *nfct_reasm;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
/*防火墙使用*/
struct nf_bridge_info *nf_bridge;
#endif
#endif /* CONFIG_NETFILTER */
#ifdef CONFIG_NET_SCHED
/*用于流量控制*/
__u16 tc_index; /* traffic control index */
#ifdef CONFIG_NET_CLS_ACT
/*用于流量控制*/
__u16 tc_verd; /* traffic control verdict */
#endif
#endif
#ifdef CONFIG_NET_DMA
dma_cookie_t dma_cookie;
#endif
#ifdef CONFIG_NETWORK_SECMARK
__u32 secmark;
#endif
__u32 mark;
/* These elements must be at the end, see alloc_skb() for details. */
/*全部数据的长度+该结构的长度,如果申请了一个len字节的缓冲区
该字段为len+sizeof(sk_buff)*/
unsigned int truesize;
/*引用计数,使用这个缓冲区的实例的数目*/
atomic_t users;
/*head和end指向数据在内存中的起始和结束位置,即
已经分配的缓冲区空间的开端和尾端
data和tail指向数据区域的起始和结束位置,即
实际数据的开端和尾端*/
unsigned char *head,
*data,
*tail,
*end;
};
|