qcacld-3.0: check for duplicate session before vdev create
Check for any duplicate peer with the same mac address before the vdev is created. Change-Id: Ie6d71b7b2892ab2ac6e8bfb37c99f20f0854c2f2 CRs-Fixed: 2555932
Este commit está contenido en:

cometido por
nshrivas

padre
a8940a2ddf
commit
add284b880
@@ -4497,6 +4497,13 @@ int hdd_vdev_create(struct hdd_adapter *adapter)
|
|||||||
|
|
||||||
/* do vdev create via objmgr */
|
/* do vdev create via objmgr */
|
||||||
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||||
|
status = sme_check_for_duplicate_session(hdd_ctx->mac_handle,
|
||||||
|
adapter->mac_addr.bytes);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
hdd_err("Duplicate session is existing with same mac address");
|
||||||
|
errno = qdf_status_to_os_return(status);
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
errno = hdd_objmgr_create_and_store_vdev(hdd_ctx->pdev, adapter);
|
errno = hdd_objmgr_create_and_store_vdev(hdd_ctx->pdev, adapter);
|
||||||
if (errno) {
|
if (errno) {
|
||||||
hdd_err("failed to create objmgr vdev: %d", errno);
|
hdd_err("failed to create objmgr vdev: %d", errno);
|
||||||
|
@@ -3941,4 +3941,16 @@ uint16_t sme_get_full_roam_scan_period_global(mac_handle_t mac_handle);
|
|||||||
QDF_STATUS sme_get_full_roam_scan_period(mac_handle_t mac_handle,
|
QDF_STATUS sme_get_full_roam_scan_period(mac_handle_t mac_handle,
|
||||||
uint8_t vdev_id,
|
uint8_t vdev_id,
|
||||||
uint32_t *full_roam_scan_period);
|
uint32_t *full_roam_scan_period);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sme_check_for_duplicate_session() - check for duplicate session
|
||||||
|
* @mac_handle: Opaque handle to the MAC context
|
||||||
|
* @peer_addr: Peer device mac address
|
||||||
|
*
|
||||||
|
* Check for duplicate mac address is available on other vdev.
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
|
||||||
|
uint8_t *peer_addr);
|
||||||
#endif /* #if !defined( __SME_API_H ) */
|
#endif /* #if !defined( __SME_API_H ) */
|
||||||
|
@@ -4504,10 +4504,7 @@ QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
|
|||||||
{
|
{
|
||||||
QDF_STATUS status = QDF_STATUS_E_INVAL;
|
QDF_STATUS status = QDF_STATUS_E_INVAL;
|
||||||
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
|
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
|
||||||
struct cdp_pdev *pdev;
|
uint8_t vdev_id;
|
||||||
ol_txrx_peer_handle peer;
|
|
||||||
u8 peer_id, vdev_id;
|
|
||||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
|
||||||
u8 *mac_addr;
|
u8 *mac_addr;
|
||||||
|
|
||||||
vdev_id = wlan_vdev_get_id(params->vdev);
|
vdev_id = wlan_vdev_get_id(params->vdev);
|
||||||
@@ -4515,28 +4512,13 @@ QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
|
|||||||
|
|
||||||
sme_debug("vdev_id %d addr:%pM", vdev_id, mac_addr);
|
sme_debug("vdev_id %d addr:%pM", vdev_id, mac_addr);
|
||||||
|
|
||||||
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
|
||||||
|
|
||||||
if (!pdev) {
|
|
||||||
sme_err("Failed to get pdev handler");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = sme_acquire_global_lock(&mac_ctx->sme);
|
status = sme_acquire_global_lock(&mac_ctx->sme);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
peer = cdp_peer_find_by_addr(soc, pdev,
|
status = csr_create_vdev(mac_ctx, params->vdev, params);
|
||||||
mac_addr,
|
if (QDF_IS_STATUS_SUCCESS(status))
|
||||||
&peer_id);
|
status = mlme_vdev_self_peer_create(params->vdev);
|
||||||
if (peer) {
|
|
||||||
sme_err("Peer=%d exist with same MAC", peer_id);
|
|
||||||
status = QDF_STATUS_E_INVAL;
|
|
||||||
} else {
|
|
||||||
status = csr_create_vdev(mac_ctx, params->vdev, params);
|
|
||||||
if (QDF_IS_STATUS_SUCCESS(status))
|
|
||||||
status = mlme_vdev_self_peer_create(params->vdev);
|
|
||||||
}
|
|
||||||
sme_release_global_lock(&mac_ctx->sme);
|
sme_release_global_lock(&mac_ctx->sme);
|
||||||
|
|
||||||
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
|
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
|
||||||
@@ -16188,3 +16170,41 @@ sme_get_full_roam_scan_period(mac_handle_t mac_handle, uint8_t vdev_id,
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
|
||||||
|
uint8_t *peer_addr)
|
||||||
|
{
|
||||||
|
QDF_STATUS status = QDF_STATUS_E_INVAL;
|
||||||
|
struct cdp_pdev *pdev;
|
||||||
|
ol_txrx_peer_handle peer;
|
||||||
|
uint8_t peer_id;
|
||||||
|
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||||
|
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
|
||||||
|
|
||||||
|
if (!soc) {
|
||||||
|
sme_err("Failed to get soc handle");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
||||||
|
if (!pdev) {
|
||||||
|
sme_err("Failed to get pdev handler");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QDF_STATUS_SUCCESS != sme_acquire_global_lock(&mac_ctx->sme))
|
||||||
|
return status;
|
||||||
|
|
||||||
|
peer = cdp_peer_find_by_addr(soc, pdev,
|
||||||
|
peer_addr,
|
||||||
|
&peer_id);
|
||||||
|
if (peer) {
|
||||||
|
sme_err("Peer=%d exist with same MAC", peer_id);
|
||||||
|
status = QDF_STATUS_E_EXISTS;
|
||||||
|
} else {
|
||||||
|
status = QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
sme_release_global_lock(&mac_ctx->sme);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
Referencia en una nueva incidencia
Block a user