当前位置:  技术问答>linux和unix

关于sk_buffer

    来源: 互联网  发布时间:2016-06-06

    本文导语:  在layer 3, sk_buffer->h.raw指什么?sk_buffer->data指什么?是指3层协议头的位置还是负载数据的起始位置? | 简单的说,skbuff所占有的内存空间分为两大部分,一个是数据缓冲区,一个结构本身所占有的空间...

在layer 3, sk_buffer->h.raw指什么?sk_buffer->data指什么?是指3层协议头的位置还是负载数据的起始位置?

|
简单的说,skbuff所占有的内存空间分为两大部分,一个是数据缓冲区,一个结构本身所占有的空间(用于组成双向循环链表中的结点),

sk_buffer->h.raw 是指向数据缓冲区的第3层部分,是没有结构化的原始流数据,
而data指针是动态改变的,用于在分层处理数据包时,不同层的函数所操作的data是不一样的,
具体的说,驱动程序处理时,data指向mac.raw, 当经过netif_rx,data指向h.raw,等等

|
struct sk_buff {

                struct sk_buff                     *next;

                struct sk_buff                     *prev;

                struct sock                          *sk;

                struct skb_timeval             tstamp;

                struct net_device         *dev;

                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;

                } h;

                union {

                                struct iphdr          *iph;

                                struct ipv6hdr      *ipv6h;

                                struct arphdr       *arph;

                                unsigned char     *raw;

                } nh;

                union {

                                unsigned char     *raw;

                } mac;

 

                struct  dst_entry                 *dst;

                struct     sec_path              *sp;

                char                                       cb[40];

 

                unsigned int                         len,

                                                                data_len,

                                                                mac_len,

                                                                csum;

                __u32                                    priority;

 

                __u8                                       local_df:1,

                                                                cloned:1,

                                                                ip_summed:2,

                                                                nohdr:1,

                                                                nfctinfo:3;

                __u8                                       pkt_type:3,

                                                                fclone:2;

                __be16                                  protocol;

                void                                       (*destructor)(struct sk_buff *skb);

 

                /* These elements must be at the end, see alloc_skb() for details.  */

                unsigned int                         truesize;

                atomic_t                               users;

                unsigned char                     *head,

                                                *data,

                                                *tail,

                                                *end;

};

 


肯定是不是纯粹的数据其实位置 

|
另外,在内核代码的skbuff.h里面有对struct sk_buff的自解释性说明,可以直接读懂每一个结构成员的含义。

如下:

/** 
 * struct sk_buff - socket buffer
 * @next: Next buffer in list
 * @prev: Previous buffer in list
 * @sk: Socket we are owned by
 * @tstamp: Time we arrived
 * @dev: Device we arrived on/are leaving by
 * @transport_header: Transport layer header
 * @network_header: Network layer header
 * @mac_header: Link layer header
 * @dst: destination entry
 * @sp: the security path, used for xfrm
 * @cb: Control buffer. Free for use by every layer. Put private vars here
 * @len: Length of actual data
 * @data_len: Data length
 * @mac_len: Length of link layer header
 * @hdr_len: writable header length of cloned skb
 * @csum: Checksum (must include start/offset pair)
 * @csum_start: Offset from skb->head where checksumming should start
 * @csum_offset: Offset from csum_start where checksum should be stored
 * @local_df: allow local fragmentation
 * @cloned: Head may be cloned (check refcnt to be sure)
 * @nohdr: Payload reference only, must not modify header
 * @pkt_type: Packet class
 * @fclone: skbuff clone status
 * @ip_summed: Driver fed us an IP checksum
 * @priority: Packet queueing priority
 * @users: User count - see {datagram,tcp}.c
 * @protocol: Packet protocol from driver
 * @truesize: Buffer size 
 * @head: Head of buffer
 * @data: Data head pointer
 * @tail: Tail pointer
 * @end: End pointer
 * @destructor: Destruct function
 * @mark: Generic packet mark
 * @nfct: Associated connection, if any
 * @ipvs_property: skbuff is owned by ipvs
 * @peeked: this packet has been seen already, so stats have been
 * done for it, don't do them again
 * @nf_trace: netfilter packet trace flag
 * @nfctinfo: Relationship of this skb to the connection
 * @nfct_reasm: netfilter conntrack re-assembly pointer
 * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
 * @iif: ifindex of device we arrived on
 * @queue_mapping: Queue mapping for multiqueue devices
 * @tc_index: Traffic control index
 * @tc_verd: traffic control verdict
 * @ndisc_nodetype: router type (from link layer)
 * @do_not_encrypt: set to prevent encryption of this frame
 * @requeue: set to indicate that the wireless core should attempt
 * a software retry on this frame if we failed to
 * receive an ACK for it
 * @dma_cookie: a cookie to one of several possible DMA operations
 * done by skb DMA functions
 * @secmark: security marking
 * @vlan_tci: vlan tag control information
 */

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 【求助】怎么填充一个sk_buffer,发送一个UDP包?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3