【C语言】linux内核dev_queue_xmit

一、中文注释

这两个函数是Linux内核网络子系统中负责发起网络包(sk_buff结构)传输的代码。下面我将用中文对这两个函数做一个简单的注释:

/*** __dev_queue_xmit - 发送一个buffer* @skb: 要发送的buffer* @sb_dev: 子设备,用于层2转发离线处理** 将buffer排队以发送到网络设备。调用此函数之前,调用者必须设置好设备和优先级,并构建好buffer。* 这个函数可以在中断上下文中调用。** 如果失败,则返回一个负的errno错误码。成功返回并不保证帧一定会被发送,因为可能会因为拥塞或流量整形而被丢弃。** 注意,这个方法也可以返回队列规则(queue disciplines)的错误,* 包括NET_XMIT_DROP,它是一个正值。所以,错误也可能是正值。** 不管返回的值是什么,skb都会被消耗,所以当前很难尝试重新发送到这个方法。* (如果你小心的话,在发送前,你可以增加引用计数以持有引用进行重试。)** 调用此方法时,中断必须是启用的。这是因为BH(Bottom Half,底半部)启用代码必须在IRQ启用的情况下,* 不会造成死锁。*/
static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev)
{// 省略代码中部分注释和实现...// 如果网络设备并没有队列(例如环回设备,隧道),则直接发送if (dev->flags & IFF_UP) {int cpu = smp_processor_id(); // 当前CPU编号// 如果还没有线程持有发送锁if (txq->xmit_lock_owner != cpu) {// 省略了关于递归发送检测和发送限制的代码...skb = validate_xmit_skb(skb, dev, &again);if (!skb)goto out;HARD_TX_LOCK(dev, txq, cpu); // 获取硬件发送锁// 如果可以发送(没有被停止)if (!netif_xmit_stopped(txq)) {// 尝试发送数据包skb = dev_hard_start_xmit(skb, dev, txq, &rc);// 如果发送完成if (dev_xmit_complete(rc)) {HARD_TX_UNLOCK(dev, txq); // 解锁goto out;}}HARD_TX_UNLOCK(dev, txq); // 解锁// 如果虚拟设备请求排队发送数据包,打印告警信息} else {// 如果检测到递归发送,打印告警信息}}rc = -ENETDOWN; // 网络设备不可用rcu_read_unlock_bh(); // 读解锁atomic_long_inc(&dev->tx_dropped); // 增加丢包计数kfree_skb_list(skb); // 释放skbreturn rc;
out:rcu_read_unlock_bh(); // 读解锁return rc;
}/*** dev_queue_xmit - 发送一个buffer* @skb: 要发送的buffer** 对__dev_queue_xmit函数的简单封装,不指定子设备。*/
int dev_queue_xmit(struct sk_buff *skb)
{return __dev_queue_xmit(skb, NULL);
}
EXPORT_SYMBOL(dev_queue_xmit); // 导出符号,使得其他模块可以调用

这两个函数涉及到Linux内核网络发送路径的处理细节,包括选择设备队列、处理网络设备的发送锁、检查设备队列是否被停止、调用真正的发送函数、错误处理和资源清理等。它们体现了操作系统内核在网络通信方面的复杂逻辑和对并发控制的处理。

二、中文讲解

这两个函数是Linux内核网络堆栈中负责处理网络包发送的函数。

__dev_queue_xmit函数是一个静态函数,它的作用是将一个网络数据包(即socket buffer,简称skb)放入网络设备队列中以便传输出去。它的参数包括待发送的数据包`skb`和用于二层转发卸载的从属设备`sb_dev`。

函数内部步骤如下:

1. 通过`skb_reset_mac_header`重置数据包中的MAC头部信息。
2. 如果数据包需要软件时间戳,则添加这个时间戳。
3. 获取RCU读锁,这是因为可能会访问共享数据而不希望被其他CPU更改。
4. 更新数据包的优先级,并初始化包的传输长度信息。
5. 如果设置有特定的流量控制,会执行一些流量控制的处理。
6. 如果网络设备标志表明它不需要数据包的目的信息,则直接丢弃这部分信息。
7. 根据数据包和设备信息,选择合适的网络设备队列。
8. 如果设备有队列调度器,则尝试将数据包加入队列。
9. 如果设备不需要队列,比如是软件设备(例如回环设备或者隧道),则尝试直接传输数据包。
10. 若设备正常运作,使用硬启动传输函数`dev_hard_start_xmit`尝试传输数据包;如果设备已经关闭或发送失败,则将其丢弃,并增加丢包计数器。
11. 结束前释放之前获取的RCU读锁。

dev_queue_xmit函数是一个可导出的简单封装函数,用于调用`__dev_queue_xmit`函数。它只需要一个参数,即要发送的数据包`skb`,因为它默认不需要处理从属设备`sb_dev`。这个函数会被内核中其他模块调用,以此来发送网络数据。

注意的是,`__dev_queue_xmit`函数可以在中断上下文中调用,并且即使发送操作报告成功,也无法保证数据包一定会被传输出去,因为可能会因为网络拥堵或流量整形策略被丢弃。函数返回值可能是负的错误码,也可能是正的,例如`NET_XMIT_DROP`表示包被丢弃。一旦调用该函数发送数据包,数据包的内存就被消费了,即使发送失败也不会尝试重传。此外,在调用此函数时,必须保证中断是开启的,以避免死锁。

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

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

相关文章

12. 建立用户表并使用雪花算法生成用户ID

文章目录 一、建立用户表二、雪花算法生成唯一ID三、将雪花算法整合到我们的项目中 一、建立用户表 上一节我们搭建完了脚手架,从这一节开始,就正式进入到业务逻辑的开发了。首先要开发的就是博客系统的用户注册与登录功能。 既然涉及到用户&#xff0…

XSS靶场-DOM型初级关卡

一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型&#xff0c;获取h2标签&#xff0c;使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了&#xff0c;为什么不显示呢&#xff1f;看一下官方文档 尽管插入进去了&#xff0…

存算一体成为突破算力瓶颈的关键技术?

大模型的训练和推理需要高性能的算力支持。以ChatGPT为例&#xff0c;据估算&#xff0c;在训练方面&#xff0c;1746亿参数的GPT-3模型大约需要375-625台8卡DGX A100服务器训练10天左右&#xff0c;对应A100 GPU数量约3000-5000张。 在推理方面&#xff0c;如果以A100 GPU单卡…

【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

力扣每日刷题 一、977. 有序数组的平方1.1题目1.2、解题思路1.3、代码实现——C 二、76. 最小覆盖子串2.1&#xff1a;题目2.2、解题思路2.3&#xff1a;代码实现——c2.4&#xff1a;易错点 一、977. 有序数组的平方 1.1题目 [题目链接]( 1.2、解题思路 题型&#xff1a;双…

思维调试:为什么FormatMessage提示找不到资源?

在不调试的情况下解决下面的问题&#xff0c;说明你的思维调试能力又进阶了。 问题 我在调用 FormatMessage 函数加载一个插入的资源字符串&#xff0c;由于某种未知的原因&#xff0c;它没能按预期那样工作。 我要加载的字符串类似于这样的 “Blah blah blah %1. Blah blah …

JavaEE——简单认识JS(Web API)

文章目录 一、认识什么是 WebAPI二、认识事件三、操作元素1. innerHTML 属性2. 获取 / 修改元素内容3. 获取 / 修改 元素属性4. 获取 / 修改 表单元素属性5. 获取 / 修改 样式属性6. 创建 / 删除元素 一、认识什么是 WebAPI 1.什么是API 在我们了解 WebAPI 之前&#xff0c;我们…

MYSQL使用mysqldump备份、复原数据库

参考 添加链接描述 1. 备份数据库 C:\Windows\system32>mysqldump -uroot -p test student>C:\student.sql Enter password: ****2. 备份多个数据库 mysqldump -u root -p --databases test mysql>C:\testandmysql.sql3. 备份所有数据库 mysqldump -u root -p -…

【Python】外网远程登录访问jupyter notebook+pycharm使用ipython

第一步&#xff1a;创建python虚拟环境 conda create -n py3610 python3.6.10第二步&#xff1a;安装ipython pip install ipython pip install ipython notebook第三步&#xff1a;创建 IPython Notebook 服务器配置文件 # 进入python交互shell&#xff0c;设置密码 >&…

数论<1>——数论基础

这期博客是一个数论入门介绍&#xff0c;dalao们可以自动忽略。 Part 1:素数(质数) 说到数论&#xff0c;小学奥数里也有。我最先想到的就是质数了。素数就是一个只能被1和它自己整除的数。判断的方法也很简单&#xff0c;可以扫一遍就结束了&#xff0c;但是没必要。由于一个…

Hudi入门

一、Hudi编译安装 1.下载 https://archive.apache.org/dist/hudi/0.9.0/hudi-0.9.0.src.tgz2.maven编译 mvn clean install -DskipTests -Dscala2.12 -Dspark33.配置spark与hudi依赖包 [rootmaster hudi-spark-jars]# ll total 37876 -rw-r--r-- 1 root root 38615211 Oct …

【NR 定位】3GPP NR Positioning 5G定位标准解读(十一)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

QT中使用QProcess执行命令,实时获取数据,例如进度条

前言 因为之前写了一个接收和发送文件的脚本&#xff0c;然后又需要获取进度&#xff0c;同步到进度条中。 效果&#xff1a; 使用正则匹配&#xff0c;获取命令行命令中的以下数据&#xff0c;然后同步到进度条 源码demo&#xff1a; 非完整代码&#xff1a; #include <Q…

nodejs web服务器 -- 搭建开发环境

一、配置目录结构 1、使用npm生成package.json&#xff0c;我创建了一个nodejs_network 文件夹&#xff0c;cd到这个文件夹下&#xff0c;执行&#xff1a; npm init -y 其中-y的含义是yes的意思&#xff0c;在init的时候省去了敲回车的步骤&#xff0c;如此就生成了默认的pac…

山泉还可以申请商标不,现阶段通过率如何!

在32类类别啤酒饮料是许多生产水企业主要申请注册的类别&#xff0c;那现在山泉在这个类别还可以申请注册商标不&#xff0c;山泉在这个类别基本上是通用词&#xff0c;首先是需要前面词具有显著性&#xff0c;没的相同或近似才可以。 经普推知产老杨检索发现&#xff0c;在32…

手机APP测试——如何进行安装、卸载、运行?

手机APP测试——主要针对的是安卓( Android )和苹果IOS两大主流操作系统,主要考虑的就是功能性、兼容性、稳定性、易用性、性能等测试&#xff0c;今天先来讲讲如何进行安装、卸载、运行的内容。 一、App安装 1、点击运行APP安装包,检测安装包是否正常; . 2、进入[安装向导]…

自动驾驶感知面试-coding应用题

感知面试手撕代码&#xff1a;这个博主总结的很好&#xff0c;尤其是关于叉积的计算 双线性插值 双线性插值公式记忆方法和Python实现 NMS算法 #include<iostream> #include<vector> #include<algorithm>using namespace std; struct Box {int x1,x2,y1,…

Pytorch学习 day09(简单神经网络模型的搭建)

简单神经网络模型的搭建 针对CIFAR 10数据集的神经网络模型结构如下图&#xff1a; 由于上图的结构没有给出具体的padding、stride的值&#xff0c;所以我们需要根据以下公式&#xff0c;手动推算&#xff1a; 注意&#xff1a;当stride太大时&#xff0c;padding也会变得很大…

【NR 定位】3GPP NR Positioning 5G定位标准解读(九)-增强的小区ID定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

基于springboot+vue的食品安全管理系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 1 首页 2 后台登录 3 食品信息添加页面 4 食品查询 三、库表设计 四、论文 前言 从事食品行业的商家可能会对于食品的储存以及食品的销售&#xff0c;都有着不同门道的想法&#xff0c;那么如何能将这些想法一一实现&#xff0c;…

大模型笔记:幻觉 hallucination

1 介绍 “幻觉” (Hallucination)&#xff0c;指模型生成自然流畅&#xff0c;语法正确但实际上毫无意义且包含虚假信息即事实错误的文本&#xff0c;以假乱真&#xff0c;就像人产生的幻觉一样。 举个例子就是&#xff0c;即使现在的chatgpt-4&#xff0c;你问他一些有确切…