我正在尝试在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?
谢谢
答案 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:
请您分享您的代码吗?我们也可以了解您的网络设备:)