本文主要是介绍linux内核网络--skb_shared_info结构和skb_shinfo函数“每日读书”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如图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++;
这篇关于linux内核网络--skb_shared_info结构和skb_shinfo函数“每日读书”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!