Linux内核: Getting packets from a netdevice

标签 linux kernel driver packets

我正在尝试编写一个简单的程序,从接口(interface)获取数据包并在 Linux 内核级别打印出其目标和源 MAC 地址。这是我使用 Linux 内核的第一个项目,我阅读了大量有关 netdevice、loopback 和 skbuff 的源代码和书籍。现在,根据我迄今为止所了解的 skbuff 看起来像是放置数据包数据的位置,但我看不到网络设备驱动程序如何从接口(interface)获取数据包并将它们放入 skb 中,或者如何获取与特定接口(interface)相关的 skb。/p>

有人可以告诉我如何查看 skb 链接到 eth0 等网络设备的情况吗?我需要某种传输和接收环来将它们摘下来吗?

一些示例代码会很棒!如果做不到这一点,如果有人可以指向一些源代码(不仅仅是文件名......行号和函数名称就太好了)。

很抱歉,如果这是一个模糊的问题,我已尽力进行研究。 提前致谢。

最佳答案

以某一款基于PCI的以太网芯片的代码为例:./drivers/net/pci-sculpture.c。也许这段代码是旧式的以太网驱动程序,但它对学习很有用。

数据包接收流程:netdrv_rx_interrupt() --> 分配/替换 sk_buff --> 调用 netif_rx() 将收到的数据包/sk_buff 传递到上层堆栈;

数据包发送流程:netdrv_start_xmit();

设备初始化流程:可以从 init_module() 开始;

常用函数可以在./net/core/dev.c中找到,如netif_rx...;

关于Linux内核: Getting packets from a netdevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190405/

相关文章:

64-bit - 在 x64 驱动程序中 Hook ZwTerminateProcess(不带 SSDT)

windows - Minifilter 驱动程序、内存映射和记事本

c++ - 剥离 linux 共享库

linux - 从制表符分隔的文件中获取值

linux - 如何从 "struct linux_binprm"获取 argv?

Linux 内核 : Why add_timer() is modifying my "expires" value?

linux - struct load_info 中的字段strmap 是什么意思?

c++ - 向子进程发送 SIGINT

c - 尝试将 GCC 特定的 asm goto 移植到 Clang

windows - KeWaitForSingleObject() 上的 'WaitReason' 参数的用途是什么?