aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-04-02 04:51:55 -0400
committerLuis Henriques <luis.henriques@canonical.com>2012-05-25 12:24:35 -0400
commit05f494c2d25b01e8fd80531065a9616e186fb418 (patch)
treee1c0a6f396b44359b3f878a5b34c998a890a7fc9 /net
parentaf70bc04dc5a6c973d991949be512258371356b1 (diff)
nl80211: ensure interface is up in various APIs
BugLink: http://bugs.launchpad.net/bugs/996109 commit 2b5f8b0b44e17e625cfba1e7b88db44f4dcc0441 upstream. [backported by Ben Greear] The nl80211 handling code should ensure as much as it can that the interface is in a valid state, it can certainly ensure the interface is running. Not doing so can cause calls through mac80211 into the driver that result in warnings and unspecified behaviour in the driver. Reported-by: Ben Greear <greearb@candelatech.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: Ben Greear <greearb@candelatech.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/wireless/nl80211.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 0c2b8080547..f310a0d90c3 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1181,6 +1181,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
1181 goto bad_res; 1181 goto bad_res;
1182 } 1182 }
1183 1183
1184 if (!netif_running(netdev)) {
1185 result = -ENETDOWN;
1186 goto bad_res;
1187 }
1188
1184 nla_for_each_nested(nl_txq_params, 1189 nla_for_each_nested(nl_txq_params,
1185 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], 1190 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
1186 rem_txq_params) { 1191 rem_txq_params) {
@@ -5432,7 +5437,7 @@ static struct genl_ops nl80211_ops[] = {
5432 .doit = nl80211_get_key, 5437 .doit = nl80211_get_key,
5433 .policy = nl80211_policy, 5438 .policy = nl80211_policy,
5434 .flags = GENL_ADMIN_PERM, 5439 .flags = GENL_ADMIN_PERM,
5435 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5440 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5436 NL80211_FLAG_NEED_RTNL, 5441 NL80211_FLAG_NEED_RTNL,
5437 }, 5442 },
5438 { 5443 {
@@ -5464,7 +5469,7 @@ static struct genl_ops nl80211_ops[] = {
5464 .policy = nl80211_policy, 5469 .policy = nl80211_policy,
5465 .flags = GENL_ADMIN_PERM, 5470 .flags = GENL_ADMIN_PERM,
5466 .doit = nl80211_addset_beacon, 5471 .doit = nl80211_addset_beacon,
5467 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5472 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5468 NL80211_FLAG_NEED_RTNL, 5473 NL80211_FLAG_NEED_RTNL,
5469 }, 5474 },
5470 { 5475 {
@@ -5472,7 +5477,7 @@ static struct genl_ops nl80211_ops[] = {
5472 .policy = nl80211_policy, 5477 .policy = nl80211_policy,
5473 .flags = GENL_ADMIN_PERM, 5478 .flags = GENL_ADMIN_PERM,
5474 .doit = nl80211_addset_beacon, 5479 .doit = nl80211_addset_beacon,
5475 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5480 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5476 NL80211_FLAG_NEED_RTNL, 5481 NL80211_FLAG_NEED_RTNL,
5477 }, 5482 },
5478 { 5483 {
@@ -5496,7 +5501,7 @@ static struct genl_ops nl80211_ops[] = {
5496 .doit = nl80211_set_station, 5501 .doit = nl80211_set_station,
5497 .policy = nl80211_policy, 5502 .policy = nl80211_policy,
5498 .flags = GENL_ADMIN_PERM, 5503 .flags = GENL_ADMIN_PERM,
5499 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5504 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5500 NL80211_FLAG_NEED_RTNL, 5505 NL80211_FLAG_NEED_RTNL,
5501 }, 5506 },
5502 { 5507 {
@@ -5512,7 +5517,7 @@ static struct genl_ops nl80211_ops[] = {
5512 .doit = nl80211_del_station, 5517 .doit = nl80211_del_station,
5513 .policy = nl80211_policy, 5518 .policy = nl80211_policy,
5514 .flags = GENL_ADMIN_PERM, 5519 .flags = GENL_ADMIN_PERM,
5515 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5520 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5516 NL80211_FLAG_NEED_RTNL, 5521 NL80211_FLAG_NEED_RTNL,
5517 }, 5522 },
5518 { 5523 {
@@ -5545,7 +5550,7 @@ static struct genl_ops nl80211_ops[] = {
5545 .doit = nl80211_del_mpath, 5550 .doit = nl80211_del_mpath,
5546 .policy = nl80211_policy, 5551 .policy = nl80211_policy,
5547 .flags = GENL_ADMIN_PERM, 5552 .flags = GENL_ADMIN_PERM,
5548 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5553 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5549 NL80211_FLAG_NEED_RTNL, 5554 NL80211_FLAG_NEED_RTNL,
5550 }, 5555 },
5551 { 5556 {
@@ -5553,7 +5558,7 @@ static struct genl_ops nl80211_ops[] = {
5553 .doit = nl80211_set_bss, 5558 .doit = nl80211_set_bss,
5554 .policy = nl80211_policy, 5559 .policy = nl80211_policy,
5555 .flags = GENL_ADMIN_PERM, 5560 .flags = GENL_ADMIN_PERM,
5556 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5561 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5557 NL80211_FLAG_NEED_RTNL, 5562 NL80211_FLAG_NEED_RTNL,
5558 }, 5563 },
5559 { 5564 {
@@ -5579,7 +5584,7 @@ static struct genl_ops nl80211_ops[] = {
5579 .doit = nl80211_get_mesh_config, 5584 .doit = nl80211_get_mesh_config,
5580 .policy = nl80211_policy, 5585 .policy = nl80211_policy,
5581 /* can be retrieved by unprivileged users */ 5586 /* can be retrieved by unprivileged users */
5582 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5587 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5583 NL80211_FLAG_NEED_RTNL, 5588 NL80211_FLAG_NEED_RTNL,
5584 }, 5589 },
5585 { 5590 {
@@ -5711,7 +5716,7 @@ static struct genl_ops nl80211_ops[] = {
5711 .doit = nl80211_setdel_pmksa, 5716 .doit = nl80211_setdel_pmksa,
5712 .policy = nl80211_policy, 5717 .policy = nl80211_policy,
5713 .flags = GENL_ADMIN_PERM, 5718 .flags = GENL_ADMIN_PERM,
5714 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5719 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5715 NL80211_FLAG_NEED_RTNL, 5720 NL80211_FLAG_NEED_RTNL,
5716 }, 5721 },
5717 { 5722 {
@@ -5719,7 +5724,7 @@ static struct genl_ops nl80211_ops[] = {
5719 .doit = nl80211_setdel_pmksa, 5724 .doit = nl80211_setdel_pmksa,
5720 .policy = nl80211_policy, 5725 .policy = nl80211_policy,
5721 .flags = GENL_ADMIN_PERM, 5726 .flags = GENL_ADMIN_PERM,
5722 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5727 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5723 NL80211_FLAG_NEED_RTNL, 5728 NL80211_FLAG_NEED_RTNL,
5724 }, 5729 },
5725 { 5730 {
@@ -5727,7 +5732,7 @@ static struct genl_ops nl80211_ops[] = {
5727 .doit = nl80211_flush_pmksa, 5732 .doit = nl80211_flush_pmksa,
5728 .policy = nl80211_policy, 5733 .policy = nl80211_policy,
5729 .flags = GENL_ADMIN_PERM, 5734 .flags = GENL_ADMIN_PERM,
5730 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5735 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5731 NL80211_FLAG_NEED_RTNL, 5736 NL80211_FLAG_NEED_RTNL,
5732 }, 5737 },
5733 { 5738 {
@@ -5815,7 +5820,7 @@ static struct genl_ops nl80211_ops[] = {
5815 .doit = nl80211_set_wds_peer, 5820 .doit = nl80211_set_wds_peer,
5816 .policy = nl80211_policy, 5821 .policy = nl80211_policy,
5817 .flags = GENL_ADMIN_PERM, 5822 .flags = GENL_ADMIN_PERM,
5818 .internal_flags = NL80211_FLAG_NEED_NETDEV | 5823 .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
5819 NL80211_FLAG_NEED_RTNL, 5824 NL80211_FLAG_NEED_RTNL,
5820 }, 5825 },
5821 { 5826 {