Linux网络协议栈之套接字缓冲区(二)

2014-11-24 12:29:28 · 作者: · 浏览: 7


/*标识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;



/*headend指向数据在内存中的起始和结束位置,即


已经分配的缓冲区空间的开端和尾端


datatail指向数据区域的起始和结束位置,即


实际数据的开端和尾端*/


unsigned char *head,


*data,


*tail,


*end;


};