2

我正在尝试在 linux 内核中实现一个网络设备(net_device)。这是一个简单的 net_device,它将命令/数据从用户空间传递到内核空间,反之亦然,这是这个简单的 net_device 的目标。我正在使用套接字将命令/数据从用户空间传递到内核空间。谷歌搜索后,我成功注册了 net_device 并能够在 /sys/class/net/abc0 (设备名称)中看到我的设备,当进行文件操作时,不清楚流程

 struct net_device_ops
 {   
   .ndo_open  =open,

   .ndo_close = close,

   .ndo_start_xmit = start_xmit   
 }
  • 如果我在套接字中发出写入,它将在数据链路层调用 start_xmit。

  • 如果我想调用 open 方法,如何使用套接字调用它

  • 如何使用套接字调用 start_xmit

  • 我将如何找到接收缓冲区中有数据包并将其传递给用户空间。

没有关于简单 net_device(以太网除外)的明确流程/信息可以建议链接/pdf。

我尝试编写简单的套接字程序来测试 open、close、start_xmit。其中套接字读/写没有调用 open,close,star_xmit 。 有什么方法可以测试开发的 net_device 吗?

谢谢

4

2 回答 2

1

SIOCSIFFLAGS, -> IFF_UP 您可以在对 netdevice abc0 执行 ioctl 时实际设置或取消设置它。

首先,您必须创建一个 dgram 套接字,

然后使用 net/if.h 中定义的 ifreq 结构

并填充接口和iff_flags

iff_flags 可以用 IFF_UP 设置,也可以用相同的 IFF_UP 取反以使接口关闭

然后关闭套接字。

#include <net/if.h>

....

sock = socket(AF_INET, SOCK_DGRAM, 0);

if (sock < 0) {

   goto fail;

}

struct ifreq ifreq;

strcpy(ifreq.ifr_name, "abcd0");

ifreq.iff_flags |= IFF_UP;

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) {

    perror("ioctl setting interface up");

}

ifreq.iff_flags ~= IFF_UP;

if (ioctl(sock, &ifreq, sizeof(ifreq) < 0) {

    perror("ioctl setting interface down");

}

close(sock);

无关:

你能分享你的代码吗?我们也可以了解您的网络设备:)

于 2013-03-14T11:02:44.910 回答
1

我找到了如何测试打开、关闭功能。

  • type : ifconfig abc0(Device name) up 会调用 open 方法

  • type : ifconfig abc0(Device name) down 会调用 close 方法

有人可以帮助我如何使用套接字测试这些方法。

于 2012-10-31T07:03:55.030 回答