Thursday, January 27, 2011

網路Driver 1 - sk_buff源码

sk_buff源码

Linux 2.6.26内核中sk_buff结构的定义如下:
struct sk_buff <include/linux/skbuff.h>
  1. /**  
  2.  *  struct sk_buff - socket buffer 
  3.  *  @next: Next buffer in list 
  4.  *  @prev: Previous buffer in list 
  5.  *  @sk: Socket we are owned by 
  6.  *  @tstamp: Time we arrived 
  7.  *  @dev: Device we arrived on/are leaving by 
  8.  *  @transport_header: Transport layer header 
  9.  *  @network_header: Network layer header 
  10.  *  @mac_header: Link layer header 
  11.  *  @dst: destination entry 
  12.  *  @sp: the security path, used for xfrm 
  13.  *  @cb: Control buffer. Free for use by every layer. Put private vars here 
  14.  *  @len: Length of actual data 
  15.  *  @data_len: Data length 
  16.  *  @mac_len: Length of link layer header 
  17.  *  @hdr_len: writable header length of cloned skb 
  18.  *  @csum: Checksum (must include start/offset pair) 
  19.  *  @csum_start: Offset from skb->head where checksumming should start 
  20.  *  @csum_offset: Offset from csum_start where checksum should be stored 
  21.  *  @local_df: allow local fragmentation 
  22.  *  @cloned: Head may be cloned (check refcnt to be sure) 
  23.  *  @nohdr: Payload reference only, must not modify header 
  24.  *  @pkt_type: Packet class 
  25.  *  @fclone: skbuff clone status 
  26.  *  @ip_summed: Driver fed us an IP checksum 
  27.  *  @priority: Packet queueing priority 
  28.  *  @users: User count - see {datagram,tcp}.c 
  29.  *  @protocol: Packet protocol from driver 
  30.  *  @truesize: Buffer size  
  31.  *  @head: Head of buffer 
  32.  *  @data: Data head pointer 
  33.  *  @tail: Tail pointer 
  34.  *  @end: End pointer 
  35.  *  @destructor: Destruct function 
  36.  *  @mark: Generic packet mark 
  37.  *  @nfct: Associated connection, if any 
  38.  *  @ipvs_property: skbuff is owned by ipvs 
  39.  *  @peeked: this packet has been seen already, so stats have been 
  40.  *      done for it, don’t do them again 
  41.  *  @nf_trace: netfilter packet trace flag 
  42.  *  @nfctinfo: Relationship of this skb to the connection 
  43.  *  @nfct_reasm: netfilter conntrack re-assembly pointer 
  44.  *  @nf_bridge: Saved data about a bridged frame - see br_netfilter.c 
  45.  *  @iif: ifindex of device we arrived on 
  46.  *  @queue_mapping: Queue mapping for multiqueue devices 
  47.  *  @tc_index: Traffic control index 
  48.  *  @tc_verd: traffic control verdict 
  49.  *  @ndisc_nodetype: router type (from link layer) 
  50.  *  @dma_cookie: a cookie to one of several possible DMA operations 
  51.  *      done by skb DMA functions 
  52.  *  @secmark: security marking 
  53.  */  
  54.   
  55. struct sk_buff {  
  56.     /* These two members must be first. */  
  57.     struct sk_buff      *next;  
  58.     struct sk_buff      *prev;  
  59.   
  60.     struct sock     *sk;  
  61.     ktime_t         tstamp;  
  62.     struct net_device   *dev;  
  63.   
  64.     union {  
  65.         struct  dst_entry   *dst;  
  66.         struct  rtable      *rtable;  
  67.     };  
  68.     struct  sec_path    *sp;  
  69.   
  70.     /* 
  71.      * This is the control buffer. It is free to use for every 
  72.      * layer. Please put your private variables there. If you 
  73.      * want to keep them across layers you have to do a skb_clone() 
  74.      * first. This is owned by whoever has the skb queued ATM. 
  75.      */  
  76.     char            cb[48];  
  77.   
  78.     unsigned int        len,  
  79.                 data_len;  
  80.     __u16           mac_len,  
  81.                 hdr_len;  
  82.     union {  
  83.         __wsum      csum;  
  84.         struct {  
  85.             __u16   csum_start;  
  86.             __u16   csum_offset;  
  87.         };  
  88.     };  
  89.     __u32           priority;  
  90.     __u8            local_df:1,  
  91.                 cloned:1,  
  92.                 ip_summed:2,  
  93.                 nohdr:1,  
  94.                 nfctinfo:3;  
  95.     __u8            pkt_type:3,  
  96.                 fclone:2,  
  97.                 ipvs_property:1,  
  98.                 peeked:1,  
  99.                 nf_trace:1;  
  100.     __be16          protocol;  
  101.   
  102.     void            (*destructor)(struct sk_buff *skb);  
  103. #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)  
  104.     struct nf_conntrack *nfct;  
  105.     struct sk_buff      *nfct_reasm;  
  106. #endif  
  107. #ifdef CONFIG_BRIDGE_NETFILTER  
  108.     struct nf_bridge_info   *nf_bridge;  
  109. #endif  
  110.   
  111.     int         iif;  
  112. #ifdef CONFIG_NETDEVICES_MULTIQUEUE  
  113.     __u16           queue_mapping;  
  114. #endif  
  115. #ifdef CONFIG_NET_SCHED  
  116.     __u16           tc_index;   /* traffic control index */  
  117. #ifdef CONFIG_NET_CLS_ACT  
  118.     __u16           tc_verd;    /* traffic control verdict */  
  119. #endif  
  120. #endif  
  121. #ifdef CONFIG_IPV6_NDISC_NODETYPE  
  122.     __u8            ndisc_nodetype:2;  
  123. #endif  
  124.     /* 14 bit hole */  
  125.   
  126. #ifdef CONFIG_NET_DMA  
  127.     dma_cookie_t        dma_cookie;  
  128. #endif  
  129. #ifdef CONFIG_NETWORK_SECMARK  
  130.     __u32           secmark;  
  131. #endif  
  132.   
  133.     __u32           mark;  
  134.   
  135.     sk_buff_data_t      transport_header;  
  136.     sk_buff_data_t      network_header;  
  137.     sk_buff_data_t      mac_header;  
  138.     /* These elements must be at the end, see alloc_skb() for details.  */  
  139.     sk_buff_data_t      tail;  
  140.     sk_buff_data_t      end;  
  141.     unsigned char       *head,  
  142.                 *data;  
  143.     unsigned int        truesize;  
  144.     atomic_t        users;  
  145. };  

This entry was posted in Software Development. Bookmark the permalink.

No comments:

Post a Comment