Linux skbuff注释笔记
SKB结构定义 /usr/src/linux/include/linux/skbuff.h
sk_buff_head:
1 struct sk_buff_head { //SKB的头结点 2 /* These two members must be first. */ 3 struct sk_buff *next; 4 struct sk_buff *prev; 5 6 __u32 qlen; //队列长度 7 spinlock_t lock; //自旋锁 8 };
sk_buff:
/** * struct sk_buff - socket buffer * @next: Next buffer in list * @prev: Previous buffer in list * @sk: Socket we are owned by * @tstamp: Time we arrived * @dev: Device we arrived on/are leaving by * @input_dev: Device we arrived on * @h: Transport layer header * @nh: Network layer header * @mac: Link layer header * @dst: destination entry * @sp: the security path, used for xfrm * @cb: Control buffer. Free for use by every layer. Put private vars here * @len: Length of actual data * @data_len: Data length * @mac_len: Length of link layer header * @csum: Checksum * @local_df: allow local fragmentation * @cloned: Head may be cloned (check refcnt to be sure) * @nohdr: Payload reference only, must not modify header * @pkt_type: Packet class * @fclone: skbuff clone status * @ip_summed: Driver fed us an IP checksum * @priority: Packet queueing priority * @users: User count - see {datagram,tcp}.c * @protocol: Packet protocol from driver * @truesize: Buffer size * @head: Head of buffer * @data: Data head pointer * @tail: Tail pointer * @end: End pointer * @destructor: Destruct function * @mark: Generic packet mark * @nfct: Associated connection, if any * @ipvs_property: skbuff is owned by ipvs * @nfctinfo: Relationship of this skb to the connection * @nfct_reasm: netfilter conntrack re-assembly pointer * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c * @tc_index: Traffic control index * @tc_verd: traffic control verdict * @dma_cookie: a cookie to one of several possible DMA operations * done by skb DMA functions * @secmark: security marking */ struct sk_buff { /* These two members must be first. */ struct sk_buff *next; struct sk_buff *prev; struct sock *sk; //宿主传输控制块,本地发送或本地接收时有效,转发时为空 struct skb_timeval tstamp; //时间戳 struct net_device *dev; //网络设备指针 struct net_device *input_dev; //接收报文的原始网络设备,包为本地生成时为空,用于流量控制 union { //指向四层协议首部,包含的数据结构表示在这一层上可以解析的协议 struct tcphdr *th; struct udphdr *uh; struct icmphdr *icmph; struct igmphdr *igmph; struct iphdr *ipiph; struct ipv6hdr *ipv6h; unsigned char *raw; // 用于初始化 } h; union { //指向三层协议首部 struct iphdr *iph; struct ipv6hdr *ipv6h; struct arphdr *arph; unsigned char *raw; } nh; union { //指向二层协议首部 unsigned char *raw; } mac; struct dst_entry *dst; //目的路由缓存 struct sec_path *sp; //IPSec协议用来跟踪传输的信息 /* * This is the control buffer. It is free to use for every * layer. Please put your private variables there. If you * want to keep them across layers you have to do a skb_clone() * first. This is owned by whoever has the skb queued ATM. */ char cb[48]; //信息控制块,存储每层自己的私有信息 unsigned int len, //数据部分长度,包含首部长度 data_len, //SG类型和FRAGLIST类型聚合分散I/O存储区中的数据长度 mac_len; //数据链路层首部长度 union { __wsum csum; //校验状态为CHECKSUM_NONE时,存放所负载数据报的数据部分校验和 __u32 csum_offset; //校验状态为CHECKSUM_PARTIAL时,记录传输层首部中的校验和字段的偏移 }; __u32 priority; //发送或转发数据包QoS类别, __u8 local_df:1, //表示此SKB在本地允许分片 cloned:1, //标记所属SKB是否被克隆 ip_summed:2, //标记传输层校验和的状态 nohdr:1, //标识payload是否被单独引用 nfctinfo:3; //被防火墙使用 __u8 pkt_type:3, //帧类型 fclone:2, //当前克隆状态 ipvs_property:1; __be16 protocol; //链路层协议类型 void (*destructor)(struct sk_buff *skb); //析构函数指针,释放时调用,没有宿主传输控制块时为空 #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. */ unsigned int truesize; //缓存区总长度 atomic_t users; //引用计数,标识有多少实体引用SKB,为零时释放 unsigned char *head, //指向缓存区头 *data, //指向数据头 *tail, //指向数据尾 *end; //指向缓存区尾 };
skb_shared_info:
1 struct skb_shared_info { //保存数据块的附加信息 2 atomic_t dataref; //引用计数器 3 unsigned short nr_frags; 4 unsigned short gso_size; 5 /* Warning: this field is not always filled in (UFO)! */ 6 unsigned short gso_segs; 7 unsigned short gso_type; 8 __be32 ip6_frag_id; 9 struct sk_buff *frag_list; 10 skb_frag_t frags[MAX_SKB_FRAGS]; 11 };