Kernel 内核中的网络上/下问题

Kernel 内核中的网络上/下问题,kernel,linux-kernel,Kernel,Linux Kernel,我正在尝试编写一个Linux内核模块,使用正确的命令,它将关闭网络接口(比如wlan0),将其IP地址更改为指定的IP地址,然后重新启动接口。在开始评论之前,是的,我知道您可以使用ifconfig,是的,我知道您也可以编写用户代码来完成此操作,但是对于我的研究项目,我正在尝试学习如何在Linux内核中完成此操作 经过研究,我找到了net\u device\u ops结构,它有我需要调用的方法(ndo\u stop,和ndo\u open)。然而,我正在努力寻找使用示例,因此尝试: dev->

我正在尝试编写一个Linux内核模块,使用正确的命令,它将关闭网络接口(比如wlan0),将其IP地址更改为指定的IP地址,然后重新启动接口。在开始评论之前,是的,我知道您可以使用ifconfig,是的,我知道您也可以编写用户代码来完成此操作,但是对于我的研究项目,我正在尝试学习如何在Linux内核中完成此操作

经过研究,我找到了
net\u device
\u ops结构,它有我需要调用的方法(
ndo\u stop
,和
ndo\u open
)。然而,我正在努力寻找使用示例,因此尝试:

dev->netdev_ops->ndo_stop(dev);
这编译得很好,但是当模块运行时,设备没有关闭

有谁能提供一个正确的用法示例或让我知道我做错了什么

void目标(int索引,\u32键){
无符号短电流if;
设备中的结构*;
如果信息为,则为ifaddr*中的结构;
结构网络设备*dev;
//结构网络设备操作;
__be32 n_键;
__u32试验2;
test2=0x00FFFFFF;
//test2=test2 |键;
n_key=cpu_到_be32(key);
cur_if=0;
dev=第一个网络设备(&init网络);
while(dev&&cur_如果ip\u ptr;
对于(如果在开发->ifa\u列表中显示信息;如果信息!=NULL;如果信息=如果信息->ifa\u下一步){
if(cur_if==索引){
dev->netdev_ops->ndo_stop(dev);
if\u info->ifa\u address=if\u info->ifa\u address&test2;
if\u info->ifa\u local=if\u info->ifa\u local&test2;
if_info->ifa_address=if_info->ifa_address | n_键;
if_info->ifa_local=if_info->ifa_local | n|u键;
printk(KERN_DEBUG“newtest::%pI4”,&if_info->ifa_local);
//dev->netdev_ops->ndo_open(dev);
}   
}
cur_if++;
dev=下一个网络设备(dev);
}
返回;
}

这与我正在尝试的类似,事实上我尝试实现某种隐形模式,它应该做到这一点(root是先决条件)。但这不是通过内核模块完成的。我仍在尽力帮忙。我的步骤如下:

  • 停止所有真实(无环回等)网络设备

  • 收集他们的苹果

  • 将其Mac更改为唯一的随机Mac

  • 收集旧主机名并将主机名更改为唯一的随机主机名

  • 重新激活NIC

  • 设置一些iptable

  • 所有这些都作为一个守护进程,等待特殊的keycomobo撤销所有更改

  • 让我们来看看答案,或者某种答案: 问题是,您肯定运行了一些应用程序,它们通过udev或其他方式控制您的NIC。我的例子是正在运行的WICD守护进程,当我在代码中关闭nic时,WICD(IIRC)立即将其打开。 我在谷歌上搜索,找到了一些关于卸载司机的信息。。。。。但这也意味着,我们不能再改变Mac或ip了。 因此,在内核中,我们需要确定哪个userland进程占用nic。 终止这些进程可能很方便。
    顺便说一句,您可以使用上面提到的命令和prepend ptrace,然后您将看到涉及哪些系统调用。

    太棒了,谢谢您的建议!我得调查一下,看看结果如何。