| From d0f3f451f0002339ad75b43e79f1322f2e2e4ed1 Mon Sep 17 00:00:00 2001 |
| From: Jouni Malinen <jouni.malinen@atheros.com> |
| Date: Mon, 13 Dec 2010 21:08:53 +0200 |
| Subject: [PATCH] nl80211: Set cipher suites when using user space SME |
| |
| Previously, pairwise and group cipher suites were configured only |
| when kernel SME (nl80211 connect API) was used. However, mac80211 |
| needs this information even in the user space SME case for one |
| thing: to disable HT when TKIP/WEP is used. Add |
| NL80211_ATTR_CIPHER_SUITES_PAIRWISE to fix this special case with |
| user space SME. This allows mac80211 to disable HT properly when |
| the AP is configured with configuration that is not allowed. |
| (cherry picked from commit aca016054885c17d58c41888698761f2e1ce2b39) |
| --- |
| src/drivers/driver_nl80211.c | 44 ++++++++++++++++++++++++++++++++++++++++++ |
| wpa_supplicant/sme.c | 2 + |
| 2 files changed, 46 insertions(+), 0 deletions(-) |
| |
| diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c |
| index 364158c..fb75c2e 100644 |
| --- a/src/drivers/driver_nl80211.c |
| +++ b/src/drivers/driver_nl80211.c |
| @@ -3940,6 +3940,50 @@ static int wpa_driver_nl80211_associate( |
| NLA_PUT(msg, NL80211_ATTR_IE, params->wpa_ie_len, |
| params->wpa_ie); |
| |
| + if (params->pairwise_suite != CIPHER_NONE) { |
| + int cipher; |
| + |
| + switch (params->pairwise_suite) { |
| + case CIPHER_WEP40: |
| + cipher = WLAN_CIPHER_SUITE_WEP40; |
| + break; |
| + case CIPHER_WEP104: |
| + cipher = WLAN_CIPHER_SUITE_WEP104; |
| + break; |
| + case CIPHER_CCMP: |
| + cipher = WLAN_CIPHER_SUITE_CCMP; |
| + break; |
| + case CIPHER_TKIP: |
| + default: |
| + cipher = WLAN_CIPHER_SUITE_TKIP; |
| + break; |
| + } |
| + wpa_printf(MSG_DEBUG, " * pairwise=0x%x\n", cipher); |
| + NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITES_PAIRWISE, cipher); |
| + } |
| + |
| + if (params->group_suite != CIPHER_NONE) { |
| + int cipher; |
| + |
| + switch (params->group_suite) { |
| + case CIPHER_WEP40: |
| + cipher = WLAN_CIPHER_SUITE_WEP40; |
| + break; |
| + case CIPHER_WEP104: |
| + cipher = WLAN_CIPHER_SUITE_WEP104; |
| + break; |
| + case CIPHER_CCMP: |
| + cipher = WLAN_CIPHER_SUITE_CCMP; |
| + break; |
| + case CIPHER_TKIP: |
| + default: |
| + cipher = WLAN_CIPHER_SUITE_TKIP; |
| + break; |
| + } |
| + wpa_printf(MSG_DEBUG, " * group=0x%x\n", cipher); |
| + NLA_PUT_U32(msg, NL80211_ATTR_CIPHER_SUITE_GROUP, cipher); |
| + } |
| + |
| #ifdef CONFIG_IEEE80211W |
| if (params->mgmt_frame_protection == MGMT_FRAME_PROTECTION_REQUIRED) |
| NLA_PUT_U32(msg, NL80211_ATTR_USE_MFP, NL80211_MFP_REQUIRED); |
| diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c |
| index 5604e97..878bbf0 100644 |
| --- a/wpa_supplicant/sme.c |
| +++ b/wpa_supplicant/sme.c |
| @@ -333,6 +333,8 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode, |
| params.wpa_ie = wpa_s->sme.assoc_req_ie_len ? |
| wpa_s->sme.assoc_req_ie : NULL; |
| params.wpa_ie_len = wpa_s->sme.assoc_req_ie_len; |
| + params.pairwise_suite = cipher_suite2driver(wpa_s->pairwise_cipher); |
| + params.group_suite = cipher_suite2driver(wpa_s->group_cipher); |
| #ifdef CONFIG_IEEE80211R |
| if (auth_type == WLAN_AUTH_FT && wpa_s->sme.ft_ies) { |
| params.wpa_ie = wpa_s->sme.ft_ies; |
| -- |
| 1.7.4-rc1 |
| |