linux Socket 缓存 介绍

重要成员变量

这里介绍的成员是驱动可能需要存取的. 以非特别的顺序列出它们.
struct net_device *dev;
接收或发送这个缓存的设备
union { /* ... */ } h;
union { /* ... */ } nh;
union { /*... */} mac;
指向报文中包含的各级的头的指针. union 中的某个成员都是一个不同数据结构类
型的指针. h 含有传输层头部指针(例如, struct tcphdr *th); nh 包含网络层头
部(例如 struct iphdr *iph); 以及 mac 包含链路层头部指针(例如 struct
ethkr * ethernet).
如果你的驱动需要查看 TCP 报文的源和目的地址, 可以在 skb->h.th 中找到. 看
头文件来找到全部的可以这样存取的头部类型.

注意网络驱动负责设置进入报文的 mac 指针. 这个任务正常是由 eth_type_trans
处理, 但是 非以太网驱动不得不直接设置 skb->mac.raw, 如同"非以太网头部"一
节所示.
unsigned char *head;
unsigned char *data;
unsigned char *tail;
unsigned char *end;
用来寻址报文中数据的指针. head 指向分配内存的开始, data 是有效字节的开始
(并且常常稍微比 head 大一些), tail 是有效字节的结尾, end 指向 tail 能够
到达的最大地址. 查看它的另一个方法是可用缓存空间是 skb->end - skb->head,
当前使用的空间是 skb->tail - skb->data.
unsigned int len;
unsigned int data_len;
len 是报文中全部数据的长度, 而 data_len 是报文存储于单个片中的部分的长度.
除非使用发散/汇聚 I/O, data_len 成员的值为 0.
unsigned char ip_summed;
这个报文的校验和策略. 由驱动在进入报文上设置这个成员, 如在"报文接收"一节
中描述的.
unsigned char pkt_type;
在递送中使用的报文分类. 驱动负责设置它为 PACKET_HOST (报文是给自己的),
PACKET_OTHERHOST (不, 这个报文不是给我的), PACKET_BROADCAST, 或者
PACKET_MULTICAST. 以太网驱动不显式修改 pkt_type, 因为 eth_type_trans 为
它们做.
shinfo(struct sk_buff *skb);
unsigned int shinfo(skb)->nr_frags;
skb_frag_t shinfo(skb)->frags;
由于性能的原因, 有些 skb 信息存储于一个分开的结构中, 它在内存中紧接着
skb. 这个"shared info"(这样命名是因为它可以在网络代码中多个 skb 拷贝中共
享)必须通过 shinfo 宏定义来存取. 这个结构中有几个成员, 但是大部分超出本
书的范围. 我们在"发散/汇聚 I/O"一节中见过 nr_frags 和 frags.
在结构中剩下的成员不是特别有趣. 它们用来维护缓存列表, 来统计 socket 拥有的缓存
大小, 等等.

作用于 socket 缓存的函数

使用一个 sk_buff 结构的网络驱动利用正式接口函数来操作它. 许多函数操作一个
socket 缓存; 这里是最有趣的几个:
struct sk_buff *alloc_skb(unsigned int len, int priority);
struct sk_buff *dev_alloc_skb(unsigned int len);
分配一个缓存区. alloc_skb 函数分配一个缓存并且将 skb->data 和 skb->tail
都初始化成 skb->head. dev_alloc_skb 函数是使用 GFP_ATOMIC 优先级调用
alloc_skb 的快捷方法, 并且在 skb->head 和 skb->data 之间保留了一些空间.
这个数据空间用在网络层之间的优化, 驱动不要动它.
void kfree_skb(struct sk_buff *skb);
void dev_kfree_skb(struct sk_buff *skb);
void dev_kfree_skb_irq(struct sk_buff *skb);
void dev_kfree_skb_any(struct sk_buff *skb);
释放缓存. kfree_skb 调用由内核在内部使用. 一个驱动应当使用一种
dev_kfree_skb 的变体: 在非中断上下文中使用 dev_kfree_skb, 在中断上下文中
使用 dev_kfree_skb_irq, 或者 dev_kfree_skb_any 在任何 2 种情况下.
unsigned char *skb_put(struct sk_buff *skb, int len);
unsigned char *__skb_put(struct sk_buff *skb, int len);
更新 sk_buff 结构中的 tail 和 len 成员; 它们用来增加数据到缓存的结尾, 每
个函数的返回值是 skb->tail 的前一个值(换句话说, 它指向刚刚创建的数据空
间). 驱动可以使用返回值通过引用 memcpy(skb_put(...), data, len) 来拷贝数
据或者一个等同的东东. 两个函数的区别在于 skb_put 检查以确认数据适合缓存,
而 __skb_put 省略这个检查.
unsigned char *skb_push(struct sk_buff *skb, int len);
unsigned char *__skb_push(struct sk_buff *skb, int len);
递减 skb->data 和递增 skb->len 的函数. 它们与 skb_put 相似, 除了数据是添
加到报文的开始而不是结尾. 返回值指向刚刚创建的数据空间. 这些函数用来在发
送报文之前添加一个硬件头部. 又一次, __skb_push 不同在它不检查空间是否足
够.
int skb_tailroom(struct sk_buff *skb);
返回可以在缓存中放置数据的可用空间数量. 如果驱动放了多于它能持有的数据到
缓存中, 系统傻掉. 尽管你可能反对说一个 printk 会足够来标识出这个错误, 内
存破坏对系统是非常有害的以至于开发者决定采取确定的动作. 实际中, 你不该需
要检查可用空间, 如果缓存被正确地分配了. 因为驱动常常在分配缓存前获知报文
的大小, 只有一个严重坏掉的驱动会在缓存中安放太多的数据, 这样出乱子就可当
作一个应得的惩罚.
int skb_headroom(struct sk_buff *skb);
返回 data 前面的可用空间数量, 就是, 可以 "push" 给缓存多少字节.

void skb_reserve(struct sk_buff *skb, int len);
递增 data 和 tail. 这个函数可用来在填充数据前保留空间. 大部分以太网接口
保留 2 个字节在报文的前面; 因此, IP 头对齐到 16 字节, 在 14 字节的以太网
头后面. snull 也这样做, 尽管没有在"报文接收"一节中展现这个指令以避免在那
时引入过多概念.
unsigned char *skb_pull(struct sk_buff *skb, int len);
从报文的头部去除数据. 驱动不会需要使用这个函数, 但是为完整而包含在这儿.
它递减 skb->len 和递增 skb->data; 这是硬件头如何从进入报文开始被剥离.
int skb_is_nonlinear(struct sk_buff *skb);
返回一个真值, 如果这个 skb 分离为多个片为发散/汇聚 I/O.
int skb_headlen(struct sk_buff *skb);
返回 skb 的第一个片的长度(由 skb->data 指着).
void *kmap_skb_frag(skb_frag_t *frag);
void kunmap_skb_frag(void *vaddr);
如果你必须从内核中的一个非线性 skb 直接存取片, 这些函数为你映射以及去映
射它们. 使用一个原子性 kmap, 因此你不能一次映射多于一个片.
内核定义了几个其他的作用于 socket 缓存的函数, 但是它们是打算用于高层网络代码,
驱动不需要它们.

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

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

相关文章

牛客NC267071小红构造数组(C++)

题目链接 实现方法 本题分为两步: 质因数分解;数字重排序(相同数字不连续) 质因数分解使用线性筛法,并在求质因数的过程中不断减小原数字。 数字重排序与重排字符串方法相同。 使用有序集合multiset存放各质因数及…

简述Elasticsearch(ES)是什么 全文搜索概念 (倒排索引 管理文档)

今天 我们来说说 NoSql 中的 Elasticsearch 大家基本都叫它 ES 官方介绍 它是一个分布式全文搜索引擎 分布式是一个系统架构的概念 而 全文搜索引擎 全文搜索 可以说基本大家天天都在接触 就比如 我们京东购物 想买什么东西 在全文输入框中搜索 它就会在所有物品中 帮你找出需…

C语言零基础入门第2天《 visual studio下载安装教程和搭建开发环境及踩坑指南》(保姆级图文教程)

visual studio下载安装教程和搭建开发环境 1、 项目实战效果图2、简单了解一下目前主流的开发环境3、 visual studio下载地址4、 visual studio安装教程5、 配置visual studio环境变量 6、如何新建一个C项目7、新建第一个C程序8、用代码测试创建的项目是否可用8、如何成功让代码…

bootstrap编辑回显案例

bootstrap编辑回显案例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Bootstrap Table Edit</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4…

oracle ADG数据库开启审计

oracle ADG备库的审计只能开启的OS状态。 在把审计开到DB状态的时候&#xff0c;重启备库的时候状态又重新变回OS状态。 Completed: ALTER DATABASE MOUNT Wed Jan 24 01:56:13 2024 ALTER DATABASE OPEN Data Guard Broker initializing... Data Guard Broker initializat…

利用git上传本地文件

1、建立仓库 2.然后刷新网站&#xff0c;获取下载链接&#xff0c;备用。 3、接下来在本地创建一个文件夹&#xff0c; 4、把github上面的仓库克隆到本地 git clone https://github.com/xxxxx&#xff08;https://github.com/xxxxx替换成你之前复制的地址&#xff09; 5、把…

C# 实现 XOR 密码

XOR密码&#xff08;异或密码&#xff09;是一种简单的加密算法&#xff0c;它使用异或&#xff08;XOR&#xff09;操作来对明文和密钥进行加密和解密。 异或操作是一种位运算&#xff0c;它对两个二进制数的对应位进行比较&#xff0c;如果两个位相同&#xff08;都为0或都为…

GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接&#xff1a;GPT4Python近红外光谱数据分析及机器学习与深度学习建模 第一&#xff1a;GPT4 1、ChatGPT&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别&#xff0c;以及与国内大语言模…

postman使用-09发送报告

文章目录 环境部署生成测试报告导出测试集导出环境变量导出全局变量 生成报告演示案例一&#xff1a;单一接口使用环境变量和全局变量案例二&#xff1a;单一接口使用环境变量、全局变量、CSV文件参数案例三&#xff1a;多接口&#xff0c;批量执行 总结 环境部署 1.安装nodej…

CSS文本外观属性(知识点2)

知识引入 1.text-indent&#xff1a;首行缩进 text-indent属性是用于定义首行文本的缩进&#xff0c;其属性值可为不同单位的数值&#xff0c;em字符宽度的倍数或相对于浏览器窗口宽度的百分比%&#xff0c;允许使用负值&#xff0c;建议使用em作为设置单位&#xff0c;下面通…

Docker Image(镜像)

Docker镜像是什么 Docker image 本质上是一个 read-only 只读文件&#xff0c;这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。我们可以把 Docker image 理解成一个模板&#xff0c; 可以通过这个模板实例化出来很多容器。image 里面…

智能家居20年,从「动手」到「用脑」

【潮汐商业评论/原创】 正在装修新家的Carro最近陷入了纠结之中&#xff0c;“还没想好要怎么装一套完整的智能家居&#xff0c;家里的基装就已经开始了。” 事实上&#xff0c;Carro对智能家居也不了解&#xff0c;并不知道该如何下手&#xff0c;心想“要是能一次性设计好就…

Java实现两个Ip相互跳转

需求:在请求HttpClient时,如果访问的http://127.0.0.1:5004/proxy/1为空或者为html(看自己的需求而定),那么就跳转到http://192.128.121.140:5004/proxy/1 传入的ip1和ip2分别是127.0.0.1和192.128.121.140 private String sendRequest(String ip1, String ip2) {CloseableHt…

MyBatis详解(1)-- ORM模型

MyBatis详解&#xff08;1&#xff09; JDBC的弊端&#xff1a; ORM 模型常见的ORM模型&#xff1a;mybatis和Hibernate的区别 ***优势&#xff1a;mybatis解决问题&#xff1a;优点&#xff1a; MyBatisMyBatis环境搭建项目架构mybatis生命周期 JDBC的弊端&#xff1a; 1.硬编…

头歌C语言递归函数、嵌套函数

目录 第1关:递归求阶乘数列 任务描述 相关知识(略) 编程要求 测试说明 第2关:递归实现输出一个整数的逆序 任务描述

jenkins部署过程记录

一、jenkins部署git链接找不到 原因分析&#xff1a; 机器的git环境不是个人git的权限&#xff0c;所以clone不了。Jenkins的master节点部署机器已经部署较多其他的job在跑&#xff0c;如果直接修改机器的git配置&#xff0c;很可能影响到其他的job clone 不了代码&#xff0c…

EI论文复现:考虑冷热运行特性的综合能源系统多时间尺度优化调度程序代码!

适用平台/参考文献&#xff1a;MatlabYalmipCplex&#xff1b; 参考文献&#xff1a;电力系统自动化《含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度》 提出考虑冷热特性的综合能源系统多时间尺度优化调度模型&#xff0c;日前计划中通过多场景描述可再生能源的不确定性…

1.20号网络

数据库基本概念 能够输入计算机并能被计算机程序识别和处理的信息集合数据库 &#xff08;Database&#xff09; 数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合 常用的数据库 1&#xff09;大型数据库Oracle公司是最早开发关系数据库的厂商…

大数据处理,Pandas与SQL高效读写大型数据集

大家好&#xff0c;使用Pandas和SQL高效地从数据库中读取、处理和写入大型数据集&#xff0c;以实现最佳性能和内存管理&#xff0c;这是十分重要的。 处理大型数据集往往是一项挑战&#xff0c;特别是在涉及到从数据库读取和写入数据时。将整个数据集加载到内存中的传统方法可…

opencv#33 边缘检测

边缘检测原理 图像的每一行每一列都可以看成是一个连续的信号经过离散后得到的数值&#xff0c;例如上图左侧给出的图像由黑色到白色的一个信号&#xff0c;也就是图像中某一行像素变化是由黑色逐渐到白色&#xff0c;我们将其对应在一个坐标轴中&#xff0c;将像素值的大小对应…