소스 검색

qcacmn: Handle snapshot sanity failure

Gracefully handle the scenario of snapshot sanity failure.

Change-Id: Icd6fcd83da8ffcfd41e254dc90a94b08ab264b37
CRs-Fixed: 3593921
Edayilliam Jayadev 1 년 전
부모
커밋
8d3856c308
1개의 변경된 파일91개의 추가작업 그리고 30개의 파일을 삭제
  1. 91 30
      umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

+ 91 - 30
umac/cmn_services/mgmt_txrx/core/src/wlan_mgmt_txrx_rx_reo.c

@@ -130,6 +130,33 @@ mgmt_rx_reo_compare_global_timestamps_gte(uint32_t ts1, uint32_t ts2)
 }
 
 #ifdef WLAN_MGMT_RX_REO_ERROR_HANDLING
+/**
+ * handle_snapshot_sanity_failures() - Handle snapshot sanity failure
+ * @desc: Pointer to frame descriptor
+ * @link: Link ID
+ *
+ * API to handle snapshot sanity failure. Host drops management frames which
+ * results in snapshot sanity failure.
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+handle_snapshot_sanity_failures(struct mgmt_rx_reo_frame_descriptor *desc,
+				uint8_t link)
+{
+	if (!desc) {
+		mgmt_rx_reo_err("Mgmt Rx REO frame descriptor is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_rx_reo_debug_rl("Snapshot sanity check for link %u failed", link);
+
+	desc->drop = true;
+	desc->drop_reason = MGMT_RX_REO_SNAPSHOT_SANITY_FAILURE;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * handle_out_of_order_pkt_ctr() - Handle management frames with out of order
  * packet counter values
@@ -257,6 +284,33 @@ check_and_handle_invalid_reo_params(struct mgmt_rx_reo_frame_descriptor *desc)
 	return QDF_STATUS_SUCCESS;
 }
 #else
+/**
+ * handle_snapshot_sanity_failures() - Handle snapshot sanity failure
+ * @desc: Pointer to frame descriptor
+ * @link: Link ID
+ *
+ * API to handle snapshot sanity failure. Host drops management frames which
+ * results in snapshot sanity failure.
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+handle_snapshot_sanity_failures(struct mgmt_rx_reo_frame_descriptor *desc,
+				uint8_t link)
+{
+	if (!desc) {
+		mgmt_rx_reo_err("Mgmt Rx REO frame descriptor is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	mgmt_rx_reo_err_rl("Snapshot sanity check for link %u failed", link);
+
+	desc->drop = true;
+	desc->drop_reason = MGMT_RX_REO_SNAPSHOT_SANITY_FAILURE;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * handle_out_of_order_pkt_ctr() - Handle management frames with out of order
  * packet counter values
@@ -1106,7 +1160,7 @@ mgmt_rx_reo_snapshots_check_sanity
 	if (!mac_hw_ss->valid) {
 		if (fw_forwarded_ss->valid || fw_consumed_ss->valid ||
 		    host_ss->valid) {
-			mgmt_rx_reo_err("MAC HW SS is invalid");
+			mgmt_rx_reo_warn_rl("MAC HW SS is invalid");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1116,7 +1170,7 @@ mgmt_rx_reo_snapshots_check_sanity
 
 	if (!fw_forwarded_ss->valid && !fw_consumed_ss->valid) {
 		if (host_ss->valid) {
-			mgmt_rx_reo_err("FW forwarded and consumed SS invalid");
+			mgmt_rx_reo_warn_rl("FW fwd and consumed SS invalid");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1128,7 +1182,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_global_timestamps_gte
 					(mac_hw_ss->global_timestamp,
 					 fw_forwarded_ss->global_timestamp)) {
-			mgmt_rx_reo_err("TS: MAC HW SS < FW forwarded SS");
+			mgmt_rx_reo_warn_rl("TS: MAC HW SS < FW forwarded SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1136,7 +1190,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_pkt_ctrs_gte
 					(mac_hw_ss->mgmt_pkt_ctr,
 					 fw_forwarded_ss->mgmt_pkt_ctr)) {
-			mgmt_rx_reo_err("PKT CTR: MAC HW SS < FW forwarded SS");
+			mgmt_rx_reo_warn_rl("CTR: MAC HW SS < FW forwarded SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1146,7 +1200,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_global_timestamps_gte
 					(mac_hw_ss->global_timestamp,
 					 fw_consumed_ss->global_timestamp)) {
-			mgmt_rx_reo_err("TS: MAC HW SS < FW consumed SS");
+			mgmt_rx_reo_warn_rl("TS: MAC HW SS < FW consumed SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1154,7 +1208,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_pkt_ctrs_gte
 					(mac_hw_ss->mgmt_pkt_ctr,
 					 fw_consumed_ss->mgmt_pkt_ctr)) {
-			mgmt_rx_reo_err("PKT CTR: MAC HW SS < FW consumed SS");
+			mgmt_rx_reo_warn_rl("CTR: MAC HW SS < FW consumed SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1164,7 +1218,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_global_timestamps_gte
 					(mac_hw_ss->global_timestamp,
 					 host_ss->global_timestamp)) {
-			mgmt_rx_reo_err("TS: MAC HW SS < host SS");
+			mgmt_rx_reo_warn_rl("TS: MAC HW SS < host SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1172,7 +1226,7 @@ mgmt_rx_reo_snapshots_check_sanity
 		if (!mgmt_rx_reo_compare_pkt_ctrs_gte
 					(mac_hw_ss->mgmt_pkt_ctr,
 					 host_ss->mgmt_pkt_ctr)) {
-			mgmt_rx_reo_err("PKT CTR: MAC HW SS < host SS");
+			mgmt_rx_reo_warn_rl("PKT CTR: MAC HW SS < host SS");
 			status = QDF_STATUS_E_INVAL;
 			goto fail;
 		}
@@ -1181,7 +1235,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			if (!mgmt_rx_reo_compare_global_timestamps_gte
 					(fw_forwarded_ss->global_timestamp,
 					 host_ss->global_timestamp)) {
-				mgmt_rx_reo_err("TS: FW forwarded < host SS");
+				mgmt_rx_reo_warn_rl("TS: FW fwd < host SS");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1189,7 +1243,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			if (!mgmt_rx_reo_compare_pkt_ctrs_gte
 					(fw_forwarded_ss->mgmt_pkt_ctr,
 					 host_ss->mgmt_pkt_ctr)) {
-				mgmt_rx_reo_err("CTR: FW forwarded < host SS");
+				mgmt_rx_reo_warn_rl("CTR: FW fwd < host SS");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1199,7 +1253,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			if (!mgmt_rx_reo_compare_global_timestamps_gte
 					(fw_consumed_ss->global_timestamp,
 					 host_ss->global_timestamp)) {
-				mgmt_rx_reo_err("TS: FW consumed < host SS");
+				mgmt_rx_reo_warn_rl("TS: FW consumed < host");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1207,7 +1261,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			if (!mgmt_rx_reo_compare_pkt_ctrs_gte
 					(fw_consumed_ss->mgmt_pkt_ctr,
 					 host_ss->mgmt_pkt_ctr)) {
-				mgmt_rx_reo_err("CTR: FW consumed < host SS");
+				mgmt_rx_reo_warn_rl("CTR: FW consumed < host");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1220,7 +1274,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			    !mgmt_rx_reo_compare_global_timestamps_gte
 					(fw_forwarded_ss->global_timestamp,
 					 host_ss->global_timestamp)) {
-				mgmt_rx_reo_err("TS: FW consumed/forwarded < host");
+				mgmt_rx_reo_warn_rl("TS: FW consumed/fwd<host");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1231,7 +1285,7 @@ mgmt_rx_reo_snapshots_check_sanity
 			    !mgmt_rx_reo_compare_pkt_ctrs_gte
 					(fw_forwarded_ss->mgmt_pkt_ctr,
 					 host_ss->mgmt_pkt_ctr)) {
-				mgmt_rx_reo_err("CTR: FW consumed/forwarded < host");
+				mgmt_rx_reo_warn_rl("CTR:FW consumed/fwd<host");
 				status = QDF_STATUS_E_INVAL;
 				goto fail;
 			}
@@ -1241,20 +1295,20 @@ mgmt_rx_reo_snapshots_check_sanity
 	return QDF_STATUS_SUCCESS;
 
 fail:
-	mgmt_rx_reo_debug("HW SS: valid = %u, ctr = %u, ts = %u",
-			  mac_hw_ss->valid, mac_hw_ss->mgmt_pkt_ctr,
-			  mac_hw_ss->global_timestamp);
-	mgmt_rx_reo_debug("FW forwarded SS: valid = %u, ctr = %u, ts = %u",
-			  fw_forwarded_ss->valid,
-			  fw_forwarded_ss->mgmt_pkt_ctr,
-			  fw_forwarded_ss->global_timestamp);
-	mgmt_rx_reo_debug("FW consumed SS: valid = %u, ctr = %u, ts = %u",
-			  fw_consumed_ss->valid,
-			  fw_consumed_ss->mgmt_pkt_ctr,
-			  fw_consumed_ss->global_timestamp);
-	mgmt_rx_reo_debug("HOST SS: valid = %u, ctr = %u, ts = %u",
-			  host_ss->valid, host_ss->mgmt_pkt_ctr,
-			  host_ss->global_timestamp);
+	mgmt_rx_reo_warn_rl("HW SS: valid = %u, ctr = %u, ts = %u",
+			    mac_hw_ss->valid, mac_hw_ss->mgmt_pkt_ctr,
+			    mac_hw_ss->global_timestamp);
+	mgmt_rx_reo_warn_rl("FW forwarded SS: valid = %u, ctr = %u, ts = %u",
+			    fw_forwarded_ss->valid,
+			    fw_forwarded_ss->mgmt_pkt_ctr,
+			    fw_forwarded_ss->global_timestamp);
+	mgmt_rx_reo_warn_rl("FW consumed SS: valid = %u, ctr = %u, ts = %u",
+			    fw_consumed_ss->valid,
+			    fw_consumed_ss->mgmt_pkt_ctr,
+			    fw_consumed_ss->global_timestamp);
+	mgmt_rx_reo_warn_rl("HOST SS: valid = %u, ctr = %u, ts = %u",
+			    host_ss->valid, host_ss->mgmt_pkt_ctr,
+			    host_ss->global_timestamp);
 
 	return status;
 }
@@ -1447,8 +1501,15 @@ wlan_mgmt_rx_reo_algo_calculate_wait_count(
 		status = mgmt_rx_reo_snapshots_check_sanity
 			(mac_hw_ss, fw_forwarded_ss, fw_consumed_ss, host_ss);
 		if (QDF_IS_STATUS_ERROR(status)) {
-			mgmt_rx_reo_err_rl("Snapshot sanity for link %u failed",
-					   link);
+			QDF_STATUS ret;
+
+			ret = handle_snapshot_sanity_failures(desc, link);
+			if (QDF_IS_STATUS_ERROR(ret)) {
+				mgmt_rx_reo_err_rl("Err:SS sanity fail handle");
+				return ret;
+			}
+			mgmt_rx_reo_warn_rl("Drop frame due to SS sanity fail");
+
 			return status;
 		}