X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Fkni%2Fkni_misc.c;h=59d15ca6eb94a22ac8c24bb0aeacb61bd9e60e5e;hb=73983b2bdae8a285c3cca3bbd18a7e965c3f1cca;hp=635e18f924ad3b6db32cbdf09984b6f1c4e5b1e5;hpb=72a7a2b2469eeba14669fabd7874cf59b28bedb5;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c b/lib/librte_eal/linuxapp/kni/kni_misc.c index 635e18f924..59d15ca6eb 100644 --- a/lib/librte_eal/linuxapp/kni/kni_misc.c +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c @@ -22,9 +22,11 @@ * Intel Corporation */ +#include #include #include #include +#include #include #include #include @@ -33,8 +35,9 @@ #include #include + +#include "compat.h" #include "kni_dev.h" -#include MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Intel Corporation"); @@ -102,9 +105,20 @@ struct kni_net { struct list_head kni_list_head; }; -static __net_init int kni_init_net(struct net *net) +static int __net_init kni_init_net(struct net *net) { +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS struct kni_net *knet = net_generic(net, kni_net_id); +#else + struct kni_net *knet; + int ret; + + knet = kmalloc(sizeof(struct kni_net), GFP_KERNEL); + if (!knet) { + ret = -ENOMEM; + return ret; + } +#endif /* Clear the bit of device in use */ clear_bit(KNI_DEV_IN_USE_BIT_NUM, &knet->device_in_use); @@ -112,14 +126,33 @@ static __net_init int kni_init_net(struct net *net) init_rwsem(&knet->kni_list_lock); INIT_LIST_HEAD(&knet->kni_list_head); +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS return 0; +#else + ret = net_assign_generic(net, kni_net_id, knet); + if (ret < 0) + kfree(knet); + + return ret; +#endif +} + +static void __net_exit kni_exit_net(struct net *net) +{ +#ifndef HAVE_SIMPLIFIED_PERNET_OPERATIONS + struct kni_net *knet = net_generic(net, kni_net_id); + + kfree(knet); +#endif } static struct pernet_operations kni_net_ops = { .init = kni_init_net, - .exit = NULL, + .exit = kni_exit_net, +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS .id = &kni_net_id, .size = sizeof(struct kni_net), +#endif }; static int __init @@ -134,7 +167,11 @@ kni_init(void) return -EINVAL; } +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS rc = register_pernet_subsys(&kni_net_ops); +#else + rc = register_pernet_gen_subsys(&kni_net_id, &kni_net_ops); +#endif if (rc) return -EPERM; @@ -152,7 +189,11 @@ kni_init(void) return 0; out: +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS unregister_pernet_subsys(&kni_net_ops); +#else + register_pernet_gen_subsys(&kni_net_id, &kni_net_ops); +#endif return rc; } @@ -160,7 +201,11 @@ static void __exit kni_exit(void) { misc_deregister(&kni_misc); +#ifdef HAVE_SIMPLIFIED_PERNET_OPERATIONS unregister_pernet_subsys(&kni_net_ops); +#else + register_pernet_gen_subsys(&kni_net_id, &kni_net_ops); +#endif KNI_PRINT("####### DPDK kni module unloaded #######\n"); } @@ -500,6 +545,15 @@ kni_ioctl_create(struct net *net, if (pci) pci_dev_put(pci); + if (kni->lad_dev) + memcpy(net_dev->dev_addr, kni->lad_dev->dev_addr, ETH_ALEN); + else + /* + * Generate random mac address. eth_random_addr() is the newer + * version of generating mac address in linux kernel. + */ + random_ether_addr(net_dev->dev_addr); + ret = register_netdev(net_dev); if (ret) { KNI_ERR("error %i registering device \"%s\"\n",