129 struct sk_buff {
130         /* These two members must be first. */
131         struct sk_buff  * next;                 /* Next buffer in list                          */
132         struct sk_buff  * prev;                 /* Previous buffer in list                      */
133
134         struct sk_buff_head * list;             /* List we are on                               */
135         struct sock     *sk;                    /* Socket we are owned by                       */
136         struct timeval  stamp;                  /* Time we arrived                              */
137         struct net_device       *dev;           /* Device we arrived on/are leaving by          */
138
139         /* Transport layer header */
140         union
141         {
142                 struct tcphdr   *th;
143                 struct udphdr   *uh;
144                 struct icmphdr  *icmph;
145                 struct igmphdr  *igmph;
146                 struct iphdr    *ipiph;
147                 struct spxhdr   *spxh;
148                 unsigned char   *raw;
149         } h;
150
151         /* Network layer header */
152         union
153         {
154                 struct iphdr    *iph;
155                 struct ipv6hdr  *ipv6h;
156                 struct arphdr   *arph;
157                 struct ipxhdr   *ipxh;
158                 unsigned char   *raw;
159         } nh;
160  
161         /* Link layer header */
162         union
163         {      
164                 struct ethhdr   *ethernet;
165                 unsigned char   *raw;
166         } mac;
167
168         struct  dst_entry *dst;
169
170         /*
171          * This is the control buffer. It is free to use for every
172          * layer. Please put your private variables there. If you
173          * want to keep them across layers you have to do a skb_clone()
174          * first. This is owned by whoever has the skb queued ATM.
175          */
176         char            cb[48]; 
177
178         unsigned int    len;                    /* Length of actual data                        */
179         unsigned int    data_len;
180         unsigned int    csum;                   /* Checksum                                     */
181         unsigned char   __unused,               /* Dead field, may be reused                    */
182                         cloned,                 /* head may be cloned (check refcnt to be sure). */
183                         pkt_type,               /* Packet class                                 */
184                         ip_summed;              /* Driver fed us an IP checksum                 */
185         __u32           priority;               /* Packet queueing priority                     */
186         atomic_t        users;                  /* User count - see datagram.c,tcp.c            */
187         unsigned short  protocol;               /* Packet protocol from driver.                 */
188         unsigned short  security;               /* Security level of packet                     */
189         unsigned int    truesize;               /* Buffer size                                  */
190
191         unsigned char   *head;                  /* Head of buffer                               */
192         unsigned char   *data;                  /* Data head pointer                            */
193         unsigned char   *tail;                  /* Tail pointer                                 */
194         unsigned char   *end;                   /* End pointer                                  */
195
196         void            (*destructor)(struct sk_buff *);        /* Destruct function            */
197 #ifdef CONFIG_NETFILTER
198         /* Can be used for communication between hooks. */
199         unsigned long   nfmark;
200         /* Cache info */
201         __u32           nfcache;
202         /* Associated connection, if any */
203         struct nf_ct_info *nfct;
204 #ifdef CONFIG_NETFILTER_DEBUG
205         unsigned int nf_debug;
206 #endif
207 #endif /*CONFIG_NETFILTER*/
208
209 #if defined(CONFIG_HIPPI)
210         union{
211                 __u32   ifield;
212         } private;
213 #endif
214
215 #ifdef CONFIG_NET_SCHED
216        __u32           tc_index;               /* traffic control index */
217 #endif
218 };