Ver Fonte

qcacld-3.0: Introduce link MAC address derive logic

A new logic to derive link address from MLD address to
randomize link MAC address on each connection.

Change-Id: I75ba80da6c9cb97103ed84ef2b9c6d091dd5d90e
CRs-Fixed: 3486110
Vinod Kumar Pirla há 2 anos atrás
pai
commit
d194db7cd2
2 ficheiros alterados com 60 adições e 0 exclusões
  1. 24 0
      core/hdd/inc/wlan_hdd_mlo.h
  2. 36 0
      core/hdd/src/wlan_hdd_mlo.c

+ 24 - 0
core/hdd/inc/wlan_hdd_mlo.h

@@ -219,6 +219,23 @@ ml_link_state_request_policy[QCA_WLAN_VENDOR_ATTR_LINK_STATE_MAX + 1];
 int wlan_hdd_cfg80211_process_ml_link_state(struct wiphy *wiphy,
 					    struct wireless_dev *wdev,
 					    const void *data, int data_len);
+
+/**
+ * hdd_derive_link_address_from_mld() - Function to derive link address from
+ * MLD address which is passed as input argument.
+ * @mld_addr: Input MLD address
+ * @link_addr_list: Start index of array to hold derived MAC addresses
+ * @max_idx: Number of addresses to derive
+ *
+ * The API will generate link addresses from the input MLD address and saves
+ * each link address as an array in @link_addr_list. Caller can request upto
+ * WLAN_MAX_MLD addresses.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS hdd_derive_link_address_from_mld(struct qdf_mac_addr *mld_addr,
+					    struct qdf_mac_addr *link_addr_list,
+					    uint8_t max_idx);
 #else
 static inline
 QDF_STATUS hdd_wlan_unregister_mlo_interfaces(struct hdd_adapter *adapter,
@@ -287,6 +304,13 @@ int wlan_hdd_cfg80211_process_ml_link_state(struct wiphy *wiphy,
 	return -ENOTSUPP;
 }
 
+static inline
+QDF_STATUS hdd_derive_link_address_from_mld(struct qdf_mac_addr *mld_addr,
+					    struct qdf_mac_addr *link_addr_list,
+					    uint8_t max_idx)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
 #define FEATURE_ML_LINK_STATE_COMMANDS
 #endif
 #endif

+ 36 - 0
core/hdd/src/wlan_hdd_mlo.c

@@ -266,6 +266,42 @@ void hdd_mlo_t2lm_unregister_callback(struct wlan_objmgr_vdev *vdev)
 	wlan_unregister_t2lm_link_update_notify_handler(vdev->mlo_dev_ctx, 0);
 }
 
+QDF_STATUS hdd_derive_link_address_from_mld(struct qdf_mac_addr *mld_addr,
+					    struct qdf_mac_addr *link_addr_list,
+					    uint8_t max_idx)
+{
+	uint8_t last_byte, temp_byte, idx;
+	struct qdf_mac_addr new_addr;
+	struct qdf_mac_addr *link_addr;
+
+	if (!mld_addr || !link_addr_list || !max_idx ||
+	    max_idx > WLAN_MAX_MLD || qdf_is_macaddr_zero(mld_addr)) {
+		hdd_err("Invalid values");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	qdf_copy_macaddr(&new_addr, mld_addr);
+	/* Set locally administered bit */
+	new_addr.bytes[0] |= 0x02;
+
+	link_addr = link_addr_list;
+	last_byte = mld_addr->bytes[5];
+	hdd_debug("MLD addr: " QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(mld_addr));
+
+	for (idx = 0; idx < max_idx; idx++) {
+		temp_byte = ((last_byte >> 4 & INTF_MACADDR_MASK) + idx) &
+			     INTF_MACADDR_MASK;
+		new_addr.bytes[5] = last_byte + temp_byte;
+
+		qdf_copy_macaddr(link_addr, &new_addr);
+		link_addr++;
+		hdd_debug("Derived link addr: " QDF_MAC_ADDR_FMT ", idx: %d",
+			  QDF_MAC_ADDR_REF(new_addr.bytes), idx);
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
 int hdd_update_vdev_mac_address(struct hdd_context *hdd_ctx,
 				struct hdd_adapter *adapter,