Browse Source

qcacld-3.0: Allow RX filter configuration for vdev mac address

For PASN authentication, the mgmt frame TX happens before
vdev is started. Firmware configures RX filter for the vdev
mac address during vdev start only. So if firmware sends PASN
initiate request with source mac address as vdev mac address,
then the RX filter willnot be configured since vdev mac is same
as source mac, this causes the PASN M2 frame from SAP to be
dropped and No ack is sent.

Configure RX filter for vdev mac address when vdev is not up.

Change-Id: I52c9e50a250be1935d1097d45753fa941ae73bea
CRs-Fixed: 3254628
Pragaspathi Thilagaraj 2 years ago
parent
commit
85754a03ca
1 changed files with 21 additions and 2 deletions
  1. 21 2
      components/p2p/core/src/wlan_p2p_off_chan_tx.c

+ 21 - 2
components/p2p/core/src/wlan_p2p_off_chan_tx.c

@@ -3018,18 +3018,35 @@ void p2p_rand_mac_tx(struct wlan_objmgr_pdev *pdev,
 		     struct tx_action_context *tx_action)
 {
 	struct wlan_objmgr_psoc *soc;
+	struct wlan_objmgr_vdev *vdev;
 	QDF_STATUS status;
+	bool is_vdev_up;
 
 	if (!tx_action || !tx_action->p2p_soc_obj ||
 	    !tx_action->p2p_soc_obj->soc)
 		return;
 	soc = tx_action->p2p_soc_obj->soc;
 
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, tx_action->vdev_id,
+						    WLAN_P2P_ID);
+	if (!vdev) {
+		p2p_err("vdev is null id:%d", tx_action->vdev_id);
+		return;
+	}
+
+	/*
+	 * For PASN authentication frames, fw may request PASN authentication
+	 * with source address same as vdev mac address when vdev is not already
+	 * started. Allow RX_FILTER configuration for vdev mac address also if
+	 * vdev is not started to prevent PASN authentication frame drops.
+	 */
+	is_vdev_up = QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
 	if (!tx_action->no_ack && tx_action->chan_freq &&
 	    tx_action->buf_len > MIN_MAC_HEADER_LEN &&
 	    p2p_is_vdev_support_rand_mac_by_id(soc, tx_action->vdev_id) &&
-	    p2p_is_random_mac(soc, tx_action->vdev_id,
-			      &tx_action->buf[SRC_MAC_ADDR_OFFSET])) {
+	    (p2p_is_random_mac(soc, tx_action->vdev_id,
+			      &tx_action->buf[SRC_MAC_ADDR_OFFSET]) ||
+	     !is_vdev_up)) {
 		status = p2p_request_random_mac(
 			soc, tx_action->vdev_id,
 			&tx_action->buf[SRC_MAC_ADDR_OFFSET],
@@ -3041,6 +3058,8 @@ void p2p_rand_mac_tx(struct wlan_objmgr_pdev *pdev,
 		else
 			tx_action->rand_mac_tx = false;
 	}
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
 }
 
 void