2017-03-01 1 views
1

J'essaie d'écrire un pilote réseau fictif et j'ai écrit le code, mais je suis confronté à un problème en essayant de charger le pilote, c'est-à-dire qu'il plante parfois le noyau et parfois non répondre.Comment écrire un pilote de périphérique réseau fictif

code dispositif factice

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

S'il vous plaît aidez-moi à la figure, où je vais mal.

Merci à l'avance

+0

Il existe déjà un pilote fictif dans le noyau Linux. http://lxr.free-electrons.com/source/drivers/net/dummy.c. Vous pouvez prendre la référence et comprendre le pilote factice d'ici. –

Répondre

2

Il est le réseau déjà codec factice dans le noyau de la canalisation principale. Mais encore si vous voulez écrire pour la pratique. Ensuite, je pense que vous pouvez continuer avec votre propre pilote.

J'ai modifié certaines choses dans votre pilote. Je pense que vous pouvez donner un essai pour voir si vous pouvez voir l'interface dummy dans votre ifconfig ou non. C'est juste un exemple de code (pour l'entrée d'interface dans ifconfig) et je ne gère aucun type de verrouillage ou de transmission ou de réception de paquets réseau.

#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

merci pour votre réponse, Je vais regarder dans. – BhanuSingh