当前位置:   article > 正文

linux内核网络源码分析--功能专用字段‘每日读书’

linux内核网络源码分析--功能专用字段‘每日读书’

linux内核模块允许选择包含什么以及省略什么因此只有当内核编译支持特定功能时候防火墙或者Qos某些字段才会包含在sk_buff数据结构

unsigned long nfmark

__u32 nfcache

__u32 nfctinfo

struct nf_conntrack *nfct

unsigned int nfdebug

struct nf_bridge_info *nf_bridge

这些参数netfileter 使用明确就是内核选项Device Drivers->Networking support->Networkiong options ->Networking packet filtering

以及两个子选项Network packet filtering debuggingBridged IP/ARP packets filteriing 所用

uinon {...} private

这个联合HIPPI(High Performance Parallel interface 高性能并行接口)使用

先关联内核选项Device Drivers->Networking support->Networkong device support

__u32 tc_index

__u32 tc_verd

__u32 tc_classid

这些参数流量控制功能使用明确就是内核选项Device Drivers->Networking support->Networking options->Qos and /or fair queueing 以及其他选项Packet classifier API使用

struct sec_path *sp

IPsec协议组使用以及记录转换信息

管理函数

内核通常提供许多很短很简单函数用以操作sk_buff元素或者元素列表2-4协助描述其中最重要几个函数

首先我们来看用于分配释放缓冲区函数然后用于头部或者预留空间操作指针函数skb->data

如果你查看一下include/linux/skbuff.hNet/core/skbuff.c文件就会注意到几乎所有的函数两个版本名称类似do_something__do_something 通常来讲第一个包裹函数增加了额外合理性检查或者调用第二个函数前后加入上锁机制内部所用__do_somethng 形式通常不会直接调用违反规则通常写得很差函数最终都会修正

sk->data

sk->len

sk->tail

skb_put. skb_push, skb_pull skb_reserve

内存分配alloc_skbdev_alloc_skb

定义在net/core/skbuff.c alloc_skb 是分配缓冲区主要函数我们已经知道数据缓冲区报头sk_buff 数据结构是两种不同实力也就说是建立一个缓冲区涉及两次分配内存一个是分配缓冲区一个分配sk_buff结构

然后嗲用kmalloc 取得一个数据缓冲区代码如下

skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask & &__GFP_DMA)

size = SKB_DATA_ALLIGN(size);

data = kmalloc();size + sizeof(struct skb_shared_info), gfp_mask

调用kmalloc之前size参数SKB_DATA_ALIGN进行调整强制对齐返回之前函数结构中一些参数初始化产生最后结果如图2-5所示

2-5 右侧内存区块低端可以发现引入了填充区域强制对齐skb_shared_info主要用于处理一些IP片段本章稍后予以描述左侧字段已经先前说明

填充区域 size SKB_DATA_ALIGN(size)

struct skb_shared_info

len = 0

head

data

tail

end

dev_alloc_skb 是由设备驱动程序使用缓冲区分配函数而且应该是中断模式中执行此函数是一个包裹alloc_skb函数为了优化原因申请大小之上16字节而且因为函数中断事件处理函数调用所以要求原子操作

GFP_ATOMIC

static inline struct sk_buff *dev_alloc_skb(unsigned int length)

{

return ++dev_alloc_skb(length, GFP_ATOMIC);

}

static inline struct sk_buff *__dev_alloc_skb(unsigned int length, int gfp_mask)

{

struct sk_buff *skb = alloc_skb(length + 16, gfp_mask)

if (likyly(skb))

skb_reserve(skb, 16);

return skb;

}

没有体系结构说明定义__dev_alloc_skb 定义就是默认

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/492639
推荐阅读
相关标签
  

闽ICP备14008679号