Parcourir la source

qcacld-3.0: Process MLO Reconfig IE in beacon for link removal

Process MLO Reconfig IE in beacon for link removal with common
api mlo_process_ml_reconfig_ie.

Change-Id: Ie1206794944d7979170a78c895b5b1c4ae45597f
CRs-Fixed: 3352907
Liangwei Dong il y a 2 ans
Parent
commit
f725025a1d

+ 22 - 0
core/mac/src/pe/lim/lim_process_beacon_frame.c

@@ -354,6 +354,27 @@ void lim_process_beacon_eht(struct mac_context *mac_ctx,
 		/* handle beacon IE for 802.11be mlo case */
 		lim_process_beacon_mlo(mac_ctx, session, bcn_ptr);
 }
+
+void
+lim_process_ml_reconfig(struct mac_context *mac_ctx,
+			struct pe_session *session,
+			uint8_t *rx_pkt_info)
+{
+	uint8_t *frame;
+	uint16_t frame_len;
+
+	if (!session->vdev)
+		return;
+
+	frame = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
+	frame_len = WMA_GET_RX_PAYLOAD_LEN(rx_pkt_info);
+	if (frame_len < SIR_MAC_B_PR_SSID_OFFSET)
+		return;
+
+	mlo_process_ml_reconfig_ie(session->vdev, NULL,
+				   frame + SIR_MAC_B_PR_SSID_OFFSET,
+				   frame_len - SIR_MAC_B_PR_SSID_OFFSET, NULL);
+}
 #endif
 
 /**
@@ -433,6 +454,7 @@ lim_process_beacon_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_info,
 		status = lim_get_bpcc_from_mlo_ie(bcn_ptr, &bpcc);
 		if (QDF_IS_STATUS_SUCCESS(status))
 			cu_flag = lim_check_cu_happens(session->vdev, bpcc);
+		lim_process_ml_reconfig(mac_ctx, session, rx_pkt_info);
 	}
 
 	lim_process_bcn_prb_rsp_t2lm(mac_ctx, session, bcn_ptr);

+ 23 - 0
core/mac/src/pe/lim/lim_types.h

@@ -488,6 +488,22 @@ void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
 void lim_process_beacon_mlo(struct mac_context *mac_ctx,
 			    struct pe_session *session,
 			    tSchBeaconStruct *bcn_ptr);
+
+/**
+ * lim_process_ml_reconfig() - to process beacon frames with reconfig IE
+ * @mac_ctx: Pointer to Global MAC structure
+ * @session: A pointer to session
+ * @rx_pkt_info: A pointer to RX packet info structure
+ *
+ * This function will process ml reconfig beacon frames. If reconfig ie
+ * is present for link removal, link reconfig timer will start.
+ *
+ * Return: none
+ */
+void
+lim_process_ml_reconfig(struct mac_context *mac_ctx,
+			struct pe_session *session,
+			uint8_t *rx_pkt_info);
 #else
 static inline
 void lim_process_beacon_mlo(struct mac_context *mac_ctx,
@@ -502,6 +518,13 @@ void lim_process_bcn_prb_rsp_t2lm(struct mac_context *mac_ctx,
 				  tpSirProbeRespBeacon bcn_ptr)
 {
 }
+
+static inline void
+lim_process_ml_reconfig(struct mac_context *mac_ctx,
+			struct pe_session *session,
+			uint8_t *rx_pkt_info)
+{
+}
 #endif
 
 void lim_process_beacon_frame(struct mac_context *, uint8_t *, struct pe_session *);

+ 1 - 0
core/mac/src/pe/sch/sch_beacon_process.c

@@ -626,6 +626,7 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx,
 		status = lim_get_bpcc_from_mlo_ie(bcn, &bpcc);
 		if (QDF_IS_STATUS_SUCCESS(status))
 			cu_flag = lim_check_cu_happens(session->vdev, bpcc);
+		lim_process_ml_reconfig(mac_ctx, session, rx_pkt_info);
 	}
 
 	if (!cu_flag)