Prechádzať zdrojové kódy

qcacld-3.0: Fix IBSS peer memory leaks

In IBSS while adding the peer the BSSID mac address was used
instead of peer address. Also while deleting peer the MAC was not
properly fetched and thus peers were not added and deleted properly
leading to peer leak.

Fix this by using peer mac while adding the IBSS peer and using
proper MAC while deleting the IBSS peer.

Change-Id: I1315103999ebec6643b3ffd6cf73e164abd5c7fa
CRs-Fixed: 2136752
Abhishek Singh 7 rokov pred
rodič
commit
4472548952
1 zmenil súbory, kde vykonal 34 pridanie a 28 odobranie
  1. 34 28
      core/hdd/src/wlan_hdd_assoc.c

+ 34 - 28
core/hdd/src/wlan_hdd_assoc.c

@@ -1353,22 +1353,8 @@ static void hdd_send_association_event(struct net_device *dev,
 				adapter->session_id);
 		memcpy(wrqu.ap_addr.sa_data, sta_ctx->conn_info.bssId.bytes,
 				ETH_ALEN);
-		hdd_debug("wlan: new IBSS connection to " MAC_ADDRESS_STR,
+		hdd_debug("wlan: new IBSS peer connection to BSSID " MAC_ADDRESS_STR,
 			MAC_ADDR_ARRAY(sta_ctx->conn_info.bssId.bytes));
-
-		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
-						 QDF_IBSS_MODE,
-						 pCsrRoamInfo->bssid.bytes,
-						 false);
-		if (ret)
-			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
-				MAC_ADDR_ARRAY(pCsrRoamInfo->bssid.bytes));
-		ret = hdd_objmgr_set_peer_mlme_state(adapter->hdd_vdev,
-						     WLAN_ASSOC_STATE);
-		if (ret)
-			hdd_err("Peer object %pM fail to set associated state",
-					peerMacAddr.bytes);
-
 	} else {                /* Not Associated */
 		hdd_debug("wlan: disconnected");
 		memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
@@ -1390,13 +1376,12 @@ static void hdd_send_association_event(struct net_device *dev,
 							adapter->session_id,
 							NULL,
 							adapter->device_mode);
-		}
-
-		ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev,
-						    peerMacAddr.bytes);
-		if (ret)
-			hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
+			ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev,
+							    peerMacAddr.bytes);
+			if (ret)
+				hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
 					MAC_ADDR_ARRAY(peerMacAddr.bytes));
+		}
 
 		hdd_lpass_notify_disconnect(adapter);
 		/* Update tdls module about the disconnection event */
@@ -1480,7 +1465,7 @@ QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid)
 	QDF_STATUS qdf_status;
 	struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	int ret = 0;
-	uint8_t *peer_mac = NULL;
+	struct qdf_mac_addr *peer_mac = NULL;
 	struct qdf_mac_addr broadcastMacAddr =
 				QDF_MAC_ADDR_BROADCAST_INITIALIZER;
 	if (eConnectionState_IbssDisconnected ==
@@ -1500,16 +1485,20 @@ QDF_STATUS hdd_roam_deregister_sta(struct hdd_adapter *adapter, uint8_t staid)
 	}
 
 	if (adapter->device_mode == QDF_STA_MODE) {
-		peer_mac = sta_ctx->conn_info.bssId.bytes;
+		peer_mac = &sta_ctx->conn_info.bssId;
 	} else if (adapter->device_mode == QDF_IBSS_MODE) {
 		if (sta_ctx->broadcast_staid == staid)
-			peer_mac = broadcastMacAddr.bytes;
+			peer_mac = &broadcastMacAddr;
 		else
-			peer_mac = sta_ctx->conn_info.
-					peerMacAddress[staid].bytes;
+			peer_mac =
+			  hdd_wlan_get_ibss_mac_addr_from_staid(adapter, staid);
 	}
-
-	ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, peer_mac);
+	if (!peer_mac) {
+		hdd_err("Coudnt find peer MAC for staid %d, delete fails",
+			staid);
+		return QDF_STATUS_E_FAILURE;
+	}
+	ret = hdd_objmgr_remove_peer_object(adapter->hdd_vdev, peer_mac->bytes);
 	if (ret) {
 		hdd_err("Peer obj %pM delete fails", peer_mac);
 		return QDF_STATUS_E_FAILURE;
@@ -3270,6 +3259,7 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter,
 			WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 		struct qdf_mac_addr broadcastMacAddr =
 			QDF_MAC_ADDR_BROADCAST_INITIALIZER;
+		int ret;
 
 		if (NULL == roam_info) {
 			QDF_ASSERT(0);
@@ -3293,10 +3283,18 @@ static void hdd_roam_ibss_indication_handler(struct hdd_adapter *adapter,
 				adapter;
 		else
 			hdd_debug("invalid sta id %d", roam_info->staId);
+
 		hdd_roam_register_sta(adapter, roam_info,
 				      roam_info->staId,
 				      &broadcastMacAddr,
 				      roam_info->pBssDesc);
+		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
+						 QDF_IBSS_MODE,
+						 broadcastMacAddr.bytes,
+						 false);
+		if (ret)
+			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
+				MAC_ADDR_ARRAY(roam_info->peerMac.bytes));
 
 		if (roam_info->pBssDesc) {
 			struct cfg80211_bss *bss;
@@ -3591,6 +3589,7 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter,
 {
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	QDF_STATUS qdf_status;
+	int ret;
 
 	switch (roamResult) {
 	case eCSR_ROAM_RESULT_IBSS_NEW_PEER:
@@ -3633,6 +3632,13 @@ roam_roam_connect_status_update_handler(struct hdd_adapter *adapter,
 			hdd_err("Cannot register STA with TL for IBSS. qdf_status: %d [%08X]",
 				qdf_status, qdf_status);
 		}
+		ret = hdd_objmgr_add_peer_object(adapter->hdd_vdev,
+						 QDF_IBSS_MODE,
+						 roam_info->peerMac.bytes,
+						 false);
+		if (ret)
+			hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
+				MAC_ADDR_ARRAY(roam_info->peerMac.bytes));
 		sta_ctx->ibss_sta_generation++;
 		stainfo = qdf_mem_malloc(sizeof(*stainfo));
 		if (stainfo == NULL) {