瀏覽代碼

qcacld-3.0: modify WAPI initial PN value

  Currently Napier FW WAPI TX/RX initial PN logic is fit for WIN
host, modify MCL host to align with WIN so that WAPI can work.

Change-Id: I0b49a25e75d1e9c4856daf8648d6561486005ba9
CRs-Fixed: 2323152
Jinwei Chen 6 年之前
父節點
當前提交
c163f9ed3e
共有 1 個文件被更改,包括 82 次插入30 次删除
  1. 82 30
      core/wma/src/wma_mgmt.c

+ 82 - 30
core/wma/src/wma_mgmt.c

@@ -1742,6 +1742,87 @@ static void wma_read_cfg_wepkey(tp_wma_handle wma_handle,
 	*num_keys = j;
 }
 
+#ifdef FEATURE_WLAN_WAPI
+#define WPI_IV_LEN 16
+#if defined(QCA_WIFI_QCA6290) || defined(QCA_WIFI_QCA6390)
+/**
+ * wma_fill_in_wapi_key_params() - update key parameters about wapi
+ * @key_params: wma key parameters
+ * @params: parameters pointer to be set
+ * @mode: operation mode
+ *
+ * Return: None
+ */
+static inline void wma_fill_in_wapi_key_params(
+		struct wma_set_key_params *key_params,
+		struct set_key_params *params, uint8_t mode)
+{
+	/*
+	 * Since MCL shares same FW with WIN for Napier/Hasting, FW WAPI logic
+	 * is fit for WIN, change it to align with WIN.
+	 */
+	unsigned char iv_init_ap[16] = { 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+					 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+					 0x5c, 0x36, 0x5c, 0x37};
+	unsigned char iv_init_sta[16] = { 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+					  0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+					  0x5c, 0x36, 0x5c, 0x36};
+
+	if (mode == wlan_op_mode_ap) {
+		qdf_mem_copy(params->rx_iv, iv_init_sta,
+			     WPI_IV_LEN);
+		qdf_mem_copy(params->tx_iv, iv_init_ap,
+			     WPI_IV_LEN);
+	} else {
+		qdf_mem_copy(params->rx_iv, iv_init_ap,
+			     WPI_IV_LEN);
+		qdf_mem_copy(params->tx_iv, iv_init_sta,
+			     WPI_IV_LEN);
+	}
+
+	params->key_txmic_len = WMA_TXMIC_LEN;
+	params->key_rxmic_len = WMA_RXMIC_LEN;
+
+	params->key_cipher = WMI_CIPHER_WAPI;
+}
+#else
+static inline void wma_fill_in_wapi_key_params(
+		struct wma_set_key_params *key_params,
+		struct set_key_params *params, uint8_t mode)
+{
+	/*initialize receive and transmit IV with default values */
+	/* **Note: tx_iv must be sent in reverse** */
+	unsigned char tx_iv[16] = { 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,
+				    0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,
+				    0x36, 0x5c, 0x36, 0x5c};
+	unsigned char rx_iv[16] = { 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+				    0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
+				    0x5c, 0x36, 0x5c, 0x37};
+	if (mode == wlan_op_mode_ap) {
+		/* Authenticator initializes the value of PN as
+		 * 0x5C365C365C365C365C365C365C365C36 for MCastkeyUpdate
+		 */
+		if (key_params->unicast)
+			tx_iv[0] = 0x37;
+
+		rx_iv[WPI_IV_LEN - 1] = 0x36;
+	} else {
+		if (!key_params->unicast)
+			rx_iv[WPI_IV_LEN - 1] = 0x36;
+	}
+
+	params->key_txmic_len = WMA_TXMIC_LEN;
+	params->key_rxmic_len = WMA_RXMIC_LEN;
+
+	qdf_mem_copy(params->rx_iv, &rx_iv,
+		     WPI_IV_LEN);
+	qdf_mem_copy(params->tx_iv, &tx_iv,
+		     WPI_IV_LEN);
+	params->key_cipher = WMI_CIPHER_WAPI;
+}
+#endif
+#endif
+
 /**
  * wma_setup_install_key_cmd() - set key parameters
  * @wma_handle: wma handle
@@ -1844,38 +1925,9 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
 		sec_type = cdp_sec_type_tkip;
 		break;
 #ifdef FEATURE_WLAN_WAPI
-#define WPI_IV_LEN 16
 	case eSIR_ED_WPI:
 	{
-		/*initialize receive and transmit IV with default values */
-		/* **Note: tx_iv must be sent in reverse** */
-		unsigned char tx_iv[16] = { 0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,
-					    0x36, 0x5c, 0x36, 0x5c, 0x36, 0x5c,
-					    0x36, 0x5c, 0x36, 0x5c};
-		unsigned char rx_iv[16] = { 0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
-					    0x5c, 0x36, 0x5c, 0x36, 0x5c, 0x36,
-					    0x5c, 0x36, 0x5c, 0x37};
-		if (mode == wlan_op_mode_ap) {
-			/* Authenticator initializes the value of PN as
-			 * 0x5C365C365C365C365C365C365C365C36 for MCastkeyUpdate
-			 */
-			if (key_params->unicast)
-				tx_iv[0] = 0x37;
-
-			rx_iv[WPI_IV_LEN - 1] = 0x36;
-		} else {
-			if (!key_params->unicast)
-				rx_iv[WPI_IV_LEN - 1] = 0x36;
-		}
-
-		params.key_txmic_len = WMA_TXMIC_LEN;
-		params.key_rxmic_len = WMA_RXMIC_LEN;
-
-		qdf_mem_copy(&params.rx_iv, &rx_iv,
-			     WPI_IV_LEN);
-		qdf_mem_copy(&params.tx_iv, &tx_iv,
-			     WPI_IV_LEN);
-		params.key_cipher = WMI_CIPHER_WAPI;
+		wma_fill_in_wapi_key_params(key_params, &params, mode);
 		break;
 	}
 #endif /* FEATURE_WLAN_WAPI */