From patchwork Fri Oct 20 03:34:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lin X-Patchwork-Id: 13430000 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 30E65CDB47E for ; Fri, 20 Oct 2023 03:34:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346935AbjJTDeU (ORCPT ); Thu, 19 Oct 2023 23:34:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346919AbjJTDeO (ORCPT ); Thu, 19 Oct 2023 23:34:14 -0400 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2085.outbound.protection.outlook.com [40.107.21.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F2BB81A4; Thu, 19 Oct 2023 20:34:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=F2jR9wO23IG4mopDB+XpfMV1dEqW1wb/X54SfGHmoQInQ+jMNP0Uw1EZqUa8UTjxUV1i62kZw7zzwoWFfJN/kklSN8M5LGpNLyQI7dBGW21ALkRO9wv9Yk+4Sjvz0dy6JArrPYom4AeawxAnfdT08qbyESOf4D1zOEJdIyCJ+OMZfVhSLtj/9gZZQdnxODXuiLoWKkAxJFQSsu/qsibQmo6sllCIbYGcSAF2gDuyPNSRnkt72wuJtuX4eP4yBYbfSVp+5mcf0+krBgXs5fgut/NIqmC6Xso4+xplcmEWXlK/5jP5WP5L0HUSv07qGAmtX9Jw5mOr5xRN2O/ahBjlNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=XwbLXcBQEonmrJlLkdG9hTpdRahNTcCwK+hEC1Mumak=; b=P0xm+ZxISRdkwzjwvtgdxb7019PwwqR6muNOfbgjaqMUHzS/Sa+HAitFPXK0KhxiJ07XUJ1zlQEgnDZbsrnN+/LJOxh3ntRt0RINeScFIwSv/ApUG2tVFnjuil9N72beXkjI7EXEVNg2Ibsp6JEYorCnmg1C4wCmJ3feYV/EiYxdOu1OEv1TJm90fSnBpz7rea03P/MhfgMWbgV/+IFt0F2KGCHdneSPFPfYTO5LmHeQzBjb7Hnh+U+4wPwWkqrqGeYsK1gp2pEVgOT5itvwFAbOkiOvfC3FbysUSgg7NoY2oPrRuIXK9YTRTfGL8cSOdW1iDsW7mk2qF8EPuaKJmQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XwbLXcBQEonmrJlLkdG9hTpdRahNTcCwK+hEC1Mumak=; b=iF20LNkwR4fpxXa5k+gQG1vaIQhp4ZXlzK2WD8kWtRq91yR/VUr5/Drm3ZtyvzVLkU/1hn9lsPzs1QA8i5qsvwXqDteqVtnnXu+tklhX5fNdFJgkVlvdocYFrz0oUJWGJTC9M/FEkcva3hzoktENJ+OcUfCA3rohUNs5MWGmLG4= Received: from PA4PR04MB9638.eurprd04.prod.outlook.com (2603:10a6:102:273::20) by DB9PR04MB8236.eurprd04.prod.outlook.com (2603:10a6:10:245::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.34; Fri, 20 Oct 2023 03:34:04 +0000 Received: from PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b]) by PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b%7]) with mapi id 15.20.6933.011; Fri, 20 Oct 2023 03:34:04 +0000 From: David Lin To: "linux-wireless@vger.kernel.org" CC: "linux-kernel@vger.kernel.org" , "briannorris@chromium.org" , "kvalo@kernel.org" , "francesco@dolcini.it" , Sharvari Harisangam , David Lin , Pete Hsieh Subject: [PATCH v5 1/6] wifi: mwifiex: added code to support host mlme. Thread-Topic: [PATCH v5 1/6] wifi: mwifiex: added code to support host mlme. Thread-Index: AdoDBkTYDiWyHExpTiquikNmJiJIbw== Date: Fri, 20 Oct 2023 03:34:04 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR04MB9638:EE_|DB9PR04MB8236:EE_ x-ms-office365-filtering-correlation-id: 4b1a6639-e87f-4b1b-1a8d-08dbd11d68ca x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: vvN9oHPyKzp8GJi9yWq3DA0VqmQAJD4vG3tLsbRJyh8b+hjkKH9KaWo2w1ydq9cYgPzZPVFnyrNFHnaqrVgl3rwEATeTyNL2rp81jYZCqc+z1dY8cCw4RHeNrIA0FYd4LLd9puvs1B1NxhxeI1vm7E9oR/YzAK9KMltvFK7tP4wW2+3oehO/r16wsfEbAwIHWp4NlcvFDGcZWl70EYAJS3/qb9H2HOM+H705mQKCh9DVpKU5URp5CDDOkj/r+3lA+qJmrnty9ND0w3EoPRKM0/RaPYhpfXetfpDlOXcCbAKhi1FdHUDal7e2MnCh82EElvw3M2xYHbCe1++TLmYJTOeXAj+4ZM+CgLblHw9CxS72bJ5Uwx43ZO3dmiTx2fj6/XMGCr3tGh4nbgqCWVaADhQsaSsTxpMTq0ilBHn0ic3cmHLwi1g7oWMmHJc8TP5x60zWQvdL6hXnYJoIfksZ1Dw3Ll8j+uAOfAwefdsr7S93XDdNES5DJsMkMh0Fikc8zqqqPQuQtypY2RdpSE7LuBHxum+vHKBUwN+vBt7HBSdZNGZzTIosRcilOWroj7IizJMVvaJY7A/Z/36dqRqnqB/ylYWocGuaxX0qfuM63azSDqzQMYyZvws4PJKakbYZ x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR04MB9638.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(396003)(376002)(346002)(366004)(39860400002)(230922051799003)(451199024)(1800799009)(64100799003)(186009)(38070700009)(66446008)(38100700002)(66556008)(30864003)(33656002)(64756008)(478600001)(66476007)(54906003)(66946007)(6506007)(6916009)(76116006)(71200400001)(2906002)(8936002)(5660300002)(8676002)(52536014)(9686003)(41300700001)(4326008)(86362001)(316002)(7696005)(83380400001)(122000001)(26005)(66899024)(55016003)(559001)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: urwIein6pUIRDkZfKfJZtoDQ2O2zihpIhlmI68a0AoNP9cZZIi9S3WzAXhzC2b+bUln/jSs/uaraqibjDMdKHcxrGgOADxjw+pO4nGGsFn+fdS+m+4m6kC/6h7RL1CK6XYETUzMs7zTKBom3F9DKM1WdcT5OOmRv8IMPHh9vtRUrc2bqs4lF4GAYIBR98ISmtiDApCdI2tpzDBkRwiq2U851C8oRyodIZEQabPKPecuqpX1kiN/vA4r9p6cCE3revREdyHzqXtUX76/3qSkv6KTNmJX6QbV0XroGZlMjRvUomalvbKfpJ8GD8QJyl8zGSW9V01Nhnw0NBa+mmkVeV8NFghybDUVOsBvFoMCziazpWmkFmgKVPXdqYkywX6qaZ13rvE/qwxNzdzK9MGl+AjkV7jeYN8Dkdf43Hg2FIE3D3FkObnormYdQmE9eXaWFaxrTO3H11dy11F+/Sjv27lt9cb9HwVqgXz43Ap+B12n5WK3Kr1NaNHzUAV5oRzyyu1liXep5xEgtz5NawIZ61tRP7hfRY9dBgy7cp08gis+jdfcKlP++V2vnch4z02XMe5xaNizMXREK84PvI+uBOg4uTc31uAQEonS+IuDM6SRLOXNUP/L7cOPDgE3wtlmknvoG5o/u2fXXIKkdZzab6/HlV48GnNPA4a2szVtzPTt4DUA7wBgJItO3CzWWrlEjtu5g3TBbrocNcMdRILZCuCtFz1tGV/EdkoM3CXgbawzZlVzoUV+Aw+LbT33VhUAjMpMXeVJIQawbBsqUN0tpA/ZWXv7LVfIDy710wwhcqsMkfb4/LAVZBcDnmuXo1E6zk4XtVcpgvOD/JcEwjqtFRtnwENqZIh+sVs2SaTOG6lAcF/eLHDALKhpmCa0CeUwvIklF3R824fN2kdKewcdnJzWPYZvam10L43Y9JLHhS0plhz8SyOCO0VEtiI5+aKsBM14fSEWepDg8D+7EBqQZILiVpyw7mz/CwYt5JKm1RICZdr+r+qFTIABm2eYekGj40mspDA+pTTWYXEAWAmBumz9UFyumeGY+FiMDjaWF5VYOvMdd01bzTqGjCJWvHaNufmlDYfcJA1lbfBywD/Y80zWjBDeA11Yp7lnsk2VbXu3rAnk3bSuVxkXIufC4vrcMEpfyhQlbVktG7Z3HPum1Lvy/Zc/0KCoC57QwIIS8X15MfXJtxA4AgWH8s6tFUh/+LA6x7dUtxEbrXcdwYwuruB8P3PhCZp2zWZ88qtFhn3kTkpOJ4rfnD/kqJo93y2K31e6omv1QDtg5KLNph2J3rOvbP+X1cyjKE3fQwrTzplkU57XUFwaTcQdcah3AigFGtrTiqYSJHpnyR5rP5s2riQjZiPxtx5w5y/WRKYxcp86nuMFfVAQq4GsK8o1/S7dHkoxDLYhlz7lTbmXjtMKVIHTgaSVi3bbz+/OAPm+CTfAe+lU0K3lpU4FR0aJyTDPVe8OTmBn+uiI0f4aPqO4J6qZGv906diK1WzV2xKaZ+wtyRU4qayJOkRT3UzKOhpIpR/tMUU/ELAt1uOLLg4h/beLQ68V4lbrhVZIWh2rsmfYva+VyBmenNa6c6ogmQVlV MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR04MB9638.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4b1a6639-e87f-4b1b-1a8d-08dbd11d68ca X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Oct 2023 03:34:04.4812 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 61TVq+00KN7KLhJ6xQnRA6PkT63lrC1Fya+TyI7dhr13+/OqqnDxEjVr42ohB7slDpyeiW3GxIzuaSBZC2e8NQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB8236 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 1. For station mode first. 2. This feature is a must for WPA3. 3. Firmware key api version 2 is needed for this feature. 4. The code is only enabled and tested with IW416. 5. This feature is disabled for other chips. Signed-off-by: David Lin --- .../net/wireless/marvell/mwifiex/cfg80211.c | 327 ++++++++++++++++++ drivers/net/wireless/marvell/mwifiex/cmdevt.c | 14 +- drivers/net/wireless/marvell/mwifiex/decl.h | 12 + drivers/net/wireless/marvell/mwifiex/fw.h | 15 + drivers/net/wireless/marvell/mwifiex/init.c | 3 + drivers/net/wireless/marvell/mwifiex/join.c | 64 +++- drivers/net/wireless/marvell/mwifiex/main.h | 10 + drivers/net/wireless/marvell/mwifiex/scan.c | 6 + drivers/net/wireless/marvell/mwifiex/sdio.c | 13 + drivers/net/wireless/marvell/mwifiex/sdio.h | 2 + .../net/wireless/marvell/mwifiex/sta_event.c | 18 +- .../net/wireless/marvell/mwifiex/sta_ioctl.c | 3 +- drivers/net/wireless/marvell/mwifiex/sta_tx.c | 9 +- .../net/wireless/marvell/mwifiex/uap_cmd.c | 26 ++ drivers/net/wireless/marvell/mwifiex/util.c | 73 ++++ 15 files changed, 582 insertions(+), 13 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 7a15ea8072e6..40c39e4765f7 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -57,6 +57,31 @@ ieee80211_iface_combination mwifiex_iface_comb_ap_sta_drcs = { .beacon_int_infra_match = true, }; +struct mwifiex_ieee80211_mgmt { + __le16 frame_control; + __le16 duration; + u8 da[ETH_ALEN]; + u8 sa[ETH_ALEN]; + u8 bssid[ETH_ALEN]; + __le16 seq_ctrl; + u8 addr4[ETH_ALEN]; + union { + struct { + __le16 auth_alg; + __le16 auth_transaction; + __le16 status_code; + /* possibly followed by Challenge text */ + u8 variable[]; + } __packed auth; + struct { + __le16 capab_info; + __le16 listen_interval; + /* followed by SSID and Supported rates */ + u8 variable[]; + } __packed assoc_req; + } u; +} __pack; + /* * This function maps the nl802.11 channel type into driver channel type. * @@ -268,6 +293,8 @@ mwifiex_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy, if (mask != priv->mgmt_frame_mask) { priv->mgmt_frame_mask = mask; + if (priv->host_mlme_reg) + priv->mgmt_frame_mask |= HOST_MLME_MGMT_MASK; mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, HostCmd_ACT_GEN_SET, 0, &priv->mgmt_frame_mask, false); @@ -848,6 +875,7 @@ static int mwifiex_deinit_priv_params(struct mwifiex_private *priv) struct mwifiex_adapter *adapter = priv->adapter; unsigned long flags; + priv->host_mlme_reg = false; priv->mgmt_frame_mask = 0; if (mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, HostCmd_ACT_GEN_SET, 0, @@ -4202,6 +4230,292 @@ mwifiex_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev, return ret; } +static int +mwifiex_cfg80211_authenticate(struct wiphy *wiphy, + struct net_device *dev, + struct cfg80211_auth_request *req) +{ + struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); + struct mwifiex_adapter *adapter = priv->adapter; + struct sk_buff *skb; + u16 pkt_len, auth_alg; + int ret; + struct mwifiex_ieee80211_mgmt *mgmt; + struct mwifiex_txinfo *tx_info; + u32 tx_control = 0, pkt_type = PKT_TYPE_MGMT; + u8 addr[ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + u8 trans = 1, status_code = 0; + u8 *varptr; + + if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) { + mwifiex_dbg(priv->adapter, ERROR, "Interface role is AP\n"); + return -EFAULT; + } + + if (priv->wdev.iftype != NL80211_IFTYPE_STATION) { + mwifiex_dbg(priv->adapter, ERROR, + "Interface type is not correct (type %d)\n", + priv->wdev.iftype); + return -EINVAL; + } + + if (priv->auth_alg != WLAN_AUTH_SAE && + (priv->auth_flag & HOST_MLME_AUTH_PENDING)) { + mwifiex_dbg(priv->adapter, ERROR, "Pending auth on going\n"); + return -EBUSY; + } + + if (!priv->host_mlme_reg) { + priv->host_mlme_reg = true; + priv->mgmt_frame_mask |= HOST_MLME_MGMT_MASK; + mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, + HostCmd_ACT_GEN_SET, 0, + &priv->mgmt_frame_mask, false); + } + + switch (req->auth_type) { + case NL80211_AUTHTYPE_OPEN_SYSTEM: + auth_alg = WLAN_AUTH_OPEN; + break; + case NL80211_AUTHTYPE_SHARED_KEY: + auth_alg = WLAN_AUTH_SHARED_KEY; + break; + case NL80211_AUTHTYPE_FT: + auth_alg = WLAN_AUTH_FT; + break; + case NL80211_AUTHTYPE_NETWORK_EAP: + auth_alg = WLAN_AUTH_LEAP; + break; + case NL80211_AUTHTYPE_SAE: + auth_alg = WLAN_AUTH_SAE; + break; + default: + mwifiex_dbg(priv->adapter, ERROR, + "unsupported auth type=%d\n", req->auth_type); + return -EOPNOTSUPP; + } + + if (!priv->auth_flag) { + ret = mwifiex_remain_on_chan_cfg(priv, HostCmd_ACT_GEN_SET, + req->bss->channel, + AUTH_TX_DEFAULT_WAIT_TIME); + + if (!ret) { + priv->roc_cfg.cookie = get_random_u32() | 1; + priv->roc_cfg.chan = *req->bss->channel; + } + } + + priv->sec_info.authentication_mode = auth_alg; + + mwifiex_cancel_scan(adapter); + + pkt_len = (u16)req->ie_len + req->auth_data_len + + MWIFIEX_MGMT_HEADER_LEN + MWIFIEX_AUTH_BODY_LEN; + if (req->auth_data_len >= 4) + pkt_len -= 4; + + skb = dev_alloc_skb(MWIFIEX_MIN_DATA_HEADER_LEN + + MWIFIEX_MGMT_FRAME_HEADER_SIZE + + pkt_len + sizeof(pkt_len)); + if (!skb) { + mwifiex_dbg(priv->adapter, ERROR, + "allocate skb failed for management frame\n"); + return -ENOMEM; + } + + tx_info = MWIFIEX_SKB_TXCB(skb); + memset(tx_info, 0, sizeof(*tx_info)); + tx_info->bss_num = priv->bss_num; + tx_info->bss_type = priv->bss_type; + tx_info->pkt_len = pkt_len; + + skb_reserve(skb, MWIFIEX_MIN_DATA_HEADER_LEN + + MWIFIEX_MGMT_FRAME_HEADER_SIZE + sizeof(pkt_len)); + memcpy(skb_push(skb, sizeof(pkt_len)), &pkt_len, sizeof(pkt_len)); + memcpy(skb_push(skb, sizeof(tx_control)), + &tx_control, sizeof(tx_control)); + memcpy(skb_push(skb, sizeof(pkt_type)), &pkt_type, sizeof(pkt_type)); + + mgmt = (struct mwifiex_ieee80211_mgmt *)skb_put(skb, pkt_len); + memset(mgmt, 0, pkt_len); + mgmt->frame_control = + cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH); + memcpy(mgmt->da, req->bss->bssid, ETH_ALEN); + memcpy(mgmt->sa, priv->curr_addr, ETH_ALEN); + memcpy(mgmt->bssid, req->bss->bssid, ETH_ALEN); + memcpy(mgmt->addr4, addr, ETH_ALEN); + + if (req->auth_data_len >= 4) { + if (req->auth_type == NL80211_AUTHTYPE_SAE) { + __le16 *pos = (__le16 *)req->auth_data; + + trans = le16_to_cpu(pos[0]); + status_code = le16_to_cpu(pos[1]); + } + memcpy((u8 *)(&mgmt->u.auth.variable), req->auth_data + 4, + req->auth_data_len - 4); + varptr = (u8 *)&mgmt->u.auth.variable + + (req->auth_data_len - 4); + } + + mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg); + mgmt->u.auth.auth_transaction = trans; + mgmt->u.auth.status_code = status_code; + + if (req->ie && req->ie_len) { + if (!varptr) + varptr = (u8 *)&mgmt->u.auth.variable; + memcpy((u8 *)varptr, req->ie, req->ie_len); + } + + priv->auth_flag = HOST_MLME_AUTH_PENDING; + priv->auth_alg = auth_alg; + + skb->priority = WMM_HIGHEST_PRIORITY; + __net_timestamp(skb); + + mwifiex_dbg(priv->adapter, MSG, + "auth: send authentication to %pM\n", req->bss->bssid); + + mwifiex_queue_tx_pkt(priv, skb); + + return 0; +} + +static int +mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, + struct cfg80211_assoc_request *req) +{ + struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); + struct mwifiex_adapter *adapter = priv->adapter; + int ret; + struct cfg80211_ssid req_ssid; + const u8 *ssid_ie; + struct cfg80211_rx_assoc_resp assoc_resp = { + .uapsd_queues = -1, + }; + + if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) { + mwifiex_dbg(adapter, ERROR, + "%s: reject infra assoc request in non-STA role\n", + dev->name); + return -EINVAL; + } + + if (test_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags) || + test_bit(MWIFIEX_IS_CMD_TIMEDOUT, &adapter->work_flags)) { + mwifiex_dbg(adapter, ERROR, + "%s: Ignore association.\t" + "Card removed or FW in bad state\n", + dev->name); + return -EFAULT; + } + + if (priv->auth_alg == WLAN_AUTH_SAE) + priv->auth_flag = HOST_MLME_AUTH_DONE; + + if (priv->auth_flag && !(priv->auth_flag & HOST_MLME_AUTH_DONE)) + return -EBUSY; + + if (!mwifiex_stop_bg_scan(priv)) + cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); + + memset(&req_ssid, 0, sizeof(struct cfg80211_ssid)); + rcu_read_lock(); + ssid_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); + + if (!ssid_ie) + goto ssid_err; + + req_ssid.ssid_len = ssid_ie[1]; + if (req_ssid.ssid_len > IEEE80211_MAX_SSID_LEN) { + mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); + goto ssid_err; + } + + memcpy(req_ssid.ssid, ssid_ie + 2, req_ssid.ssid_len); + if (!req_ssid.ssid_len || req_ssid.ssid[0] < 0x20) { + mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); + goto ssid_err; + } + rcu_read_unlock(); + + /* As this is new association, clear locally stored + * keys and security related flags + */ + priv->sec_info.wpa_enabled = false; + priv->sec_info.wpa2_enabled = false; + priv->wep_key_curr_index = 0; + priv->sec_info.encryption_mode = 0; + priv->sec_info.is_authtype_auto = 0; + ret = mwifiex_set_encode(priv, NULL, NULL, 0, 0, NULL, 1); + + if (req->crypto.n_ciphers_pairwise) + priv->sec_info.encryption_mode = + req->crypto.ciphers_pairwise[0]; + + if (req->crypto.cipher_group) + priv->sec_info.encryption_mode = req->crypto.cipher_group; + + if (req->ie) + ret = mwifiex_set_gen_ie(priv, req->ie, req->ie_len); + + memcpy(priv->cfg_bssid, req->bss->bssid, ETH_ALEN); + + mwifiex_dbg(priv->adapter, MSG, + "assoc: send association to %pM\n", req->bss->bssid); + + cfg80211_ref_bss(priv->adapter->wiphy, req->bss); + + ret = mwifiex_bss_start(priv, req->bss, &req_ssid); + + if (!ret) { + assoc_resp.links[0].bss = priv->attempted_bss_desc->bss; + assoc_resp.buf = priv->assoc_rsp_buf; + assoc_resp.len = priv->assoc_rsp_size; + cfg80211_rx_assoc_resp(priv->netdev, + &assoc_resp); + } else { + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + eth_zero_addr(priv->cfg_bssid); + } + + cfg80211_put_bss(priv->adapter->wiphy, req->bss); + + return 0; + +ssid_err: + + rcu_read_unlock(); + return -EFAULT; +} + +static int +mwifiex_cfg80211_deauthenticate(struct wiphy *wiphy, + struct net_device *dev, + struct cfg80211_deauth_request *req) +{ + return mwifiex_cfg80211_disconnect(wiphy, dev, req->reason_code); +} + +static int +mwifiex_cfg80211_disassociate(struct wiphy *wiphy, + struct net_device *dev, + struct cfg80211_disassoc_request *req) +{ + return mwifiex_cfg80211_disconnect(wiphy, dev, req->reason_code); +} + +static int +mwifiex_cfg80211_probe_client(struct wiphy *wiphy, + struct net_device *dev, const u8 *peer, + u64 *cookie) +{ + return -1; +} + /* station cfg80211 operations */ static struct cfg80211_ops mwifiex_cfg80211_ops = { .add_virtual_intf = mwifiex_add_virtual_intf, @@ -4347,6 +4661,16 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) "%s: creating new wiphy\n", __func__); return -ENOMEM; } + if (adapter->host_mlme) { + mwifiex_cfg80211_ops.auth = mwifiex_cfg80211_authenticate; + mwifiex_cfg80211_ops.assoc = mwifiex_cfg80211_associate; + mwifiex_cfg80211_ops.deauth = mwifiex_cfg80211_deauthenticate; + mwifiex_cfg80211_ops.disassoc = mwifiex_cfg80211_disassociate; + mwifiex_cfg80211_ops.disconnect = NULL; + mwifiex_cfg80211_ops.connect = NULL; + mwifiex_cfg80211_ops.probe_client = + mwifiex_cfg80211_probe_client; + } wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH; wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN; wiphy->mgmt_stypes = mwifiex_mgmt_stypes; @@ -4428,6 +4752,9 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter) NL80211_FEATURE_LOW_PRIORITY_SCAN | NL80211_FEATURE_NEED_OBSS_SCAN; + if (adapter->host_mlme) + wiphy->features |= NL80211_FEATURE_SAE; + if (ISSUPP_ADHOC_ENABLED(adapter->fw_cap_info)) wiphy->features |= NL80211_FEATURE_HT_IBSS; diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index 3756aa247e77..311af5f40c3e 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -654,7 +654,7 @@ int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no, if (ret) { mwifiex_dbg(adapter, ERROR, "PREP_CMD: cmd %#x preparation failed\n", - cmd_no); + cmd_no); mwifiex_insert_cmd_to_free_q(adapter, cmd_node); return -1; } @@ -1477,6 +1477,17 @@ int mwifiex_cmd_get_hw_spec(struct mwifiex_private *priv, return 0; } +static void mwifiex_check_key_api_ver(struct mwifiex_adapter *adapter) +{ + if (adapter->host_mlme) { + if (adapter->key_api_major_ver != KEY_API_VER_MAJOR_V2) + adapter->host_mlme = false; + mwifiex_dbg(adapter, MSG, "host_mlme: %s, key_api: %d\n", + adapter->host_mlme ? "enable" : "disable", + adapter->key_api_major_ver); + } +} + /* * This function handles the command response of get hardware * specifications. @@ -1586,6 +1597,7 @@ int mwifiex_ret_get_hw_spec(struct mwifiex_private *priv, "key_api v%d.%d\n", adapter->key_api_major_ver, adapter->key_api_minor_ver); + mwifiex_check_key_api_ver(adapter); break; case FW_API_VER_ID: adapter->fw_api_ver = diff --git a/drivers/net/wireless/marvell/mwifiex/decl.h b/drivers/net/wireless/marvell/mwifiex/decl.h index 326ffb05d791..f9b21b13d6c3 100644 --- a/drivers/net/wireless/marvell/mwifiex/decl.h +++ b/drivers/net/wireless/marvell/mwifiex/decl.h @@ -24,6 +24,18 @@ #define MWIFIEX_RX_HEADROOM 64 #define MAX_TXPD_SZ 32 #define INTF_HDR_ALIGN 4 +/* frmctl + durationid + addr1 + addr2 + addr3 + seqctl + addr4 */ +#define MWIFIEX_MGMT_HEADER_LEN (2 + 2 + 6 + 6 + 6 + 2 + 6) +/* 6 = auth_alg + auth_transaction + auth_status */ +#define MWIFIEX_AUTH_BODY_LEN 6 + +#define HOST_MLME_AUTH_PENDING BIT(0) +#define HOST_MLME_AUTH_DONE BIT(1) + +#define HOST_MLME_MGMT_MASK (BIT(IEEE80211_STYPE_AUTH >> 4) | \ + BIT(IEEE80211_STYPE_DEAUTH >> 4) | \ + BIT(IEEE80211_STYPE_DISASSOC >> 4)) +#define AUTH_TX_DEFAULT_WAIT_TIME 2400 #define MWIFIEX_MIN_DATA_HEADER_LEN (MWIFIEX_DMA_ALIGN_SZ + INTF_HDR_ALIGN + \ MAX_TXPD_SZ) diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h index 8e6db904e5b2..8b22cd993a79 100644 --- a/drivers/net/wireless/marvell/mwifiex/fw.h +++ b/drivers/net/wireless/marvell/mwifiex/fw.h @@ -209,6 +209,9 @@ enum MWIFIEX_802_11_PRIVACY_FILTER { #define TLV_TYPE_RANDOM_MAC (PROPRIETARY_TLV_BASE_ID + 236) #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_SAE_PWE_MODE (PROPRIETARY_TLV_BASE_ID + 339) + #define MWIFIEX_TX_DATA_BUF_SIZE_2K 2048 @@ -802,6 +805,11 @@ struct mwifiex_ie_types_ssid_param_set { u8 ssid[]; } __packed; +struct mwifiex_ie_types_host_mlme { + struct mwifiex_ie_types_header header; + u8 host_mlme; +} __packed; + struct mwifiex_ie_types_num_probes { struct mwifiex_ie_types_header header; __le16 num_probes; @@ -905,6 +913,13 @@ struct mwifiex_ie_types_tdls_idle_timeout { __le16 value; } __packed; +#define MWIFIEX_AUTHTYPE_SAE 6 + +struct mwifiex_ie_types_sae_pwe_mode { + struct mwifiex_ie_types_header header; + u8 pwe[]; +} __packed; + struct mwifiex_ie_types_rsn_param_set { struct mwifiex_ie_types_header header; u8 rsn_ie[]; diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c index c9c58419c37b..f86a527fd7ca 100644 --- a/drivers/net/wireless/marvell/mwifiex/init.c +++ b/drivers/net/wireless/marvell/mwifiex/init.c @@ -81,6 +81,9 @@ int mwifiex_init_priv(struct mwifiex_private *priv) priv->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR; priv->data_avg_factor = DEFAULT_DATA_AVG_FACTOR; + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + priv->sec_info.wep_enabled = 0; priv->sec_info.authentication_mode = NL80211_AUTHTYPE_OPEN_SYSTEM; priv->sec_info.encryption_mode = 0; diff --git a/drivers/net/wireless/marvell/mwifiex/join.c b/drivers/net/wireless/marvell/mwifiex/join.c index a6e254a1185c..ef7cc40c3ba4 100644 --- a/drivers/net/wireless/marvell/mwifiex/join.c +++ b/drivers/net/wireless/marvell/mwifiex/join.c @@ -382,7 +382,9 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, struct mwifiex_ie_types_ss_param_set *ss_tlv; struct mwifiex_ie_types_rates_param_set *rates_tlv; struct mwifiex_ie_types_auth_type *auth_tlv; + struct mwifiex_ie_types_sae_pwe_mode *sae_pwe_tlv; struct mwifiex_ie_types_chan_list_param_set *chan_tlv; + struct mwifiex_ie_types_host_mlme *host_mlme_tlv; u8 rates[MWIFIEX_SUPPORTED_RATES]; u32 rates_size; u16 tmp_cap; @@ -448,7 +450,7 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, mwifiex_dbg(priv->adapter, INFO, "info: ASSOC_CMD: rates size = %d\n", rates_size); - /* Add the Authentication type to be used for Auth frames */ + /* Add the Authentication type */ auth_tlv = (struct mwifiex_ie_types_auth_type *) pos; auth_tlv->header.type = cpu_to_le16(TLV_TYPE_AUTH_TYPE); auth_tlv->header.len = cpu_to_le16(sizeof(auth_tlv->auth_type)); @@ -460,6 +462,24 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, pos += sizeof(auth_tlv->header) + le16_to_cpu(auth_tlv->header.len); + if (priv->sec_info.authentication_mode == WLAN_AUTH_SAE) { + auth_tlv->auth_type = cpu_to_le16(MWIFIEX_AUTHTYPE_SAE); + if (bss_desc->bcn_rsnx_ie && + bss_desc->bcn_rsnx_ie->ieee_hdr.len && + (bss_desc->bcn_rsnx_ie->data[0] & + WLAN_RSNX_CAPA_SAE_H2E)) { + sae_pwe_tlv = + (struct mwifiex_ie_types_sae_pwe_mode *)pos; + sae_pwe_tlv->header.type = + cpu_to_le16(TLV_TYPE_SAE_PWE_MODE); + sae_pwe_tlv->header.len = + cpu_to_le16(sizeof(sae_pwe_tlv->pwe[0])); + sae_pwe_tlv->pwe[0] = bss_desc->bcn_rsnx_ie->data[0]; + pos += sizeof(sae_pwe_tlv->header) + + sizeof(sae_pwe_tlv->pwe[0]); + } + } + if (IS_SUPPORT_MULTI_BANDS(priv->adapter) && !(ISSUPP_11NENABLED(priv->adapter->fw_cap_info) && (!bss_desc->disable_11n) && @@ -491,6 +511,16 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, sizeof(struct mwifiex_chan_scan_param_set); } + if (priv->adapter->host_mlme) { + host_mlme_tlv = (struct mwifiex_ie_types_host_mlme *)pos; + host_mlme_tlv->header.type = cpu_to_le16(TLV_TYPE_HOST_MLME); + host_mlme_tlv->header.len = + cpu_to_le16(sizeof(host_mlme_tlv->host_mlme)); + host_mlme_tlv->host_mlme = 1; + pos += sizeof(host_mlme_tlv->header) + + sizeof(host_mlme_tlv->host_mlme); + } + if (!priv->wps.session_enable) { if (priv->sec_info.wpa_enabled || priv->sec_info.wpa2_enabled) rsn_ie_len = mwifiex_append_rsn_ie_wpa_wpa2(priv, &pos); @@ -634,6 +664,7 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, u16 cap_info, status_code, aid; const u8 *ie_ptr; struct ieee80211_ht_operation *assoc_resp_ht_oper; + struct ieee80211_mgmt *hdr; if (!priv->attempted_bss_desc) { mwifiex_dbg(priv->adapter, ERROR, @@ -641,7 +672,19 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, goto done; } - assoc_rsp = (struct ieee_types_assoc_rsp *) &resp->params; + if (adapter->host_mlme) { + hdr = (struct ieee80211_mgmt *)&resp->params; + if (!memcmp(hdr->bssid, + priv->attempted_bss_desc->mac_address, + ETH_ALEN)) + assoc_rsp = (struct ieee_types_assoc_rsp *) + &hdr->u.assoc_resp; + else + assoc_rsp = + (struct ieee_types_assoc_rsp *)&resp->params; + } else { + assoc_rsp = (struct ieee_types_assoc_rsp *)&resp->params; + } cap_info = le16_to_cpu(assoc_rsp->cap_info_bitmap); status_code = le16_to_cpu(assoc_rsp->status_code); @@ -778,7 +821,8 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, priv->adapter->dbg.num_cmd_assoc_success++; - mwifiex_dbg(priv->adapter, INFO, "info: ASSOC_RESP: associated\n"); + mwifiex_dbg(priv->adapter, MSG, "assoc: associated with %pM\n", + priv->attempted_bss_desc->mac_address); /* Add the ra_list here for infra mode as there will be only 1 ra always */ @@ -1491,6 +1535,20 @@ int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac) if (!priv->media_connected) return 0; + if (priv->adapter->host_mlme) { + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + priv->host_mlme_reg = false; + priv->mgmt_frame_mask = 0; + if (mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, + HostCmd_ACT_GEN_SET, 0, + &priv->mgmt_frame_mask, false)) { + mwifiex_dbg(priv->adapter, ERROR, + "could not unregister mgmt frame rx\n"); + return -1; + } + } + switch (priv->bss_mode) { case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_P2P_CLIENT: diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h index d263eae6078c..83449ad84d15 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h @@ -384,6 +384,7 @@ struct ieee_types_aid { struct mwifiex_bssdescriptor { u8 mac_address[ETH_ALEN]; + struct cfg80211_bss *bss; struct cfg80211_ssid ssid; u32 privacy; s32 rssi; @@ -426,6 +427,8 @@ struct mwifiex_bssdescriptor { u16 wpa_offset; struct ieee_types_generic *bcn_rsn_ie; u16 rsn_offset; + struct ieee_types_generic *bcn_rsnx_ie; + u16 rsnx_offset; struct ieee_types_generic *bcn_wapi_ie; u16 wapi_offset; u8 *beacon_buf; @@ -527,6 +530,8 @@ struct mwifiex_private { u8 bss_priority; u8 bss_num; u8 bss_started; + u8 auth_flag; + u16 auth_alg; u8 frame_type; u8 curr_addr[ETH_ALEN]; u8 media_connected; @@ -649,6 +654,7 @@ struct mwifiex_private { u16 gen_idx; u8 ap_11n_enabled; u8 ap_11ac_enabled; + bool host_mlme_reg; u32 mgmt_frame_mask; struct mwifiex_roc_cfg roc_cfg; bool scan_aborting; @@ -998,6 +1004,7 @@ struct mwifiex_adapter { bool is_up; bool ext_scan; + bool host_mlme; u8 fw_api_ver; u8 key_api_major_ver, key_api_minor_ver; u8 max_p2p_conn, max_sta_conn; @@ -1063,6 +1070,9 @@ int mwifiex_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb); int mwifiex_uap_recv_packet(struct mwifiex_private *priv, struct sk_buff *skb); +void mwifiex_host_mlme_disconnect(struct mwifiex_private *priv, + u16 reason_code, u8 *sa); + int mwifiex_process_mgmt_packet(struct mwifiex_private *priv, struct sk_buff *skb); diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c index 72904c275461..7ecff7ce06e4 100644 --- a/drivers/net/wireless/marvell/mwifiex/scan.c +++ b/drivers/net/wireless/marvell/mwifiex/scan.c @@ -1383,6 +1383,12 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, bss_entry->rsn_offset = (u16) (current_ptr - bss_entry->beacon_buf); break; + case WLAN_EID_RSNX: + bss_entry->bcn_rsnx_ie = + (struct ieee_types_generic *)current_ptr; + bss_entry->rsnx_offset = + (u16)(current_ptr - bss_entry->beacon_buf); + break; case WLAN_EID_BSS_AC_ACCESS_DELAY: bss_entry->bcn_wapi_ie = (struct ieee_types_generic *) current_ptr; diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c index 6462a0ffe698..f5039d158f46 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.c +++ b/drivers/net/wireless/marvell/mwifiex/sdio.c @@ -331,6 +331,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = false, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8787 = { @@ -346,6 +347,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8787 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8797 = { @@ -361,6 +363,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8797 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = { @@ -376,6 +379,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = { .can_dump_fw = true, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = { @@ -392,6 +396,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = { @@ -408,6 +413,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = true, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = { @@ -425,6 +431,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = { .fw_dump_enh = true, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = { @@ -440,6 +447,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = { .can_dump_fw = false, .can_auto_tdls = true, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = { @@ -456,6 +464,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = { .fw_dump_enh = true, .can_auto_tdls = true, .can_ext_scan = true, + .host_mlme = false, }; static const struct mwifiex_sdio_device mwifiex_sdio_sd8801 = { @@ -471,6 +480,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8801 = { .can_dump_fw = false, .can_auto_tdls = false, .can_ext_scan = true, + .host_mlme = false, }; static struct memory_type_mapping generic_mem_type_map[] = { @@ -563,6 +573,7 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id) card->fw_dump_enh = data->fw_dump_enh; card->can_auto_tdls = data->can_auto_tdls; card->can_ext_scan = data->can_ext_scan; + card->host_mlme = data->host_mlme; INIT_WORK(&card->work, mwifiex_sdio_work); } @@ -2493,6 +2504,8 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter) adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl); } + adapter->host_mlme = card->host_mlme; + return 0; } diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.h b/drivers/net/wireless/marvell/mwifiex/sdio.h index b86a9263a6a8..4f253d8cae42 100644 --- a/drivers/net/wireless/marvell/mwifiex/sdio.h +++ b/drivers/net/wireless/marvell/mwifiex/sdio.h @@ -255,6 +255,7 @@ struct sdio_mmc_card { bool fw_dump_enh; bool can_auto_tdls; bool can_ext_scan; + bool host_mlme; struct mwifiex_sdio_mpa_tx mpa_tx; struct mwifiex_sdio_mpa_rx mpa_rx; @@ -278,6 +279,7 @@ struct mwifiex_sdio_device { bool fw_dump_enh; bool can_auto_tdls; bool can_ext_scan; + bool host_mlme; }; /* diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c index df9cdd10a494..69426ddd9c3a 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_event.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c @@ -135,6 +135,9 @@ void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code, priv->media_connected = false; + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + priv->scan_block = false; priv->port_open = false; @@ -999,10 +1002,17 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) case EVENT_REMAIN_ON_CHAN_EXPIRED: mwifiex_dbg(adapter, EVENT, "event: Remain on channel expired\n"); - cfg80211_remain_on_channel_expired(&priv->wdev, - priv->roc_cfg.cookie, - &priv->roc_cfg.chan, - GFP_ATOMIC); + + if (adapter->host_mlme && + (priv->auth_flag & HOST_MLME_AUTH_PENDING)) { + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + } else { + cfg80211_remain_on_channel_expired(&priv->wdev, + priv->roc_cfg.cookie, + &priv->roc_cfg.chan, + GFP_ATOMIC); + } memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg)); diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c index a2ad2b53f016..046541713318 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c @@ -136,6 +136,7 @@ int mwifiex_fill_new_bss_desc(struct mwifiex_private *priv, const struct cfg80211_bss_ies *ies; rcu_read_lock(); + bss_desc->bss = bss; ies = rcu_dereference(bss->ies); beacon_ie = kmemdup(ies->data, ies->len, GFP_ATOMIC); beacon_ie_len = ies->len; @@ -339,7 +340,7 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, ret = mwifiex_associate(priv, bss_desc); } - if (bss) + if (bss && !priv->adapter->host_mlme) cfg80211_put_bss(priv->adapter->wiphy, bss); } else { /* Adhoc mode */ diff --git a/drivers/net/wireless/marvell/mwifiex/sta_tx.c b/drivers/net/wireless/marvell/mwifiex/sta_tx.c index 70c2790b8e35..9d0ef04ebe02 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_tx.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_tx.c @@ -36,7 +36,7 @@ void mwifiex_process_sta_txpd(struct mwifiex_private *priv, struct txpd *local_tx_pd; struct mwifiex_txinfo *tx_info = MWIFIEX_SKB_TXCB(skb); unsigned int pad; - u16 pkt_type, pkt_offset; + u16 pkt_type, pkt_length, pkt_offset; int hroom = adapter->intf_hdr_len; pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0; @@ -49,9 +49,10 @@ void mwifiex_process_sta_txpd(struct mwifiex_private *priv, memset(local_tx_pd, 0, sizeof(struct txpd)); local_tx_pd->bss_num = priv->bss_num; local_tx_pd->bss_type = priv->bss_type; - local_tx_pd->tx_pkt_length = cpu_to_le16((u16)(skb->len - - (sizeof(struct txpd) + - pad))); + pkt_length = (u16)(skb->len - (sizeof(struct txpd) + pad)); + if (pkt_type == PKT_TYPE_MGMT) + pkt_length -= MWIFIEX_MGMT_FRAME_HEADER_SIZE; + local_tx_pd->tx_pkt_length = cpu_to_le16(pkt_length); local_tx_pd->priority = (u8) skb->priority; local_tx_pd->pkt_delay_2ms = diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c index e78a201cd150..eb0b8016d43d 100644 --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c @@ -743,6 +743,29 @@ 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 int mwifiex_cmd_uap_bss_start(struct mwifiex_private *priv, + struct host_cmd_ds_command *cmd) +{ + struct mwifiex_ie_types_host_mlme *tlv; + + cmd->command = cpu_to_le16(HostCmd_CMD_UAP_BSS_START); + cmd->size = S_DS_GEN; + + if (priv->adapter->host_mlme) { + tlv = (struct mwifiex_ie_types_host_mlme *)((u8 *)cmd + 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; + cmd->size += sizeof(struct mwifiex_ie_types_host_mlme); + } + + cmd->size = cpu_to_le16(cmd->size); + + return 0; +} + /* This function prepares AP specific deauth command with mac supplied in * function parameter. */ @@ -777,6 +800,9 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, u16 cmd_no, return -1; break; case HostCmd_CMD_UAP_BSS_START: + if (mwifiex_cmd_uap_bss_start(priv, cmd)) + return -1; + break; case HostCmd_CMD_UAP_BSS_STOP: case HOST_CMD_APCMD_SYS_RESET: case HOST_CMD_APCMD_STA_LIST: diff --git a/drivers/net/wireless/marvell/mwifiex/util.c b/drivers/net/wireless/marvell/mwifiex/util.c index 745b1d925b21..23675c1cecae 100644 --- a/drivers/net/wireless/marvell/mwifiex/util.c +++ b/drivers/net/wireless/marvell/mwifiex/util.c @@ -370,6 +370,46 @@ mwifiex_parse_mgmt_packet(struct mwifiex_private *priv, u8 *payload, u16 len, return 0; } + +/* This function sends deauth packet to the kernel. */ +void mwifiex_host_mlme_disconnect(struct mwifiex_private *priv, + u16 reason_code, u8 *sa) +{ + u8 broadcast_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + u8 frame_buf[100]; + struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)frame_buf; + + memset(frame_buf, 0, sizeof(frame_buf)); + mgmt->frame_control = (__force __le16)IEEE80211_STYPE_DEAUTH; + mgmt->duration = 0; + mgmt->seq_ctrl = 0; + mgmt->u.deauth.reason_code = (__force __le16)reason_code; + + if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) { + memcpy(mgmt->da, broadcast_addr, ETH_ALEN); + memcpy(mgmt->sa, + priv->curr_bss_params.bss_descriptor.mac_address, + ETH_ALEN); + memcpy(mgmt->bssid, priv->cfg_bssid, ETH_ALEN); + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + } else { + memcpy(mgmt->da, priv->curr_addr, ETH_ALEN); + memcpy(mgmt->sa, sa, ETH_ALEN); + memcpy(mgmt->bssid, priv->curr_addr, ETH_ALEN); + } + + if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) { + wiphy_lock(priv->wdev.wiphy); + cfg80211_rx_mlme_mgmt(priv->netdev, frame_buf, 26); + wiphy_unlock(priv->wdev.wiphy); + } else { + cfg80211_rx_mgmt(&priv->wdev, + priv->bss_chandef.chan->center_freq, + 0, frame_buf, 26, 0); + } +} + /* * This function processes the received management packet and send it * to the kernel. @@ -417,6 +457,39 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv, pkt_len -= ETH_ALEN; rx_pd->rx_pkt_length = cpu_to_le16(pkt_len); + if (priv->host_mlme_reg && + (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) && + (ieee80211_is_auth(ieee_hdr->frame_control) || + ieee80211_is_deauth(ieee_hdr->frame_control) || + ieee80211_is_disassoc(ieee_hdr->frame_control))) { + if (ieee80211_is_auth(ieee_hdr->frame_control)) { + if (priv->auth_flag & HOST_MLME_AUTH_PENDING) { + if (priv->auth_alg != WLAN_AUTH_SAE) { + priv->auth_flag &= + ~HOST_MLME_AUTH_PENDING; + priv->auth_flag |= + HOST_MLME_AUTH_DONE; + } + } else { + return 0; + } + + mwifiex_dbg(priv->adapter, MSG, + "auth: receive authentication from %pM\n", + ieee_hdr->addr3); + } else { + if (!priv->wdev.connected) + return 0; + + if (ieee80211_is_deauth(ieee_hdr->frame_control)) { + priv->auth_flag = 0; + priv->auth_alg = 0xFFFF; + } + } + + cfg80211_rx_mlme_mgmt(priv->netdev, skb->data, pkt_len); + } + cfg80211_rx_mgmt(&priv->wdev, priv->roc_cfg.chan.center_freq, CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len, 0); From patchwork Fri Oct 20 03:34:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lin X-Patchwork-Id: 13429999 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10E24C001DF for ; Fri, 20 Oct 2023 03:34:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376265AbjJTDeV (ORCPT ); Thu, 19 Oct 2023 23:34:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346947AbjJTDeS (ORCPT ); Thu, 19 Oct 2023 23:34:18 -0400 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2085.outbound.protection.outlook.com [40.107.21.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 443CFD6B; Thu, 19 Oct 2023 20:34:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BfVsae5RC/CD5dbxbskTzJdTOMolDSe0V2aND49REis5NA/hSlks9c+QjUZnXFcFBdSq8fSubQ6qUVYUNRWFFrHwJWZNgCsbFg3FOCNAqLwtooALz/pw90AIw0pZwLObuHEtsnALFpIK5+uxU+IMHifIJ6I6zom/BUIrIf9mMNLUv9fPcPG9qvamPkDWsVx/yeIvFufHAXHOqvVhOsXHRxBWVV/XX/kcYL1WMWEBnINf9A4odI8sxljM7Psu0wLLfOJz9QRPlMY2lfem0cnPtFG0FqtHgjID7NSHL+L29EuUCzu2q0tCmvjZgfmp5J3QZ/309kvW9sbz02Sa9zH5Yw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=kSDFf+diQUzWFavfrz8vXQVQuP22O58vGaLwxYQ64zc=; b=O3VibzTJZxZ+DKL24h0Z7O5yUG2Unx+PCYV2hzJKBI2GJ5D7GMuwGYMOANobOEDLAtgL0AbhznbGVVHIZ/PsfLZXZDpEdUp0Ic98Hp9XVwZLuGCtnMQbt0HQdjYRT1xfvaHl02YhltCAl9xdZESTbO9Q0gwFng56T/rAZG+cIaewjuV5yNmr3iqTzLc+R7v5BU8ALEotIFxAdGeLc3LwQmKusDFm4nygxI5l6b8YZn/7jIVlZAg7XsWTy3oCau/F379C2UOEtDQeJhVaw6apOpiqOknV6yBnpOKUUco6iTy9k95tLuY812xuxK+iJmT4AWr61WCduS7ECD/Mq9jb9A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kSDFf+diQUzWFavfrz8vXQVQuP22O58vGaLwxYQ64zc=; b=UJcUW2OJUrenk2WpWsOtu/T+weZexi4cQWDOWq3wjQWAdCXzXdtrRcxf6EH/Zlkra3II/Pxubs+rOW6j1hc8q1gTsdeJtMOdArwzBk7wZMJn4GTHnDmG/QKwASb8YfyIBGHHzLftHEQyzppNjJWSJadvH9/FH+CUxKF9LRiI0PA= Received: from PA4PR04MB9638.eurprd04.prod.outlook.com (2603:10a6:102:273::20) by DB9PR04MB8236.eurprd04.prod.outlook.com (2603:10a6:10:245::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.34; Fri, 20 Oct 2023 03:34:08 +0000 Received: from PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b]) by PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b%7]) with mapi id 15.20.6933.011; Fri, 20 Oct 2023 03:34:08 +0000 From: David Lin To: "linux-wireless@vger.kernel.org" CC: "linux-kernel@vger.kernel.org" , "briannorris@chromium.org" , "kvalo@kernel.org" , "francesco@dolcini.it" , Sharvari Harisangam , David Lin , Pete Hsieh Subject: [PATCH v5 2/6] wifi: mwifiex: fixed group rekey issue for WPA3. Thread-Topic: [PATCH v5 2/6] wifi: mwifiex: fixed group rekey issue for WPA3. Thread-Index: AdoDBkd5Cmqyq+6nRdaF/U9AWpwe9g== Date: Fri, 20 Oct 2023 03:34:08 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR04MB9638:EE_|DB9PR04MB8236:EE_ x-ms-office365-filtering-correlation-id: ed3ea348-145a-4caf-ca01-08dbd11d6afc x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: C8vrW7plKOMQUCNyRW+nkDabKx68cQXGqzL5aV1PmIwORimjHZfN8QvHc9JjmecgH04QIbGeXX4m5ip8c0z8hztN/sV4k3f9CCnnPZrbQleNjVR60Yu/+wHNyYncgZrTIotVH7BxKtLugTbPgiNRrMbvlgHSkR4vO1UtnlOzoum83vd7k02ac1/9Yk/WI4hf4FmzwQhlY9Bwst+FYz9ryLhWghsnYGNGsw6R9pX5Kg7ydUX0+hLi5XPQpTmmnPbcQl+eKtmCnPPCpsYNmgr74w+q23/znadzGQ0D8agElljJ9w0Y6JLr23+46G6u+lwPlBQrJ0nM2YYkLMCgG2XQtV2pGbzILiCJEml0jyrFmj3dUq+Kjep1TLFJyhKpgg4izE8nyHGkB26TpOkqEW5q73rCr6s4VEAqoQEDeO+CDap4cGebdo4p5wOdCC1CkIhcCx4AsFp5YsunU2ZDayipDmbRn0HwvoJoBGSwOdsqMiRbyKvntzr2/ReD6p94g5WovJBfk/uvHBiEMI0Jq3y8SPOKXqH48vVltwHCrjA6DX9RQzhQtE+f9kDo5jUEwJ1GPJAiz515BvRA256Up/ZHSpHZB2OUUQJwTsZ0HteQAFZV0LxFK1pVtKEZPYA5ZlgL x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR04MB9638.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(396003)(376002)(346002)(366004)(39860400002)(230922051799003)(451199024)(1800799009)(64100799003)(186009)(38070700009)(66446008)(38100700002)(66556008)(33656002)(64756008)(478600001)(66476007)(54906003)(66946007)(6506007)(6916009)(76116006)(71200400001)(2906002)(8936002)(5660300002)(8676002)(52536014)(9686003)(41300700001)(4326008)(86362001)(316002)(7696005)(83380400001)(122000001)(26005)(55016003);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: tX8lTWdYRxFR1BZmNhE5SAr2uYZ46K17144BAXhv89porJpGkUl/54cgUJn5IrdboYj7/t6uIDaoI4CzNENVCsSBNyMbTqKqMu7epiw0TxVmLHO3yOxN7Z6YH2kN+6MupEV10qCNu1IV9n8iVnzXTLtoxn/2I6F35eETAhQGbgnJ0EX2Q8Oajw8cn0Exg/3qa6C02BK+SDzWKndqJhxIlNkAy5SoXNY37d3hWwT6A45CTZK45AEUsqYABmL+5iimDSeXJNIJQ6Gz1k2w2q7LZioeEMwiGmDNmll+aqylNrPK2cL6zJAwCgKmOotLdCZ1p4jo4qaJPxm/i/iahGTKv7VqMsscIarODEfFwUWnZK8HaOAlukuOdzAa7pS8/CKBemszQi+YAwbPhgeJFxhwGnk9eKmwznVUaCYQ8+bf32GblIQK5jXOAis1A+PFv727vK7wT9iM1W6J03bDmRp57tkNKie4sU79sKfZvP/EGmnBDxAB7XxgtC0RvZqs31up/fIKBRUrcqsKyXZA8bkGTM9MxuvdRljjltc+nBcCXQbdTHeI5E/2SLY74VWxdEUBN5ZNkn75SC0j2VzSQd/UhmzJZqd9OzvdxWPHx3wBn6UryGR5GuJfW9+s0ZJSyMsufhJ4noVEN92n+t2b7DAEqULBgqnSr2ktTDGkzqATFkCRBcAWO7QcSZHnRPyklkA6/gTwwizoipXxt6T3XAMtwRS5nGKr6vZEZ6BY+PV9Wp8aM6jwECzSR/C5jn2AsDbDseezyoLApA7WkU5BcfuYfRqcNH1R1N+Q5m/Qx7W2FcLBc3aHQI+DUtqJxBV/17SNI3Ge9rtzQNSMcpnXRHjraS9+Ana03l/rhnAZu6Tq65qKfpdgk9jJYMtXPbUJwZns+Zg0eBIWL6/kIL76zO1BXEPs/IMN8b7xOkMlrS60xwZ0OE6IENmCBCuOSXT6gD3fhUPIZiWxRjumKYI3nSR1Wg8AeQ/hvVRLLEC63JYVBDkk2dcki/xD1UvneVfnUYXLaFRY3TzWknLuwS5lOj7pVbnKm3DO0eKjAGF4uYwIP6ol3B4rmorIMjZ7wu2mQPRoTCbG3S3aEn1CISwEZYrnitN5Nvixk1vU+e9SbHWB0LlKOqc9wK35s9KA74/ABR/zUalhCs4m7PuYPCeZGuO2sXVfowctP+RUmm6FQxI+HqmZOReIvs2mMcaD9QoPQ8N6LDTmCF0bl5bQcG9Ng1Yyh7kWSXJhnNpFjBoE6RgPzU7zzstl0jfP1iHnoJ9v/Sfw+9SFQIGn1gBQ4FENIQhvTycq5CpA60XWZmtibHDg+cjF7KlX3xhNcqsC2O8SwBTJ94fEgoxI0+T5CPyjRj6YndO4Y+0+MIvWymL6Ah0I/ulwiB3raMtWX6rka4klvC++/wgNoP+7EZrTCxuyAv4r7YhYDJnC02x3Tm3MPn3FQuVLwRUH3x11/gxTfUPsdRebJQuTJoCNc2WdLK3RP0STumGjp97qFcRkEeOycEitcOItKKfrDXZgKjGBXEeKx0x+Vl7+WAOywD2vFnirzkebPf1lFxg2/2YuaUopJl3A415MTNAWSyJG9/c96xlboMwq MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR04MB9638.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ed3ea348-145a-4caf-ca01-08dbd11d6afc X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Oct 2023 03:34:08.1760 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: tWUXxmmXQ6SlYa4KrHx7K3Yx5jBuR5BEurFtfDVhNCzQuOmxSE4LgVbPBxkgI1gk+KTpZ9IwgIT042d+iuMBiA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB8236 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org If host mlme is enabled, gropu rekey offload should be disabled. Signed-off-by: David Lin --- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 3 +++ drivers/net/wireless/marvell/mwifiex/main.c | 4 ++++ drivers/net/wireless/marvell/mwifiex/util.c | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 40c39e4765f7..3d59e6a441b9 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -3657,6 +3657,9 @@ static int mwifiex_set_rekey_data(struct wiphy *wiphy, struct net_device *dev, if (!ISSUPP_FIRMWARE_SUPPLICANT(priv->adapter->fw_cap_info)) return -EOPNOTSUPP; + if (priv->adapter->host_mlme) + return 0; + return mwifiex_send_cmd(priv, HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG, HostCmd_ACT_GEN_SET, 0, data, true); } diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index d99127dc466e..3bebb6c37604 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -802,6 +802,10 @@ mwifiex_bypass_tx_queue(struct mwifiex_private *priv, "bypass txqueue; eth type %#x, mgmt %d\n", ntohs(eth_hdr->h_proto), mwifiex_is_skb_mgmt_frame(skb)); + if (ntohs(eth_hdr->h_proto) == ETH_P_PAE) + mwifiex_dbg(priv->adapter, MSG, + "key: send EAPOL to %pM\n", + eth_hdr->h_dest); return true; } diff --git a/drivers/net/wireless/marvell/mwifiex/util.c b/drivers/net/wireless/marvell/mwifiex/util.c index 23675c1cecae..ff1b2f162c30 100644 --- a/drivers/net/wireless/marvell/mwifiex/util.c +++ b/drivers/net/wireless/marvell/mwifiex/util.c @@ -482,8 +482,15 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv, return 0; if (ieee80211_is_deauth(ieee_hdr->frame_control)) { + mwifiex_dbg(priv->adapter, MSG, + "auth: receive deauth from %pM\n", + ieee_hdr->addr3); priv->auth_flag = 0; priv->auth_alg = 0xFFFF; + } else { + mwifiex_dbg(priv->adapter, MSG, + "assoc: receive disasso from %pM\n", + ieee_hdr->addr3); } } From patchwork Fri Oct 20 03:34:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lin X-Patchwork-Id: 13430001 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E66FC001DF for ; Fri, 20 Oct 2023 03:34:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346942AbjJTDeX (ORCPT ); Thu, 19 Oct 2023 23:34:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50936 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346929AbjJTDeU (ORCPT ); Thu, 19 Oct 2023 23:34:20 -0400 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2085.outbound.protection.outlook.com [40.107.21.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 165BBD7C; Thu, 19 Oct 2023 20:34:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BggqzKtX1Jlm/fJufr7QNaNrRgcogN1WzJ8O09mJ5bIUh54HkuTThupevACV1Ph3oBGkK9OwglXfmx7cEK1XZey3uB5kw0uGbcQ1Q/iq4p0XennHz1Es57f5ynm6lOkUlP++5sKNqkMLj4GJx2zUXtR+dUyygs2BH0ud22hr2gMD0Wmodkro1hspDWdqueO0kElLu9dq1ry4BgIPYcwnJ5fPRDyker4TR6HI2eKCA3Tenpbn8uSL65RZtekd+hQKEGvOpGz7gSDfehuU72yePmqgEUFT1Wpzv4ivuirMLNT7LbQyoRUsCKO0LwSigh3WhCZFnraxHS5d7GKqRJTkPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=U4SkeeAq/HkU/8HoKVchswjM51I1gqV16brMIKI5cU0=; b=b8TnDLNc35mAQsDUAmc0AsPACN6HWr4c/Z6AfQuQVQPnxAJ9v//I/l/80HEBAwk/e6hbhEGotl3BNbiz4wdC9wu+aEBgOBv5CtWdZSFiSPGGde8WGABQFFuiCTqKA/EVJrIUa5YHYZDnLaO5HZJyNo/kBhgRKGZColFODQiQqh5argzdxt8j+tOG4Te9ccLgBcZJgvWhAgERqlJz49OGSGGfCChPTa6Nu5sR0JwCytoDbNsnm/HGyXPVkjNBS9vHnlPKY7VbUyaKhzCVIWpw2FxXB/r+pKXUjnX2BRIAP0Oynqyqa5akzuexpOtrAdWmz/BKnMpkxEGfoRA0DiAQrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=U4SkeeAq/HkU/8HoKVchswjM51I1gqV16brMIKI5cU0=; b=RdLe+Rz+KqSJM6IwUNXdbzq+S5Vxc8SaW/NAYqKuQHnBbhLZPJ4LvCNMO4nvnJmqvFoVunRvhwN8EZsTqoz0xKlqDTBpCQWI+0gDvOo5qQfKlj5K9O9WNX9rjRPCi55s5oH4p8dRzTkDXxbjPb9u8SLaPckXUIxdfi5vKk0YN5s= Received: from PA4PR04MB9638.eurprd04.prod.outlook.com (2603:10a6:102:273::20) by DB9PR04MB8236.eurprd04.prod.outlook.com (2603:10a6:10:245::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.34; Fri, 20 Oct 2023 03:34:11 +0000 Received: from PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b]) by PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b%7]) with mapi id 15.20.6933.011; Fri, 20 Oct 2023 03:34:11 +0000 From: David Lin To: "linux-wireless@vger.kernel.org" CC: "linux-kernel@vger.kernel.org" , "briannorris@chromium.org" , "kvalo@kernel.org" , "francesco@dolcini.it" , Sharvari Harisangam , David Lin , Pete Hsieh Subject: [PATCH v5 3/6] wifi: mwifiex: fixed reassocation issue for WPA3. Thread-Topic: [PATCH v5 3/6] wifi: mwifiex: fixed reassocation issue for WPA3. Thread-Index: AdoDBklPP2ms8qKvSYKhwn8ugGVR0w== Date: Fri, 20 Oct 2023 03:34:11 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR04MB9638:EE_|DB9PR04MB8236:EE_ x-ms-office365-filtering-correlation-id: 84d3de13-bbec-4b12-2a01-08dbd11d6ce3 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 897YWYWYWfmdXuSGPPFPrLlFg8OgSDhKRvvPzdHRklSzOPmbngJvYGI2B2dH9ESTh66WDaVbg7HSi4PTvMLPHP6r/AVHhUjJSlv+tPkM0WUobVDxUdExOhy3/TDj6yUG9Rg3g0BBC93GnQbIxzfsHo/3gUpt4kRKeOU4LCQYAL4gm/WS5NI1pbiPrawtawkXX4fgSZA15MRDIa+prkcQVW0cvEHhvtNLWP/t4KVuIAHWoXcH1JRxWAlJsIRBzdH9HWFXAD9xti6DgglaLmEV7vK7+oWGidmgbfvfegfBOXfp/nXRJJIac2Q6fvgVHoF3N3YTt6IuH/vsh0x3hvpomeWNj7SPVvAqGFta7wuXCeCfTITWjQUyqEb3RF3k4aZbjS3iY47XAcJBtCllPFeKg40PPL6IXrfCwSkF16ldCuaYRkY1ThVF9EQF6JJgY94yN4etVprYugE639mvi5Pi0PdbvkGt0sG21SlTr6dXGLK+SbXJv6557U92fbNig0TPJ0NWqo+FSuqfP6r6MHFPeRAFBOXv5nr7cEckkfLmKzL373Z84UIiNXZrxmLrZWQXbtVrS1XxJ36rOuACnaeTJhaZfTQQWIFUQTuef147xF1LQpWA4GlL5NWzqmRY7zQG x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR04MB9638.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(396003)(376002)(346002)(366004)(39860400002)(230922051799003)(451199024)(1800799009)(64100799003)(186009)(38070700009)(66446008)(38100700002)(66556008)(33656002)(64756008)(478600001)(66476007)(54906003)(66946007)(6506007)(6916009)(76116006)(71200400001)(2906002)(8936002)(5660300002)(8676002)(52536014)(9686003)(41300700001)(4326008)(86362001)(316002)(7696005)(83380400001)(122000001)(26005)(55016003);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: yQ4oaXk4FSwAwMxmU2fxK3aBDJ0xcLQrilFipKKjqzFnuJoeLDunsSgGD47pwPl2zz1VWwXXAxlyOPsMymoopZpVtMYrbt6clLwv60849sU0KWa/PRuXF5uVtUDIyzJzkgkImoYVJhP6DwbzXLgmgTWkwL6KNcWpSUwlEw9o5chplEU/PXnRYDwEQKyjqp0/vp94fOJjhOk0EbRRLxVe+wLQ3fj2Kb93dz3+m7h4V8NxZgTkXjj7/GEklFypb+UEk//mfpbzUtRzESJk9I2hyMT75GgnFbloe0S7ydZ13tJCPnjiVHM+EWnKMjhbdsOZfSsQX9Rw2W2YIBbkFfMxuZXlU9ylJdYNhQ5GeOvPyUnT/ec/xtmgNXpWSIqigiKLIbu3CZFRaS9moVseIXEIeM9UcgtM2j1CmTwsDU+4M5AJUh3pAvZMfM9HsGcT3wpaUeXlpdeepjmhb0ad23Sdt5ZfpI5uzS9sPsVadSr31QVZTav/JQm3a1Qp7lJf74wKvzO+pal7d03rQvDW0OdmxsEdJdDyUkKcanGDz+9pza7lKmbA4tBEr8hiv9bg2pUJZPi3sUkYheWtzxDllHcA51ryxdZUyPxn5oNVP6RzqHETp/V8kDLlod4yWZue6XJ4mjkg+2oQ99z1s1VsHSUWRWt6t5zq9y9CVoA5DqyC2YL6kBYaXIEqAW1rBaP9iGq75PW2RR7829KaziK9rFcYtCirXbJnhkJNIZjt1zO2jkrI+tfXgCfGCX0LKbshg0+V0zbVdhzzIqZSSWRAhedimjZW4ZO0PdK6N+Km3KYxms6Dqzy8PiJpanXzrpf6wl6+sHDfBDWRqUrcD1eRN5No1L1SXlJyEMmq9mpXKYC/9YkD7oYX3rLy1iUvzz0FhiDjWaxswAWoPalKOGRZFoF4yt6Ew318H1pxpCYRfcifwMCfSKmJF/y9tLg2o4MBX84p0hIyss74aKzAvWVGCSw8YA5L2Z5/zvCYXAMfBf5HhHSe5ZFcO92H6RnVJOd67DoJdHnDTFzzNfvFWMJkCY2wEB8+hsOkcexlZ6Bjwi4IBaUDouc52OmH4BtEjI2K+opg3NByW9yfIPN25EZvSpn/PPU3YYFS56fUYD/BbcfJKBFtK5pEFIIuUWe2smRbNrDQaVXa9BdpilCkK/6BN1eSiPOGtvlPcCkxZC+GEsYHM25Cb8AIsi9WtUJXyiWB5aMQqmgvdVGshB+1CG5lhQLXQtmvqxK93mcz+rxu/Fz8inmMUJbXyrBXHraafLim9+g/2naC6Sd7TbLD0BQxLNy+EEo9QwTVPBEZOv4IOZq3w3+I9CFa7VRVKPF8f5qtcCOvQxTMVsDWgko2bEsb9JuWU7A+B8yIvrYQZVcYpicpAFaKSAkg+e+HvUeDLrKIeCrJNKNG7GxkX1ZWaGcO99flIZv7/3hBLlKY1KALAD/BYtoO6iCEJU1yYrGTxMnkVan0crHtZwATT5KXowfCzrkci1IqF/tIVYztDAhknsq2g0CP3sw1yktC/l5You4g0CxKFfeXGP+XMiWjxvn8zjmeDjoFmAVAm27Uw9O/ArqCbRTC71jhFds7b6aXFRHsyTko MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR04MB9638.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 84d3de13-bbec-4b12-2a01-08dbd11d6ce3 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Oct 2023 03:34:11.3639 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Nk9ParlmJ8D4ny0+O9C/o95ImvuYruCgBHuVwBVterkTTmaD4aF9qWkJAYZTA6H8J6UMtXnhZ+g1wSywl/Ginw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB8236 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This issue is related to resatart/reconfigure AP. When AP is restarted or reconfigured, wpa_supplilcant will use cached PMKSA to do association to AP. Because association failure does not report to cfg80211/wpa_supplicant, wpa_supplicant will always use cached PMKSA to do assocaiton. Connection can't be established under this way. Signed-off-by: David Lin --- .../net/wireless/marvell/mwifiex/cfg80211.c | 25 ++++++++----------- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 18 +++++++++++++ drivers/net/wireless/marvell/mwifiex/init.c | 1 + drivers/net/wireless/marvell/mwifiex/main.c | 6 +++++ drivers/net/wireless/marvell/mwifiex/main.h | 3 +++ 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 3d59e6a441b9..a21310f3807c 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -4395,9 +4395,6 @@ mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, int ret; struct cfg80211_ssid req_ssid; const u8 *ssid_ie; - struct cfg80211_rx_assoc_resp assoc_resp = { - .uapsd_queues = -1, - }; if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) { mwifiex_dbg(adapter, ERROR, @@ -4433,13 +4430,13 @@ mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, req_ssid.ssid_len = ssid_ie[1]; if (req_ssid.ssid_len > IEEE80211_MAX_SSID_LEN) { - mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); + mwifiex_dbg(adapter, ERROR, "invalid SSID - aborting\n"); goto ssid_err; } memcpy(req_ssid.ssid, ssid_ie + 2, req_ssid.ssid_len); if (!req_ssid.ssid_len || req_ssid.ssid[0] < 0x20) { - mwifiex_dbg(priv->adapter, ERROR, "invalid SSID - aborting\n"); + mwifiex_dbg(adapter, ERROR, "invalid SSID - aborting\n"); goto ssid_err; } rcu_read_unlock(); @@ -4466,25 +4463,25 @@ mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, memcpy(priv->cfg_bssid, req->bss->bssid, ETH_ALEN); - mwifiex_dbg(priv->adapter, MSG, + mwifiex_dbg(adapter, MSG, "assoc: send association to %pM\n", req->bss->bssid); - cfg80211_ref_bss(priv->adapter->wiphy, req->bss); + cfg80211_ref_bss(adapter->wiphy, req->bss); ret = mwifiex_bss_start(priv, req->bss, &req_ssid); - if (!ret) { - assoc_resp.links[0].bss = priv->attempted_bss_desc->bss; - assoc_resp.buf = priv->assoc_rsp_buf; - assoc_resp.len = priv->assoc_rsp_size; - cfg80211_rx_assoc_resp(priv->netdev, - &assoc_resp); - } else { + if (ret) { priv->auth_flag = 0; priv->auth_alg = 0xFFFF; eth_zero_addr(priv->cfg_bssid); } + if (priv->assoc_rsp_size) { + priv->req_bss = req->bss; + adapter->assoc_resp_received = true; + queue_work(adapter->workqueue, &adapter->main_work); + } + cfg80211_put_bss(priv->adapter->wiphy, req->bss); return 0; diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index 311af5f40c3e..16777af50097 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -924,6 +924,24 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter) return ret; } +void mwifiex_process_assoc_resp(struct mwifiex_adapter *adapter) +{ + struct cfg80211_rx_assoc_resp assoc_resp = { + .uapsd_queues = -1, + }; + struct mwifiex_private *priv = + mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA); + + if (priv->assoc_rsp_size) { + assoc_resp.links[0].bss = priv->req_bss; + assoc_resp.buf = priv->assoc_rsp_buf; + assoc_resp.len = priv->assoc_rsp_size; + cfg80211_rx_assoc_resp(priv->netdev, + &assoc_resp); + priv->assoc_rsp_size = 0; + } +} + /* * This function handles the timeout of command sending. * diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c index f86a527fd7ca..4326e03a66d3 100644 --- a/drivers/net/wireless/marvell/mwifiex/init.c +++ b/drivers/net/wireless/marvell/mwifiex/init.c @@ -223,6 +223,7 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter) adapter->cmd_resp_received = false; adapter->event_received = false; adapter->data_received = false; + adapter->assoc_resp_received = false; clear_bit(MWIFIEX_SURPRISE_REMOVED, &adapter->work_flags); diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 3bebb6c37604..1dac77946813 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -365,6 +365,12 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) } } + /* Chekc for Assoc Resp */ + if (adapter->assoc_resp_received) { + adapter->assoc_resp_received = false; + mwifiex_process_assoc_resp(adapter); + } + /* Check if we need to confirm Sleep Request received previously */ if (adapter->ps_state == PS_STATE_PRE_SLEEP) diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h index 83449ad84d15..ae4b44ad6c50 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h @@ -615,6 +615,7 @@ struct mwifiex_private { #define MWIFIEX_ASSOC_RSP_BUF_SIZE 500 u8 assoc_rsp_buf[MWIFIEX_ASSOC_RSP_BUF_SIZE]; u32 assoc_rsp_size; + struct cfg80211_bss *req_bss; #define MWIFIEX_GENIE_BUF_SIZE 256 u8 gen_ie_buf[MWIFIEX_GENIE_BUF_SIZE]; @@ -915,6 +916,7 @@ struct mwifiex_adapter { u8 cmd_resp_received; u8 event_received; u8 data_received; + u8 assoc_resp_received; u16 seq_num; struct cmd_ctrl_node *cmd_pool; struct cmd_ctrl_node *curr_cmd; @@ -1104,6 +1106,7 @@ void mwifiex_insert_cmd_to_pending_q(struct mwifiex_adapter *adapter, int mwifiex_exec_next_cmd(struct mwifiex_adapter *adapter); int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter); +void mwifiex_process_assoc_resp(struct mwifiex_adapter *adapter); int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter, struct sk_buff *skb); int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, From patchwork Fri Oct 20 03:34:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lin X-Patchwork-Id: 13430002 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA315CDB47E for ; Fri, 20 Oct 2023 03:34:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376259AbjJTDep (ORCPT ); Thu, 19 Oct 2023 23:34:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42976 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346920AbjJTDek (ORCPT ); Thu, 19 Oct 2023 23:34:40 -0400 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2085.outbound.protection.outlook.com [40.107.21.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 359E2D52; Thu, 19 Oct 2023 20:34:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FFTQZS0nlavBykIIH5il10F9bju1fx2kbfz8lW27EVnocUoC5L8mBS8wcNZXjpqPg4LSH/8Sdzjxn5oT8z5GjvqLJTzi71a8VAKliVVfHl6wbRbYnp1uzrY5/URyiOj/9xpkJAxML3c0k+Ov3z5K9R0G2fJHZh8rbPDbPMM6Ib/jAoScNrgx5312FGCtz9reLdaB1w5wa4DDW6YSJak0xBYqPONJp9v4UBvdc9JZoOUpnNmZmb8CMDDTTINm9CAFWb0QklP4SN9eyMQ9DIsMbTgdzL60CWrYD3Ghx8TewU07H+8B5v+/r2S8o1G7M27eaRdj7kRPRo36Lm/jIU/1bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Reafhm3bZC4UY7sdDkNCyJu/1eC2l1idzHlyhmhgYHQ=; b=HtmnY5PjEUhAGVNBsRmyKPYNLZBB2bcM8lu9ymiwtbPfWL3leNyPNC5zZrcwDcrzVLZGuw6d9EErfIJrJ1s5JPOmQz1IUHHmBTV6AyYRe1PyO1K6boAclmI7rIJAGynedTm6+wfI13CrQnopsdFFEAWJsTFIUpunV2qnFeC1UeEoIM4uIjsxv9PrYyQEgBKkxhWYbIHSERFhOAtZnnrMkNTxaHOG6Q9m0SqqCKyt3JYvQVXBuBFiNaeUFExuNmd+K2Z15zu+VSXUYfAWAtURZoWjisvbEW9JjKPp+HbN6w7j+EjDZVcBrx+vnC+0BVS4TuutgqAdrEeo9NXcrHq7dw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Reafhm3bZC4UY7sdDkNCyJu/1eC2l1idzHlyhmhgYHQ=; b=mu6JMbftE1AF+iApPTjT/zZHtWrD3iirDpJQepfMNdp/+uNQT82aPb2isF9Z58Ropc9XRDxWCz/R52t0oXbrCl7zPTgSnn6AJtmBYuKq29Xci/CHr/wtJp4Vr1F8D4LC9goxo7gKBsFr8RJQdzuB00PYMtzgjDtxuyPc+Ui4EoU= Received: from PA4PR04MB9638.eurprd04.prod.outlook.com (2603:10a6:102:273::20) by DB9PR04MB8236.eurprd04.prod.outlook.com (2603:10a6:10:245::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6886.34; Fri, 20 Oct 2023 03:34:14 +0000 Received: from PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b]) by PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b%7]) with mapi id 15.20.6933.011; Fri, 20 Oct 2023 03:34:14 +0000 From: David Lin To: "linux-wireless@vger.kernel.org" CC: "linux-kernel@vger.kernel.org" , "briannorris@chromium.org" , "kvalo@kernel.org" , "francesco@dolcini.it" , Sharvari Harisangam , David Lin , Pete Hsieh Subject: [PATCH v5 4/6] wifi: mwifiex: fixed missing WMM IE for assoc req. Thread-Topic: [PATCH v5 4/6] wifi: mwifiex: fixed missing WMM IE for assoc req. Thread-Index: AdoDBksI8PsS8zjfR6mgaeybO4vo6Q== Date: Fri, 20 Oct 2023 03:34:14 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR04MB9638:EE_|DB9PR04MB8236:EE_ x-ms-office365-filtering-correlation-id: 36184e6d-431c-436a-92f0-08dbd11d6e8b x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: J2yWZrkGyMZOvTPGuX1I8DbkpVR4RaN8zMJp+nTxjgVK0wsxeVhEyCGHff6sXUGtfzeRiYZ2HQkxOcXp0hFRaIHdfBMA5WwZ21+5Qa94w8RlftfiTBtPTlxTsAbVl32sH7OW5GYfG7YvRExQRsDiUT/ejT0k1Oca7ja1llw/33pD5xgNJnBovKeq3qQEF4Nl+4dNxODyy0p3h2MUFFctrIohcpbi8TNG5kT0ZxVpSL5V4pWCU3RghxYk8II8q837iCEb83Jop9b6oY1w2Plr0EfXjC+Ac+TKO0mpRbWFV9rV84yxYaGXCM1WPw22b/32AyZ42+DzXJBB2r7IvZ9S5Pmp7VShGiipHWX4LpzzaYMyGI2ITa0tqUuzXMr5BpZa2UWiXcdHzFKMJEqtOiuweSWOuaSGg+9IEQM/F7cLVFTcAmGxJbxXGz0t/FnvU8ehX46lHrfcwXVtVHLIyIzztXcdG8AtW8Ic8mz5tL8yCoC+KSlSreKSgsNKxo0dvM3/vVRQlG9D6bLgkzq26jI0flbEPq0pETfY385sRCD/bMYl059Vmjj+a5rd7WO4B/Z6QkaddO1aJm2VJ9xWGOPQCx/Mkq95sd5z8cFzDw1TvM3cAmQMOwD4hZjzjlCQ/SLs x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR04MB9638.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(396003)(376002)(346002)(366004)(39860400002)(230922051799003)(451199024)(1800799009)(64100799003)(186009)(38070700009)(66446008)(38100700002)(66556008)(33656002)(64756008)(478600001)(66476007)(54906003)(66946007)(6506007)(6916009)(76116006)(71200400001)(2906002)(8936002)(5660300002)(8676002)(52536014)(9686003)(41300700001)(4326008)(86362001)(316002)(7696005)(83380400001)(122000001)(26005)(55016003);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: 4BlFM9HwVI5CghU53X7PcZhSgCZAtc+t8hNkdnymQJKv8cawR4b/MU7g+fgRruxSdHl/1OB2ByVp6l2k9OBpre7dO88Fxf3vX7luy8mCogTXjqK8WNiF+/4N1PrCj1Wr8EsXmPue3TP1WmLMhJWy9iQcq2OQD6IIFgI9qu7oQFpwP4deTG6tAZeVVNpB99uQ4L8ZbsfLeRwl2XHTDMGRHcisC8qaPve7Yb374HvsP4x6qEn4myyNghpUGl7UhVt6g32Xubap+qVek5LM8J6Onmr2QSHXRLulRTsRF8qYYKtH4AJ6FSiLj55y17ez3nVUHmdtpTlFH0flaQAjC7htrNnl8MjE9FawsioPMiIhkqopE8LQHDI1piPY61/UJxjuYnXUwiKju01BVCuFnRrGNlxrxCfbRDHr3uPaZuZ/DEIbmjNOfrtlUyWEixuikCr479bEY5rt7cBpWJNnafO4th5DWoi5Mfh2uNtGscQJWuZU9mK7sXuuoTTE6ZnTn3hcjKnIXu1pDrD3MTybFGxI01wEAtnSlHEXn+VTI9NW5/mEH1rNhhXoCANEjbGWMC0IIetREqlDieaFCRVKYn6B7LiC7z+DCQyjlb+QYK0NtqAG4rloTiVioSXqtoTkIT8vlDx0PD/SfnQkTnk5dKCmxRm5CmJp9YZfjvEpHlwSU4l8SqzqMLECjN3/8zNCvkCBMa7nA8VcCQlhyX8YI5OS1BsQeeXZuNblQma7dFyF4eaV64LsHI/Sfk7DjPTWG1GLWgdfxlPcduCfdbqG1XE7yctHaJq3tkKRTxBdrzrzEuoDzxlxtS+9lUrV42CcKeqJtccf90QXsXp9llW2crkTJeuv3CJHsnKHuPwz0fH0XgiSmzAuUQQW9v06UiUAZGKCTqXIay4LDuoWPNynd81TPgW0nM34E688pN1WfoHLhqj9vqkigtLzPUOgLrS0xYk7FMUuDtwnMtCITXv1ihLQxfq5sA6rRV5UEim1N+04n7ObIeeR0qqK+gd5cnJejEa0GP2M9roh3LyxUnA8qYU85bBkAe0SMGz737L0INJOKobkv5UlFBy2MhiqIvzZ/QC6kfGPaV4zJ6s6A1jQ08SvgNh/cLTu9Ls/rHmONiSPNT0rdXVOSioXyQ5tbD20fUMBuWilgWXFmIsMSmNsgHhgQEKom7eZPij2klcX7ZePF3UKRo/zkRNCtSW2gceTisNQ29r/SMD/jeR6Qpl1nVwBBquBeHeuu17UBd8dpIv9BMsYBhD5h1bL8G6U7V7T82qGslmFeIQcZcudmd9aUJfoAWbnnbHhvHE5crBM2OeKZKLgncpSB0uZJGRA22Uy2drM4fWE0X1MXptQSEEaYcaM0oZ6YToQPxi0UGLz21x5+g3olepCtyt7NrHtc5xbIOAsu1G5a72WDC6QSv/P7Fh2Jh7aZ/uTkdu5KZ2adqJCBxmfFfR/+BNQVotuGmfxpG0eKf0HutDujjWMFV2Vrz6Ni0VVoB3MfQCRbggT15zXZlLvn1kYe4o7+xfPAfpiH0oybrX35DY+bWetZ7sr23yOK6Zg6HbgPY055avgCnVyQYQQqkh9RsEeJNVYOxR3Xyb+ MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR04MB9638.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 36184e6d-431c-436a-92f0-08dbd11d6e8b X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Oct 2023 03:34:14.1566 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: dLXFjxjCC9IzoQocFS+lvF1xIHedDlc18PfAfQIYunlhLAB8PkXeEjSAyeSNJ2jOwwOuFtky8+bkdAnGPPojZw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB8236 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Remain on channel must be removed after authentication is done. Otherwise WMM setting for assoiation request will be removed. Signed-off-by: David Lin --- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index a21310f3807c..b99de9f4ca14 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -4306,6 +4306,8 @@ mwifiex_cfg80211_authenticate(struct wiphy *wiphy, if (!ret) { priv->roc_cfg.cookie = get_random_u32() | 1; priv->roc_cfg.chan = *req->bss->channel; + } else { + return -EFAULT; } } @@ -4418,6 +4420,16 @@ mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, if (priv->auth_flag && !(priv->auth_flag & HOST_MLME_AUTH_DONE)) return -EBUSY; + if (priv->roc_cfg.cookie) { + ret = mwifiex_remain_on_chan_cfg(priv, HostCmd_ACT_GEN_REMOVE, + &priv->roc_cfg.chan, 0); + if (!ret) + memset(&priv->roc_cfg, 0, + sizeof(struct mwifiex_roc_cfg)); + else + return -EFAULT; + } + if (!mwifiex_stop_bg_scan(priv)) cfg80211_sched_scan_stopped_locked(priv->wdev.wiphy, 0); From patchwork Fri Oct 20 03:34:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lin X-Patchwork-Id: 13430003 X-Patchwork-Delegate: kvalo@adurom.com Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F0E7ACDB47E for ; Fri, 20 Oct 2023 03:35:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346972AbjJTDe7 (ORCPT ); Thu, 19 Oct 2023 23:34:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40904 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346943AbjJTDex (ORCPT ); Thu, 19 Oct 2023 23:34:53 -0400 Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2052.outbound.protection.outlook.com [40.107.7.52]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A74510C8; Thu, 19 Oct 2023 20:34:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=S1qDks0oxTIJXILdUuVc8Pi2b808ZZKrqadTNCbj5ZzJSSae9TSZfQCW2v9KuGZLAXztt7YdOaUI66IvMoHppVDJg5XM5DqRtKUTJI4xbwZDBVtRodaYxKJqd2nv4mkjK1/yxI6Gue2GhVzHG/7KB16TM+7l8hgESas0dYu0rzH/reC53yisVrPtglM5nvH8hYztjVbCinFC4rQryrGRIIvZ515iC0dYw5fv8VjZcTAiHcB3ESR9sdF5sSrYYPZUfX1TtaKiVpxs8f28GogX4l3xEgLw7WOixG5S9SKpYsta0pc0o8GIs5544K7lwd6z/do9d0v9reVJOjhtwfEObg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=j1ZVY9e1xs69Vnok9GtX9PAIlEDSqMHn6XF5ACmkOoM=; b=OZbS+D6AbLEL//d6Ehrf5hw4oDHPch7xeK7GoD3geZ+dJ4inxvyxyHCCEvEkp2awaAST0Vw/mNftyNGBFQzFSanZ2NbVCYKb23BsCrZALzlddYYM4oAw2WdbfNB2KDqyl9gru+065B0esvOM3tC3LTbD+QjT8wOengwBz+6H74XBKePTc2Dk3x+IiI9CuohDN7o6b9UAEiwRyuw/UfA21037p7AML1U79dRYiI36vieEuWvm8kLo1f1RRdZ4h7YcQ2oENH4CLizmebXk8QTB7AIAfEMFLKjdlOHeVZbBFppZ6bjufg199xfxkLLu/4yBLQZcSgVnvLl5bPc29eKu4A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j1ZVY9e1xs69Vnok9GtX9PAIlEDSqMHn6XF5ACmkOoM=; b=QtlIQacAO3Oz6rShriaYfH8NMNF4XRfB6dPm/Zgy+pR6sl7jQeuTTBxrjXR+0RHLzMKZJ2mIzJIEcdJ/yi54CxoAIeCd33htlH5U69mdc7F6kWmW8v5yPuL2++PshJLiJTZNe2RKF7sQH/arU8TqRODFbxAzaTYLV52bo8ojqvQ= Received: from PA4PR04MB9638.eurprd04.prod.outlook.com (2603:10a6:102:273::20) by PR3PR04MB7306.eurprd04.prod.outlook.com (2603:10a6:102:81::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6933.11; Fri, 20 Oct 2023 03:34:18 +0000 Received: from PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b]) by PA4PR04MB9638.eurprd04.prod.outlook.com ([fe80::34dd:289e:9e8b:9c9b%7]) with mapi id 15.20.6933.011; Fri, 20 Oct 2023 03:34:17 +0000 From: David Lin To: "linux-wireless@vger.kernel.org" CC: "linux-kernel@vger.kernel.org" , "briannorris@chromium.org" , "kvalo@kernel.org" , "francesco@dolcini.it" , Sharvari Harisangam , David Lin , Pete Hsieh Subject: [PATCH v5 5/6] wifi: mwifiex: supported host mlme for AP mode. Thread-Topic: [PATCH v5 5/6] wifi: mwifiex: supported host mlme for AP mode. Thread-Index: AdoDBkz0gevPPdLTR0CvTnP7UaV03w== Date: Fri, 20 Oct 2023 03:34:17 +0000 Message-ID: Accept-Language: zh-TW, en-US Content-Language: zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PA4PR04MB9638:EE_|PR3PR04MB7306:EE_ x-ms-office365-filtering-correlation-id: 0ec5e178-c15f-47be-1251-08dbd11d70a4 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 0bo8dom66iEHzGWcW1GGfDJj0OscuhFdhR3hN/WzvIz7MKSfVRzLcRyrSsfHbOhOoz3fUSSEJJBpqfykqaB3MS/kKzJlQ9fGuUysXwXiyw9Ok7vddLMtvOV0oVA5h2K4wSmuQSdzzVFRUUXAcgNIM45hakR6VYlYQnqCqfrcfLzKvKbc6igmhnBS7prj7Lxet6YNV5NyHn9TZ06GVqIQuAyMjVlJ8bKUCnr/IdmLmv5ZThON+wGrkxeQIa+Embe+K3psf60Lhp1NHzR/WYh2tvCSyJXQ4dm5IMuRPNPQILrI3O+zYPFtSb79a9rGiK72tZWKHC/dh2TwBBuI87bkPf6/YX3l2dAaCh7drOAmZq//UKKO81hR7CSOgDnB3ZGRdtMLgR3+8avKs5BeU4qdDBsRB+NB8ckaYK455GSDon5EoaZo8CHZorDUDpyAthHmqWe9kLGnw+qZEBGahsaCb4uqcfgWpt62wfE+6bE4/zASuds3gJHMO+tWo2kIBSxU/CUClUTyhwt6/wSOPpSJ7QnO5ONYbpZY0EYea7GL/xTeUDMMxoRXb5eolMjKzX3/64GdhJIskFD9fZpon7kbKzxoD9Aa0pQukgDCcb0IEYw3Qcyd2/tnKnu3vo0DsZlT x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PA4PR04MB9638.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(376002)(396003)(366004)(346002)(136003)(230922051799003)(64100799003)(186009)(451199024)(1800799009)(478600001)(26005)(7696005)(9686003)(83380400001)(6506007)(122000001)(38100700002)(33656002)(66899024)(71200400001)(66446008)(6916009)(66946007)(66556008)(66476007)(54906003)(64756008)(316002)(76116006)(41300700001)(52536014)(86362001)(38070700009)(5660300002)(8936002)(8676002)(4326008)(55016003)(2906002)(30864003)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: 5Q6zILPLTPIeWjr5tor3jGEHSZvgdJeEE2xIiukI2t2v6mq5gf9dSGrBBEHyzZxRBxYN71nAjJAHA9KFtoSyp4YXkkpzTzHXOOMV2NQnp67AzFf1WO9zpPjqis1GJ/A630XwT92YRj39BDJs5w6T/fSVn0Nq4xpuJYTI9Ym3euEU6aumjDINtd4qFtQE5J9wFnyos5t/WQc7BE6k33bbqNq0T4xJ4hVGr6RnR3C4XUadUtpTJSFD4CGdEAbZ53BQI0wmOiTnqFhKVsAMD5aQuaNnBEJJuoJ5ZZxPOXWHsYk49dDHjL3VT0fasmJ9/h8y7LSYejcWfhiLrLDEu+vz1akHC3PmZwj9Xj/UVrVKCH8pF6WLgGHXaVUbH6bRcrZNdA5F5m1Dw2jwcn4RYF1ZkpgCAZ8XbuLDvzTnZNgcCxE2125l/kjm+HKGaWs8fs92iZu6OmaVlIz+3JJbcSFR+K1whneEHrN3C7WdI8tcCrpiRw/dRcyW7MltfCQ7p777UIqArqaOEH+5jESfaCGHWrdVOrboHszSvwRQ8Bvp0BuA4kLiBhZ2qGZyMo8BGNGEYXbvm+IBp5urx3uGLJb0Sjckx40xvV0o59Z/SvtngP5EcYT2d5mnHHE90e2wm8nSuQ9k5zhex9z9sBULzCntBtGjTTCtSzpmrdLn/StvIg1MyX+xw73bMvo/rlE4LfAviRG8dRuJxsVbHKq2AfWbIEOL3hppvrDfwIfZtjlBHgxSyFzIU8o+lHoczrQ/LlFAJlQ4/MzzVnBtGlXAbA8l54jhtrzqffqghESJf19KrQpWebAQ03981mZp+FWwSOTMhh0+v+P8JgQ8/zQ4r+vgqXMNcB6WQsmt6LudRA06sEqj78xsy4OS+erBZdITyj/z5KOkgGzgVh3YhKbV+0cXz2lQ58WYcH9SHQsvLoNXNF4BTRndsYgG+5hqmLXft0XBJtNU7Cyo5g2PjE3FDVKSfAXea8pO4w+RS5eSsudANWqZYQkR70xuKdH5KDPqpFeefwZyfMBFxktJgNysj633qoDb9RWdc9OUUFbrVqKsj02J53YmjkiJ7GTfTG96ES2ssoJf77NrVGjq+zwK4cyUOuNeeJq93zFh0ID9w5G1RRlwaSxdlcqM1+Qvc5vak1VSYNLJp/8wTLbIE+4o3Cymf/zu2D5nmxQdz+xU+tnQ3koOJ2MbPbMKYIf0eF0ZKEuYBl5RHJlUK8JrT/aCEy2nQi8F3BGNFqHbT/jwI4No80//5CvjyyS3xCOhCFXFmRu3Z74vaGpB8r2ZRewWlBqoc1z+OQnjdSewiVDV9cBv4dIav/F/4LlywgbXAHmxRht+/usZRNV10gZzN5YxQZF+UUA9vQ1T5M1KKwo9euxQbQn7q8WFSHii3NesyjyU7aPH7Kz3t415FZb17i5uAX9Mp7+RUBTiuaAAmIZorJUHbyPsSQXn0E7deg3rit+WuHPculVW0P1p5q/YxcI/ekO1b3S9KI5vNqVA0AO4SMCdzmIFkRkjs4vXgTV2PmW6YkA8ANwbmQqb6nkwr2N2aPrzwNthFvRIIlbAfoB7gpkG2X18k2LHpX8fgQyo/dy3FHcz MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PA4PR04MB9638.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0ec5e178-c15f-47be-1251-08dbd11d70a4 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Oct 2023 03:34:17.6535 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ZjbtJztrUvlo/X6TBPgOK+fmXEKETMZEefQVqNsIXdohfWQMQ+Dtmwt4mGj9JTqKGhz/vZ/B7PiuwK1R0EVRNA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR04MB7306 Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Added code to support host mlme for AP mode and let WPA3 work. Signed-off-by: David Lin --- .../net/wireless/marvell/mwifiex/cfg80211.c | 81 +++++++++- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 2 + drivers/net/wireless/marvell/mwifiex/fw.h | 22 ++- drivers/net/wireless/marvell/mwifiex/ioctl.h | 5 + .../wireless/marvell/mwifiex/sta_cmdresp.c | 2 + .../net/wireless/marvell/mwifiex/uap_cmd.c | 148 ++++++++++++++++++ drivers/net/wireless/marvell/mwifiex/util.c | 24 +++ 7 files changed, 276 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index b99de9f4ca14..2968db643ab4 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -246,6 +246,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 + @@ -293,7 +313,8 @@ mwifiex_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy, if (mask != priv->mgmt_frame_mask) { priv->mgmt_frame_mask = mask; - if (priv->host_mlme_reg) + if (priv->host_mlme_reg && + GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_UAP) priv->mgmt_frame_mask |= HOST_MLME_MGMT_MASK; mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, HostCmd_ACT_GEN_SET, 0, @@ -530,6 +551,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) + 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; @@ -1746,10 +1770,14 @@ mwifiex_mgmt_stypes[NUM_NL80211_IFTYPES] = { BIT(IEEE80211_STYPE_PROBE_REQ >> 4), }, [NL80211_IFTYPE_AP] = { - .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_RESP >> 4), - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4), + .tx = 0xffff, + .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), }, [NL80211_IFTYPE_P2P_CLIENT] = { .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | @@ -3974,12 +4002,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 = NULL; + + sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); + + if (sinfo) { + 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 && + (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; @@ -4217,6 +4276,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 && + (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; @@ -4727,14 +4790,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) + 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 16777af50097..c8d94cc6706f 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 8b22cd993a79..7080f8701952 100644 --- a/drivers/net/wireless/marvell/mwifiex/fw.h +++ b/drivers/net/wireless/marvell/mwifiex/fw.h @@ -210,9 +210,9 @@ 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 #define SSN_MASK 0xfff0 @@ -407,6 +407,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 +418,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 +504,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) \ @@ -2312,6 +2317,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; @@ -2390,6 +2409,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 091e7ca79376..80ba79ca74c5 100644 --- a/drivers/net/wireless/marvell/mwifiex/ioctl.h +++ b/drivers/net/wireless/marvell/mwifiex/ioctl.h @@ -157,6 +157,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 eb0b8016d43d..91a8a581e3f5 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; } @@ -783,6 +787,145 @@ 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; + struct mwifiex_ie_types_header *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); + cmd->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) + goto done; + + 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); + cmd->size += sizeof(struct mwifiex_ie_types_sta_flag); + + if (params->ext_capab_len) { + tlv = (struct mwifiex_ie_types_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_EXT_CAPABILITY); + tlv_len = params->ext_capab_len; + tlv->len = cpu_to_le16(tlv_len); + memcpy(tlv + header_len, params->ext_capab, tlv_len); + pos += (header_len + tlv_len); + cmd->size += (header_len + tlv_len); + } + + if (params->link_sta_params.supported_rates_len) { + tlv = (struct mwifiex_ie_types_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_SUPP_RATES); + tlv_len = params->link_sta_params.supported_rates_len; + tlv->len = cpu_to_le16(tlv_len); + memcpy(tlv + header_len, + params->link_sta_params.supported_rates, tlv_len); + pos += (header_len + tlv_len); + cmd->size += (header_len + tlv_len); + } + + if (params->uapsd_queues || params->max_sp) { + tlv = (struct mwifiex_ie_types_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_QOS_CAPA); + tlv_len = sizeof(qos_capa); + tlv->len = cpu_to_le16(tlv_len); + qos_capa = params->uapsd_queues | (params->max_sp << 5); + memcpy(tlv + header_len, &qos_capa, tlv_len); + pos += (header_len + tlv_len); + cmd->size += (header_len + tlv_len); + sta_ptr->is_wmm_enabled = 1; + } + + if (params->link_sta_params.ht_capa) { + tlv = (struct mwifiex_ie_types_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_HT_CAPABILITY); + tlv_len = sizeof(struct ieee80211_ht_cap); + tlv->len = cpu_to_le16(tlv_len); + memcpy(tlv + header_len, params->link_sta_params.ht_capa, + tlv_len); + pos += (header_len + tlv_len); + cmd->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_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_VHT_CAPABILITY); + tlv_len = sizeof(struct ieee80211_vht_cap); + tlv->len = cpu_to_le16(tlv_len); + memcpy(tlv + header_len, params->link_sta_params.vht_capa, + tlv_len); + pos += (header_len + tlv_len); + cmd->size += (header_len + tlv_len); + sta_ptr->is_11ac_enabled = 1; + } + + if (params->link_sta_params.opmode_notif_used) { + tlv = (struct mwifiex_ie_types_header *)pos; + tlv->type = cpu_to_le16(WLAN_EID_OPMODE_NOTIF); + tlv_len = sizeof(u8); + tlv->len = cpu_to_le16(tlv_len); + memcpy(tlv + header_len, params->link_sta_params.opmode_notif, + tlv_len); + pos += (header_len + tlv_len); + cmd->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)); + +done: + cmd->size = cpu_to_le16(cmd->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 @@ -818,6 +961,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 ff1b2f162c30..9e36bb4a8d67 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 && + (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);