在内核模块内发送 UDP 数据包

2023-12-11

背景:我是 UCSB 计算机工程专业的四年级学生。我参加过网络和操作系统课程。我在用户空间中创建了一个程序,它将 UDP 数据包广播到子网上,并在自组织网络中接收 UDP 数据包。我想要完成的任务是将这个程序转换为一个内核模块,该模块将在具有 Angstrom Linux 内核版本 2.6.39 的 ARM 嵌入式系统上运行(x86 到 ARM 架构的交叉编译是另一天的问题)。迁移到内核的原因是为了减少用户空间函数的一些开销,并使发送和接收部分尽可能快。

我以前从未在我所学的任何课程中做过这样的事情,所以请告诉我我所说的是否不正确、无用或低效!

经过与 Google 的研究后,我得出的结论是,典型的方法是完全取消套接字并使用sockbuf结构并自己填写必要的标题。这会影响子网上广播数据包的能力吗? 我目前正在尝试遵循此处的代码:使用linux内核模块发送UDP数据包而不使用套接字

我已经弄清楚了大部分代码背后的原因,但最后一部分让我感到困惑:

eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
skb_reset_mac_header(skb);
skb->protocol = eth->h_proto = htons(ETH_P_IP);
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
memcpy(eth->h_dest, remote_mac, ETH_ALEN);

skb->dev = dev;


dev_queue_xmit(skb);
  • 除了源 MAC 地址之外,所有以太网标头似乎都是纯粹由内核中定义的标头构建的,这是正确的吗?我将广播我的数据包,那么目标 MAC 地址字段中到底应该放入什么内容呢?
  • 更重要的是,dev 是什么?skb->dev = dev;线?根据我的调查,它是一个指向与其关联的设备驱动程序的指针。根据我的理解,我希望它指向无线芯片设备驱动程序,因为我使用 802.11 进行通信。我必须创建自己的吗dev无线驱动程序的结构?如果是这样,有关于如何实现这一目标的指导吗?如果没有,我如何访问现有的设备驱动程序并在内核模块中使用它?

我尝试注释掉 dev 行并运行代码,但毫不奇怪,一旦执行,我就会出现内核恐慌dev_queue_xmit(skb);.

再说一次,我以前从未做过这样的事情,所以任何建议都会有帮助,即使这意味着完全改变我的方法!我也知道这可能是一个小问题,但任何形式的指导都是值得赞赏的!

先感谢您!


如果您不尝试修改协议,最好的方法是不要干扰协议。在更高(套接字)层上工作。这个API可以在net/socket.c中找到

This will help: (open in new browser tab/window to zoom) Linux Kernel Network Flow

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在内核模块内发送 UDP 数据包 的相关文章

  • C - 如何正确使用 OpenSSL 的 BIO_write()

    我是 OpenSSL 新手 我知道 BIO write BIO b const void buf int len 需要在循环中调用 但我不完全确定我是否正确使用它 我写了一个这样的函数 int32 t SendPacket BIO cons
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 是否可以将 CFLAGS 设置为 Linux 内核模块 Makefile?

    例如 常见设备模块的Makefile obj m jc o default MAKE C lib modules shell uname r build M shell pwd modules clean MAKE C lib module
  • Windows 内存映射文件

    我正在尝试研究 Windows 内核在内存映射文件 虚拟内存方面的行为 具体来说 我感兴趣的是确定内存映射文件的内容 由 Windows 刷新到磁盘的频率以及 Windows 使用什么标准来决定是时候这样做 我在网上做了一些研究 除了 MS
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 序列化是通过套接字发送数据的最佳选择吗?

    有人告诉我 序列化不是通过套接字发送数据的最佳方法 但他们说他们在一本书上读过一次 并且不确定更好的方法 因为他们以前没有真正做过网络 那么序列化是最好的方法还是有更好的方法 如果这有很大的不同的话 这也是一个游戏 通过搜索有关通过它发送对
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • 有没有一种简单的方法可以在 R 的 igraph 中按度数对网络节点进行着色?

    使用igraphR 包 我想按度数对网络节点进行着色 颜色应代表渐变 例如从蓝色到红色 或从黄色到红色 从网络中观察到的最低程度到最高程度 我找到了一个可行的解决方案 https stackoverflow com questions 40
  • “java.io.IOException:连接超时”和“SocketTimeoutException:读取超时”之间有什么区别

    如果我设置一个套接字 SoTimeout 并从中读取 当读取时间超过超时限制时 我会收到 SocketTimeoutException 读取超时 这是我的例子中的堆栈 java net SocketTimeoutException Read
  • 如何编译一个简单的 multiboot2 裸机可执行文件?

    我想开始写一个操作系统内核 然后 我找到了一个document http nongnu askapache com grub phcoder multiboot pdf引入 multiboot2 规范 有三个示例代码文件 名为boot S
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • 使用 strace 修复挂起内存问题

    我有一个在 RHEL6 x 64 位 上运行的多线程进程 我发现当我尝试启动该进程时 该进程挂起并且大多数线程 同一进程的 崩溃 有些线程等待线程之间的共享内存被创建 我可以看到所有的共享内存都没有被创建 但是当我使用 strace 时 进
  • 如何用 C 语言通过 HTTP 协议发送图像?

    我是一名正在做网络服务器练习的学生 我需要一些帮助 我的网络服务器在文本页面上运行良好 但是每当浏览器发送一个 GET img jpg HTTP 1 1请求 我不知道如何处理 我听说 HTTP 协议是基于文本的 那么如何在 HTTP 响应中
  • 如何在非零端点(libusb)上发送 USB 控制事务?

    我正在编写代码来了解 Freescale Kinetis 微控制器上的 USB 外设 我已经设法在 Linux 主机上完成枚举 并且可以使用 EP0 上的供应商自定义代码发送和接收数据包 与 libusb 测试程序交互 看起来我可以在微控制
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • Flutter:在 Android 上获取本地 IP 地址

    如何在 Flutter 中获取我的 Android 设备的本地 IP 地址 这应该是 当连接到 WIFI 时 我的路由器通过 DHCP 分配的本地 IP 地址 如果连接到 VPN 则由我的 VPN 服务器分配的 VPN 网络中的本地 IP

随机推荐

  • 如何找出ClearCase视图加载的文件在哪里?

    我们使用 ClearCase UCM 和 base 我们面临的悬而未决的问题之一是 如何通过给定的视图存储目录路径找出快照视图的加载文件所在的位置 例如我们的景观位于C views myview vws 有时 等效加载的文件位于C view
  • ZF2 + Doctrine2:服务器已消失 - 如何启动旧连接?

    在此先感谢您的帮助 我想知道是否有人很快知道在实体存储库死机时要调用哪些函数来重新连接 我正在通过 ZF2 CLI 路由运行一些作业 这些作业可能需要超过 wait timeout 的时间 不幸的是 ER 的连接在需要使用时 作业完成时 就
  • UILocalNotification重复声音

    我使用了此页面中苹果示例的代码 Link 但我似乎无法让声音重复 我检查了其他应用程序 例如 Skype 用于 VOIP 和 Alarm Clock Pro 音频 但我无法重复播放声音文件 这是我的代码 void applicationDi
  • Windll ctypes 从 python 2.7 调用可变参数 c 函数在 win64 中有效,但在 win32 中无效

    我在 Windows 10 32 和 Windows 10 64 上使用 Python 2 7 我正在为 C 编译的 stdcall Windows DLL mydll 编写一个 python 包装器 我有 2 个版本的 DLL 32 位和
  • 是否可以使 wget 的进度条适应多个文件?

    我通过执行或多或少的操作来下载某些目录的所有 htm 文件 wget http some url r accept htm nv show progress 其中我关闭了 wget 的打印 但保留了进度条 这对我的情况很有用 nv show
  • C++/CLI - 如何打开新表单并返回

    我正在创建一个应用程序 其中前端必须是使用 C CLI 的 Windows 窗体 该表格用于登录目的 在我的表单中 我有一个注册按钮 单击此按钮后 应打开一个新表单 关闭登录表单 我能够通过以下代码实现这一目标 Form rgForm gc
  • C++ 对命名空间中函数的未定义引用

    这已经困扰我一段时间了 我有一个命名空间 在该命名空间中我想声明 C 风格的函数 所以我做了我认为正确的事情 namespace test std deque
  • javaFX:MediaPlayer的seek方法挂起播放器,没有错误消息或状态更改

    我有一个带有 8 个媒体播放器的程序 它们像一个大视频一样通过一组控件进行控制 我有一个滑块来控制时间 也就是我调用所有 MediaPlayerseek中的方法onMouseReleased滑块的 我的问题是 媒体播放器一直挂起 没有改变其
  • JTable 的单元格渲染器 - 彩色行

    我一直在寻找解决方案 但在不问我自己的问题的情况下 我无法从各个地方了解如何让我的桌子进行彩色行 从我看过的每个地方我收集到我需要使用单元格渲染器 但问题是我不知道如何将其应用到我自己的情况 因此 我有一个包含 3 列的简单 JTable
  • 在哪里可以找到 Java 平方根函数的源代码? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我知道Math sqrt来电StrictMath sqrt double a 方法签名在StrictMath班级 public static nat
  • 处理中几何着色器的意外行为

    我在处理中使用简单的几何着色器 shader shader beginShape vertex 0 1 0 1 vertex 0 0 0 0 vertex 0 001 0 02 endShape 所以我在三角形上应用着色器 我们首先有一个不
  • Android 权限:电话:读取手机状态和身份

    我的 Android 应用程序与电话无关 但我发现当我在测试设备上安装调试版本时 它需要 电话 读取电话状态和身份 权限 我在AndroidManifest xml 我想拥有尽可能小的权限 想知道是否有人知道如何摆脱这个 我注释掉了我记录一
  • Microsoft.ACE.OLEDB.12.0 提供程序未注册

    我的申请是写在C 和用途Ms Access 2003我希望它能够正常运行64 bitWindows 安装 我使用数据提供者作为ACE OLEDB 12 连接字符串中的 0 但它仍然给出异常Microsoft ACE OLEDB 12 0尽管
  • android的TabHost应用程序中的ProgressDialog

    我想在我的应用程序中使用进度对话框 我在执行此操作时遇到一个问题 经过一番研究后 我发现不太可能创建进度对话框 我在应用程序中具有 TabHost 的活动组类 我有完全相同的场景 我的应用程序中有 TabHost 以及具有 TabHost
  • 将 Glassfish 集成到 Eclipse for Java EE

    我正在使用 Eclipse for Java EE 我已经安装了包含 Glassfish 服务器的 Java EE SDK 但在创建 Web 项目时 我在服务器列表中没有看到 Glassfish 如何将 Glassfish 添加到 Ecli
  • Octokit.js 无法与 Vite 配合使用。模块外部化,无法在客户端模式下访问

    我在做什么 我正在将 Vite 用于我的 React 应用程序 我正在导入 Octokit 并像这样绑定它 import Octokit from octokit const githubToken import meta env REAC
  • Android:FileProvider“找不到配置的根目录”

    我正在尝试使用 FileProvider 通过电子邮件共享 SQL 数据库文件 Error java lang IllegalArgumentException Failed to find configured root that con
  • 在 jQuery 中设置背景渐变的 -os-/-ms 前缀失败?

    我在这里看到了一些关于 jQuery 的其他帖子 css 不与 webkit gradient 但是我还没有找到一个与 ms linear gradient o linear gradient and linear gradient 长话短
  • 访问歌曲上的 BPM 字段(MPMediaItemPropertyBeatsPerMinute 不起作用)

    我正在构建一个包含媒体播放器的应用程序 我使用的是 iOS SDK 4 2 当播放一首给定的歌曲时 我几乎可以访问每个属性 但无法访问 MPMediaItemPropertyBeatsPerMinute 每次都返回null The 苹果文档
  • 在内核模块内发送 UDP 数据包

    背景 我是 UCSB 计算机工程专业的四年级学生 我参加过网络和操作系统课程 我在用户空间中创建了一个程序 它将 UDP 数据包广播到子网上 并在自组织网络中接收 UDP 数据包 我想要完成的任务是将这个程序转换为一个内核模块 该模块将在具