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