As we trim the SKB, this page will keep track of the size and layout of this structure. This is done for a 64-bit architecture, structure offsets are in the first column.


struct sk_buff {
0x00	struct sk_buff		*next;
0x08	struct sk_buff		*prev;
0x10	struct sock		*sk;
0x18	struct timeval		stamp;
0x28	struct net_device	*dev;
0x30	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;
0x38	} h;
	union {
		struct iphdr	*iph;
		struct ipv6hdr	*ipv6h;
		struct arphdr	*arph;
		unsigned char	*raw;
0x40	} nh;
	union {
	  	unsigned char 	*raw;
0x48	} mac;
0x50	struct  dst_entry	*dst;
0x58	struct	sec_path	*sp;
0x60	char			cb[40];

0x88	unsigned int		len,
0x8c				data_len,
0x90				mac_len,
0x94				csum;
0x98	__u32			priority;
0x9c	__u8			local_df:1,
				cloned:1,
				ip_summed:2,
				nohdr:1,
				nfctinfo:3;
0x9d	__u8			pkt_type;
0x9e	__u16			protocol;
0xa0	void			(*destructor)(struct sk_buff *skb);
0xa8	__u32			nfmark;
0xb0	struct nf_conntrack	*nfct;
0xb8	__u8			ipvs_property:1;
0xc0	struct nf_bridge_info	*nf_bridge;
0xc8	__u16			tc_index;
0xca	__u16			tc_verd;
0xcc	unsigned int		truesize;
0xd0	atomic_t		users;
0xd8	unsigned char		*head,
0xe0				*data,
0xe8				*tail,
0xf0				*end;
};