Selaa lähdekoodia

qcacld-3.0: HDD, SAP changes to Disable/Enable NOA

P2P-GO whenever goes offchannel, issues NOA. With this behavior, we
have issue whenever legacy STA connects to P2P-GO as legacy STA
does not understand NOA. To handle this case, changes are done in HDD
and SAP component and the revised behavior will be:
 1. By default no change in NOA.
 2. Whenever first legacy STA connects to GO, SAP informs HDD with
    new parameter station type. HDD will communicate the same to
    p2p protocol component. Once the connected station is authorized
    p2p protocol component will disable NOA (i.e. P2P-GO will start
    issuing Self-CTS whenever it goes off-channel).
 3. Whenever last legacy STA disconnects from GO, p2p protocol
    component enables NOA (i.e. P2P-GO will start issuing NOA whenever
    it goes off-channel).

Change-Id: Iadab47c9a2aeb434371d4c262623d7196f3b1ab4
CRs-Fixed: 2035609
Rachit Kankane 8 vuotta sitten
vanhempi
sitoutus
2487f8f7e9

+ 3 - 0
core/hdd/inc/wlan_hdd_main.h

@@ -713,6 +713,9 @@ typedef struct {
 	 */
 	uint8_t ucSTAId;
 
+	/* type of station i.e. p2p client or infrastructure station */
+	eStationType staType;
+
 	/** MAC address of the station */
 	struct qdf_mac_addr macAddrSTA;
 

+ 4 - 2
core/hdd/src/wlan_hdd_assoc.c

@@ -1276,7 +1276,8 @@ static void hdd_send_association_event(struct net_device *dev,
 
 		ret = hdd_objmgr_add_peer_object(pAdapter->hdd_vdev,
 						 pAdapter->device_mode,
-						 peerMacAddr.bytes);
+						 peerMacAddr.bytes,
+						 false);
 		if (ret)
 			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
 					MAC_ADDR_ARRAY(peerMacAddr.bytes));
@@ -1326,7 +1327,8 @@ static void hdd_send_association_event(struct net_device *dev,
 
 		ret = hdd_objmgr_add_peer_object(pAdapter->hdd_vdev,
 						 QDF_IBSS_MODE,
-						 pCsrRoamInfo->bssid.bytes);
+						 pCsrRoamInfo->bssid.bytes,
+						 false);
 		if (ret)
 			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
 				MAC_ADDR_ARRAY(pCsrRoamInfo->bssid.bytes));

+ 9 - 1
core/hdd/src/wlan_hdd_hostapd.c

@@ -1574,6 +1574,12 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 				pSapEvent->sapevt.
 				sapStationAssocReassocCompleteEvent.
 				chan_info.rate_flags;
+			pHostapdAdapter->aStaInfo[staId].staType =
+				pSapEvent->sapevt.
+				sapStationAssocReassocCompleteEvent.
+				staType;
+			hdd_debug("hdd_hostapd_sap_event_cb, StaID: %d, StaType: %d",
+			      staId, pHostapdAdapter->aStaInfo[staId].staType);
 		}
 
 		if (hdd_ipa_is_enabled(pHddCtx)) {
@@ -1692,7 +1698,9 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 			pHostapdAdapter->hdd_vdev,
 			pHostapdAdapter->device_mode,
 			pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.
-				staMac.bytes);
+			staMac.bytes,
+			(pHostapdAdapter->aStaInfo[staId].staType
+							== eSTA_TYPE_P2P_CLI));
 		if (ret)
 			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
 					MAC_ADDR_ARRAY(pSapEvent->sapevt.

+ 9 - 4
core/hdd/src/wlan_hdd_object_manager.c

@@ -245,7 +245,8 @@ int hdd_objmgr_release_and_destroy_vdev(hdd_adapter_t *adapter)
 
 int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
 			       enum tQDF_ADAPTER_MODE adapter_mode,
-			       uint8_t *mac_addr)
+			       uint8_t *mac_addr,
+			       bool is_p2p_type)
 {
 	enum wlan_peer_type peer_type;
 	struct wlan_objmgr_peer *peer;
@@ -255,7 +256,11 @@ int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
 		peer_type = WLAN_PEER_AP;
 	} else if ((adapter_mode == QDF_SAP_MODE) ||
 		(adapter_mode == QDF_P2P_GO_MODE)) {
-		peer_type = WLAN_PEER_STA;
+		if (is_p2p_type) {
+			peer_type = WLAN_PEER_P2P_CLI;
+		} else {
+			peer_type = WLAN_PEER_STA;
+		}
 	} else if (adapter_mode == QDF_IBSS_MODE) {
 		peer_type = WLAN_PEER_IBSS;
 	} else {
@@ -273,8 +278,8 @@ int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
 	if (!peer)
 		return -ENOMEM;
 
-	hdd_info("Peer object "MAC_ADDRESS_STR" add success!",
-		 MAC_ADDR_ARRAY(mac_addr));
+	hdd_info("Peer object "MAC_ADDRESS_STR" add success! Type: %d",
+		 MAC_ADDR_ARRAY(mac_addr), peer_type);
 
 	return 0;
 }

+ 5 - 3
core/hdd/src/wlan_hdd_object_manager.h

@@ -159,16 +159,18 @@ int hdd_objmgr_release_and_destroy_vdev(hdd_adapter_t *adapter);
  * @vdev: vdev pointer
  * @adapter_mode: adapter mode
  * @mac_addr: Peer mac address
+ * @is_p2p_type: TRUE if peer is p2p type
  *
  * This API creates and adds the peer object to the given @vdev. The peer type
- * (STA, AP or IBSS) is assigned based on adapter mode. For example, if adapter
- * mode is STA, peer is AP.
+ * (STA, AP, P2P or IBSS) is assigned based on adapter mode. For example, if
+ * adapter mode is STA, peer is AP.
  *
  * Return: 0 for success, negative error code for failure
  */
 int hdd_objmgr_add_peer_object(struct wlan_objmgr_vdev *vdev,
 			       enum tQDF_ADAPTER_MODE adapter_mode,
-			       uint8_t *mac_addr);
+			       uint8_t *mac_addr,
+			       bool is_p2p_type);
 
 /**
  * hdd_objmgr_remove_peer_object() - Delete and remove the peer from vdev

+ 2 - 0
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -47,6 +47,7 @@
 #include <cdp_txrx_flow_ctrl_v2.h>
 #include <cdp_txrx_handle.h>
 #include <wlan_hdd_object_manager.h>
+#include "wlan_p2p_ucfg_api.h"
 #ifdef IPA_OFFLOAD
 #include <wlan_hdd_ipa.h>
 #endif
@@ -1067,6 +1068,7 @@ QDF_STATUS hdd_softap_change_sta_state(hdd_adapter_t *pAdapter,
 	if (QDF_STATUS_SUCCESS == qdf_status) {
 		pAdapter->aStaInfo[ucSTAId].tlSTAState =
 			OL_TXRX_PEER_STATE_AUTH;
+		p2p_peer_authorized(pAdapter->hdd_vdev, pDestMacAddress->bytes);
 	}
 
 	EXIT();

+ 10 - 0
core/sap/inc/sap_api.h

@@ -234,6 +234,15 @@ typedef enum {
 	eSAP_WPSPBC_ONE_WPSPBC_PROBE_REQ_IN120S,
 } eWPSPBCOverlap;
 
+/*---------------------------------------------------------------------------
+  SAP Associated station types
+  ---------------------------------------------------------------------------*/
+typedef enum {
+	eSTA_TYPE_NONE    = 0x00000000,  /* No station type */
+	eSTA_TYPE_INFRA   = 0x00000001,  /* legacy station */
+	eSTA_TYPE_P2P_CLI = 0x00000002,  /* p2p client */
+} eStationType;
+
 /*----------------------------------------------------------------------------
  *  Typedefs
  * -------------------------------------------------------------------------*/
@@ -267,6 +276,7 @@ typedef struct sap_StationAssocIndication_s {
 
 typedef struct sap_StationAssocReassocCompleteEvent_s {
 	struct qdf_mac_addr staMac;
+	eStationType staType;
 	uint8_t staId;
 	uint8_t status;
 	uint8_t ies[MAX_ASSOC_IND_IE_LEN];

+ 8 - 0
core/sap/src/sap_fsm.c

@@ -55,6 +55,7 @@
 #include "cds_reg_service.h"
 #include "qdf_util.h"
 #include "wlan_policy_mgr_api.h"
+#include "cfg_api.h"
 #include <wlan_objmgr_pdev_obj.h>
 #include <wlan_objmgr_vdev_obj.h>
 #include <wlan_utility.h>
@@ -2393,6 +2394,13 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
 			qdf_mem_copy(&reassoc_complete->ies[len],
 				     csr_roaminfo->paddIE,
 				     csr_roaminfo->addIELen);
+			if (cfg_get_vendor_ie_ptr_from_oui(mac_ctx,
+			    SIR_MAC_P2P_OUI, SIR_MAC_P2P_OUI_SIZE,
+			    csr_roaminfo->paddIE, csr_roaminfo->addIELen)) {
+				reassoc_complete->staType = eSTA_TYPE_P2P_CLI;
+			} else {
+				reassoc_complete->staType = eSTA_TYPE_INFRA;
+			}
 		}
 
 		/* also fill up the channel info from the csr_roamInfo */