如图2-5所示,数据缓冲区尾端有个名为skb_shared_info的数据结构,用以保持此数据区块的附加信息,此数据结构紧接在标记数据尾端的end指针之后,此数据结构的定义如下,

struct skb_shared_info {

    atomic_t dataref;

    unsigned int nr_frags;

    unsigned short tso_size;

    unsigned short tso_segs;

    struct sk_buff *frag_list;

    skb_frag_t frags[MAX_SKB_FRAGS];

};

dataref 代表的是数据块的用户数目, 下一节,缓冲区的克隆和拷贝,中会对此予以描述。nr_frags, frag_list以及frags 用于处理IP片段,在第二十一章回对此予以描述。skb_is_nonlinear 函数可用于检查缓冲区是否为片段。而skb_linearize 可以用于吧几个片段合压成一个均一的single flat缓冲区,合压几个片段时会引发拷贝,因为会使性能下降。

有些网络接口卡network interface card, NIC 可以采用硬件处理一些传统上由CPU所做的任务,最常见的例子就是L3和L4层的校验和计算,有些NIC甚至可以维护L4协议的状态机。在这里给出这段代码的原因在于,我们感兴趣的是TCP节段写在TCP segementaion offload ,TSO。 NIC在这里实现了TCP层的子集,此功能会用到tso_size和tso_segs/

注意,sk_buff 结构中没有指向skb_shared_info数据结构的字段,为了访问该结构,函数必须使用返回end 指针的skb_shinfo宏。

#define skb_shinfo (SKB) ((struct skb_shared_info*))((SKB)->end)

例如,如下语句显示出该红如何用于增加私有块的一个字段。

skb_shinfo(skb)->wr_frags++;

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐