跟踪napi_gro_receive_entry时IP头信息缺失的分析

问题描述

在使用eBPF程序跟踪napi_gro_receive_entry内核跟踪点时,发现获取到的IP头部字段(如saddrdaddrprotocol)为空值。

代码如下:

/* 自定义结构体来映射 napi_gro_receive_entry tracepoint 的 format */
struct napi_gro_receive_entry_data {unsigned short common_type;unsigned char common_flags;unsigned char common_preempt_count;int common_pid;/* 以下字段根据 format 来定义 */char name[4];      // __data_loc char[]unsigned int napi_id;unsigned short queue_mapping;const void *skbaddr; // skbaddr 字段,用来访问 skb 数据bool vlan_tagged;unsigned short vlan_proto;unsigned short vlan_tci;unsigned short protocol;unsigned char ip_summed;unsigned int hash;bool l4_hash;unsigned int len;unsigned int data_len;unsigned int truesize;bool mac_header_valid;int mac_header;unsigned char nr_frags;unsigned short gso_size;unsigned short gso_type;
};
//ip头里面的信息为空
SEC("tp/net/napi_gro_receive_entry")
int trace_napi(struct napi_gro_receive_entry_data *ctx)
{// 获取当前进程 PIDint pid = bpf_get_current_pid_tgid();bpf_printk("Hello!!! \n");// 读取 IP 头中的 protocol 字段u8 protocol; struct sk_buff *skb = (struct sk_buff *)ctx->skbaddr;if(skb == NULL){bpf_printk("skb is NULL \n");return 0;}struct iphdr *ip = (struct iphdr *)(BPF_CORE_READ(skb, head) +BPF_CORE_READ(skb, network_header));if(ip == NULL){bpf_printk("ip is NULL \n");return 0;}protocol = BPF_CORE_READ(ip, protocol);// 如果协议字段无效,返回if (protocol < 0) {bpf_printk("protocol is NULL \n");return 0;}//输出协议源IP字段__u32 saddr = BPF_CORE_READ(ip, saddr);bpf_printk("Source IP: %d.%d.%d.%d\n",(saddr >> 24) & 0xFF,(saddr >> 16) & 0xFF,(saddr >> 8) & 0xFF,saddr & 0xFF);//输出协议协议字段bpf_printk("protocol: %d \n", protocol);return 0;}

 输出结果如下:

 发现读取到的IP头部信息(iphdr结构中的内容)是空的,但是可以确定获取到了skb以及iphdr结构体。

问题分析:(deepseek解答)

  1. GRO合并未完成
    GRO机制会对多个分片报文进行重组,此时network_header可能仅指向首个分片的头部位置。当处理后续分片时,skb->network_header可能尚未更新为有效偏移量‌。

  2. 协议头初始化时序
    在GRO处理路径中,skb->transport_headerskb->network_header的初始化可能延迟到分片重组完成后进行。过早访问会导致读取到内核未初始化的内存区域‌。

  3. SKB共享状态干扰
    skb被克隆(skb_clone())时,多个副本共享数据缓冲区。此时直接访问skb->head + skb->network_header可能触发内存越界,因为克隆操作的元数据更新存在延迟‌。

 以上给出了deepseek的解释,但是本人并没有验证,后期会去深入源码实现来探讨这个问题。

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

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

相关文章

【Golang】第五弹----函数

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、函数 1.1基本介绍…

naive ui 控制 n-input 只可以输入26个英文字母+数字

<n-form-item label"编码" path"sn"><n-input v-model:value"form.sn" placeholder"请输入编码" :on-input"handleInput"></n-input></n-form-item> // 处理输入事件的函数 const handleInput (v…

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后&#xff0c;终于找到的解决的方案&#xff0c;遂将该方法简要的记录下来&#xff0c;以备后用&#xff0c;并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下&#xff0c;假…

网络安全防护架构有哪些 网络安全防护措施包括

网络安全预防措施 网安措施 计算机网络安全措施主要包括保护网络安全、保护应用服务安全和保护系统安全三个方面&#xff0c;各个方面都要结合考虑安全防护的物理安全、防火墙、信息安全、Web安全、媒体安全等等。 (一)保护网络安全。 网络安全是为保护商务各方网络端系统之…

14.C语言const的使用规范,详细说明

目录 修饰变量 修饰指针 指向常量的指针 常量指针 指向常量的常量指针 修饰函数参数 修饰函数返回值 总结 在 C 语言里&#xff0c;const 是一个类型限定符&#xff0c;它的作用是将变量定义为只读&#xff0c;也就是不允许对其值进行修改&#xff0c;用来修饰函数中的…

Android 7 及以上,Fiddler 抓 https 包

文章目录 问题描述解决方案环境准备操作步骤1、导出 Fiddler 证书并修改成 .pem 和 .0 文件2、修改夜神模拟器配置3、打开夜神模拟器设备的 USB 调试选项4、将0725b47c.0证书放入夜神模拟器系统证书目录5、夜神模拟器 cmd 环境配置6、给 0725b47c.0 证书赋予权限7、打开 fiddle…

韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码

研究过程 起源与提出&#xff1a;1687 年牛顿提出 “三体问题”&#xff0c;旨在研究三个可视为质点的天体在相互之间万有引力作用下的运动规律&#xff0c;但因运动方程过于复杂&#xff0c;难以得到完全解。欧拉的贡献1&#xff1a;1767 年&#xff0c;瑞士数学家莱昂哈德・…

python力扣15. 三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&am…

【redis】type命令和定时器的两种实现方式(优先级队列、时间轮)

type——返回 key 对应的数据类型 此处 Redis 所有的 key 都是 string&#xff0c;但是 key 对应的 value 可能会存在多种类型 none —— key 不存在string ——字符串list ——列表set ——集合zset ——有序集合hash ——哈希表stream ——Redis 作为消息队列的时候&#x…

游戏引擎学习第153天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 目前正在进行的是一个比较大的系统调整&#xff0c;原本预计今天会继续深入这个改动&#xff0c;但实际上在昨天的开发中&#xff0c;我们已经完成了大部分的代码编写&#xff0c;并且运行之后几乎一切都能正常工作&#x…

mac 苍穹外卖 前端环境配置

博主的 mac 是 m2。 结合以下两篇&#xff0c;成功配置前端环境。 macOS 配置苍穹外卖前端环境_macbook怎么nginx下载外卖-CSDN博客 苍穹外卖-Mac配置前端开发环境_sudo 启动 nginx 有什么区别-CSDN博客 一、安装nginx 我使用的是 homebrew&#xff0c;homebrew 的安装请自…

Linux——Shell运行原理以及Linux权限

目录 1. Shell的运行原理 2. Linux中的权限问题 2.1 Linux权限的概念 2.1.1 如何实现用户账号之间的切换 2.1.2 如何将普通用户添加到信任列表中 2.1.3 如何仅提升当前指令的权限 2.2 Linux权限管理 2.2.1 文件访问者的分类&#xff08;人&#xff09; 2.2.2 文件类型…

Docker 运行 GPUStack 的详细教程

GPUStack GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。它具有广泛的硬件兼容性&#xff0c;支持多种品牌的 GPU&#xff0c;并能在 Apple MacBook、Windows PC 和 Linux 服务器上运行。GPUStack 支持各种 AI 模型&#xff0c;包括大型语言模型&#xff08;LLMs&am…

2024年广州市智能网联汽车创新实践年度报告

政策法规方面&#xff0c;积极推进《广州市智能网联汽车创新发展条例》的制定和发布&#xff0c;不断完善法规标准体系&#xff0c;为产业创新发展营造良好政策环境&#xff1b;技术创新方面&#xff0c;企业加大研发投入&#xff0c;在自动驾驶算法、车联网安全等关键领域取得…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展&#xff0c;性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件&#xff0c;凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力&#xff0c;引起了广泛关注。本文将从配置性…

Machine Learning: 十大基本机器学习算法

机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 基本的机器学习算法&#xff1a; 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类&#xff1a; 监督学习算法 (Sup…

WPF从初学者到专家:实战项目经验分享与总结

WPF从初学者到专家&#xff1a;实战项目经验分享与总结 一、前言二、WPF 基础概念与入门2.1 什么是 WPF2.2 XAML 基础2.3 数据绑定基础 三、第一个 WPF 项目&#xff1a;简单的待办事项列表3.1 项目需求分析3.2 项目搭建与界面设计3.3 业务逻辑实现 四、中级项目&#xff1a;音…

力扣hot100_二叉树

二叉树的建立与遍历 #include <iostream> #include <vector> #include <queue> using namespace std;// 定义二叉树节点 struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };// 函数&…

解锁MATLAB语言:从入门到实战的编程秘籍

目录 一、MATLAB 是什么? 二、搭建 MATLAB 环境 三、基础语法入门 3.1 特殊符号与运算符 3.2 变量命名与赋值 3.3 向量与矩阵创建 四、实战演练 4.1 简单数学运算 4.2 绘制函数图像 五、深入学习建议 一、MATLAB 是什么? MATLAB,即 Matrix Laboratory(矩…

JVM垃圾回收面试题及原理

1. 对象什么时候可以被垃圾器回收 如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;则有可能会被垃圾回收器回收 如果要定位什么是垃圾&#xff0c;有两种方式来确定 引用计数法可达性分析算法 1.1 …