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;
};