summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c42
-rw-r--r--core/sap/inc/sap_api.h7
-rw-r--r--core/sap/src/sap_api_link_cntl.c5
-rw-r--r--core/sap/src/sap_fsm.c9
-rw-r--r--core/sap/src/sap_module.c10
5 files changed, 66 insertions, 7 deletions
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index 3c24ba78c1f1..ecc03837ee14 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -1063,6 +1063,40 @@ static QDF_STATUS hdd_handle_acs_scan_event(tpSap_Event sap_event,
}
#endif
+/**
+ * hdd_update_scan_result() - Update the scan result to CFG80211
+ * @sap_event: SAP event
+ * @adapter: adapter for SAP
+ *
+ * The function is to update the scan result to CFG80211
+ *
+ * Return: QDF_STATUS_SUCCESS on success,
+ * other value on failure
+ */
+static QDF_STATUS hdd_update_scan_result(tpSap_Event sap_event,
+ hdd_adapter_t *adapter)
+{
+ struct cfg80211_bss *bss_status;
+
+ if (NULL != sap_event->sapevt.bss_desc) {
+ bss_status = wlan_hdd_cfg80211_inform_bss_frame(
+ adapter,
+ sap_event->sapevt.bss_desc);
+ if (NULL == bss_status) {
+ hdd_info("UPDATE_SCAN_RESULT returned NULL");
+ return QDF_STATUS_E_FAILURE;
+ } else {
+ cfg80211_put_bss(
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)) || defined(WITH_BACKPORTS)
+ (WLAN_HDD_GET_CTX(adapter))->wiphy,
+#endif
+ bss_status);
+ }
+ }
+
+ return QDF_STATUS_SUCCESS;
+}
+
QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
void *usrDataForCallback)
{
@@ -2060,7 +2094,9 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
return QDF_STATUS_E_FAILURE;
else
return QDF_STATUS_SUCCESS;
-
+ case eSAP_UPDATE_SCAN_RESULT:
+ return hdd_update_scan_result(pSapEvent,
+ pHostapdAdapter);
default:
hdd_debug("SAP message is not handled");
goto stopbss;
@@ -5827,9 +5863,9 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter, bool reinit)
return QDF_STATUS_E_FAULT;
}
- status = wlansap_start(sapContext, mode,
+ status = wlansap_start(sapContext, hdd_hostapd_sap_event_cb, mode,
pAdapter->macAddressCurrent.bytes,
- &session_id);
+ &session_id, pAdapter->dev);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("wlansap_start failed!!");
wlansap_close(sapContext);
diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h
index c6b0ae4b0404..43ab6ff32bc4 100644
--- a/core/sap/inc/sap_api.h
+++ b/core/sap/inc/sap_api.h
@@ -182,6 +182,7 @@ typedef enum {
eSAP_ACS_SCAN_SUCCESS_EVENT,
eSAP_ACS_CHANNEL_SELECTED,
eSAP_ECSA_CHANGE_CHAN_IND,
+ eSAP_UPDATE_SCAN_RESULT,
} eSapHddEvent;
typedef enum {
@@ -465,6 +466,7 @@ typedef struct sap_Event_s {
struct sap_roc_ready_ind_s sap_roc_ind;
struct sap_ch_change_ind sap_chan_cng_ind;
struct sap_acs_scan_complete_event sap_acs_scan_comp;
+ tSirBssDescription *bss_desc;
} sapevt;
} tSap_Event, *tpSap_Event;
@@ -867,12 +869,13 @@ QDF_STATUS wlansap_get_wps_state(void *p_cds_gctx, bool *pbWPSState);
void *wlansap_open(void *p_cds_gctx);
QDF_STATUS wlansap_global_init(void);
QDF_STATUS wlansap_global_deinit(void);
-QDF_STATUS wlansap_start(void *p_cds_gctx, enum tQDF_ADAPTER_MODE mode,
- uint8_t *addr, uint32_t *session_id);
QDF_STATUS wlansap_stop(void *p_cds_gctx);
QDF_STATUS wlansap_close(void *p_cds_gctx);
typedef QDF_STATUS (*tpWLAN_SAPEventCB)(tpSap_Event pSapEvent,
void *pUsrContext);
+QDF_STATUS wlansap_start(void *p_cds_gctx, tpWLAN_SAPEventCB pSapEventCallback,
+ enum tQDF_ADAPTER_MODE mode, uint8_t *addr,
+ uint32_t *session_id, void *pUsrContext);
uint8_t wlansap_get_state(void *p_cds_gctx);
QDF_STATUS wlansap_start_bss(void *p_cds_gctx,
diff --git a/core/sap/src/sap_api_link_cntl.c b/core/sap/src/sap_api_link_cntl.c
index a4306bb50c32..16a134d5bcd2 100644
--- a/core/sap/src/sap_api_link_cntl.c
+++ b/core/sap/src/sap_api_link_cntl.c
@@ -1025,6 +1025,11 @@ wlansap_roam_callback(void *ctx, tCsrRoamInfo *csr_roam_info, uint32_t roamId,
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
FL("Received set channel Indication"));
break;
+ case eCSR_ROAM_UPDATE_SCAN_RESULT:
+ sap_signal_hdd_event(sap_ctx, csr_roam_info,
+ eSAP_UPDATE_SCAN_RESULT,
+ (void *) eSAP_STATUS_SUCCESS);
+ break;
default:
break;
}
diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c
index 85a370dff8f6..74d2b30900af 100644
--- a/core/sap/src/sap_fsm.c
+++ b/core/sap/src/sap_fsm.c
@@ -3136,6 +3136,15 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
sap_ap_event.sapevt.sap_chan_cng_ind.new_chan =
csr_roaminfo->target_channel;
break;
+ case eSAP_UPDATE_SCAN_RESULT:
+ if (!csr_roaminfo) {
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
+ FL("Invalid CSR Roam Info"));
+ return QDF_STATUS_E_INVAL;
+ }
+ sap_ap_event.sapHddEventCode = eSAP_UPDATE_SCAN_RESULT;
+ sap_ap_event.sapevt.bss_desc = csr_roaminfo->pBssDesc;
+ break;
default:
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
FL("SAP Unknown callback event = %d"),
diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c
index e640e747f2f9..44349c12e905 100644
--- a/core/sap/src/sap_module.c
+++ b/core/sap/src/sap_module.c
@@ -297,9 +297,11 @@ void *wlansap_open(void *p_cds_gctx)
* control block can be extracted from its context
* When MBSSID feature is enabled, SAP context is directly
* passed to SAP APIs
+ * @pSapEventCallback: Callback function to register
* @mode: Device mode
* @addr: MAC address of the SAP
* @session_id: Pointer to the session id
+ * @pUsrContext: user context to be used in callback @pSapEventCallback
*
* Called as part of the overall start procedure (cds_enable). SAP will
* use this call to register with TL as the SAP entity for SAP RSN frames.
@@ -309,8 +311,9 @@ void *wlansap_open(void *p_cds_gctx)
* access would cause a page fault.
* QDF_STATUS_SUCCESS: Success
*/
-QDF_STATUS wlansap_start(void *pCtx, enum tQDF_ADAPTER_MODE mode,
- uint8_t *addr, uint32_t *session_id)
+QDF_STATUS wlansap_start(void *pCtx, tpWLAN_SAPEventCB pSapEventCallback,
+ enum tQDF_ADAPTER_MODE mode, uint8_t *addr,
+ uint32_t *session_id, void *pUsrContext)
{
ptSapContext pSapCtx = NULL;
QDF_STATUS qdf_ret_status;
@@ -357,6 +360,9 @@ QDF_STATUS wlansap_start(void *pCtx, enum tQDF_ADAPTER_MODE mode,
/* Now configure the auth type in the roaming profile. To open. */
pSapCtx->csr_roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM; /* open is the default */
+ pSapCtx->pfnSapEventCallback = pSapEventCallback;
+ pSapCtx->pUsrContext = pUsrContext;
+
if (!QDF_IS_STATUS_SUCCESS(qdf_mutex_create(&pSapCtx->SapGlobalLock))) {
QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
"wlansap_start failed init lock");