summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelvaraj, Sridhar <sselvara@codeaurora.org>2017-03-10 14:38:56 +0530
committerSandeep Puligilla <spuligil@codeaurora.org>2017-03-10 14:30:13 -0800
commitb6bbaebba05781c5c42e2afa954232638822c14f (patch)
treee48ae7dea0a1c4ad9e63b332b3256c2937dbf756
parent3ce4e1ddf8d7649f11b5484c3d32ce58a92ec33e (diff)
qcacld-3.0: Send scan results to userspace from SAP interface
Scan results are not forwarded to userspace if the first active interface is not station. Due to this scan results are not seen in the userspace if SAP or non station interface was created first. Add fix to send the results through SAP interface as well. Change-Id: Ia1ec81d2d8cb1571a8ed707479b2a849e1535c2e CRs-Fixed: 2016994
-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");