2017-03-01 72 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