aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-07-01 19:16:48 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-01 19:16:48 -0400
commitaea54bce01c44bf3e35ac016fcd584b0de137673 (patch)
tree6325f046bb7b024bbfd1b05d864ee47f4480dffc /net
parent3e878b8d54e0fc12df363ee8e4a638c8147aac98 (diff)
parent0ac9ebedce444ec6f93cf6a995e4a20009191b00 (diff)
Merge branch 'for-next' of git://git2.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan
Diffstat (limited to 'net')
-rw-r--r--net/ieee802154/af_ieee802154.c2
-rw-r--r--net/ieee802154/dgram.c2
-rw-r--r--net/ieee802154/nl-phy.c31
3 files changed, 33 insertions, 2 deletions
diff --git a/net/ieee802154/af_ieee802154.c b/net/ieee802154/af_ieee802154.c
index 6df6ecf49708..40e606f3788f 100644
--- a/net/ieee802154/af_ieee802154.c
+++ b/net/ieee802154/af_ieee802154.c
@@ -302,7 +302,7 @@ static int ieee802154_rcv(struct sk_buff *skb, struct net_device *dev,
302 struct packet_type *pt, struct net_device *orig_dev) 302 struct packet_type *pt, struct net_device *orig_dev)
303{ 303{
304 if (!netif_running(dev)) 304 if (!netif_running(dev))
305 return -ENODEV; 305 goto drop;
306 pr_debug("got frame, type %d, dev %p\n", dev->type, dev); 306 pr_debug("got frame, type %d, dev %p\n", dev->type, dev);
307#ifdef DEBUG 307#ifdef DEBUG
308 print_hex_dump_bytes("ieee802154_rcv ", DUMP_PREFIX_NONE, skb->data, skb->len); 308 print_hex_dump_bytes("ieee802154_rcv ", DUMP_PREFIX_NONE, skb->data, skb->len);
diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c
index 1a3334c2609a..faecf648123f 100644
--- a/net/ieee802154/dgram.c
+++ b/net/ieee802154/dgram.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * ZigBee socket interface 2 * IEEE 802.15.4 dgram socket interface
3 * 3 *
4 * Copyright 2007, 2008 Siemens AG 4 * Copyright 2007, 2008 Siemens AG
5 * 5 *
diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c
index 02548b292b53..c64a38d57aa3 100644
--- a/net/ieee802154/nl-phy.c
+++ b/net/ieee802154/nl-phy.c
@@ -24,6 +24,7 @@
24 24
25#include <linux/kernel.h> 25#include <linux/kernel.h>
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/if_arp.h>
27#include <net/netlink.h> 28#include <net/netlink.h>
28#include <net/genetlink.h> 29#include <net/genetlink.h>
29#include <net/wpan-phy.h> 30#include <net/wpan-phy.h>
@@ -213,12 +214,37 @@ static int ieee802154_add_iface(struct sk_buff *skb,
213 goto nla_put_failure; 214 goto nla_put_failure;
214 } 215 }
215 216
217 if (info->attrs[IEEE802154_ATTR_HW_ADDR] &&
218 nla_len(info->attrs[IEEE802154_ATTR_HW_ADDR]) !=
219 IEEE802154_ADDR_LEN) {
220 rc = -EINVAL;
221 goto nla_put_failure;
222 }
223
216 dev = phy->add_iface(phy, devname); 224 dev = phy->add_iface(phy, devname);
217 if (IS_ERR(dev)) { 225 if (IS_ERR(dev)) {
218 rc = PTR_ERR(dev); 226 rc = PTR_ERR(dev);
219 goto nla_put_failure; 227 goto nla_put_failure;
220 } 228 }
221 229
230 if (info->attrs[IEEE802154_ATTR_HW_ADDR]) {
231 struct sockaddr addr;
232
233 addr.sa_family = ARPHRD_IEEE802154;
234 nla_memcpy(&addr.sa_data, info->attrs[IEEE802154_ATTR_HW_ADDR],
235 IEEE802154_ADDR_LEN);
236
237 /*
238 * strangely enough, some callbacks (inetdev_event) from
239 * dev_set_mac_address require RTNL_LOCK
240 */
241 rtnl_lock();
242 rc = dev_set_mac_address(dev, &addr);
243 rtnl_unlock();
244 if (rc)
245 goto dev_unregister;
246 }
247
222 NLA_PUT_STRING(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy)); 248 NLA_PUT_STRING(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy));
223 NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, dev->name); 249 NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, dev->name);
224 250
@@ -228,6 +254,11 @@ static int ieee802154_add_iface(struct sk_buff *skb,
228 254
229 return ieee802154_nl_reply(msg, info); 255 return ieee802154_nl_reply(msg, info);
230 256
257dev_unregister:
258 rtnl_lock(); /* del_iface must be called with RTNL lock */
259 phy->del_iface(phy, dev);
260 dev_put(dev);
261 rtnl_unlock();
231nla_put_failure: 262nla_put_failure:
232 nlmsg_free(msg); 263 nlmsg_free(msg);
233out_dev: 264out_dev: