我正在尝试编写一个简单的程序,从接口(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/