zoukankan      html  css  js  c++  java
  • Linux skbuff注释笔记

    SKB结构定义   /usr/src/linux/include/linux/skbuff.h

    sk_buff_head:
    1 struct sk_buff_head {            //SKB的头结点
    2     /* These two members must be first. */
    3     struct sk_buff    *next;     
    4     struct sk_buff    *prev;
    5 
    6     __u32        qlen;           //队列长度
    7     spinlock_t    lock;          //自旋锁
    8 };
    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
     *    @input_dev: Device we arrived on
     *    @h: Transport layer header
     *    @nh: Network layer header
     *    @mac: 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
     *    @csum: Checksum
     *    @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
     *    @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
     *    @tc_index: Traffic control index
     *    @tc_verd: traffic control verdict
     *    @dma_cookie: a cookie to one of several possible DMA operations
     *        done by skb DMA functions
     *    @secmark: security marking
     */
    
    struct sk_buff {
        /* These two members must be first. */
        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;           //IPSec协议用来跟踪传输的信息
    
        /*
         * This is the control buffer. It is free to use for every
         * layer. Please put your private variables there. If you
         * want to keep them across layers you have to do a skb_clone()
         * first. This is owned by whoever has the skb queued ATM.
         */
        char            cb[48];           //信息控制块,存储每层自己的私有信息
    
        unsigned int        len,          //数据部分长度,包含首部长度
                    data_len,             //SG类型和FRAGLIST类型聚合分散I/O存储区中的数据长度
                    mac_len;              //数据链路层首部长度
        union {
            __wsum        csum;           //校验状态为CHECKSUM_NONE时,存放所负载数据报的数据部分校验和
            __u32        csum_offset;     //校验状态为CHECKSUM_PARTIAL时,记录传输层首部中的校验和字段的偏移
        };
        __u32            priority;        //发送或转发数据包QoS类别,
        __u8            local_df:1,       //表示此SKB在本地允许分片
                    cloned:1,             //标记所属SKB是否被克隆
                    ip_summed:2,          //标记传输层校验和的状态
                    nohdr:1,              //标识payload是否被单独引用
                    nfctinfo:3;           //被防火墙使用
        __u8            pkt_type:3,       //帧类型
                    fclone:2,             //当前克隆状态
                    ipvs_property:1;
        __be16            protocol;       //链路层协议类型
    
        void            (*destructor)(struct sk_buff *skb);           //析构函数指针,释放时调用,没有宿主传输控制块时为空
    #ifdef CONFIG_NETFILTER
        struct nf_conntrack    *nfct;                                 //被防火墙使用
    #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
        struct sk_buff        *nfct_reasm;
    #endif
    #ifdef CONFIG_BRIDGE_NETFILTER
        struct nf_bridge_info    *nf_bridge;                          //被防火墙使用
    #endif
    #endif /* CONFIG_NETFILTER */
    #ifdef CONFIG_NET_SCHED
        __u16            tc_index;    /* traffic control index 流量控制*/
    #ifdef CONFIG_NET_CLS_ACT
        __u16            tc_verd;    /* traffic control verdict */
    #endif
    #endif
    #ifdef CONFIG_NET_DMA
        dma_cookie_t        dma_cookie;
    #endif
    #ifdef CONFIG_NETWORK_SECMARK
        __u32            secmark;
    #endif
    
        __u32            mark;
    
        /* These elements must be at the end, see alloc_skb() for details.  */
        unsigned int        truesize;        //缓存区总长度
        atomic_t        users;               //引用计数,标识有多少实体引用SKB,为零时释放
        unsigned char        *head,          //指向缓存区头
                    *data,                   //指向数据头
                    *tail,                   //指向数据尾
                    *end;                    //指向缓存区尾
    };
    skb_shared_info:
     1 struct skb_shared_info {                  //保存数据块的附加信息
     2     atomic_t    dataref;                  //引用计数器
     3     unsigned short    nr_frags;
     4     unsigned short    gso_size;
     5     /* Warning: this field is not always filled in (UFO)! */
     6     unsigned short    gso_segs;
     7     unsigned short  gso_type;
     8     __be32          ip6_frag_id;
     9     struct sk_buff    *frag_list;
    10     skb_frag_t    frags[MAX_SKB_FRAGS];
    11 };
  • 相关阅读:
    最新 蓝鲸人java校招面经 (含整理过的面试题大全)
    最新 上海轻轻java校招面经 (含整理过的面试题大全)
    最新 苏州朗动java校招面经 (含整理过的面试题大全)
    最新 医渡云java校招面经 (含整理过的面试题大全)
    变量的自动类型转换和强制类型转换(day01_10)
    java的数据类型(day01_09)
    常用的dos命令操作(day01_03)
    1.镜像-虚拟光驱-光驱
    Spring基于配置文件的方式来配置AOP
    Spring-AOP(切面的优先级&&&重用切点表达式)
  • 原文地址:https://www.cnblogs.com/duanv/p/4518128.html
Copyright © 2011-2022 走看看