智能网卡驱动之 sk_buff

一、结构体定义原型

首先来看 sk_buff 这个庞大的结构体。无需逐字段死记,只需了解其主要成员和用途,后文会重点介绍典型成员变量。

struct sk_buff {
   
   
    union {
   
   
        struct {
   
   
            /* 链表中的下一个 sk_buff 指针,用于管理 skb 的链表 */
            struct sk_buff *next;
            /* 链表中的前一个 sk_buff 指针,形成双向链表 */
            struct sk_buff *prev;
            union {
   
   
                /* 关联的网络设备指针,指向处理此 skb 的网络设备 */
                struct net_device *dev;
                /* 某些协议可能会在这里使用空间存储信息 */
                unsigned long dev_scratch;
            };
        };
        struct rb_node rbnode;         // 红黑树节点
        struct list_head list;         // 链表头节点
        struct llist_node ll_node;     // 低延迟链表节点
    };

    union {
   
   
        struct sock *sk;               // 关联的 socket
        int ip_defrag_offset;          // IP 分片偏移
    };

    union {
   
   
        ktime_t tstamp;                // 时间戳
        u64 skb_mstamp_ns;             // 最早发送时间
    };
    /*
     * 控制缓冲区(cb)。每个层可以自由使用此区域存储私有变量。
     * 如果希望跨层保留数据,需使用 skb_clone() 进行克隆。
     */
    char cb[48] __aligned(8);         // 控制缓冲区

    union {
   
   
        struct {
   
   
            unsigned long _skb_refdst; // 目标引用地址
            void (*destructor)(struct sk_buff *skb); // 析构函数
        };
        struct list_head tcp_tsorted_anchor; // TCP 排序锚点
    };

#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
    unsigned long _nfct;              // 连接追踪标识
#endif

    unsigned int len;                 // skb 的总长度
    unsigned int data_len;            // 非线性数据长度
    __u16 mac_len;                    // MAC 头部长度
    __u16 hdr_len;                    // 数据包头部长度
    __u16 queue_mapping;              // 队列映射

    __u8 __cloned_offset[0];          // 克隆信息偏移
    __u8 cloned:1, nohdr:1, fclone:2, peeked:1, head_frag:1, pfmemalloc:1, pp_recycle:1;

#ifdef CONFIG_SKB_EXTENSIONS
    __u8 active_extensions;           // 活动扩展数量
#endif

    __u32 headers_start[0];           // 头部开始位置

    __u8 __pkt_type_offset[0];        // 包类型偏移
    __u8 pkt_type:3;                  // 包类型(如 IP、ARP)
    __u8 ignore_df:1;                 // 忽略 DF 标志
    __u8 nf_trace:1<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值