1 /* This program is free software; you can redistribute it and/or modify 2 * it under the terms of the GNU General Public License version 2 3 * as published by the Free Software Foundation. 4 * 5 * This program is distributed in the hope that it will be useful, 6 * but WITHOUT ANY WARRANTY; without even the implied warranty of 7 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 8 * GNU General Public License for more details. 9 * 10 * Authors: 11 * (C) 2015 Pengutronix, Alexander Aring <aar@pengutronix.de> 12 */ 13 14 #include <linux/module.h> 15 16 #include <net/6lowpan.h> 17 18 #include "6lowpan_i.h" 19 20 int lowpan_register_netdevice(struct net_device *dev, 21 enum lowpan_lltypes lltype) 22 { 23 int ret; 24 25 dev->addr_len = EUI64_ADDR_LEN; 26 dev->type = ARPHRD_6LOWPAN; 27 dev->mtu = IPV6_MIN_MTU; 28 dev->priv_flags |= IFF_NO_QUEUE; 29 30 lowpan_priv(dev)->lltype = lltype; 31 32 ret = register_netdevice(dev); 33 if (ret < 0) 34 return ret; 35 36 ret = lowpan_dev_debugfs_init(dev); 37 if (ret < 0) 38 unregister_netdevice(dev); 39 40 return ret; 41 } 42 EXPORT_SYMBOL(lowpan_register_netdevice); 43 44 int lowpan_register_netdev(struct net_device *dev, 45 enum lowpan_lltypes lltype) 46 { 47 int ret; 48 49 rtnl_lock(); 50 ret = lowpan_register_netdevice(dev, lltype); 51 rtnl_unlock(); 52 return ret; 53 } 54 EXPORT_SYMBOL(lowpan_register_netdev); 55 56 void lowpan_unregister_netdevice(struct net_device *dev) 57 { 58 unregister_netdevice(dev); 59 lowpan_dev_debugfs_exit(dev); 60 } 61 EXPORT_SYMBOL(lowpan_unregister_netdevice); 62 63 void lowpan_unregister_netdev(struct net_device *dev) 64 { 65 rtnl_lock(); 66 lowpan_unregister_netdevice(dev); 67 rtnl_unlock(); 68 } 69 EXPORT_SYMBOL(lowpan_unregister_netdev); 70 71 static int __init lowpan_module_init(void) 72 { 73 int ret; 74 75 ret = lowpan_debugfs_init(); 76 if (ret < 0) 77 return ret; 78 79 request_module_nowait("ipv6"); 80 81 request_module_nowait("nhc_dest"); 82 request_module_nowait("nhc_fragment"); 83 request_module_nowait("nhc_hop"); 84 request_module_nowait("nhc_ipv6"); 85 request_module_nowait("nhc_mobility"); 86 request_module_nowait("nhc_routing"); 87 request_module_nowait("nhc_udp"); 88 89 return 0; 90 } 91 92 static void __exit lowpan_module_exit(void) 93 { 94 lowpan_debugfs_exit(); 95 } 96 97 module_init(lowpan_module_init); 98 module_exit(lowpan_module_exit); 99 100 MODULE_LICENSE("GPL"); 101