Sfoglia il codice sorgente

qcacmn: Add support to get MLD mac address from reconfig ML IE

In the driver, add support to get the MLD mac address from a given
reconfig variant Multi-link element.

Change-Id: I8c54f58f05a89cd5624ea5dc34b6630c06777013
CRs-Fixed: 3348125
Deeksha Gupta 2 anni fa
parent
commit
3c3a62b04b
2 ha cambiato i file con 73 aggiunte e 0 eliminazioni
  1. 27 0
      umac/mlo_mgr/inc/utils_mlo.h
  2. 46 0
      umac/mlo_mgr/src/utils_mlo.c

+ 27 - 0
umac/mlo_mgr/inc/utils_mlo.h

@@ -464,6 +464,27 @@ util_get_prvmlie_persta_link_id(uint8_t *mlieseq,
 				qdf_size_t mlieseqlen,
 				struct mlo_probereq_info *probereq_info);
 
+/**
+ * util_get_rvmlie_mldmacaddr() - Get the MLD MAC address from a given Reconfig
+ * variant Multi-Link element.
+ *
+ * @mlieseq: Starting address of the Multi-Link element or Multi-Link element
+ * fragment sequence
+ * @mlieseqlen: Total length of the Multi-Link element or Multi-Link element
+ * fragment sequence
+ * @mldmacaddr: Pointer to the location where the MLD MAC address should be
+ * updated. This should be ignored by the caller if the function returns error.
+ *
+ * Get the MLD MAC address from a given Reconfig variant Multi-Link element
+ * or element fragment sequence.
+ *
+ * Return: QDF_STATUS_SUCCESS in the case of success, QDF_STATUS value giving
+ * the reason for error in the case of failure
+ */
+QDF_STATUS
+util_get_rvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
+			   struct qdf_mac_addr *mldmacaddr);
+
 #else
 static inline QDF_STATUS
 util_gen_link_assoc_req(uint8_t *frame, qdf_size_t frame_len, bool isreassoc,
@@ -574,5 +595,11 @@ util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
 	return QDF_STATUS_E_NOSUPPORT;
 }
 
+static inline QDF_STATUS
+util_get_rvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
+			   struct qdf_mac_addr *mldmacaddr)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
 #endif /* WLAN_FEATURE_11BE_MLO */
 #endif /* _WLAN_UTILS_MLO_H_ */

+ 46 - 0
umac/mlo_mgr/src/utils_mlo.c

@@ -3861,4 +3861,50 @@ util_get_prvmlie_mldid(uint8_t *mlieseq, qdf_size_t mlieseqlen,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS util_get_rvmlie_mldmacaddr(uint8_t *mlieseq, qdf_size_t mlieseqlen,
+				      struct qdf_mac_addr *mldmacaddr)
+{
+	struct wlan_ie_multilink *mlie_fixed;
+	enum wlan_ml_variant variant;
+	uint16_t mlcontrol;
+	uint16_t presencebitmap;
+
+	if (!mlieseq || !mlieseqlen || !mldmacaddr)
+		return QDF_STATUS_E_NULL_VALUE;
+
+	qdf_mem_zero(mldmacaddr, sizeof(*mldmacaddr));
+
+	if (mlieseqlen < sizeof(struct wlan_ie_multilink))
+		return QDF_STATUS_E_INVAL;
+
+	mlie_fixed = (struct wlan_ie_multilink *)mlieseq;
+
+	if (mlie_fixed->elem_id != WLAN_ELEMID_EXTN_ELEM ||
+	    mlie_fixed->elem_id_ext != WLAN_EXTN_ELEMID_MULTI_LINK)
+		return QDF_STATUS_E_INVAL;
+
+	mlcontrol = qdf_le16_to_cpu(mlie_fixed->mlcontrol);
+
+	variant = QDF_GET_BITS(mlcontrol, WLAN_ML_CTRL_TYPE_IDX,
+			       WLAN_ML_CTRL_TYPE_BITS);
+
+	if (variant != WLAN_ML_VARIANT_RECONFIG)
+		return QDF_STATUS_E_INVAL;
+
+	presencebitmap = QDF_GET_BITS(mlcontrol, WLAN_ML_CTRL_PBM_IDX,
+				      WLAN_ML_CTRL_PBM_BITS);
+
+	/* Check if MLD mac address is present */
+	if (presencebitmap & WLAN_ML_RV_CTRL_PBM_MLDMACADDR_P) {
+		if ((sizeof(struct wlan_ie_multilink) + QDF_MAC_ADDR_SIZE) >
+			mlieseqlen)
+			return QDF_STATUS_E_PROTO;
+
+		qdf_mem_copy(mldmacaddr->bytes,
+			     mlieseq + sizeof(struct wlan_ie_multilink),
+			     QDF_MAC_ADDR_SIZE);
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif