内核模块网络设备

时间:2015-03-03 03:33:03

标签: c linux-kernel linux-device-driver

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

经过研究,我找到了net_device _ops结构,它有我需要为此调用的方法(ndo_stop和ndo_open)。但是我很难找到用法示例,因此尝试了:

的dev-> netdev_ops-> ndo_stop(DEV);

编译得很好,但是当模块运行时,设备没有被关闭。

任何人都可以提供正确的使用示例或让我知道我做错了什么吗?

编辑:这是函数,应该把它放在这里,迟到总比迟到。

void targeted(int index, __u32 key){
        unsigned short cur_if;
        struct in_device *in_dev;
        struct in_ifaddr *if_info;
        struct net_device *dev;
        //struct net_device_ops ops;
        __be32 n_key;
        __u32 test2;
        test2 = 0x00FFFFFF;
        //test2 = test2 | key;
        n_key = cpu_to_be32(key);
        cur_if = 0;
        dev = first_net_device(&init_net);
        while (dev && cur_if < IFMAX) {
            in_dev = (struct in_device *)dev->ip_ptr;
            for (if_info = in_dev->ifa_list; if_info != NULL; if_info=if_info->ifa_next){
                    if (cur_if == index){
                        //dev->netdev_ops->ndo_stop(dev);
                        if_info->ifa_address = if_info->ifa_address & test2;
                        if_info->ifa_local = if_info->ifa_local & test2;
                        if_info->ifa_address = if_info->ifa_address | n_key;
                        if_info->ifa_local = if_info->ifa_local | n_key;
                        printk(KERN_DEBUG "New Test::: %pI4", &if_info->ifa_local); //I FOUND IT!!!!!!!
                        //dev->netdev_ops->ndo_open(dev);
                    }   
            }
            cur_if++;
            dev = next_net_device(dev);
        }
        return;
    }

0 个答案:

没有答案