在linux内核中开发简单的net_device

时间:2012-10-30 16:07:41

标签: linux sockets network-programming linux-kernel

我正在尝试在linux内核中实现netdevice(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。

我尝试编写简单的socket程序来测试open,close,start_xmit。 socket读/写不调用open,close,star_xmit。 有没有办法测试开发的net_device?

谢谢

2 个答案:

答案 0 :(得分:1)

我找到了如何测试开放,关闭功能。

  • 键入:ifconfig abc0(设备名称)up将调用open方法

  • 键入:ifconfig abc0(设备名称)down将调用close方法

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

答案 1 :(得分:1)

SIOCSIFFLAGS, - > IFF_UP你可以在对网络设备abc0进行ioctl时实际设置或取消设置。

首先你需要创建一个dgram套接字,

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

并填充界面和iff_flags

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

然后关闭套接字。

#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);

offtopic:

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