????3??skb_shared_info????


struct skb_shared_info {
 unsigned short nr_frags;
 unsigned short gso_size;//???
 /* Warning: this field is not always filled in (UFO)! */
 unsigned short gso_segs;//???
 unsigned short  gso_type;
 __be32          ip6_frag_id;
 __u8  tx_flags;
 struct sk_buff *frag_list;//?????sk_buff?б?
 struct skb_shared_hwtstamps hwtstamps;//???????

 /*
  * Warning : all fields before dataref are cleared in __alloc_skb()
  */
 atomic_t dataref;//??ü???

 /* Intermediate layers must ensure that destructor_arg
  * remains valid until skb destructor */
 void *  destructor_arg;

 /* must be last field?? see pskb_expand_head() */
 skb_frag_t frags[MAX_SKB_FRAGS];
};
 


???????????????????????????????????????????skb????


#define skb_shinfo(SKB) ((struct skb_shared_info *)(skb_end_pointer(SKB)))

 

#ifdef NET_SKBUFF_DATA_USES_OFFSET
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
 return skb->head + skb->end;
}
#else
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
 return skb->end;
}
#endif


???????????????????????????????????skb??end???????????????洢??????????

????????????й?sk_buff???????????????

????????????http://blog.csdn.net/yming0221/article/details/7971463