【问题标题】:How to write a dummy network device driver如何编写虚拟网络设备驱动程序
【发布时间】:2018-11-25 21:15:00
【问题描述】:

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

虚拟设备代码

#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");

请帮我想想,我哪里错了。

提前致谢

【问题讨论】:

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


【解决方案1】:

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

我在您的驱动程序中修改了一些内容。我认为您可以尝试一下,看看是否可以在 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");

【讨论】:

  • 您删除了“netif_start_queue(dev);”出于某种原因从 virtualNIC_open - 不确定这是如何工作的。这段代码是否经过测试?
【解决方案2】:

这很有帮助,我只想添加这部分代码:

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

这在新内核中有 4 个参数...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2020-03-31
    • 2011-07-02
    • 2015-09-18
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多