mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-12 15:49:17 -04:00
Merge "qcacld-3.0: Avoid deleting peer on other vdev in case of duplicate MAC" into wlan-cld3.driver.lnx.2.0
This commit is contained in:
commit
a5d19b15c1
2 changed files with 54 additions and 1 deletions
|
|
@ -2141,6 +2141,43 @@ send_ind_to_sme:
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_peer_present_on_any_sta() - Check if Same MAC is connected with STA, i.e.
|
||||
* duplicate mac detection.
|
||||
* @mac_ctx: Pointer to Global MAC structure
|
||||
* @peer_addr: peer address to check
|
||||
*
|
||||
* This function will return true if a peer STA and AP are using same mac
|
||||
* address.
|
||||
*
|
||||
* @Return: bool
|
||||
*/
|
||||
static bool
|
||||
lim_peer_present_on_any_sta(struct mac_context *mac_ctx, uint8_t *peer_addr)
|
||||
{
|
||||
struct wlan_objmgr_peer *peer;
|
||||
bool sta_peer_present = false;
|
||||
enum QDF_OPMODE mode;
|
||||
uint8_t peer_vdev_id;
|
||||
|
||||
peer = wlan_objmgr_get_peer_by_mac(mac_ctx->psoc, peer_addr,
|
||||
WLAN_LEGACY_MAC_ID);
|
||||
if (!peer)
|
||||
return sta_peer_present;
|
||||
|
||||
peer_vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer));
|
||||
mode = wlan_vdev_mlme_get_opmode(wlan_peer_get_vdev(peer));
|
||||
if (mode == QDF_STA_MODE || mode == QDF_P2P_CLIENT_MODE) {
|
||||
pe_debug("duplicate mac detected!!! Peer " QDF_MAC_ADDR_STR " present on STA vdev %d",
|
||||
QDF_MAC_ADDR_ARRAY(peer_addr), peer_vdev_id);
|
||||
sta_peer_present = true;
|
||||
}
|
||||
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
|
||||
return sta_peer_present;
|
||||
}
|
||||
|
||||
/**
|
||||
* lim_process_assoc_req_frame() - Process RE/ASSOC Request frame.
|
||||
* @mac_ctx: Pointer to Global MAC structure
|
||||
|
|
@ -2218,6 +2255,14 @@ void lim_process_assoc_req_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_in
|
|||
return;
|
||||
}
|
||||
|
||||
if (lim_peer_present_on_any_sta(mac_ctx, hdr->sa))
|
||||
/*
|
||||
* This mean a AP and STA have same mac address and device STA
|
||||
* is already connected to the AP, and STA is now trying to
|
||||
* connect to device SAP. So ignore association.
|
||||
*/
|
||||
return;
|
||||
|
||||
/*
|
||||
* If a STA is already present in DPH and it is initiating a Assoc
|
||||
* re-transmit, do not process it. This can happen when first Assoc Req
|
||||
|
|
|
|||
|
|
@ -1562,6 +1562,7 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *mac_addr,
|
|||
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
|
||||
uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
|
||||
bool peer_unmap_conf_support_enabled;
|
||||
uint8_t peer_vdev_id;
|
||||
|
||||
if (!wma->interfaces[vdev_id].peer_count) {
|
||||
WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
|
||||
|
|
@ -1577,12 +1578,19 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *mac_addr,
|
|||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (!wma_objmgr_peer_exist(wma, peer_addr, NULL)) {
|
||||
if (!wma_objmgr_peer_exist(wma, peer_addr, &peer_vdev_id)) {
|
||||
wma_err("peer doesn't exist peer_addr %pM vdevid %d peer_count %d",
|
||||
peer_addr, vdev_id,
|
||||
wma->interfaces[vdev_id].peer_count);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (peer_vdev_id != vdev_id) {
|
||||
wma_err("peer %pM is on vdev id %d but delete req on vdevid %d peer_count %d",
|
||||
peer_addr, peer_vdev_id, vdev_id,
|
||||
wma->interfaces[vdev_id].peer_count);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
peer_unmap_conf_support_enabled =
|
||||
cdp_cfg_get_peer_unmap_conf_support(soc);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue