Просмотр исходного кода

qcacld-3.0: Set EXTERNAL_AUTH flag for SAE auth frame

hostapd handles SAE authentication frames sent by a station.
Set the flag RXMGMT_FLAG_EXTERNAL_AUTH and forward them
to hostapd.

Change-Id: Ic1d6a560430307b899700f98d90a7dacfe741071
CRs-Fixed: 2396360
Srinivas Dasari 6 лет назад
Родитель
Сommit
ea1c133d3f

+ 4 - 3
core/hdd/inc/wlan_hdd_p2p.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -61,8 +61,9 @@ int hdd_set_p2p_opps(struct net_device *dev, uint8_t *command);
 int hdd_set_p2p_noa(struct net_device *dev, uint8_t *command);
 
 void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
-			     uint32_t nFrameLength, uint8_t *pbFrames,
-			     uint8_t frameType, uint32_t rxChan, int8_t rxRssi);
+			       uint32_t frm_len, uint8_t *pb_frames,
+			       uint8_t frame_type, uint32_t rx_chan,
+			       int8_t rx_rssi, enum rxmgmt_flags rx_flags);
 
 int wlan_hdd_check_remain_on_channel(struct hdd_adapter *adapter);
 void wlan_hdd_cancel_existing_remain_on_channel(struct hdd_adapter *adapter);

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

@@ -9046,7 +9046,8 @@ void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind)
 						frame_ind->frameBuf,
 						frame_ind->frameType,
 						frame_ind->rxChan,
-						frame_ind->rxRssi);
+						frame_ind->rxRssi,
+						frame_ind->rx_flags);
 			}
 		}
 		adapter = NULL;
@@ -9062,7 +9063,8 @@ void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind)
 						frame_ind->frameBuf,
 						frame_ind->frameType,
 						frame_ind->rxChan,
-						frame_ind->rxRssi);
+						frame_ind->rxRssi,
+						frame_ind->rx_flags);
 }
 
 void hdd_acs_response_timeout_handler(void *context)

+ 62 - 15
core/hdd/src/wlan_hdd_p2p.c

@@ -930,19 +930,62 @@ hdd_is_qos_action_frame(uint8_t *pb_frames, uint32_t frame_len)
 		 WLAN_HDD_QOS_MAP_CONFIGURE));
 }
 
+#if defined(WLAN_FEATURE_SAE) && defined(CFG80211_EXTERNAL_AUTH_AP_SUPPORT)
+/**
+ * wlan_hdd_set_rxmgmt_external_auth_flag() - Set the EXTERNAL_AUTH flag
+ * @nl80211_flag: flags to be sent to nl80211 from enum nl80211_rxmgmt_flags
+ *
+ * Set the flag NL80211_RXMGMT_FLAG_EXTERNAL_AUTH if supported.
+ */
+static void
+wlan_hdd_set_rxmgmt_external_auth_flag(enum nl80211_rxmgmt_flags *nl80211_flag)
+{
+		*nl80211_flag |= NL80211_RXMGMT_FLAG_EXTERNAL_AUTH;
+}
+#else
+static void
+wlan_hdd_set_rxmgmt_external_auth_flag(enum nl80211_rxmgmt_flags *nl80211_flag)
+{
+}
+#endif
+
+/**
+ * wlan_hdd_cfg80211_convert_rxmgmt_flags() - Convert RXMGMT value
+ * @nl80211_flag: Flags to be sent to nl80211 from enum nl80211_rxmgmt_flags
+ * @flag: flags set by driver(SME/PE) from enum rxmgmt_flags
+ *
+ * Convert driver internal RXMGMT flag value to nl80211 defined RXMGMT flag
+ * Return: 0 on success, -EINVAL on invalid value
+ */
+static int
+wlan_hdd_cfg80211_convert_rxmgmt_flags(enum rxmgmt_flags flag,
+				       enum nl80211_rxmgmt_flags *nl80211_flag)
+{
+	int ret = -EINVAL;
+
+	if (flag & RXMGMT_FLAG_EXTERNAL_AUTH) {
+		wlan_hdd_set_rxmgmt_external_auth_flag(nl80211_flag);
+		ret = 0;
+	}
+
+	return ret;
+}
+
 void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
-			     uint32_t frm_len,
-			     uint8_t *pb_frames,
-			     uint8_t frameType, uint32_t rxChan, int8_t rxRssi)
+			       uint32_t frm_len,
+			       uint8_t *pb_frames,
+			       uint8_t frame_type, uint32_t rx_chan,
+			       int8_t rx_rssi, enum rxmgmt_flags rx_flags)
 {
 	uint16_t freq;
 	uint8_t type = 0;
-	uint8_t subType = 0;
+	uint8_t sub_type = 0;
 	struct hdd_context *hdd_ctx;
 	uint8_t *dest_addr;
+	enum nl80211_rxmgmt_flags nl80211_flag = 0;
 
 	hdd_debug("Frame Type = %d Frame Length = %d",
-		frameType, frm_len);
+		  frame_type, frm_len);
 
 	if (NULL == adapter) {
 		hdd_err("adapter is NULL");
@@ -961,11 +1004,11 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
 	}
 
 	type = WLAN_HDD_GET_TYPE_FRM_FC(pb_frames[0]);
-	subType = WLAN_HDD_GET_SUBTYPE_FRM_FC(pb_frames[0]);
+	sub_type = WLAN_HDD_GET_SUBTYPE_FRM_FC(pb_frames[0]);
 
 	/* Get adapter from Destination mac address of the frame */
 	if ((type == SIR_MAC_MGMT_FRAME) &&
-	    (subType != SIR_MAC_MGMT_PROBE_REQ) &&
+	    (sub_type != SIR_MAC_MGMT_PROBE_REQ) &&
 	    !qdf_is_macaddr_broadcast(
 	     (struct qdf_mac_addr *)&pb_frames[WLAN_HDD_80211_FRM_DA_OFFSET])) {
 		dest_addr = &pb_frames[WLAN_HDD_80211_FRM_DA_OFFSET];
@@ -982,7 +1025,7 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
 			hdd_err("adapter for action frame is NULL Macaddr = "
 				MAC_ADDRESS_STR, MAC_ADDR_ARRAY(dest_addr));
 			hdd_debug("Frame Type = %d Frame Length = %d subType = %d",
-				  frameType, frm_len, subType);
+				  frame_type, frm_len, sub_type);
 			/*
 			 * We will receive broadcast management frames
 			 * in OCB mode
@@ -1013,11 +1056,11 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
 
 	/* Channel indicated may be wrong. TODO */
 	/* Indicate an action frame. */
-	if (rxChan <= MAX_NO_OF_2_4_CHANNELS)
-		freq = ieee80211_channel_to_frequency(rxChan,
+	if (rx_chan <= MAX_NO_OF_2_4_CHANNELS)
+		freq = ieee80211_channel_to_frequency(rx_chan,
 						      NL80211_BAND_2GHZ);
 	else
-		freq = ieee80211_channel_to_frequency(rxChan,
+		freq = ieee80211_channel_to_frequency(rx_chan,
 						      NL80211_BAND_5GHZ);
 
 	if (hdd_is_qos_action_frame(pb_frames, frm_len))
@@ -1029,18 +1072,22 @@ void __hdd_indicate_mgmt_frame(struct hdd_adapter *adapter,
 	hdd_debug("Indicate Frame over NL80211 sessionid : %d, idx :%d",
 		   adapter->vdev_id, adapter->dev->ifindex);
 
+	if (wlan_hdd_cfg80211_convert_rxmgmt_flags(rx_flags, &nl80211_flag))
+		hdd_debug("Failed to convert RXMGMT flags :0x%x to nl80211 format",
+			  rx_flags);
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
 	cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr,
-		 freq, rxRssi * 100, pb_frames,
-			 frm_len, NL80211_RXMGMT_FLAG_ANSWERED);
+		 freq, rx_rssi * 100, pb_frames,
+			 frm_len, NL80211_RXMGMT_FLAG_ANSWERED | nl80211_flag);
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0))
 	cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr,
-			freq, rxRssi * 100, pb_frames,
+			freq, rx_rssi * 100, pb_frames,
 			 frm_len, NL80211_RXMGMT_FLAG_ANSWERED,
 			 GFP_ATOMIC);
 #else
 	cfg80211_rx_mgmt(adapter->dev->ieee80211_ptr, freq,
-			rxRssi * 100,
+			rx_rssi * 100,
 			pb_frames, frm_len, GFP_ATOMIC);
 #endif /* LINUX_VERSION_CODE */
 }

+ 12 - 0
core/mac/inc/sir_api.h

@@ -2017,12 +2017,24 @@ struct keep_alive_req {
 	uint8_t sessionId;
 };
 
+/**
+ * enum rxmgmt_flags - flags for received management frame.
+ * @RXMGMT_FLAG_NONE: Default value to indicate no flags are set.
+ * @RXMGMT_FLAG_EXTERNAL_AUTH: frame can be used for external authentication
+ *			       by upper layers.
+ */
+enum rxmgmt_flags {
+	RXMGMT_FLAG_NONE,
+	RXMGMT_FLAG_EXTERNAL_AUTH = 1 << 1,
+};
+
 typedef struct sSirSmeMgmtFrameInd {
 	uint16_t frame_len;
 	uint32_t rxChan;
 	uint8_t sessionId;
 	uint8_t frameType;
 	int8_t rxRssi;
+	enum rxmgmt_flags rx_flags;
 	uint8_t frameBuf[1];    /* variable */
 } tSirSmeMgmtFrameInd, *tpSirSmeMgmtFrameInd;
 

+ 18 - 14
core/mac/src/pe/lim/lim_process_action_frame.c

@@ -1055,10 +1055,11 @@ static void __lim_process_qos_map_configure_frame(struct mac_context *mac_ctx,
 		return;
 	}
 	lim_send_sme_mgmt_frame_ind(mac_ctx, mac_hdr->fc.subType,
-			(uint8_t *) mac_hdr,
-			frame_len + sizeof(tSirMacMgmtHdr), 0,
-			WMA_GET_RX_CH(rx_pkt_info), session,
-			WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info));
+				    (uint8_t *)mac_hdr,
+				    frame_len + sizeof(tSirMacMgmtHdr), 0,
+				    WMA_GET_RX_CH(rx_pkt_info), session,
+				    WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info),
+				    RXMGMT_FLAG_NONE);
 }
 
 #ifdef ANI_SUPPORT_11H
@@ -1274,9 +1275,10 @@ __lim_process_radio_measure_request(struct mac_context *mac, uint8_t *pRxPacketI
 	/* Save seq no of currently processing rrm report req frame */
 	mac->rrm.rrmPEContext.prev_rrm_report_seq_num = curr_seq_num;
 	lim_send_sme_mgmt_frame_ind(mac, pHdr->fc.subType, (uint8_t *)pHdr,
-		frameLen + sizeof(tSirMacMgmtHdr), 0,
-		WMA_GET_RX_CH(pRxPacketInfo), pe_session,
-		WMA_GET_RX_RSSI_NORMALIZED(pRxPacketInfo));
+				    frameLen + sizeof(tSirMacMgmtHdr), 0,
+				    WMA_GET_RX_CH(pRxPacketInfo), pe_session,
+				    WMA_GET_RX_RSSI_NORMALIZED(pRxPacketInfo),
+				    RXMGMT_FLAG_NONE);
 
 	frm = qdf_mem_malloc(sizeof(*frm));
 	if (!frm)
@@ -1507,7 +1509,7 @@ static void __lim_process_sa_query_response_action_frame(struct mac_context *mac
 					    WMA_GET_RX_CH(pRxPacketInfo),
 					    pe_session,
 					    WMA_GET_RX_RSSI_NORMALIZED(
-					    pRxPacketInfo));
+					    pRxPacketInfo), RXMGMT_FLAG_NONE);
 		return;
 	}
 
@@ -1927,7 +1929,7 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 					frame_len + sizeof(tSirMacMgmtHdr),
 					session->smeSessionId,
 					WMA_GET_RX_CH(rx_pkt_info),
-					session, rssi);
+					session, rssi, RXMGMT_FLAG_NONE);
 			break;
 		default:
 			pe_debug("Action ID: %d not handled in WNM category",
@@ -2017,7 +2019,7 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 					WMA_GET_RX_CH(rx_pkt_info),
 					session,
 					WMA_GET_RX_RSSI_NORMALIZED(
-					rx_pkt_info));
+					rx_pkt_info), RXMGMT_FLAG_NONE);
 		} else {
 			pe_debug("Dropping the vendor specific action frame"
 					"beacause of (WES Mode not enabled "
@@ -2076,7 +2078,7 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 					session->smeSessionId,
 					WMA_GET_RX_CH(rx_pkt_info), session,
 					WMA_GET_RX_RSSI_NORMALIZED(
-					rx_pkt_info));
+					rx_pkt_info), RXMGMT_FLAG_NONE);
 			break;
 		default:
 			pe_warn("Unhandled public action frame: %x",
@@ -2141,7 +2143,7 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 					    WMA_GET_RX_CH(rx_pkt_info),
 					    session,
 					    WMA_GET_RX_RSSI_NORMALIZED(
-					    rx_pkt_info));
+					    rx_pkt_info), RXMGMT_FLAG_NONE);
 		break;
 	}
 	case SIR_MAC_ACTION_PROT_DUAL_PUB:
@@ -2158,7 +2160,8 @@ void lim_process_action_frame(struct mac_context *mac_ctx,
 				mac_hdr->fc.subType, (uint8_t *) mac_hdr,
 				frame_len + sizeof(tSirMacMgmtHdr),
 				session->smeSessionId,
-				WMA_GET_RX_CH(rx_pkt_info), session, rssi);
+				WMA_GET_RX_CH(rx_pkt_info), session, rssi,
+				RXMGMT_FLAG_NONE);
 			break;
 		default:
 			pe_warn("Unhandled - Protected Dual Public Action");
@@ -2262,7 +2265,8 @@ void lim_process_action_frame_no_session(struct mac_context *mac, uint8_t *pBd)
 					(uint8_t *) mac_hdr,
 					frame_len + sizeof(tSirMacMgmtHdr), 0,
 					WMA_GET_RX_CH(pBd), NULL,
-					WMA_GET_RX_RSSI_NORMALIZED(pBd));
+					WMA_GET_RX_RSSI_NORMALIZED(pBd),
+					RXMGMT_FLAG_NONE);
 			break;
 		default:
 			pe_warn("Unhandled public action frame: %x",

+ 9 - 4
core/mac/src/pe/lim/lim_process_auth_frame.c

@@ -291,6 +291,7 @@ static void lim_process_sae_auth_frame(struct mac_context *mac_ctx,
 	tpSirMacMgmtHdr mac_hdr;
 	uint32_t frame_len;
 	uint8_t *body_ptr;
+	enum rxmgmt_flags rx_flags = RXMGMT_FLAG_NONE;
 
 	mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
 	body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -299,15 +300,19 @@ static void lim_process_sae_auth_frame(struct mac_context *mac_ctx,
 	pe_debug("Received SAE Auth frame type %d subtype %d",
 		mac_hdr->fc.type, mac_hdr->fc.subType);
 
-	if (pe_session->limMlmState != eLIM_MLM_WT_SAE_AUTH_STATE)
-		pe_err("received SAE auth response in unexpected state %x",
-				pe_session->limMlmState);
+	if (LIM_IS_STA_ROLE(pe_session) &&
+	    pe_session->limMlmState != eLIM_MLM_WT_SAE_AUTH_STATE)
+		pe_err("SAE auth response for STA in unexpected state %x",
+		       pe_session->limMlmState);
+
+	if (LIM_IS_AP_ROLE(pe_session))
+		rx_flags = RXMGMT_FLAG_EXTERNAL_AUTH;
 
 	lim_send_sme_mgmt_frame_ind(mac_ctx, mac_hdr->fc.subType,
 			(uint8_t *) mac_hdr,
 			frame_len + sizeof(tSirMacMgmtHdr), 0,
 			WMA_GET_RX_CH(rx_pkt_info), pe_session,
-			WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info));
+			WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info), rx_flags);
 }
 #else
 static inline void  lim_process_sae_auth_frame(struct mac_context *mac_ctx,

+ 2 - 1
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1042,7 +1042,8 @@ lim_check_mgmt_registered_frames(struct mac_context *mac_ctx, uint8_t *buff_desc
 			WMA_GET_RX_PAYLOAD_LEN(buff_desc) +
 			sizeof(tSirMacMgmtHdr), mgmt_frame->sessionId,
 			WMA_GET_RX_CH(buff_desc), session_entry,
-			WMA_GET_RX_RSSI_NORMALIZED(buff_desc));
+			WMA_GET_RX_RSSI_NORMALIZED(buff_desc),
+			RXMGMT_FLAG_NONE);
 
 		if ((type == SIR_MAC_MGMT_FRAME)
 		    && (fc.type == SIR_MAC_MGMT_FRAME)

+ 2 - 1
core/mac/src/pe/lim/lim_process_probe_req_frame.c

@@ -454,7 +454,8 @@ lim_indicate_probe_req_to_hdd(struct mac_context *mac, uint8_t *pBd,
 				    (frameLen + sizeof(tSirMacMgmtHdr)),
 				    pe_session->smeSessionId, WMA_GET_RX_CH(pBd),
 				    pe_session,
-				    WMA_GET_RX_RSSI_NORMALIZED(pBd));
+				    WMA_GET_RX_RSSI_NORMALIZED(pBd),
+				    RXMGMT_FLAG_NONE);
 } /*** end lim_indicate_probe_req_to_hdd() ***/
 
 /**

+ 3 - 1
core/mac/src/pe/lim/lim_utils.c

@@ -7809,7 +7809,8 @@ enum rateid lim_get_min_session_txrate(struct pe_session *session)
 void lim_send_sme_mgmt_frame_ind(struct mac_context *mac_ctx, uint8_t frame_type,
 				 uint8_t *frame, uint32_t frame_len,
 				 uint16_t session_id, uint32_t rx_channel,
-				 struct pe_session *psession_entry, int8_t rx_rssi)
+				 struct pe_session *psession_entry,
+				 int8_t rx_rssi, enum rxmgmt_flags rx_flags)
 {
 	tpSirSmeMgmtFrameInd sme_mgmt_frame = NULL;
 	uint16_t length;
@@ -7832,6 +7833,7 @@ void lim_send_sme_mgmt_frame_ind(struct mac_context *mac_ctx, uint8_t frame_type
 	sme_mgmt_frame->frameType = frame_type;
 	sme_mgmt_frame->rxRssi = rx_rssi;
 	sme_mgmt_frame->rxChan = rx_channel;
+	sme_mgmt_frame->rx_flags = rx_flags;
 
 	qdf_mem_zero(sme_mgmt_frame->frameBuf, frame_len);
 	qdf_mem_copy(sme_mgmt_frame->frameBuf, frame, frame_len);

+ 11 - 9
core/mac/src/pe/lim/lim_utils.h

@@ -164,14 +164,15 @@ void lim_update_short_slot_time(struct mac_context *mac, tSirMacAddr peerMacAddr
 
 /*
  * lim_send_sme_mgmt_frame_ind() - Function to send mgmt frame ind to HDD
- * @mac_ctx : Pointer to Global MAC structure
- * @frame_type : Type of mgmt frame
- * @frame : Frame pointer
- * @frame_len : Length og mgmt frame
- * @session_id : session id
- * @psession_entry : PE Session Entry
- * @rx_channel : Channel of where packet is received
- * @rx_rssi : rssi value
+ * @mac_ctx: Pointer to Global MAC structure
+ * @frame_type: Type of mgmt frame
+ * @frame: Frame pointer
+ * @frame_len: Length og mgmt frame
+ * @session_id: session id
+ * @psession_entry: PE Session Entry
+ * @rx_channel: Channel of where packet is received
+ * @rx_rssi: rssi value
+ * @rx_flags: RXMGMT flags to be set for the frame. Defined in enum rxmgmt_flags
  *
  * Indicate the Mgmt Frame received to SME to HDD callback
  * handle Probe_req/Action frame currently
@@ -181,7 +182,8 @@ void lim_update_short_slot_time(struct mac_context *mac, tSirMacAddr peerMacAddr
 void lim_send_sme_mgmt_frame_ind(struct mac_context *mac_ctx, uint8_t frame_type,
 				 uint8_t *frame, uint32_t frame_len,
 				 uint16_t session_id, uint32_t rx_channel,
-				 struct pe_session *psession_entry, int8_t rx_rssi);
+				 struct pe_session *psession_entry,
+				 int8_t rx_rssi, enum rxmgmt_flags rx_flags);
 
 /*
  * lim_deactivate_timers() - Function to deactivate lim timers