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 debugging和Bridged 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.h和Net/core/skbuff.c文件,就会注意到几乎所有的函数都由两个版本,名称类似do_something和__do_something 通常来讲,第一个是包裹函数,增加了额外的合理性检查或者在调用第二个函数前后加入上锁机制,内部所用的__do_somethng 形式通常不会被直接调用,违反规则时通常写得很差的函数,而最终都会被修正。

sk->data

sk->len

sk->tail

skb_put. skb_push, skb_pull skb_reserve

内存分配:alloc_skb和dev_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 的定义就是默认的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/798400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xss.pwnfunction-Ugandan Knuckles

这个是把<>过滤掉了所以只能用js的事件 ?weya"onfocus"alert(1337)" autofocus"

基于springboot的社区医疗服务系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

数据结构面试题报错调试方法记录

栈和队列报错调试 1.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 此题解题思路如下&#xff1a; 先将数据放在pushst栈里面&#xff0c;popst栈为空再把pushst栈里面的数据放进popst栈里面去&#xff0c;不为空则不执行。不为空时候直接拿取栈…

基于C语言实现 SQL数据库和链表的相互转换

使用的函数介绍 这里sqlite3_open、sqlite3_close就不介绍了 sqlite3_prepare_v2()&#xff1a; 函数原型&#xff1a;int sqlite3_prepare_v2(sqlite3* db, const char* zSql, int nByte, sqlite3_stmt** ppStmt, const char** pzTail);作用&#xff1a;准备 SQL 语句以供执…

WSL2迁移后默认登陆用户为root的解决方案

第一步&#xff0c;在wsl的root用户下面用vim打开/etc/wsl.conf文件 vim /etc/wsl.conf第二步&#xff0c;在文件中添加以下代码, 仅需把user_name替换成你原来wsl的用户名即可 [user] defaultuser_name如 [user] defaultpengyuyan重启wsl,在powershell下输入 wsl --shutdo…

【GDB】GDB解CORE文件

目录 一 GDB解析CORE文件(Linux) 二 GDB解析CORE文件(QNX) 在 Linux 系统中,当一个进程发生崩溃或异常时,它会生成一个所谓的 core dump 文件,其中包含了该进程的内存映像和一些调试信息。这个文件可以用于分析和解决崩溃问题,以便了解进程崩溃时的状态和原因

多模态text-image模型之ITM loss(blip)

主要代码&#xff1a; # forward the positve image-text pair # 正向传播正面的图像文本对 output_pos self.text_encoder.bert(encoder_embedstext_embeds, attention_masktext.attention_mask,encoder_hidden_statesimage_embeds,encoder_attention_maskimage_atts, …

【技术笔记】Ubuntu下VirtualBox不能识别USB解决办法(手把手解决)

环境说明 系统版本&#xff1a;Ubuntu 20.04 VirtualBox版本&#xff1a; 7.0.12 解决过程 扩展下载&#xff0c;进入VirtualBox 官方下载路径。选择本机安装版本&#xff0c;如下图所示&#xff0c;因笔者是7.0.x版本&#xff0c;因此点击第一条链接&#xff1b; 进入版本页…

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

慢SQL问题排查

慢SQL问题排查是一个系统性的过程&#xff0c;它涉及到对数据库性能、查询优化以及系统资源的深入理解。 1. 收集慢查询日志 启用慢查询日志&#xff1a;大多数数据库系统&#xff08;如MySQL、PostgreSQL等&#xff09;都支持慢查询日志功能。启用该功能后&#xff0c;数据库…

关于npm和yarn的使用(自己的问题记录)

目录 一 npm 和 yarn 常用命令 二 package.json中 devDependencies 和 dependencies 的区别。 三 npm安装包时&#xff0c;加 --save和不加的区别 一 npm 和 yarn 常用命令 备注&#xff1a;以下命令以 axios 为例。 未完&#xff1a;待续。。。。 二 ​​​​​​​ …

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建&#xff1a;computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

【教程】VOC数据集制作

语义分割任务中VOC数据集的制作&#xff0c;任务中只有一种标签&#xff1a;gas 文章目录 1、由黑白图像识别为txt标签2、txt转json3、数据集转VOC格式 1、由黑白图像识别为txt标签 由于使用CycleGAN网络进行风格迁移学习&#xff0c;生成了大量伪标签图像&#xff0c;因此需…

【递归与递推】数的计算|数的划分|耐摔指数

1.数的计算 - 蓝桥云课 (lanqiao.cn) 思路&#xff1a; 1.dfs的变量>每一次递归什么在变&#xff1f; &#xff08;1&#xff09;当前数的大小一直在变&#xff1a;sum &#xff08;2&#xff09;最高位的数&#xff1a;k 2.递归出口&#xff1a;最高位数字为1 3.注意&#…

鱼塘钓鱼(c++实现)

题目 有 N 个鱼塘排成一排&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5 时&#xff0c;如下表&#xff1a; 即&#xff1a;在第 1 个鱼塘中钓鱼第 1 分钟内可钓到 10 条鱼&#xff0c;第 2 分钟内只能钓到 8 条鱼&#xff0c;……&#xff0c;第 5 分…

Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andreys Tree&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 我们假设删除任意一个结点后&#xff0c;我们会将整个树切分为k个联通块&#xff0c;那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。 那么最小代价是啥呢? 图解分…

0基础进入IT行业

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 方向一&#xff1a;学习路径 对于零基础进入 IT 行业的人来说&#xff…

第十五题:最大距离

题目描述 在数列 a1,a2,⋯ ,an​中&#xff0c;定义两个元素 ai 和 aj​ 的距离为∣i−j∣∣ai−aj∣&#xff0c;即元素下标的距离加上元素值的差的绝对值&#xff0c;其中 ∣x∣ 表示 x 的绝对值。 给定一个数列&#xff0c;请问找出元素之间最大的元素距离。 输入描述 …

【网站项目】校园订餐小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

鱼骨图功能实现

dom: <div class="module-content"><div class="title"><span>[</span><p>鱼骨图</p><span>]</span></div><div class="line-mian"></div><div :ref="module + i&q…