Skip to content

Commit

Permalink
6lowpan: add lowpan dev register helpers
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Alexander Aring <[email protected]>
Signed-off-by: Marcel Holtmann <[email protected]>
  • Loading branch information
alexaring authored and holtmann committed Dec 10, 2015
1 parent 43f26e1 commit 00f5931
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 12 deletions.
7 changes: 6 additions & 1 deletion include/net/6lowpan.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,12 @@ static inline void lowpan_push_hc_data(u8 **hc_ptr, const void *data,
*hc_ptr += len;
}

void lowpan_netdev_setup(struct net_device *dev, enum lowpan_lltypes lltype);
int lowpan_register_netdevice(struct net_device *dev,
enum lowpan_lltypes lltype);
int lowpan_register_netdev(struct net_device *dev,
enum lowpan_lltypes lltype);
void lowpan_unregister_netdevice(struct net_device *dev);
void lowpan_unregister_netdev(struct net_device *dev);

/**
* lowpan_header_decompress - replace 6LoWPAN header with IPv6 header
Expand Down
33 changes: 31 additions & 2 deletions net/6lowpan/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,45 @@

#include <net/6lowpan.h>

void lowpan_netdev_setup(struct net_device *dev, enum lowpan_lltypes lltype)
int lowpan_register_netdevice(struct net_device *dev,
enum lowpan_lltypes lltype)
{
dev->addr_len = EUI64_ADDR_LEN;
dev->type = ARPHRD_6LOWPAN;
dev->mtu = IPV6_MIN_MTU;
dev->priv_flags |= IFF_NO_QUEUE;

lowpan_priv(dev)->lltype = lltype;

return register_netdevice(dev);
}
EXPORT_SYMBOL(lowpan_register_netdevice);

int lowpan_register_netdev(struct net_device *dev,
enum lowpan_lltypes lltype)
{
int ret;

rtnl_lock();
ret = lowpan_register_netdevice(dev, lltype);
rtnl_unlock();
return ret;
}
EXPORT_SYMBOL(lowpan_register_netdev);

void lowpan_unregister_netdevice(struct net_device *dev)
{
unregister_netdevice(dev);
}
EXPORT_SYMBOL(lowpan_unregister_netdevice);

void lowpan_unregister_netdev(struct net_device *dev)
{
rtnl_lock();
lowpan_unregister_netdevice(dev);
rtnl_unlock();
}
EXPORT_SYMBOL(lowpan_netdev_setup);
EXPORT_SYMBOL(lowpan_unregister_netdev);

static int __init lowpan_module_init(void)
{
Expand Down
8 changes: 3 additions & 5 deletions net/bluetooth/6lowpan.c
Original file line number Diff line number Diff line change
Expand Up @@ -825,9 +825,7 @@ static int setup_netdev(struct l2cap_chan *chan, struct lowpan_dev **dev)
list_add_rcu(&(*dev)->list, &bt_6lowpan_devices);
spin_unlock(&devices_lock);

lowpan_netdev_setup(netdev, LOWPAN_LLTYPE_BTLE);

err = register_netdev(netdev);
err = lowpan_register_netdev(netdev, LOWPAN_LLTYPE_BTLE);
if (err < 0) {
BT_INFO("register_netdev failed %d", err);
spin_lock(&devices_lock);
Expand Down Expand Up @@ -890,7 +888,7 @@ static void delete_netdev(struct work_struct *work)
struct lowpan_dev *entry = container_of(work, struct lowpan_dev,
delete_netdev);

unregister_netdev(entry->netdev);
lowpan_unregister_netdev(entry->netdev);

/* The entry pointer is deleted by the netdev destructor. */
}
Expand Down Expand Up @@ -1348,7 +1346,7 @@ static void disconnect_devices(void)
ifdown(entry->netdev);
BT_DBG("Unregistering netdev %s %p",
entry->netdev->name, entry->netdev);
unregister_netdev(entry->netdev);
lowpan_unregister_netdev(entry->netdev);
kfree(entry);
}
}
Expand Down
6 changes: 2 additions & 4 deletions net/ieee802154/6lowpan/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,7 @@ static int lowpan_newlink(struct net *src_net, struct net_device *ldev,
wdev->needed_headroom;
ldev->needed_tailroom = wdev->needed_tailroom;

lowpan_netdev_setup(ldev, LOWPAN_LLTYPE_IEEE802154);

ret = register_netdevice(ldev);
ret = lowpan_register_netdevice(ldev, LOWPAN_LLTYPE_IEEE802154);
if (ret < 0) {
dev_put(wdev);
return ret;
Expand All @@ -180,7 +178,7 @@ static void lowpan_dellink(struct net_device *ldev, struct list_head *head)
ASSERT_RTNL();

wdev->ieee802154_ptr->lowpan_dev = NULL;
unregister_netdevice(ldev);
lowpan_unregister_netdevice(ldev);
dev_put(wdev);
}

Expand Down

0 comments on commit 00f5931

Please sign in to comment.