diff options
author | David S. Miller <davem@davemloft.net> | 2011-07-01 19:16:48 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-01 19:16:48 -0400 |
commit | aea54bce01c44bf3e35ac016fcd584b0de137673 (patch) | |
tree | 6325f046bb7b024bbfd1b05d864ee47f4480dffc /net | |
parent | 3e878b8d54e0fc12df363ee8e4a638c8147aac98 (diff) | |
parent | 0ac9ebedce444ec6f93cf6a995e4a20009191b00 (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.c | 2 | ||||
-rw-r--r-- | net/ieee802154/dgram.c | 2 | ||||
-rw-r--r-- | net/ieee802154/nl-phy.c | 31 |
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 | ||
257 | dev_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(); | ||
231 | nla_put_failure: | 262 | nla_put_failure: |
232 | nlmsg_free(msg); | 263 | nlmsg_free(msg); |
233 | out_dev: | 264 | out_dev: |