【C语言】linux内核netif_receive_skb

一、中文注释

/*** netif_receive_skb - 从网络处理接收缓冲区* @skb: 要处理的缓冲区** netif_receive_skb() 是主要的数据接收处理函数。* 它总是成功的。由于拥塞控制或协议层的原因,缓冲区可能在处理过程中被丢弃。** 这个函数只能在软中断(softirq)上下文中调用,并且应该启用中断。** 返回值(通常被忽略):* NET_RX_SUCCESS: 无拥塞* NET_RX_DROP: 数据包被丢弃*/
int netif_receive_skb(struct sk_buff *skb)
{trace_netif_receive_skb_entry(skb);return netif_receive_skb_internal(skb);
}
EXPORT_SYMBOL(netif_receive_skb);static int netif_receive_skb_internal(struct sk_buff *skb)
{int ret;net_timestamp_check(netdev_tstamp_prequeue, skb);if (skb_defer_rx_timestamp(skb))return NET_RX_SUCCESS;if (static_branch_unlikely(&generic_xdp_needed_key)) {int ret;preempt_disable();rcu_read_lock();ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb);rcu_read_unlock();preempt_enable();if (ret != XDP_PASS)return NET_RX_DROP;}rcu_read_lock();
#ifdef CONFIG_RPS// RPS (接收包处理软中断) 配置,用于多核系统的性能优化if (static_key_false(&rps_needed)) {struct rps_dev_flow voidflow, *rflow = &voidflow;int cpu = get_rps_cpu(skb->dev, skb, &rflow);if (cpu >= 0) {ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);rcu_read_unlock();return ret;}}
#endifret = __netif_receive_skb(skb);rcu_read_unlock();return ret;
}

这段代码包含了两个函数,`netif_receive_skb` 和 netif_receive_skb_internal。
netif_receive_skb 是公开的API,用于处理从网络接收到的数据包。这个函数的作用是将收到的数据包传入内核网络栈进行进一步处理。它定义了一个跟踪点(tracepoint)来记录数据包接收事件,然后调用 netif_receive_skb_internal 来执行实际的处理。
netif_receive_skb_internal 是实际处理数据包的内部函数。该函数开始时通过对数据包进行时间戳检查来确定是否需要进一步处理。如果启用了泛型XDP,并且XDP程序对数据包的处理结果不是通过(XDP_PASS),则会直接返回并丢弃数据包(NET_RX_DROP),不再进一步处理。
如果启用了接收包处理软中断(RPS)配置,这是一个为多核处理系统设计的性能优化机制,它会尝试将数据包分发到合适的CPU上的后备队列中。如果没有启用RPS或者相关的处理不适用,会直接调用 __netif_receive_skb 函数来进行通常的数据包接收处理。
注意这些函数通常在软中断上下文中调用,这意味着它们不能被长时间阻塞,并且不能睡眠。因此它们通常都是快速执行的,并且需要注意并发和RPS等高级特性以获得最优的性能。在多核处理器系统中,处理网络数据包的性能至关重要,所以这些函数的设计考虑到了多核调度和效率。

二、讲解

这两个函数是Linux内核网络子系统中的一部分,它们负责处理接收到的网络数据包。

netif_receive_skb 函数

netif_receive_skb 函数是网络设备驱动收到数据包后的主要处理函数。当网络数据包(由`struct sk_buff`结构体表示)准备好从网络设备接收时,此函数被调用。
这个函数只能在软中断(softirq)上下文中被调用,并且在调用时应当开启中断。
函数返回的值通常会被忽略,但可能是以下几种:
- NET_RX_SUCCESS:代表数据包被成功处理,没有拥塞发生。
- NET_RX_DROP:代表数据包由于拥塞控制或协议层的原因被丢弃。
此函数简单地记录数据包接收事件(trace_netif_receive_skb_entry),并调用`netif_receive_skb_internal`函数来进行实际的数据包处理。

netif_receive_skb_internal 函数

netif_receive_skb_internal 是`netif_receive_skb`的内部实现,它执行实际的数据包接收处理操作。
1. 首先,检查是否需要记录时间戳(net_timestamp_check),如果需要的话,就对数据包时间戳进行处理。
2. 接着,检查是否需要进行接收路径时间戳的推迟处理(skb_defer_rx_timestamp)。如果是,将返回`NET_RX_SUCCESS`并退出。
3. 然后,如果全局性的XDP(eXpress Data Path)功能被需要,它会尝试执行XDP处理程序。XDP是一个高性能且灵活的数据包处理路径,可以运行eBPF程序来进行数据包的处理。如果XDP处理结果不是通过(XDP_PASS),则数据包将被丢弃,函数返回`NET_RX_DROP`。
4. 如果启用了接收包路由(RPS,接收包流量控制),则会尝试根据RPS逻辑确定合适的CPU来处理此数据包,如果找到,则将数据包入队到相应CPU的后端(backlog)中,接着返回相应的处理结果。
5. 如果没有应用RPS或者XDP处理结果是通过,函数会调用`__netif_receive_skb`来进行标准的网络数据包接收处理。这个过程涉及到网络协议栈的各个层级,处理如路由决策、协议分发(例如,IPv4、IPv6、ARP)等任务。
6. 最后,返回处理结果,它可能显示数据包被成功处理或者被丢弃。
以上描述的函数是网络接收路径中的关键部分,负责确保数据包被正确地从网络设备收集并按照配置的网络策略进行处理。

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

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

相关文章

洛阳旅游攻略

洛阳旅游攻略 第一天(抵达当天): 1.先将行李放到酒店—2.老城十字街(打车可能会堵车)—3.洛邑古城—4.丽景门(步行) 第二天: 1.早起吃早餐—(打车三十分钟&#xff0c…

guava的使用

对数组操作前判断是否会越界&#xff1a; List<String> s new ArrayList<>();System.out.println(Preconditions.checkElementIndex(2,s.size(),"下标长度超过了")); 是否为空 String s null;System.out.println(Preconditions.checkNotNull(s)); 判空…

Android使用Sensor.TYPE_STEP_COUNTER计步器传感器进行步数统计

1、首先&#xff0c;申请权限 必须声明 ACTIVITY_RECOGNITION 权限&#xff0c;以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。 Manifest.xml也记得声明 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {Log.d(TAG, "[权限]&quo…

Docker的安装跟基础使用一篇文章包会

目录 国内源安装新版本 1、清理环境 2、配置docker yum源 3、安装启动 4、启动Docker服务 5、修改docker数据存放位置 6、配置加速器 现在我们已经完成了docker的安装和初始配置。以下为基本测试使用 自带源安装的版本太低 docker官方源安装的话速度太慢了 所以本篇文…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

移动端的自动化测试&#xff0c;最常见的是 Android 自动化测试&#xff0c;我个人觉得 Android 的测试优先级会更高&#xff0c;也更开放&#xff0c;更容易测试&#xff1b;而 iOS 相较于 Android 要安全稳定的多&#xff0c;但也是一个必须测试的方向&#xff0c;这个系列文…

STM32(18)I2C

串口通信缺点 一个设备就需要一个串口&#xff0c;单片机可能没有那么多串口外设 总线/非总线 主机&#xff1a;负责管理总线&#xff0c;可控制波特率、数据的通信方向 波特率&#xff1a;由主机产生波特率信号 数据的传输 每个从机都有7位地址&#xff0c;最后移位是读&a…

力扣--动态规划516.最长回文子序列

思路分析&#xff1a; 创建一个二维动态规划表dp&#xff0c;其中dp[i][j]表示在子串s[i...j]中的最长回文子序列的长度。初始化基本情况&#xff1a;对角线上的元素dp[i][i]都为1&#xff0c;因为单个字符本身就是长度为1的回文子序列。从字符串末尾向前遍历&#xff0c;填充…

IPsec VPN协议框架

IPsec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

java排序简单总结和推荐使用套路(数据排序,结构体排序)

了解int和Integer的区别 int是Java的基本数据类型&#xff0c;用于表示整数值。Integer是int的包装类&#xff0c;它是一个对象&#xff0c;可以包含一个int值并提供一些额外的功能。 Java集合框架中的集合类&#xff08;如List、Set、Map&#xff09;只能存储对象&#xff0c;…

计算机基础专升本笔记十三-PowerPoint常用快捷键大全

计算机基础专升本笔记十三-PowerPoint常用快捷键大全 PowerPoint常用快捷键 按键作用Ctrl A全选表格Ctrl B字体加粗Ctrl C复制Ctrl D文本、图形、图片等距复制Ctrl E居中Ctrl F查找Ctrl G组合&#xff0c;可统一移动&#xff0c;改变大小Ctrl H隐藏鼠标箭头Ctrl I斜…

第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 统计子矩阵

#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue>using namespace std;int cnt,temp; int n,m,K; int a[505][505]; int pre[505][505];//二维前缀和void sol() {cin>>…

如何从产品的角度做好内容营销?媒介盒子支招

内容运营就是指将生产传播内容并进行重组&#xff0c;去满足用户的内容消费需求&#xff0c;想要提高内容运营的效果&#xff0c;媒介盒子认为可以从产品出发&#xff0c;将内容运营与品牌产品相结合。那么应该怎么做呢&#xff1f;接下来就让媒介盒子告诉你。 一、 场景化内容…

MySQL 空间碎片详解

文章目录 前言1. 空间碎片如何产生2. 空间碎片如何查看3. 空间碎片如何回收后记 前言 MySQL 数据库在运行过程中&#xff0c;随着时间的推移&#xff0c;可能会出现空间碎片的问题。空间碎片是指数据库表中不再使用的空间&#xff0c;但由于各种原因&#xff0c;这些空间并没有…

小程序嵌套H5-真机突然无法使用

今天测试反馈了一个问题&#xff0c;测试环境的小程序突然就登录不了了。我自己拿手机扫码登录是正常的&#xff0c;用其他同事的手机扫描登录也是正常。 下面是排查的路线&#xff1a; 1、其他环境使用测试手机扫码登录是否正常&#xff1f;(正常) 2、H5地址改为本地IP&#…

【漏洞复现】CVE-2023-27178 GDidees CMS任意文件上传漏洞复现

漏洞描述 漏洞编号&#xff1a;CVE-2023-27178 GDidees CMS是法国一款开源的网站管理工具&#xff0c;可用于创建站点、照片或视频库。GDidees CMS 3.9.1及以下版本存在任意文件上传漏洞&#xff0c;允许未经授权的攻击者上传精心构造的文件并执行任意代码。 影响版本 GDide…

Linux运维_Bash脚本_编译安装Glib-2.78.4

Linux运维_Bash脚本_编译安装Glib-2.78.4 Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和…

国内企业怎么创建WhatsApp Business账号?

什么是WhatsApp Business 账号&#xff1f; WhatsApp是世界上最受欢迎的消息应用程序之一&#xff0c;拥有超过25亿月活用户。近年来&#xff0c;WhatsApp 推出了一项新产品——WhatsApp Business 。 那么&#xff0c;WhatsApp Business 究竟是什么呢&#xff1f;WhatsApp Bu…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

计算机等级考试:信息安全技术 知识点一

美国联邦政府颁布数字签名标准(Digital Signature Standard&#xff0c;DSS)的年份是1994美国联邦政府颁布高级加密标准(Advanced Encryption Standard&#xff0c;AES)的年份是2001产生认证码的函数类型通常有3类:消息加密、消息认证码和哈希函数。自主访问控制&#xff0c;Di…

C++之std::any

std::any 是 C++17 引入的一种通用类型包装,允许在运行时存储和检索任何类型的值。你可以将不同类型的值放入 std::any 对象中,然后在需要时检索出原始类型。 以下是使用 std::any 的基本用法: 使用 std::any 存储和检索自定义类型: #include <iostream> #include &…