Message ID | 20240418060626.431202-3-yu-hao.lin@nxp.com |
---|---|
State | New |
Headers | show |
Series | wifi: mwifiex: add code to support host mlme | expand |
Hi, Hopefully-last comment for patch 2: On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c > +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c > @@ -1712,7 +1735,7 @@ static const u32 mwifiex_cipher_suites[] = { > }; > > /* Supported mgmt frame types to be advertised to cfg80211 */ > -static const struct ieee80211_txrx_stypes > +static struct ieee80211_txrx_stypes > mwifiex_mgmt_stypes[NUM_NL80211_IFTYPES] = { > [NL80211_IFTYPE_STATION] = { > .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | ... > + if (adapter->host_mlme_enabled) { > + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].tx = 0xffff; > + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].rx = > + BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | > + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | > + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | > + BIT(IEEE80211_STYPE_DISASSOC >> 4) | > + BIT(IEEE80211_STYPE_AUTH >> 4) | > + BIT(IEEE80211_STYPE_DEAUTH >> 4) | > + BIT(IEEE80211_STYPE_ACTION >> 4); > + } This doesn't look like a sound approach. I think you should keep 'mwifiex_mgmt_stypes' const, because if you're making modifications to it, then you may break multi-adapter situations. Consider someone loads this driver with host_mlme_enabled==true, and then later registers a device with host_mlme_enabled==false. The second adapter will get the wrong values. I think 'mwifiex_mgmt_stypes' is small enough you might as well just make a second copy with the MLME-enabled values, rather than fiddling with modifying a single copy. Aside from that: Acked-by: Brian Norris <briannorris@chromium.org> (Feel free to carry that to a v11, since my only remaining substantial concerns are with patch 1 I think.) Brian
> From: Brian Norris <briannorris@chromium.org> > Sent: Thursday, May 23, 2024 8:59 AM > To: David Lin <yu-hao.lin@nxp.com> > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > kvalo@kernel.org; francesco@dolcini.it; Pete Hsieh > <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > <francesco.dolcini@toradex.com> > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP mode > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report > this email' button > > > Hi, > > Hopefully-last comment for patch 2: > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c > > +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c > > > @@ -1712,7 +1735,7 @@ static const u32 mwifiex_cipher_suites[] = { }; > > > > /* Supported mgmt frame types to be advertised to cfg80211 */ -static > > const struct ieee80211_txrx_stypes > > +static struct ieee80211_txrx_stypes > > mwifiex_mgmt_stypes[NUM_NL80211_IFTYPES] = { > > [NL80211_IFTYPE_STATION] = { > > .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | > ... > > + if (adapter->host_mlme_enabled) { > > + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].tx = 0xffff; > > + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].rx = > > + BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | > > + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | > > + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | > > + BIT(IEEE80211_STYPE_DISASSOC >> 4) | > > + BIT(IEEE80211_STYPE_AUTH >> 4) | > > + BIT(IEEE80211_STYPE_DEAUTH >> 4) | > > + BIT(IEEE80211_STYPE_ACTION >> 4); > > + } > > This doesn't look like a sound approach. I think you should keep > 'mwifiex_mgmt_stypes' const, because if you're making modifications to it, > then you may break multi-adapter situations. Consider someone loads this > driver with host_mlme_enabled==true, and then later registers a device with > host_mlme_enabled==false. The second adapter will get the wrong values. > > I think 'mwifiex_mgmt_stypes' is small enough you might as well just make a > second copy with the MLME-enabled values, rather than fiddling with > modifying a single copy. > > Aside from that: > > Acked-by: Brian Norris <briannorris@chromium.org> > > (Feel free to carry that to a v11, since my only remaining substantial concerns > are with patch 1 I think.) > > Brian I will modify mwifiex_mgmt_stypes for patch v11 and carry your "Acked-by" tag. David
Hi David, On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > Add host based MLME to enable WPA3 functionalities in AP mode. > This feature required a firmware with the corresponding V2 Key API > support. The feature (WPA3) is currently enabled and verified only > on IW416. Also, verified no regression with change when host MLME > is disabled. > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > --- > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > index 491e36611909..073c665183b3 100644 > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct mwifiex_private *priv, > bss_config->key_mgmt = KEY_MGMT_PSK; > } > break; > + case WLAN_AKM_SUITE_SAE: > + bss_config->protocol = PROTOCOL_WPA2; > + bss_config->key_mgmt = KEY_MGMT_SAE; > + break; Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? Clearing the other flags when SAE is enabled looks wrong to me. Sascha
> From: Sascha Hauer <s.hauer@pengutronix.de> > Sent: Wednesday, June 12, 2024 9:12 PM > To: David Lin <yu-hao.lin@nxp.com> > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; Pete > Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > <francesco.dolcini@toradex.com> > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP mode > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report > this email' button > > > Hi David, > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > Add host based MLME to enable WPA3 functionalities in AP mode. > > This feature required a firmware with the corresponding V2 Key API > > support. The feature (WPA3) is currently enabled and verified only on > > IW416. Also, verified no regression with change when host MLME is > > disabled. > > > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > > --- > > > > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > index 491e36611909..073c665183b3 100644 > > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct > mwifiex_private *priv, > > bss_config->key_mgmt = > KEY_MGMT_PSK; > > } > > break; > > + case WLAN_AKM_SUITE_SAE: > > + bss_config->protocol = PROTOCOL_WPA2; > > + bss_config->key_mgmt = KEY_MGMT_SAE; > > + break; > > Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? > Clearing the other flags when SAE is enabled looks wrong to me. > > Sascha > These fields are used for the configuration of FW, this is the correct setting. David
On Fri, Jun 14, 2024 at 02:06:45AM +0000, David Lin wrote: > > From: Sascha Hauer <s.hauer@pengutronix.de> > > Sent: Wednesday, June 12, 2024 9:12 PM > > To: David Lin <yu-hao.lin@nxp.com> > > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; Pete > > Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > <francesco.dolcini@toradex.com> > > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP mode > > > > Caution: This is an external email. Please take care when clicking links or > > opening attachments. When in doubt, report the message using the 'Report > > this email' button > > > > > > Hi David, > > > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > > Add host based MLME to enable WPA3 functionalities in AP mode. > > > This feature required a firmware with the corresponding V2 Key API > > > support. The feature (WPA3) is currently enabled and verified only on > > > IW416. Also, verified no regression with change when host MLME is > > > disabled. > > > > > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > > > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > > > --- > > > > > > > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > index 491e36611909..073c665183b3 100644 > > > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct > > mwifiex_private *priv, > > > bss_config->key_mgmt = > > KEY_MGMT_PSK; > > > } > > > break; > > > + case WLAN_AKM_SUITE_SAE: > > > + bss_config->protocol = PROTOCOL_WPA2; > > > + bss_config->key_mgmt = KEY_MGMT_SAE; > > > + break; > > > > Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? > > Clearing the other flags when SAE is enabled looks wrong to me. > > > > Sascha > > > > These fields are used for the configuration of FW, this is the correct setting. This is done in a loop iterating over the different AKM suites, with your patch this looks like this: for (i = 0; i < params->crypto.n_akm_suites; i++) { switch (params->crypto.akm_suites[i]) { case WLAN_AKM_SUITE_8021X: if (params->crypto.wpa_versions & NL80211_WPA_VERSION_1) { bss_config->protocol = PROTOCOL_WPA; bss_config->key_mgmt = KEY_MGMT_EAP; } if (params->crypto.wpa_versions & NL80211_WPA_VERSION_2) { bss_config->protocol |= PROTOCOL_WPA2; bss_config->key_mgmt = KEY_MGMT_EAP; } break; case WLAN_AKM_SUITE_PSK: if (params->crypto.wpa_versions & NL80211_WPA_VERSION_1) { bss_config->protocol = PROTOCOL_WPA; bss_config->key_mgmt = KEY_MGMT_PSK; } if (params->crypto.wpa_versions & NL80211_WPA_VERSION_2) { bss_config->protocol |= PROTOCOL_WPA2; bss_config->key_mgmt = KEY_MGMT_PSK; } break; case WLAN_AKM_SUITE_SAE: bss_config->protocol = PROTOCOL_WPA2; bss_config->key_mgmt = KEY_MGMT_SAE; break; default: break; } } It looks wrong to overwrite bss_config->protocol and bss_config->key_mgmt in each iteration of this loop. If that would be correct, you wouldn't need a loop at all, but could instead configure based on the last AKM suite entry. In my understanding the bits in bss_config->key_mgmt should be ored together depending on the possible AKM suites which is also what the downstream driver does. Sascha
> From: Sascha Hauer <s.hauer@pengutronix.de> > Sent: Friday, June 14, 2024 2:32 PM > To: David Lin <yu-hao.lin@nxp.com> > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; Pete > Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > <francesco.dolcini@toradex.com> > Subject: Re: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP > mode > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report > this email' button > > > On Fri, Jun 14, 2024 at 02:06:45AM +0000, David Lin wrote: > > > From: Sascha Hauer <s.hauer@pengutronix.de> > > > Sent: Wednesday, June 12, 2024 9:12 PM > > > To: David Lin <yu-hao.lin@nxp.com> > > > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > > > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; > > > Pete Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > > <francesco.dolcini@toradex.com> > > > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for > > > AP mode > > > > > > Caution: This is an external email. Please take care when clicking > > > links or opening attachments. When in doubt, report the message > > > using the 'Report this email' button > > > > > > > > > Hi David, > > > > > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > > > Add host based MLME to enable WPA3 functionalities in AP mode. > > > > This feature required a firmware with the corresponding V2 Key API > > > > support. The feature (WPA3) is currently enabled and verified only > > > > on IW416. Also, verified no regression with change when host MLME > > > > is disabled. > > > > > > > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > > > > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > > > > --- > > > > > > > > > > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > index 491e36611909..073c665183b3 100644 > > > > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct > > > mwifiex_private *priv, > > > > bss_config->key_mgmt = > > > KEY_MGMT_PSK; > > > > } > > > > break; > > > > + case WLAN_AKM_SUITE_SAE: > > > > + bss_config->protocol = PROTOCOL_WPA2; > > > > + bss_config->key_mgmt = KEY_MGMT_SAE; > > > > + break; > > > > > > Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? > > > Clearing the other flags when SAE is enabled looks wrong to me. > > > > > > Sascha > > > > > > > These fields are used for the configuration of FW, this is the correct setting. > > This is done in a loop iterating over the different AKM suites, with your patch > this looks like this: > > for (i = 0; i < params->crypto.n_akm_suites; i++) { > switch (params->crypto.akm_suites[i]) { > case WLAN_AKM_SUITE_8021X: > if (params->crypto.wpa_versions & > NL80211_WPA_VERSION_1) { > bss_config->protocol = > PROTOCOL_WPA; > bss_config->key_mgmt = > KEY_MGMT_EAP; > } > if (params->crypto.wpa_versions & > NL80211_WPA_VERSION_2) { > bss_config->protocol |= > PROTOCOL_WPA2; > bss_config->key_mgmt = > KEY_MGMT_EAP; > } > break; > case WLAN_AKM_SUITE_PSK: > if (params->crypto.wpa_versions & > NL80211_WPA_VERSION_1) { > bss_config->protocol = > PROTOCOL_WPA; > bss_config->key_mgmt = > KEY_MGMT_PSK; > } > if (params->crypto.wpa_versions & > NL80211_WPA_VERSION_2) { > bss_config->protocol |= > PROTOCOL_WPA2; > bss_config->key_mgmt = > KEY_MGMT_PSK; > } > break; > case WLAN_AKM_SUITE_SAE: > bss_config->protocol = PROTOCOL_WPA2; > bss_config->key_mgmt = KEY_MGMT_SAE; > break; > > default: > break; > } > } > > It looks wrong to overwrite bss_config->protocol and bss_config->key_mgmt in > each iteration of this loop. If that would be correct, you wouldn't need a loop > at all, but could instead configure based on the last AKM suite entry. > > In my understanding the bits in bss_config->key_mgmt should be ored together > depending on the possible AKM suites which is also what the downstream > driver does. > > Sascha > > -- > Pengutronix e.K. | > | > Steuerwalder Str. 21 | > http://www.pen/ > gutronix.de%2F&data=05%7C02%7Cyu-hao.lin%40nxp.com%7C7c90883e11414 > 5a307fa08dc8c3ba753%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0% > 7C638539435049441786%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw > MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C& > sdata=QSbX5IuEvP18tf0t6sMe8%2F4kuHo7IFEURWabdE4Cxcg%3D&reserved=0 > | > 31137 Hildesheim, Germany | Phone: > +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: > +49-5121-206917-5555 | For the configuration of FW, ored only happens for the same AKM suite. David
On Mon, Jun 17, 2024 at 02:15:41AM +0000, David Lin wrote: > > From: Sascha Hauer <s.hauer@pengutronix.de> > > Sent: Friday, June 14, 2024 2:32 PM > > To: David Lin <yu-hao.lin@nxp.com> > > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; Pete > > Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > <francesco.dolcini@toradex.com> > > Subject: Re: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP > > mode > > > > Caution: This is an external email. Please take care when clicking links or > > opening attachments. When in doubt, report the message using the 'Report > > this email' button > > > > > > On Fri, Jun 14, 2024 at 02:06:45AM +0000, David Lin wrote: > > > > From: Sascha Hauer <s.hauer@pengutronix.de> > > > > Sent: Wednesday, June 12, 2024 9:12 PM > > > > To: David Lin <yu-hao.lin@nxp.com> > > > > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > > > > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; > > > > Pete Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > > > <francesco.dolcini@toradex.com> > > > > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for > > > > AP mode > > > > > > > > Caution: This is an external email. Please take care when clicking > > > > links or opening attachments. When in doubt, report the message > > > > using the 'Report this email' button > > > > > > > > > > > > Hi David, > > > > > > > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > > > > Add host based MLME to enable WPA3 functionalities in AP mode. > > > > > This feature required a firmware with the corresponding V2 Key API > > > > > support. The feature (WPA3) is currently enabled and verified only > > > > > on IW416. Also, verified no regression with change when host MLME > > > > > is disabled. > > > > > > > > > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > > > > > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > > > > > --- > > > > > > > > > > > > > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > index 491e36611909..073c665183b3 100644 > > > > > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct > > > > mwifiex_private *priv, > > > > > bss_config->key_mgmt = > > > > KEY_MGMT_PSK; > > > > > } > > > > > break; > > > > > + case WLAN_AKM_SUITE_SAE: > > > > > + bss_config->protocol = PROTOCOL_WPA2; > > > > > + bss_config->key_mgmt = KEY_MGMT_SAE; > > > > > + break; > > > > > > > > Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? > > > > Clearing the other flags when SAE is enabled looks wrong to me. > > > > > > > > Sascha > > > > > > > > > > These fields are used for the configuration of FW, this is the correct setting. > > > > This is done in a loop iterating over the different AKM suites, with your patch > > this looks like this: > > > > for (i = 0; i < params->crypto.n_akm_suites; i++) { > > switch (params->crypto.akm_suites[i]) { > > case WLAN_AKM_SUITE_8021X: > > if (params->crypto.wpa_versions & > > NL80211_WPA_VERSION_1) { > > bss_config->protocol = > > PROTOCOL_WPA; > > bss_config->key_mgmt = > > KEY_MGMT_EAP; > > } > > if (params->crypto.wpa_versions & > > NL80211_WPA_VERSION_2) { > > bss_config->protocol |= > > PROTOCOL_WPA2; > > bss_config->key_mgmt = > > KEY_MGMT_EAP; > > } > > break; > > case WLAN_AKM_SUITE_PSK: > > if (params->crypto.wpa_versions & > > NL80211_WPA_VERSION_1) { > > bss_config->protocol = > > PROTOCOL_WPA; > > bss_config->key_mgmt = > > KEY_MGMT_PSK; > > } > > if (params->crypto.wpa_versions & > > NL80211_WPA_VERSION_2) { > > bss_config->protocol |= > > PROTOCOL_WPA2; > > bss_config->key_mgmt = > > KEY_MGMT_PSK; > > } > > break; > > case WLAN_AKM_SUITE_SAE: > > bss_config->protocol = PROTOCOL_WPA2; > > bss_config->key_mgmt = KEY_MGMT_SAE; > > break; > > > > default: > > break; > > } > > } > > > > It looks wrong to overwrite bss_config->protocol and bss_config->key_mgmt in > > each iteration of this loop. If that would be correct, you wouldn't need a loop > > at all, but could instead configure based on the last AKM suite entry. > > > > In my understanding the bits in bss_config->key_mgmt should be ored together > > depending on the possible AKM suites which is also what the downstream > > driver does. > > > > For the configuration of FW, ored only happens for the same AKM suite. Sorry, I don't understand this. Could you elaborate what you mean here? Sascha
> From: Sascha Hauer <s.hauer@pengutronix.de> > Sent: Monday, June 17, 2024 2:30 PM > To: David Lin <yu-hao.lin@nxp.com> > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; Pete > Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > <francesco.dolcini@toradex.com> > Subject: Re: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme for AP > mode > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report > this email' button > > > On Mon, Jun 17, 2024 at 02:15:41AM +0000, David Lin wrote: > > > From: Sascha Hauer <s.hauer@pengutronix.de> > > > Sent: Friday, June 14, 2024 2:32 PM > > > To: David Lin <yu-hao.lin@nxp.com> > > > Cc: linux-wireless@vger.kernel.org; linux-kernel@vger.kernel.org; > > > briannorris@chromium.org; kvalo@kernel.org; francesco@dolcini.it; > > > Pete Hsieh <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > > <francesco.dolcini@toradex.com> > > > Subject: Re: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme > > > for AP mode > > > > > > Caution: This is an external email. Please take care when clicking > > > links or opening attachments. When in doubt, report the message > > > using the 'Report this email' button > > > > > > > > > On Fri, Jun 14, 2024 at 02:06:45AM +0000, David Lin wrote: > > > > > From: Sascha Hauer <s.hauer@pengutronix.de> > > > > > Sent: Wednesday, June 12, 2024 9:12 PM > > > > > To: David Lin <yu-hao.lin@nxp.com> > > > > > Cc: linux-wireless@vger.kernel.org; > > > > > linux-kernel@vger.kernel.org; briannorris@chromium.org; > > > > > kvalo@kernel.org; francesco@dolcini.it; Pete Hsieh > > > > > <tsung-hsien.hsieh@nxp.com>; Francesco Dolcini > > > > > <francesco.dolcini@toradex.com> > > > > > Subject: [EXT] Re: [PATCH v10 2/2] wifi: mwifiex: add host mlme > > > > > for AP mode > > > > > > > > > > Caution: This is an external email. Please take care when > > > > > clicking links or opening attachments. When in doubt, report the > > > > > message using the 'Report this email' button > > > > > > > > > > > > > > > Hi David, > > > > > > > > > > On Thu, Apr 18, 2024 at 02:06:26PM +0800, David Lin wrote: > > > > > > Add host based MLME to enable WPA3 functionalities in AP mode. > > > > > > This feature required a firmware with the corresponding V2 Key > > > > > > API support. The feature (WPA3) is currently enabled and > > > > > > verified only on IW416. Also, verified no regression with > > > > > > change when host MLME is disabled. > > > > > > > > > > > > Signed-off-by: David Lin <yu-hao.lin@nxp.com> > > > > > > Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com> > > > > > > --- > > > > > > > > > > > > > > > > > diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > > b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > > index 491e36611909..073c665183b3 100644 > > > > > > --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > > +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c > > > > > > @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct > > > > > mwifiex_private *priv, > > > > > > bss_config->key_mgmt = > > > > > KEY_MGMT_PSK; > > > > > > } > > > > > > break; > > > > > > + case WLAN_AKM_SUITE_SAE: > > > > > > + bss_config->protocol = PROTOCOL_WPA2; > > > > > > + bss_config->key_mgmt = > KEY_MGMT_SAE; > > > > > > + break; > > > > > > > > > > Shouldn't this be |= PROTOCOL_WPA2 and |= KEY_MGMT_SAE? > > > > > Clearing the other flags when SAE is enabled looks wrong to me. > > > > > > > > > > Sascha > > > > > > > > > > > > > These fields are used for the configuration of FW, this is the correct > setting. > > > > > > This is done in a loop iterating over the different AKM suites, with > > > your patch this looks like this: > > > > > > for (i = 0; i < params->crypto.n_akm_suites; i++) { > > > switch (params->crypto.akm_suites[i]) { > > > case WLAN_AKM_SUITE_8021X: > > > if (params->crypto.wpa_versions & > > > NL80211_WPA_VERSION_1) { > > > bss_config->protocol = > PROTOCOL_WPA; > > > bss_config->key_mgmt = > KEY_MGMT_EAP; > > > } > > > if (params->crypto.wpa_versions & > > > NL80211_WPA_VERSION_2) { > > > bss_config->protocol |= > > > PROTOCOL_WPA2; > > > bss_config->key_mgmt = > KEY_MGMT_EAP; > > > } > > > break; > > > case WLAN_AKM_SUITE_PSK: > > > if (params->crypto.wpa_versions & > > > NL80211_WPA_VERSION_1) { > > > bss_config->protocol = > PROTOCOL_WPA; > > > bss_config->key_mgmt = > KEY_MGMT_PSK; > > > } > > > if (params->crypto.wpa_versions & > > > NL80211_WPA_VERSION_2) { > > > bss_config->protocol |= > > > PROTOCOL_WPA2; > > > bss_config->key_mgmt = > KEY_MGMT_PSK; > > > } > > > break; > > > case WLAN_AKM_SUITE_SAE: > > > bss_config->protocol = PROTOCOL_WPA2; > > > bss_config->key_mgmt = KEY_MGMT_SAE; > > > break; > > > > > > default: > > > break; > > > } > > > } > > > > > > It looks wrong to overwrite bss_config->protocol and > > > bss_config->key_mgmt in each iteration of this loop. If that would > > > be correct, you wouldn't need a loop at all, but could instead configure > based on the last AKM suite entry. > > > > > > In my understanding the bits in bss_config->key_mgmt should be ored > > > together depending on the possible AKM suites which is also what the > > > downstream driver does. > > > > > > > For the configuration of FW, ored only happens for the same AKM suite. > > Sorry, I don't understand this. Could you elaborate what you mean here? > > Sascha > > -- > Pengutronix e.K. | > | > Steuerwalder Str. 21 | > http://www.pen/ > gutronix.de%2F&data=05%7C02%7Cyu-hao.lin%40nxp.com%7Cc852ce81dd734 > 2c25e0408dc8e96ebb2%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0% > 7C638542026048434949%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw > MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C& > sdata=6Y%2FM9gFWYhf0UfClFTBwwsuMwrasEimaHKzJ2y2bHjQ%3D&reserved > =0 | > 31137 Hildesheim, Germany | Phone: > +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: > +49-5121-206917-5555 | Firmware can only support one of WLAN_AKM_SUITE_8021X, WLAN_AKM_SUITE_PSK, or WLAN_AKM_SUITE_SAE. For WLAN_AKM_SUITE_8021X and WLAN_AKM_SUITE_PSK, the protocol can be WPA, WPA2 or both. David
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 53eeda388802..e122cc686dad 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -221,6 +221,26 @@ mwifiex_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, return 0; } + if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) { + if (ieee80211_is_auth(mgmt->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "auth: send auth to %pM\n", mgmt->da); + if (ieee80211_is_deauth(mgmt->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "auth: send deauth to %pM\n", mgmt->da); + if (ieee80211_is_disassoc(mgmt->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: send disassoc to %pM\n", mgmt->da); + if (ieee80211_is_assoc_resp(mgmt->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: send assoc resp to %pM\n", + mgmt->da); + if (ieee80211_is_reassoc_resp(mgmt->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: send reassoc resp to %pM\n", + mgmt->da); + } + pkt_len = len + ETH_ALEN; skb = dev_alloc_skb(MWIFIEX_MIN_DATA_HEADER_LEN + MWIFIEX_MGMT_FRAME_HEADER_SIZE + @@ -505,6 +525,9 @@ mwifiex_cfg80211_set_default_mgmt_key(struct wiphy *wiphy, wiphy_dbg(wiphy, "set default mgmt key, key index=%d\n", key_index); + if (priv->adapter->host_mlme_enabled) + return 0; + memset(&encrypt_key, 0, sizeof(struct mwifiex_ds_encrypt_key)); encrypt_key.key_len = WLAN_KEY_LEN_CCMP; encrypt_key.key_index = key_index; @@ -1712,7 +1735,7 @@ static const u32 mwifiex_cipher_suites[] = { }; /* Supported mgmt frame types to be advertised to cfg80211 */ -static const struct ieee80211_txrx_stypes +static struct ieee80211_txrx_stypes mwifiex_mgmt_stypes[NUM_NL80211_IFTYPES] = { [NL80211_IFTYPE_STATION] = { .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | @@ -3951,12 +3974,43 @@ mwifiex_cfg80211_tdls_cancel_chan_switch(struct wiphy *wiphy, } } +static int +mwifiex_cfg80211_uap_add_station(struct mwifiex_private *priv, const u8 *mac, + struct station_parameters *params) +{ + struct mwifiex_sta_info add_sta; + int ret; + + memcpy(add_sta.peer_mac, mac, ETH_ALEN); + add_sta.params = params; + + ret = mwifiex_send_cmd(priv, HostCmd_CMD_ADD_NEW_STATION, + HostCmd_ACT_ADD_STA, 0, (void *)&add_sta, true); + + if (!ret) { + struct station_info *sinfo; + + sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); + if (!sinfo) + return -ENOMEM; + + cfg80211_new_sta(priv->netdev, mac, sinfo, GFP_KERNEL); + kfree(sinfo); + } + + return ret; +} + static int mwifiex_cfg80211_add_station(struct wiphy *wiphy, struct net_device *dev, const u8 *mac, struct station_parameters *params) { struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); + if (priv->adapter->host_mlme_enabled && + (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)) + return mwifiex_cfg80211_uap_add_station(priv, mac, params); + if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) return -EOPNOTSUPP; @@ -4194,6 +4248,10 @@ mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev, int ret; struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); + if (priv->adapter->host_mlme_enabled && + (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)) + return 0; + /* we support change_station handler only for TDLS peers*/ if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) return -EOPNOTSUPP; @@ -4662,6 +4720,17 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) } wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; + if (adapter->host_mlme_enabled) { + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].tx = 0xffff; + mwifiex_mgmt_stypes[NL80211_IFTYPE_AP].rx = + BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4); + } wiphy->mgmt_stypes = mwifiex_mgmt_stypes; wiphy->max_remain_on_channel_duration = 5000; wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | @@ -4704,14 +4773,18 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) ether_addr_copy(wiphy->perm_addr, adapter->perm_addr); wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME | - WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD | + wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD | WIPHY_FLAG_AP_UAPSD | WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL | WIPHY_FLAG_HAS_CHANNEL_SWITCH | WIPHY_FLAG_NETNS_OK | WIPHY_FLAG_PS_ON_BY_DEFAULT; + if (adapter->host_mlme_enabled) + wiphy->flags |= WIPHY_FLAG_REPORTS_OBSS; + else + wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME; + if (ISSUPP_TDLS_ENABLED(adapter->fw_cap_info)) wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS | WIPHY_FLAG_TDLS_EXTERNAL_SETUP; diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index da983e27023c..ea6ebc9c23ef 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -635,6 +635,8 @@ int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no, case HostCmd_CMD_UAP_STA_DEAUTH: case HOST_CMD_APCMD_SYS_RESET: case HOST_CMD_APCMD_STA_LIST: + case HostCmd_CMD_CHAN_REPORT_REQUEST: + case HostCmd_CMD_ADD_NEW_STATION: ret = mwifiex_uap_prepare_cmd(priv, cmd_no, cmd_action, cmd_oid, data_buf, cmd_ptr); diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h index 0f89b86aa527..65799ae3bc72 100644 --- a/drivers/net/wireless/marvell/mwifiex/fw.h +++ b/drivers/net/wireless/marvell/mwifiex/fw.h @@ -211,6 +211,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define TLV_TYPE_CHAN_ATTR_CFG (PROPRIETARY_TLV_BASE_ID + 237) #define TLV_TYPE_MAX_CONN (PROPRIETARY_TLV_BASE_ID + 279) #define TLV_TYPE_HOST_MLME (PROPRIETARY_TLV_BASE_ID + 307) +#define TLV_TYPE_UAP_STA_FLAGS (PROPRIETARY_TLV_BASE_ID + 313) #define TLV_TYPE_SAE_PWE_MODE (PROPRIETARY_TLV_BASE_ID + 339) #define MWIFIEX_TX_DATA_BUF_SIZE_2K 2048 @@ -407,6 +408,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define HostCmd_CMD_STA_CONFIGURE 0x023f #define HostCmd_CMD_CHAN_REGION_CFG 0x0242 #define HostCmd_CMD_PACKET_AGGR_CTRL 0x0251 +#define HostCmd_CMD_ADD_NEW_STATION 0x025f #define PROTOCOL_NO_SECURITY 0x01 #define PROTOCOL_STATIC_WEP 0x02 @@ -417,6 +419,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define KEY_MGMT_NONE 0x04 #define KEY_MGMT_PSK 0x02 #define KEY_MGMT_EAP 0x01 +#define KEY_MGMT_SAE 0x400 #define CIPHER_TKIP 0x04 #define CIPHER_AES_CCMP 0x08 #define VALID_CIPHER_BITMAP 0x0c @@ -502,6 +505,9 @@ enum mwifiex_channel_flags { #define HostCmd_ACT_GET_TX 0x0008 #define HostCmd_ACT_GET_BOTH 0x000c +#define HostCmd_ACT_REMOVE_STA 0x0 +#define HostCmd_ACT_ADD_STA 0x1 + #define RF_ANTENNA_AUTO 0xFFFF #define HostCmd_SET_SEQ_NO_BSS_INFO(seq, num, type) \ @@ -2331,6 +2337,20 @@ struct host_cmd_ds_sta_configure { u8 tlv_buffer[]; } __packed; +struct mwifiex_ie_types_sta_flag { + struct mwifiex_ie_types_header header; + __le32 sta_flags; +} __packed; + +struct host_cmd_ds_add_station { + __le16 action; + __le16 aid; + u8 peer_mac[ETH_ALEN]; + __le32 listen_interval; + __le16 cap_info; + u8 tlv[]; +} __packed; + struct host_cmd_ds_command { __le16 command; __le16 size; @@ -2409,6 +2429,7 @@ struct host_cmd_ds_command { struct host_cmd_ds_chan_region_cfg reg_cfg; struct host_cmd_ds_pkt_aggr_ctrl pkt_aggr_ctrl; struct host_cmd_ds_sta_configure sta_cfg; + struct host_cmd_ds_add_station sta_info; } params; } __packed; diff --git a/drivers/net/wireless/marvell/mwifiex/ioctl.h b/drivers/net/wireless/marvell/mwifiex/ioctl.h index e8825f302de8..516159b721d3 100644 --- a/drivers/net/wireless/marvell/mwifiex/ioctl.h +++ b/drivers/net/wireless/marvell/mwifiex/ioctl.h @@ -158,6 +158,11 @@ struct mwifiex_bss_info { u8 bssid[ETH_ALEN]; }; +struct mwifiex_sta_info { + u8 peer_mac[ETH_ALEN]; + struct station_parameters *params; +}; + #define MAX_NUM_TID 8 #define MAX_RX_WINSIZE 64 diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c index 7b69d27e0c0e..9c53825f222d 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c @@ -1398,6 +1398,8 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no, break; case HostCmd_CMD_UAP_STA_DEAUTH: break; + case HostCmd_CMD_ADD_NEW_STATION: + break; case HOST_CMD_APCMD_SYS_RESET: break; case HostCmd_CMD_MEF_CFG: diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c index 491e36611909..073c665183b3 100644 --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c @@ -72,6 +72,10 @@ int mwifiex_set_secure_params(struct mwifiex_private *priv, bss_config->key_mgmt = KEY_MGMT_PSK; } break; + case WLAN_AKM_SUITE_SAE: + bss_config->protocol = PROTOCOL_WPA2; + bss_config->key_mgmt = KEY_MGMT_SAE; + break; default: break; } @@ -751,6 +755,28 @@ mwifiex_cmd_uap_sys_config(struct host_cmd_ds_command *cmd, u16 cmd_action, return 0; } +/* This function prepares AP start up command with or without host MLME + */ +static void mwifiex_cmd_uap_bss_start(struct mwifiex_private *priv, + struct host_cmd_ds_command *cmd) +{ + struct mwifiex_ie_types_host_mlme *tlv; + int size; + + cmd->command = cpu_to_le16(HostCmd_CMD_UAP_BSS_START); + size = S_DS_GEN; + + if (priv->adapter->host_mlme_enabled) { + tlv = (struct mwifiex_ie_types_host_mlme *)((u8 *)cmd + size); + tlv->header.type = cpu_to_le16(TLV_TYPE_HOST_MLME); + tlv->header.len = cpu_to_le16(sizeof(tlv->host_mlme)); + tlv->host_mlme = 1; + size += sizeof(struct mwifiex_ie_types_host_mlme); + } + + cmd->size = cpu_to_le16(size); +} + /* This function prepares AP specific deauth command with mac supplied in * function parameter. */ @@ -768,6 +794,144 @@ static int mwifiex_cmd_uap_sta_deauth(struct mwifiex_private *priv, return 0; } +/* This function prepares AP specific add station command. + */ +static int mwifiex_cmd_uap_add_station(struct mwifiex_private *priv, + struct host_cmd_ds_command *cmd, + u16 cmd_action, void *data_buf) +{ + struct host_cmd_ds_add_station *new_sta = &cmd->params.sta_info; + struct mwifiex_sta_info *add_sta = (struct mwifiex_sta_info *)data_buf; + struct station_parameters *params = add_sta->params; + struct mwifiex_sta_node *sta_ptr; + u8 *pos; + u8 qos_capa; + u16 header_len = sizeof(struct mwifiex_ie_types_header); + u16 tlv_len; + int size; + struct mwifiex_ie_types_data *tlv; + struct mwifiex_ie_types_sta_flag *sta_flag; + int i; + + cmd->command = cpu_to_le16(HostCmd_CMD_ADD_NEW_STATION); + new_sta->action = cpu_to_le16(cmd_action); + size = sizeof(struct host_cmd_ds_add_station) + S_DS_GEN; + + if (cmd_action == HostCmd_ACT_ADD_STA) + sta_ptr = mwifiex_add_sta_entry(priv, add_sta->peer_mac); + else + sta_ptr = mwifiex_get_sta_entry(priv, add_sta->peer_mac); + + if (!sta_ptr) + return -1; + + memcpy(new_sta->peer_mac, add_sta->peer_mac, ETH_ALEN); + + if (cmd_action == HostCmd_ACT_REMOVE_STA) { + cmd->size = cpu_to_le16(size); + return 0; + } + + new_sta->aid = cpu_to_le16(params->aid); + new_sta->listen_interval = cpu_to_le32(params->listen_interval); + new_sta->cap_info = cpu_to_le16(params->capability); + + pos = new_sta->tlv; + + if (params->sta_flags_set & NL80211_STA_FLAG_WME) + sta_ptr->is_wmm_enabled = 1; + sta_flag = (struct mwifiex_ie_types_sta_flag *)pos; + sta_flag->header.type = cpu_to_le16(TLV_TYPE_UAP_STA_FLAGS); + sta_flag->header.len = cpu_to_le16(sizeof(__le32)); + sta_flag->sta_flags = cpu_to_le32(params->sta_flags_set); + pos += sizeof(struct mwifiex_ie_types_sta_flag); + size += sizeof(struct mwifiex_ie_types_sta_flag); + + if (params->ext_capab_len) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_EXT_CAPABILITY); + tlv_len = params->ext_capab_len; + tlv->header.len = cpu_to_le16(tlv_len); + memcpy(tlv->data, params->ext_capab, tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + } + + if (params->link_sta_params.supported_rates_len) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_SUPP_RATES); + tlv_len = params->link_sta_params.supported_rates_len; + tlv->header.len = cpu_to_le16(tlv_len); + memcpy(tlv->data, + params->link_sta_params.supported_rates, tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + } + + if (params->uapsd_queues || params->max_sp) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_QOS_CAPA); + tlv_len = sizeof(qos_capa); + tlv->header.len = cpu_to_le16(tlv_len); + qos_capa = params->uapsd_queues | (params->max_sp << 5); + memcpy(tlv->data, &qos_capa, tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + sta_ptr->is_wmm_enabled = 1; + } + + if (params->link_sta_params.ht_capa) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_HT_CAPABILITY); + tlv_len = sizeof(struct ieee80211_ht_cap); + tlv->header.len = cpu_to_le16(tlv_len); + memcpy(tlv->data, params->link_sta_params.ht_capa, tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + sta_ptr->is_11n_enabled = 1; + sta_ptr->max_amsdu = + le16_to_cpu(params->link_sta_params.ht_capa->cap_info) & + IEEE80211_HT_CAP_MAX_AMSDU ? + MWIFIEX_TX_DATA_BUF_SIZE_8K : + MWIFIEX_TX_DATA_BUF_SIZE_4K; + } + + if (params->link_sta_params.vht_capa) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_VHT_CAPABILITY); + tlv_len = sizeof(struct ieee80211_vht_cap); + tlv->header.len = cpu_to_le16(tlv_len); + memcpy(tlv->data, params->link_sta_params.vht_capa, tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + sta_ptr->is_11ac_enabled = 1; + } + + if (params->link_sta_params.opmode_notif_used) { + tlv = (struct mwifiex_ie_types_data *)pos; + tlv->header.type = cpu_to_le16(WLAN_EID_OPMODE_NOTIF); + tlv_len = sizeof(u8); + tlv->header.len = cpu_to_le16(tlv_len); + memcpy(tlv->data, ¶ms->link_sta_params.opmode_notif, + tlv_len); + pos += (header_len + tlv_len); + size += (header_len + tlv_len); + } + + for (i = 0; i < MAX_NUM_TID; i++) { + if (sta_ptr->is_11n_enabled) + sta_ptr->ampdu_sta[i] = + priv->aggr_prio_tbl[i].ampdu_user; + else + sta_ptr->ampdu_sta[i] = BA_STREAM_NOT_ALLOWED; + } + + memset(sta_ptr->rx_seq, 0xff, sizeof(sta_ptr->rx_seq)); + cmd->size = cpu_to_le16(size); + + return 0; +} + /* This function prepares the AP specific commands before sending them * to the firmware. * This is a generic function which calls specific command preparation @@ -785,6 +949,8 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, u16 cmd_no, return -1; break; case HostCmd_CMD_UAP_BSS_START: + mwifiex_cmd_uap_bss_start(priv, cmd); + break; case HostCmd_CMD_UAP_BSS_STOP: case HOST_CMD_APCMD_SYS_RESET: case HOST_CMD_APCMD_STA_LIST: @@ -800,6 +966,11 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, u16 cmd_no, data_buf)) return -1; break; + case HostCmd_CMD_ADD_NEW_STATION: + if (mwifiex_cmd_uap_add_station(priv, cmd, cmd_action, + data_buf)) + return -1; + break; default: mwifiex_dbg(priv->adapter, ERROR, "PREP_CMD: unknown cmd %#x\n", cmd_no); diff --git a/drivers/net/wireless/marvell/mwifiex/util.c b/drivers/net/wireless/marvell/mwifiex/util.c index 3817c08a1507..42c04bf858da 100644 --- a/drivers/net/wireless/marvell/mwifiex/util.c +++ b/drivers/net/wireless/marvell/mwifiex/util.c @@ -497,6 +497,30 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv, cfg80211_rx_mlme_mgmt(priv->netdev, skb->data, pkt_len); } + if (priv->adapter->host_mlme_enabled && + (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP)) { + if (ieee80211_is_auth(ieee_hdr->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "auth: receive auth from %pM\n", + ieee_hdr->addr2); + if (ieee80211_is_deauth(ieee_hdr->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "auth: receive deauth from %pM\n", + ieee_hdr->addr2); + if (ieee80211_is_disassoc(ieee_hdr->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: receive disassoc from %pM\n", + ieee_hdr->addr2); + if (ieee80211_is_assoc_req(ieee_hdr->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: receive assoc req from %pM\n", + ieee_hdr->addr2); + if (ieee80211_is_reassoc_req(ieee_hdr->frame_control)) + mwifiex_dbg(priv->adapter, MSG, + "assoc: receive reassoc req from %pM\n", + ieee_hdr->addr2); + } + cfg80211_rx_mgmt(&priv->wdev, priv->roc_cfg.chan.center_freq, CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len, 0);