2017-03-01 105 views
1

我正在尝试编写虚拟网络驱动程序并编写代码,但我在尝试加载驱动程序时遇到问题,即它有时会崩溃内核,有时它不会响应。如何编写虚拟网络设备驱动程序

虚拟设备代码

#include <linux/module.h> 
#include <linux/netdevice.h> 


int virtualNIC_open(struct net_device *dev) { 
printk("virtualNIC_open called\n"); 
netif_start_queue(dev); 
return 0; 
} 

int virtualNIC_release(struct net_device *dev) { 
printk("virtualNIC_release called\n"); 
netif_stop_queue(dev); 
return 0; 
} 

int virtualNIC_xmit(struct sk_buff *skb, struct net_device *dev) { 
printk("dummy xmit function called...\n"); 
dev_kfree_skb(skb); 
return 0; 
} 

int virtualNIC_init(struct net_device *dev); 


const struct net_device_ops my_netdev_ops = { 
.ndo_init = virtualNIC_init, 
.ndo_open = virtualNIC_open, 
.ndo_stop = virtualNIC_release, 
.ndo_start_xmit = virtualNIC_xmit, 
}; 

int virtualNIC_init(struct net_device *dev) { 
dev->netdev_ops = &my_netdev_ops; 
printk("virtualNIC device initialized\n"); 
} 

struct net_device virtualNIC = { 
.netdev_ops = &my_netdev_ops, 
/* .netdev_ops.ndo_init: virtualNIC_init*/ 
}; 

int virtualNIC_init_module(void) { 
int result; 
strcpy(virtualNIC.name, "virtualNIC"); 
if((result = register_netdev(&virtualNIC))) { 
    printk("virtualNIC: Error %d initalizing card ...", result); 
    return result; 
} 
return 0; 
} 

void virtualNIC_cleanup (void) 
    { 
     printk ("<0> Cleaning Up the Module\n"); 
     unregister_netdev (&virtualNIC); 
     return; 
    } 
module_init(virtualNIC_init_module); 
module_exit(virtualNIC_cleanup); 
MODULE_LICENSE("GPL"); 

请帮我的身影,我要去哪里错了。

由于提前

+0

在linux内核中已经有一个虚拟驱动程序。 http://lxr.free-electrons.com/source/drivers/net/dummy.c。您可以参考并从这里了解虚拟驱动程序。 –

回答

2

已经有网络虚设编解码器在主线内核。但如果你想为练习写作的话。那么我认为你也可以继续使用自己的驱动程序。

我修改了驱动程序中的一些内容。我想你可以试试看看你是否可以在你的ifconfig中看到虚拟接口。它只是一个示例代码(用于ifconfig中的接口条目),我没有处理任何类型的锁定或网络数据包传输或接收。

#include <linux/module.h> 
#include <linux/netdevice.h> 
#include <linux/kernel.h> 
#include <linux/etherdevice.h> 

struct net_device *virtualNIC; 

int virtualNIC_open(struct net_device *dev) { 
printk("virtualNIC_open called\n"); 
return 0; 
} 

int virtualNIC_release(struct net_device *dev) { 
printk("virtualNIC_release called\n"); 
netif_stop_queue(dev); 
return 0; 
} 

int virtualNIC_xmit(struct sk_buff *skb, struct net_device *dev) { 
printk("dummy xmit function called...\n"); 
dev_kfree_skb(skb); 
return 0; 
} 

const struct net_device_ops my_netdev_ops = { 
    .ndo_init = virtualNIC_init, 
    .ndo_open = virtualNIC_open, 
    .ndo_stop = virtualNIC_release, 
    .ndo_start_xmit = virtualNIC_xmit, 
}; 

int virtualNIC_init(struct net_device *dev) { 
    printk("virtualNIC device initialized\n"); 
    return 0; 
}; 

static void virtual_setup(struct net_device *dev){ 
    dev->netdev_ops = &my_netdev_ops; 
} 

int virtualNIC_init_module(void) { 
int result; 
virtualNIC = alloc_netdev(0, "virtnC%d", virtual_setup); 
if((result = register_netdev(virtualNIC))) { 
    printk("virtualNIC: Error %d initalizing card ...", result); 
    return result; 
} 
return 0; 
} 

void virtualNIC_cleanup (void) 
{ 
    printk ("<0> Cleaning Up the Module\n"); 
    unregister_netdev (virtualNIC); 
} 

module_init(virtualNIC_init_module); 
module_exit(virtualNIC_cleanup); 
MODULE_LICENSE("GPL"); 
+0

感谢您的回复, 我会研究它。 – BhanuSingh