Parcourir la source

qcacld-3.0: Set nud_state to PROBE on NUD_FAILED event post roaming

In the issue scenario, roaming is triggered due to NUD_FAILED
event and nud state is set to NONE once roaming is completed.
NUD_FAILED events could be received without any NUD_PROBE
INCOMPLETE events post this roaming and these nud failures
are not honored due to which further roaming due to NUD_FAILURE
won't be triggered.

Fix is to set nud state to PROBE explicity on receiving
NUD_FAILED event post roaming.

Change-Id: Ib34b82f478263eb9664112a25f2d1f8bd858f5dc
CRs-Fixed: 2837825
Yeshwanth Sriram Guntuka il y a 4 ans
Parent
commit
25ad84c408
2 fichiers modifiés avec 17 ajouts et 2 suppressions
  1. 3 1
      core/hdd/src/wlan_hdd_assoc.c
  2. 14 1
      core/hdd/src/wlan_hdd_nud_tracking.c

+ 3 - 1
core/hdd/src/wlan_hdd_assoc.c

@@ -3111,6 +3111,9 @@ hdd_association_completion_handler(struct hdd_adapter *adapter,
 		if (!reqRsnIe)
 			return QDF_STATUS_E_NOMEM;
 
+		if (roam_info->fReassocReq || ft_carrier_on)
+			hdd_nud_indicate_roam(adapter);
+
 		/*
 		 * For reassoc, the station is already registered, all we need
 		 * is to change the state of the STA in TL.
@@ -3405,7 +3408,6 @@ hdd_association_completion_handler(struct hdd_adapter *adapter,
 					      eCSR_BSS_TYPE_INFRASTRUCTURE);
 			}
 
-			hdd_nud_indicate_roam(adapter);
 			/* Start the tx queues */
 			hdd_debug("Enabling queues");
 			hdd_netif_queue_enable(adapter);

+ 14 - 1
core/hdd/src/wlan_hdd_nud_tracking.c

@@ -504,7 +504,20 @@ static void hdd_nud_filter_netevent(struct neighbour *neigh)
 
 	case NUD_FAILED:
 		hdd_debug("NUD_FAILED [0x%x]", neigh->nud_state);
-		hdd_nud_process_failure_event(adapter);
+		/*
+		 * This condition is to handle the scenario where NUD_FAILED
+		 * events are received without any NUD_PROBE/INCOMPLETE event
+		 * post roaming. Nud state is set to NONE as part of roaming.
+		 * NUD_FAILED is not honored when the curr state is any state
+		 * other than NUD_PROBE/INCOMPLETE so post roaming, nud state
+		 * is moved to NUD_PROBE to honor future NUD_FAILED events.
+		 */
+		if (adapter->nud_tracking.curr_state == NUD_NONE) {
+			hdd_nud_capture_stats(adapter, NUD_PROBE);
+			hdd_nud_set_tracking(adapter, NUD_PROBE, true);
+		} else {
+			hdd_nud_process_failure_event(adapter);
+		}
 		break;
 	default:
 		hdd_debug("NUD Event For Other State [0x%x]",