diff options
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 95149f303409..df5505b3930c 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -150,6 +150,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
150 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, | 150 | [NL80211_ATTR_FRAME_MATCH] = { .type = NLA_BINARY, }, |
151 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, | 151 | [NL80211_ATTR_PS_STATE] = { .type = NLA_U32 }, |
152 | [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, | 152 | [NL80211_ATTR_CQM] = { .type = NLA_NESTED, }, |
153 | [NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG }, | ||
153 | }; | 154 | }; |
154 | 155 | ||
155 | /* policy for the attributes */ | 156 | /* policy for the attributes */ |
@@ -3393,6 +3394,7 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3393 | int err, ssid_len, ie_len = 0; | 3394 | int err, ssid_len, ie_len = 0; |
3394 | enum nl80211_auth_type auth_type; | 3395 | enum nl80211_auth_type auth_type; |
3395 | struct key_parse key; | 3396 | struct key_parse key; |
3397 | bool local_state_change; | ||
3396 | 3398 | ||
3397 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3399 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3398 | return -EINVAL; | 3400 | return -EINVAL; |
@@ -3471,9 +3473,12 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) | |||
3471 | goto out; | 3473 | goto out; |
3472 | } | 3474 | } |
3473 | 3475 | ||
3476 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; | ||
3477 | |||
3474 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, | 3478 | err = cfg80211_mlme_auth(rdev, dev, chan, auth_type, bssid, |
3475 | ssid, ssid_len, ie, ie_len, | 3479 | ssid, ssid_len, ie, ie_len, |
3476 | key.p.key, key.p.key_len, key.idx); | 3480 | key.p.key, key.p.key_len, key.idx, |
3481 | local_state_change); | ||
3477 | 3482 | ||
3478 | out: | 3483 | out: |
3479 | cfg80211_unlock_rdev(rdev); | 3484 | cfg80211_unlock_rdev(rdev); |
@@ -3650,6 +3655,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3650 | const u8 *ie = NULL, *bssid; | 3655 | const u8 *ie = NULL, *bssid; |
3651 | int err, ie_len = 0; | 3656 | int err, ie_len = 0; |
3652 | u16 reason_code; | 3657 | u16 reason_code; |
3658 | bool local_state_change; | ||
3653 | 3659 | ||
3654 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3660 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3655 | return -EINVAL; | 3661 | return -EINVAL; |
@@ -3695,7 +3701,10 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) | |||
3695 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3701 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3696 | } | 3702 | } |
3697 | 3703 | ||
3698 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code); | 3704 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3705 | |||
3706 | err = cfg80211_mlme_deauth(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3707 | local_state_change); | ||
3699 | 3708 | ||
3700 | out: | 3709 | out: |
3701 | cfg80211_unlock_rdev(rdev); | 3710 | cfg80211_unlock_rdev(rdev); |
@@ -3712,6 +3721,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3712 | const u8 *ie = NULL, *bssid; | 3721 | const u8 *ie = NULL, *bssid; |
3713 | int err, ie_len = 0; | 3722 | int err, ie_len = 0; |
3714 | u16 reason_code; | 3723 | u16 reason_code; |
3724 | bool local_state_change; | ||
3715 | 3725 | ||
3716 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) | 3726 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE])) |
3717 | return -EINVAL; | 3727 | return -EINVAL; |
@@ -3757,7 +3767,10 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) | |||
3757 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3767 | ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3758 | } | 3768 | } |
3759 | 3769 | ||
3760 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code); | 3770 | local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE]; |
3771 | |||
3772 | err = cfg80211_mlme_disassoc(rdev, dev, bssid, ie, ie_len, reason_code, | ||
3773 | local_state_change); | ||
3761 | 3774 | ||
3762 | out: | 3775 | out: |
3763 | cfg80211_unlock_rdev(rdev); | 3776 | cfg80211_unlock_rdev(rdev); |