Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/networking/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking 如何编写虚拟网络设备驱动程序_Networking_Linux Kernel_Linux Device Driver - Fatal编程技术网

Networking 如何编写虚拟网络设备驱动程序

Networking 如何编写虚拟网络设备驱动程序,networking,linux-kernel,linux-device-driver,Networking,Linux Kernel,Linux Device Driver,我正在尝试编写一个虚拟网络驱动程序,并且已经编写了代码,但是我在尝试加载驱动程序时遇到了一个问题,即它有时会使内核崩溃,有时它没有响应 虚拟设备代码 #include <linux/module.h> #include <linux/netdevice.h> int virtualNIC_open(struct net_device *dev) { printk("virtualNIC_open called\n"); netif_start_queue(dev)

我正在尝试编写一个虚拟网络驱动程序,并且已经编写了代码,但是我在尝试加载驱动程序时遇到了一个问题,即它有时会使内核崩溃,有时它没有响应

虚拟设备代码

#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");
#包括
#包括
int virtualNIC_open(结构网络设备*dev){
printk(“virtualNIC_open called\n”);
网络启动队列(dev);
返回0;
}
int虚拟发布(结构网络设备*dev){
printk(“称为\n的虚拟发布”);
netif_停止队列(dev);
返回0;
}
int virtualNIC_xmit(结构sk_buff*skb,结构net_设备*dev){
printk(“被调用的伪xmit函数…\n”);
dev_kfree_skb(skb);
返回0;
}
int virtualNIC_init(结构网络设备*dev);
const struct net_device_ops my_netdev_ops={
.ndo_init=虚拟初始化,
.ndo_open=虚拟_open,
.ndo_stop=虚拟发布,
.ndo_start_xmit=virtualNIC_xmit,
};
int virtualNIC_init(结构网络设备*dev){
dev->netdev_ops=&my_netdev_ops;
printk(“虚拟设备已初始化”);
}
结构网络设备虚拟电路={
.netdev_ops=&my_netdev_ops,
/*.netdev_ops.ndo_init:virtualNIC_init*/
};
int虚拟初始化模块(void){
int结果;
strcpy(virtualNIC.name,“virtualNIC”);
if((result=register\u netdev(&virtualNIC))){
printk(“虚拟:初始化卡时出现错误%d…”,结果);
返回结果;
}
返回0;
}
void虚拟单元清理(void)
{
printk(“清理模块\n”);
注销网络开发人员(和虚拟机);
返回;
}
模块初始化(虚拟初始化模块);
模块退出(虚拟清理);
模块许可证(“GPL”);
请帮我想想,我错在哪里


提前感谢

主线内核中已经有网络虚拟编解码器。但是如果你想为练习写作的话。那我想你也可以自己开车

我已经修改了你的驱动程序中的一些内容。我认为您可以尝试一下,看看是否可以在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");
#包括
#包括
#包括
#包括
结构网络设备*虚拟电路;
int virtualNIC_open(结构网络设备*dev){
printk(“virtualNIC_open called\n”);
返回0;
}
int虚拟发布(结构网络设备*dev){
printk(“称为\n的虚拟发布”);
netif_停止队列(dev);
返回0;
}
int virtualNIC_xmit(结构sk_buff*skb,结构net_设备*dev){
printk(“被调用的伪xmit函数…\n”);
dev_kfree_skb(skb);
返回0;
}
const struct net_device_ops my_netdev_ops={
.ndo_init=虚拟初始化,
.ndo_open=虚拟_open,
.ndo_stop=虚拟发布,
.ndo_start_xmit=virtualNIC_xmit,
};
int virtualNIC_init(结构网络设备*dev){
printk(“虚拟设备已初始化”);
返回0;
};
静态无效虚拟设备设置(结构网络设备*dev){
dev->netdev_ops=&my_netdev_ops;
}
int虚拟初始化模块(void){
int结果;
virtualNIC=alloc_netdev(0,“virtnC%d”,虚拟_设置);
如果((结果=寄存器\网络开发者(虚拟))){
printk(“虚拟:初始化卡时出现错误%d…”,结果);
返回结果;
}
返回0;
}
void虚拟单元清理(void)
{
printk(“清理模块\n”);
注销网络开发(虚拟化);
}
模块初始化(虚拟初始化模块);
模块退出(虚拟清理);
模块许可证(“GPL”);

这非常有用,我只想添加这部分代码:

virtualNIC = alloc_netdev (0, "virtnC%d", NET_NAME_UNKNOWN, virtual_setup); 

新内核中有4个参数…

linux内核中已经有一个虚拟驱动程序。您可以从这里获取引用并理解虚拟驱动程序。出于某种原因,您从virtualNIC打开中删除了“netif_start_queue(dev);”——不确定这是如何工作的。这个代码经过测试了吗?