2

我正在尝试编写一个简单的程序,该程序从接口获取数据包并在 Linux 内核级别打印出其目标和源 MAC 地址。这是我第一个使用 Linux 内核的项目,我已经阅读了很多关于 netdevice、loopback 和 skbuff 的源代码和书籍。现在,从我到目前为止所学到的 skbuff 看起来像放置数据包数据的位置,但我看不到网络设备驱动程序如何从接口获取数据包并将它们放入 skb 或如何获得与特定接口相关的 skb。

有人可以告诉我如何看待 skb 与 eth0 等网络设备的链接吗?是否需要某种发送和接收环来接它们?

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

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

4

2 回答 2

1

您可以尝试使用 netfilter 挂钩。

使用 注册您的回调nf_register_hook(),它将针对给定的地址族(例如AF_INETIPv4)和类型(例如NF_IP_LOCAL_IN传入数据包)调用。您的钩子还将获取 skb 和数据包通过其传入或传出的网络设备。

回调的原型如下所示:

unsigned int my_hook(unsigned int hook,
                     struct sk_buff *skb,
                     const struct net_device *in,
                     const struct net_device *out,
                     int (*okfn)(struct sk_buff *));

在http://www.sikurezza.org/ml/12_99/msg00063.html也有一个(过时的)示例,但您也可以深入研究内核源代码,有几个示例如何使用网络堆栈或 iptables 模块网络过滤器钩子。

于 2013-03-03T21:34:16.970 回答
1

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

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

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

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

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

于 2013-03-04T08:18:08.390 回答