Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

6lowpan: add lowpan dev register helpers

This patch introduces register and unregister functionality for lowpan
interfaces. While register a lowpan interface there are several things
which need to be initialize by the 6lowpan subsystem. Upcoming
functionality need to register/unregister per interface components e.g.
debugfs entry.

Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Alexander Aring and committed by
Marcel Holtmann
00f59314 43f26e17

+42 -12
+6 -1
include/net/6lowpan.h
··· 185 185 *hc_ptr += len; 186 186 } 187 187 188 - void lowpan_netdev_setup(struct net_device *dev, enum lowpan_lltypes lltype); 188 + int lowpan_register_netdevice(struct net_device *dev, 189 + enum lowpan_lltypes lltype); 190 + int lowpan_register_netdev(struct net_device *dev, 191 + enum lowpan_lltypes lltype); 192 + void lowpan_unregister_netdevice(struct net_device *dev); 193 + void lowpan_unregister_netdev(struct net_device *dev); 189 194 190 195 /** 191 196 * lowpan_header_decompress - replace 6LoWPAN header with IPv6 header
+31 -2
net/6lowpan/core.c
··· 15 15 16 16 #include <net/6lowpan.h> 17 17 18 - void lowpan_netdev_setup(struct net_device *dev, enum lowpan_lltypes lltype) 18 + int lowpan_register_netdevice(struct net_device *dev, 19 + enum lowpan_lltypes lltype) 19 20 { 20 21 dev->addr_len = EUI64_ADDR_LEN; 21 22 dev->type = ARPHRD_6LOWPAN; ··· 24 23 dev->priv_flags |= IFF_NO_QUEUE; 25 24 26 25 lowpan_priv(dev)->lltype = lltype; 26 + 27 + return register_netdevice(dev); 27 28 } 28 - EXPORT_SYMBOL(lowpan_netdev_setup); 29 + EXPORT_SYMBOL(lowpan_register_netdevice); 30 + 31 + int lowpan_register_netdev(struct net_device *dev, 32 + enum lowpan_lltypes lltype) 33 + { 34 + int ret; 35 + 36 + rtnl_lock(); 37 + ret = lowpan_register_netdevice(dev, lltype); 38 + rtnl_unlock(); 39 + return ret; 40 + } 41 + EXPORT_SYMBOL(lowpan_register_netdev); 42 + 43 + void lowpan_unregister_netdevice(struct net_device *dev) 44 + { 45 + unregister_netdevice(dev); 46 + } 47 + EXPORT_SYMBOL(lowpan_unregister_netdevice); 48 + 49 + void lowpan_unregister_netdev(struct net_device *dev) 50 + { 51 + rtnl_lock(); 52 + lowpan_unregister_netdevice(dev); 53 + rtnl_unlock(); 54 + } 55 + EXPORT_SYMBOL(lowpan_unregister_netdev); 29 56 30 57 static int __init lowpan_module_init(void) 31 58 {
+3 -5
net/bluetooth/6lowpan.c
··· 825 825 list_add_rcu(&(*dev)->list, &bt_6lowpan_devices); 826 826 spin_unlock(&devices_lock); 827 827 828 - lowpan_netdev_setup(netdev, LOWPAN_LLTYPE_BTLE); 829 - 830 - err = register_netdev(netdev); 828 + err = lowpan_register_netdev(netdev, LOWPAN_LLTYPE_BTLE); 831 829 if (err < 0) { 832 830 BT_INFO("register_netdev failed %d", err); 833 831 spin_lock(&devices_lock); ··· 888 890 struct lowpan_dev *entry = container_of(work, struct lowpan_dev, 889 891 delete_netdev); 890 892 891 - unregister_netdev(entry->netdev); 893 + lowpan_unregister_netdev(entry->netdev); 892 894 893 895 /* The entry pointer is deleted by the netdev destructor. */ 894 896 } ··· 1346 1348 ifdown(entry->netdev); 1347 1349 BT_DBG("Unregistering netdev %s %p", 1348 1350 entry->netdev->name, entry->netdev); 1349 - unregister_netdev(entry->netdev); 1351 + lowpan_unregister_netdev(entry->netdev); 1350 1352 kfree(entry); 1351 1353 } 1352 1354 }
+2 -4
net/ieee802154/6lowpan/core.c
··· 161 161 wdev->needed_headroom; 162 162 ldev->needed_tailroom = wdev->needed_tailroom; 163 163 164 - lowpan_netdev_setup(ldev, LOWPAN_LLTYPE_IEEE802154); 165 - 166 - ret = register_netdevice(ldev); 164 + ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154); 167 165 if (ret < 0) { 168 166 dev_put(wdev); 169 167 return ret; ··· 178 180 ASSERT_RTNL(); 179 181 180 182 wdev->ieee802154_ptr->lowpan_dev = NULL; 181 - unregister_netdevice(ldev); 183 + lowpan_unregister_netdevice(ldev); 182 184 dev_put(wdev); 183 185 } 184 186