qcacmn: Support roam invoke request in connection manager
Add support for roam invoke request in connection manager. CRs-Fixed: 2869259 Change-Id: I618add058d39e9452530b1950cff57bfe6100448
This commit is contained in:

gecommit door
snandini

bovenliggende
051c1e0d79
commit
d5cc294f49
@@ -494,8 +494,9 @@ int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
if (req->channel)
|
if (req->channel)
|
||||||
connect_req->chan_freq = req->channel->center_freq;
|
connect_req->chan_freq = req->channel->center_freq;
|
||||||
else
|
|
||||||
connect_req->chan_freq = 0;
|
if (req->channel_hint)
|
||||||
|
connect_req->chan_freq_hint = req->channel_hint->center_freq;
|
||||||
|
|
||||||
status = osif_cm_set_crypto_params(connect_req, req);
|
status = osif_cm_set_crypto_params(connect_req, req);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
@@ -1626,7 +1626,7 @@ QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx,
|
|||||||
mlme_debug(CM_PREFIX_FMT,
|
mlme_debug(CM_PREFIX_FMT,
|
||||||
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
|
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
|
||||||
resp->cm_id));
|
resp->cm_id));
|
||||||
cm_remove_cmd(cm_ctx, resp->cm_id);
|
cm_remove_cmd(cm_ctx, &resp->cm_id);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@@ -481,7 +481,7 @@ QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx,
|
|||||||
if (resp->req.cm_id == cm_ctx->active_cm_id)
|
if (resp->req.cm_id == cm_ctx->active_cm_id)
|
||||||
cm_flush_pending_request(cm_ctx, DISCONNECT_REQ_PREFIX, false);
|
cm_flush_pending_request(cm_ctx, DISCONNECT_REQ_PREFIX, false);
|
||||||
|
|
||||||
cm_remove_cmd(cm_ctx, resp->req.cm_id);
|
cm_remove_cmd(cm_ctx, &resp->req.cm_id);
|
||||||
mlme_debug(CM_PREFIX_FMT "disconnect count %d connect count %d",
|
mlme_debug(CM_PREFIX_FMT "disconnect count %d connect count %d",
|
||||||
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
|
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
|
||||||
resp->req.cm_id),
|
resp->req.cm_id),
|
||||||
|
@@ -458,8 +458,7 @@ reassoc_fail:
|
|||||||
wlan_vdev_get_pdev(vdev),
|
wlan_vdev_get_pdev(vdev),
|
||||||
&bss_info, &mlme_info);
|
&bss_info, &mlme_info);
|
||||||
}
|
}
|
||||||
|
cm_remove_cmd(cm_ctx, &resp->cm_id);
|
||||||
cm_remove_cmd(cm_ctx, resp->cm_id);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If roaming fails and conn_sm is in ROAMING state, then
|
* If roaming fails and conn_sm is in ROAMING state, then
|
||||||
|
@@ -679,7 +679,7 @@ void cm_flush_pending_request(struct cnx_mgr *cm_ctx, uint32_t prefix,
|
|||||||
*
|
*
|
||||||
* Return: void
|
* Return: void
|
||||||
*/
|
*/
|
||||||
void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id);
|
void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cm_add_req_to_list_and_indicate_osif() - Add the request to request list in
|
* cm_add_req_to_list_and_indicate_osif() - Add the request to request list in
|
||||||
|
@@ -237,17 +237,23 @@ cm_fill_bss_info_in_roam_rsp_by_cm_id(struct cnx_mgr *cm_ctx,
|
|||||||
struct wlan_cm_roam_resp *resp);
|
struct wlan_cm_roam_resp *resp);
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
|
/**
|
||||||
|
* cm_send_roam_invoke_req() - Send Roam invoke req to FW
|
||||||
|
* @cm_ctx: connection manager context
|
||||||
|
* @req: connection manager request
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
cm_send_roam_invoke_req(struct cnx_mgr *cm_ctx, struct cm_req *req);
|
||||||
/**
|
/**
|
||||||
* cm_roam_offload_enabled() - check if roam offload(LFR3) is enabled
|
* cm_roam_offload_enabled() - check if roam offload(LFR3) is enabled
|
||||||
* @psoc: psoc pointer to get the INI
|
* @psoc: psoc pointer to get the INI
|
||||||
*
|
*
|
||||||
* Return: bool
|
* Return: bool
|
||||||
*/
|
*/
|
||||||
static inline bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc)
|
bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc);
|
||||||
{
|
|
||||||
/* use INI CFG_LFR3_ROAMING_OFFLOAD,return true for now */
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
static inline bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc)
|
static inline bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc)
|
||||||
{
|
{
|
||||||
|
@@ -63,7 +63,10 @@ bool cm_state_roaming_event(void *ctx, uint16_t event,
|
|||||||
break;
|
break;
|
||||||
case WLAN_CM_SM_EV_ROAM_INVOKE:
|
case WLAN_CM_SM_EV_ROAM_INVOKE:
|
||||||
cm_add_roam_req_to_list(cm_ctx, data);
|
cm_add_roam_req_to_list(cm_ctx, data);
|
||||||
/* cm_start_roam_invoke(cm_ctx); define in LFR3/FW roam file */
|
cm_sm_transition_to(cm_ctx, WLAN_CM_SS_ROAM_STARTED);
|
||||||
|
cm_sm_deliver_event_sync(cm_ctx,
|
||||||
|
WLAN_CM_SM_EV_ROAM_INVOKE,
|
||||||
|
data_len, data);
|
||||||
break;
|
break;
|
||||||
case WLAN_CM_SM_EV_ROAM_START:
|
case WLAN_CM_SM_EV_ROAM_START:
|
||||||
cm_add_roam_req_to_list(cm_ctx, data);
|
cm_add_roam_req_to_list(cm_ctx, data);
|
||||||
@@ -253,6 +256,14 @@ bool cm_subst_roam_start_event(void *ctx, uint16_t event,
|
|||||||
cm_handle_connect_disconnect_in_roam(cm_ctx, event,
|
cm_handle_connect_disconnect_in_roam(cm_ctx, event,
|
||||||
data_len, data);
|
data_len, data);
|
||||||
break;
|
break;
|
||||||
|
case WLAN_CM_SM_EV_ROAM_INVOKE:
|
||||||
|
cm_send_roam_invoke_req(cm_ctx, data);
|
||||||
|
break;
|
||||||
|
case WLAN_CM_SM_EV_ROAM_INVOKE_FAIL:
|
||||||
|
cm_sm_transition_to(cm_ctx, WLAN_CM_S_CONNECTED);
|
||||||
|
cm_sm_deliver_event_sync(cm_ctx, WLAN_CM_SM_EV_ROAM_INVOKE_FAIL,
|
||||||
|
data_len, data);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
event_handled = false;
|
event_handled = false;
|
||||||
break;
|
break;
|
||||||
|
@@ -40,14 +40,20 @@ QDF_STATUS cm_check_and_prepare_roam_req(struct cnx_mgr *cm_ctx,
|
|||||||
struct qdf_mac_addr bssid;
|
struct qdf_mac_addr bssid;
|
||||||
struct wlan_ssid ssid;
|
struct wlan_ssid ssid;
|
||||||
struct cm_req *cm_req, *req_ptr;
|
struct cm_req *cm_req, *req_ptr;
|
||||||
|
qdf_freq_t freq = 0;
|
||||||
|
|
||||||
cm_req = qdf_container_of(connect_req, struct cm_req, connect_req);
|
cm_req = qdf_container_of(connect_req, struct cm_req, connect_req);
|
||||||
req = &connect_req->req;
|
req = &connect_req->req;
|
||||||
|
|
||||||
|
if (req->chan_freq)
|
||||||
|
freq = req->chan_freq;
|
||||||
|
else if (req->chan_freq_hint)
|
||||||
|
freq = req->chan_freq_hint;
|
||||||
/*
|
/*
|
||||||
* Reject re-assoc unless freq along with prev bssid and one
|
* Reject re-assoc unless freq along with prev bssid and one
|
||||||
* of bssid or bssid hint is present.
|
* of bssid or bssid hint is present.
|
||||||
*/
|
*/
|
||||||
if (!req->chan_freq || qdf_is_macaddr_zero(&req->prev_bssid) ||
|
if (!freq || qdf_is_macaddr_zero(&req->prev_bssid) ||
|
||||||
(qdf_is_macaddr_zero(&req->bssid) &&
|
(qdf_is_macaddr_zero(&req->bssid) &&
|
||||||
qdf_is_macaddr_zero(&req->bssid_hint)))
|
qdf_is_macaddr_zero(&req->bssid_hint)))
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
@@ -55,8 +61,12 @@ QDF_STATUS cm_check_and_prepare_roam_req(struct cnx_mgr *cm_ctx,
|
|||||||
wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &bssid);
|
wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &bssid);
|
||||||
|
|
||||||
/* Reject re-assoc unless prev_bssid matches the current BSSID. */
|
/* Reject re-assoc unless prev_bssid matches the current BSSID. */
|
||||||
if (!qdf_is_macaddr_equal(&req->prev_bssid, &bssid))
|
if (!qdf_is_macaddr_equal(&req->prev_bssid, &bssid)) {
|
||||||
|
mlme_debug("BSSID didn't matched: bssid: "QDF_MAC_ADDR_FMT " prev bssid: " QDF_MAC_ADDR_FMT,
|
||||||
|
QDF_MAC_ADDR_REF(bssid.bytes),
|
||||||
|
QDF_MAC_ADDR_REF(req->prev_bssid.bytes));
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
status = wlan_vdev_mlme_get_ssid(cm_ctx->vdev, ssid.ssid, &ssid.length);
|
status = wlan_vdev_mlme_get_ssid(cm_ctx->vdev, ssid.ssid, &ssid.length);
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
@@ -66,8 +76,12 @@ QDF_STATUS cm_check_and_prepare_roam_req(struct cnx_mgr *cm_ctx,
|
|||||||
|
|
||||||
/* Reject re-assoc unless ssid matches. */
|
/* Reject re-assoc unless ssid matches. */
|
||||||
if (ssid.length != req->ssid.length ||
|
if (ssid.length != req->ssid.length ||
|
||||||
qdf_mem_cmp(ssid.ssid, req->ssid.ssid, ssid.length))
|
qdf_mem_cmp(ssid.ssid, req->ssid.ssid, ssid.length)) {
|
||||||
|
mlme_debug("SSID didn't matched: self ssid: \"%.*s\", ssid in req: \"%.*s\"",
|
||||||
|
ssid.length, ssid.ssid, req->ssid.length,
|
||||||
|
req->ssid.ssid);
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
/* fill roam_req for roaming and free cm_req */
|
/* fill roam_req for roaming and free cm_req */
|
||||||
*roam_req = qdf_mem_malloc(sizeof(**roam_req));
|
*roam_req = qdf_mem_malloc(sizeof(**roam_req));
|
||||||
@@ -82,7 +96,7 @@ QDF_STATUS cm_check_and_prepare_roam_req(struct cnx_mgr *cm_ctx,
|
|||||||
&req->bssid_hint);
|
&req->bssid_hint);
|
||||||
|
|
||||||
qdf_copy_macaddr(&req_ptr->roam_req.req.prev_bssid, &req->prev_bssid);
|
qdf_copy_macaddr(&req_ptr->roam_req.req.prev_bssid, &req->prev_bssid);
|
||||||
req_ptr->roam_req.req.chan_freq = req->chan_freq;
|
req_ptr->roam_req.req.chan_freq = freq;
|
||||||
req_ptr->roam_req.req.source = CM_ROAMING_HOST;
|
req_ptr->roam_req.req.source = CM_ROAMING_HOST;
|
||||||
|
|
||||||
/* Free the connect req, as reassoc is tried */
|
/* Free the connect req, as reassoc is tried */
|
||||||
|
@@ -304,6 +304,11 @@ static bool cm_state_connected_event(void *ctx, uint16_t event,
|
|||||||
cm_reassoc_complete(cm_ctx, data);
|
cm_reassoc_complete(cm_ctx, data);
|
||||||
event_handled = true;
|
event_handled = true;
|
||||||
break;
|
break;
|
||||||
|
case WLAN_CM_SM_EV_ROAM_INVOKE_FAIL:
|
||||||
|
cm_remove_cmd(cm_ctx, data);
|
||||||
|
event_handled = true;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
event_handled = false;
|
event_handled = false;
|
||||||
break;
|
break;
|
||||||
|
@@ -35,6 +35,7 @@ static uint32_t cm_get_prefix_for_cm_id(enum wlan_cm_source source) {
|
|||||||
return CONNECT_REQ_PREFIX;
|
return CONNECT_REQ_PREFIX;
|
||||||
case CM_ROAMING_HOST:
|
case CM_ROAMING_HOST:
|
||||||
case CM_ROAMING_FW:
|
case CM_ROAMING_FW:
|
||||||
|
case CM_ROAMING_NUD_FAILURE:
|
||||||
return ROAM_REQ_PREFIX;
|
return ROAM_REQ_PREFIX;
|
||||||
default:
|
default:
|
||||||
return DISCONNECT_REQ_PREFIX;
|
return DISCONNECT_REQ_PREFIX;
|
||||||
@@ -747,7 +748,7 @@ cm_delete_req_from_list(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
|
void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
|
||||||
{
|
{
|
||||||
struct wlan_objmgr_psoc *psoc;
|
struct wlan_objmgr_psoc *psoc;
|
||||||
QDF_STATUS status;
|
QDF_STATUS status;
|
||||||
@@ -755,15 +756,15 @@ void cm_remove_cmd(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id)
|
|||||||
psoc = wlan_vdev_get_psoc(cm_ctx->vdev);
|
psoc = wlan_vdev_get_psoc(cm_ctx->vdev);
|
||||||
if (!psoc) {
|
if (!psoc) {
|
||||||
mlme_err(CM_PREFIX_FMT "Failed to find psoc",
|
mlme_err(CM_PREFIX_FMT "Failed to find psoc",
|
||||||
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev), cm_id));
|
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev), *cm_id));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = cm_delete_req_from_list(cm_ctx, cm_id);
|
status = cm_delete_req_from_list(cm_ctx, *cm_id);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cm_remove_cmd_from_serialization(cm_ctx, cm_id);
|
cm_remove_cmd_from_serialization(cm_ctx, *cm_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cm_vdev_scan_cancel(struct wlan_objmgr_pdev *pdev,
|
void cm_vdev_scan_cancel(struct wlan_objmgr_pdev *pdev,
|
||||||
|
@@ -124,6 +124,7 @@ struct wlan_fils_con_info {
|
|||||||
* enum wlan_cm_source - connection manager req source
|
* enum wlan_cm_source - connection manager req source
|
||||||
* @CM_OSIF_CONNECT: Connect req initiated by OSIF or north bound
|
* @CM_OSIF_CONNECT: Connect req initiated by OSIF or north bound
|
||||||
* @CM_ROAMING_HOST: Roaming request initiated by host
|
* @CM_ROAMING_HOST: Roaming request initiated by host
|
||||||
|
* @CM_ROAMING_NUD_FAILURE: Roaming request initiated by NUD failure
|
||||||
* @CM_ROAMING_FW: Roam req initiated by FW
|
* @CM_ROAMING_FW: Roam req initiated by FW
|
||||||
* @CM_OSIF_DISCONNECT: Disconnect req initiated by OSIF or north bound
|
* @CM_OSIF_DISCONNECT: Disconnect req initiated by OSIF or north bound
|
||||||
* @CM_PEER_DISCONNECT: Disconnect req initiated by peer sending deauth/disassoc
|
* @CM_PEER_DISCONNECT: Disconnect req initiated by peer sending deauth/disassoc
|
||||||
@@ -143,6 +144,7 @@ struct wlan_fils_con_info {
|
|||||||
enum wlan_cm_source {
|
enum wlan_cm_source {
|
||||||
CM_OSIF_CONNECT,
|
CM_OSIF_CONNECT,
|
||||||
CM_ROAMING_HOST,
|
CM_ROAMING_HOST,
|
||||||
|
CM_ROAMING_NUD_FAILURE,
|
||||||
CM_ROAMING_FW,
|
CM_ROAMING_FW,
|
||||||
CM_OSIF_DISCONNECT,
|
CM_OSIF_DISCONNECT,
|
||||||
CM_PEER_DISCONNECT,
|
CM_PEER_DISCONNECT,
|
||||||
@@ -165,6 +167,7 @@ enum wlan_cm_source {
|
|||||||
* @ssid: profile SSID
|
* @ssid: profile SSID
|
||||||
* @bssid_hint: bssid hint to connect
|
* @bssid_hint: bssid hint to connect
|
||||||
* @chan_freq: channel of the AP
|
* @chan_freq: channel of the AP
|
||||||
|
* @chan_freq_hint: channel hint
|
||||||
* @crypto: crypto related info
|
* @crypto: crypto related info
|
||||||
* @assoc_ie:Additional assoc IE to be appended in assoc req
|
* @assoc_ie:Additional assoc IE to be appended in assoc req
|
||||||
* (Include RSN/WPA/WAPI/WPS ies)
|
* (Include RSN/WPA/WAPI/WPS ies)
|
||||||
@@ -194,7 +197,8 @@ struct wlan_cm_connect_req {
|
|||||||
struct qdf_mac_addr prev_bssid;
|
struct qdf_mac_addr prev_bssid;
|
||||||
struct wlan_ssid ssid;
|
struct wlan_ssid ssid;
|
||||||
struct qdf_mac_addr bssid_hint;
|
struct qdf_mac_addr bssid_hint;
|
||||||
uint32_t chan_freq;
|
qdf_freq_t chan_freq;
|
||||||
|
qdf_freq_t chan_freq_hint;
|
||||||
struct wlan_cm_connect_crypto_info crypto;
|
struct wlan_cm_connect_crypto_info crypto;
|
||||||
struct element_info assoc_ie;
|
struct element_info assoc_ie;
|
||||||
struct element_info scan_ie;
|
struct element_info scan_ie;
|
||||||
@@ -257,6 +261,7 @@ struct wlan_cm_vdev_connect_req {
|
|||||||
* @bssid: bssid given
|
* @bssid: bssid given
|
||||||
* @prev_bssid: prev AP bssid, given in case supplican want to roam to new BSSID
|
* @prev_bssid: prev AP bssid, given in case supplican want to roam to new BSSID
|
||||||
* @chan_freq: channel of the AP
|
* @chan_freq: channel of the AP
|
||||||
|
* @forced_roaming: Roaming to be done without giving bssid, and channel.
|
||||||
*/
|
*/
|
||||||
struct wlan_cm_roam_req {
|
struct wlan_cm_roam_req {
|
||||||
uint8_t vdev_id;
|
uint8_t vdev_id;
|
||||||
@@ -264,6 +269,7 @@ struct wlan_cm_roam_req {
|
|||||||
struct qdf_mac_addr bssid;
|
struct qdf_mac_addr bssid;
|
||||||
struct qdf_mac_addr prev_bssid;
|
struct qdf_mac_addr prev_bssid;
|
||||||
uint32_t chan_freq;
|
uint32_t chan_freq;
|
||||||
|
bool forced_roaming;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -749,8 +749,7 @@ QDF_STATUS (*send_process_roam_synch_complete_cmd)(wmi_unified_t wmi_handle,
|
|||||||
uint8_t vdev_id);
|
uint8_t vdev_id);
|
||||||
|
|
||||||
QDF_STATUS (*send_roam_invoke_cmd)(wmi_unified_t wmi_handle,
|
QDF_STATUS (*send_roam_invoke_cmd)(wmi_unified_t wmi_handle,
|
||||||
struct wmi_roam_invoke_cmd *roaminvoke,
|
struct roam_invoke_req *roaminvoke);
|
||||||
uint32_t ch_hz);
|
|
||||||
|
|
||||||
QDF_STATUS (*send_set_roam_trigger_cmd)(wmi_unified_t wmi_handle,
|
QDF_STATUS (*send_set_roam_trigger_cmd)(wmi_unified_t wmi_handle,
|
||||||
struct wlan_roam_triggers *triggers);
|
struct wlan_roam_triggers *triggers);
|
||||||
|
Verwijs in nieuw issue
Block a user