【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,一经查实,立即删除!

相关文章

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;和封装安全载…

第十三届蓝桥杯大赛软件赛省赛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;这些空间并没有…

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

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

国内企业怎么创建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;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

Android工作资料,这份火爆全网的452页Android Framework内核解析

为什么想跳槽&#xff1f; 简单说一下当时的状况&#xff0c;我在这家公司做了两年多&#xff0c;这两年多完成了一个大项目&#xff0c;作为开发的核心主力&#xff0c;开发压力很大&#xff0c;特别是项目上线前的几个月是非常辛苦&#xff0c;几乎每晚都要加班到12点以后&a…

前方高能,又一波Smartbi签约喜报来袭

近期&#xff0c;交通银行、厦门国际银行、中原农业保险、江苏中天科技等多家知名企业签约Smartbi&#xff0c;携手Smartbi实现数据驱动业务新增长。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#xff08;PaaS&a…

Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking 1.添加网络权限 依赖等 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.92.写请求类network package com.example.myapplication;import android.graphics.Bi…

前端语义化标签及实例

常用的语义化标签的以下几种&#xff1a; header、nav、article、section、aside、footer、abbr、dfn、address、del、ins、pre、meter、progress <header> 定义文章的页眉信息 <header><h1>我的网站标题</h1><nav><ul><li><a …

windows 字符编码

LPSTR char* LPCSTR const char* LPWSTR wchar_t* LPCWSTR const wchar_t* LPTSTR TCHAR* LPCTSTR const TCHAR*STD_OUTPUT_HANDLE 标准输出句柄 STD_INTPUT_HANDLE 标准输入句柄 STD_ERROR_HANDLE 标准错误句柄 windows 使用的是utf-16 linux 使用的是utf-8 wch…

4. 使用zap替换gin框架默认的日志并配置日志切割

文章目录 一、gin默认的中间件二、基于zap的中间件三、在gin项目中使用zap 本文将介绍在基于gin框架开发的项目中如何配置并使用zap来接收gin框架默认的日志以及如何配置日志切割。 我们在基于gin框架开发项目时通常都会选择使用专业的日志库来记录项目中的日志&#xff0c;go…

leancloud云存储如何接入App Inventor 2?

提问&#xff1a;leancloud如何应用到App Inventor 2&#xff1f; LeanCloud 能够高效存取海量级 JSON 对象、二进制文件、地理位置等数据。其内置的行级 ACL 权限控制&#xff0c;以及通用的用户及角色管理体系&#xff0c;可以快速实现安全而灵活的数据访问。 根据官方文档&a…