blob: c865c86342e29a10e19af9fd91b5deca88055030 [file] [log] [blame]
/*
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: define internal APIs related to the mlme component
*/
#include "wlan_mlme_main.h"
#include "wlan_mlme_vdev_mgr_interface.h"
#include "lim_utils.h"
#include "wma_api.h"
#include "lim_types.h"
#include <include/wlan_mlme_cmn.h>
#include <../../core/src/vdev_mgr_ops.h>
#include "wlan_psoc_mlme_api.h"
static struct vdev_mlme_ops sta_mlme_ops;
static struct vdev_mlme_ops ap_mlme_ops;
static struct vdev_mlme_ops mon_mlme_ops;
static struct mlme_ext_ops ext_ops;
bool mlme_is_vdev_in_beaconning_mode(enum QDF_OPMODE vdev_opmode)
{
switch (vdev_opmode) {
case QDF_SAP_MODE:
case QDF_P2P_GO_MODE:
case QDF_IBSS_MODE:
case QDF_NDI_MODE:
return true;
default:
return false;
}
}
/**
* mlme_get_global_ops() - Register ext global ops
*
* Return: ext_ops global ops
*/
static struct mlme_ext_ops *mlme_get_global_ops(void)
{
return &ext_ops;
}
QDF_STATUS mlme_register_mlme_ext_ops(void)
{
mlme_set_ops_register_cb(mlme_get_global_ops);
return QDF_STATUS_SUCCESS;
}
/**
* mlme_register_vdev_mgr_ops() - Register vdev mgr ops
* @vdev_mlme: vdev mlme object
*
* This function is called to register vdev manager operations
*
* Return: QDF_STATUS
*/
QDF_STATUS mlme_register_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme)
{
struct wlan_objmgr_vdev *vdev;
vdev = vdev_mlme->vdev;
if (mlme_is_vdev_in_beaconning_mode(vdev->vdev_mlme.vdev_opmode))
vdev_mlme->ops = &ap_mlme_ops;
else if (vdev->vdev_mlme.vdev_opmode == QDF_MONITOR_MODE)
vdev_mlme->ops = &mon_mlme_ops;
else
vdev_mlme->ops = &sta_mlme_ops;
return QDF_STATUS_SUCCESS;
}
/**
* mlme_unregister_vdev_mgr_ops() - Unregister vdev mgr ops
* @vdev_mlme: vdev mlme object
*
* This function is called to unregister vdev manager operations
*
* Return: QDF_STATUS
*/
QDF_STATUS mlme_unregister_vdev_mgr_ops(struct vdev_mlme_obj *vdev_mlme)
{
return QDF_STATUS_SUCCESS;
}
/**
* sta_mlme_vdev_start_send() - MLME vdev start callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to initiate actions of VDEV.start
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_sta_mlme_vdev_start_send(vdev_mlme, event_data_len,
event_data);
}
/**
* sta_mlme_start_continue() - vdev start rsp calback
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to handle the VDEV START/RESTART calback
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_sta_mlme_vdev_start_continue(vdev_mlme, data_len, data);
}
/**
* sta_mlme_vdev_restart_send() - MLME vdev restart send
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to initiate actions of VDEV.start
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_sta_mlme_vdev_restart_send(vdev_mlme, event_data_len,
event_data);
}
/**
* sta_mlme_vdev_start_req_failed() - MLME start fail callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to send the vdev stop to firmware
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len,
void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_sta_mlme_vdev_req_fail(vdev_mlme, data_len, data);
}
/**
* sta_mlme_vdev_start_connection() - MLME vdev start callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to initiate actions of STA connection
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_start_connection(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return QDF_STATUS_SUCCESS;
}
/**
* sta_mlme_vdev_up_send() - MLME vdev UP callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to send the vdev up command
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_sta_vdev_up_send(vdev_mlme, event_data_len, event_data);
}
/**
* sta_mlme_vdev_notify_up_complete() - MLME vdev UP complete callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to VDEV MLME on moving
* to UP state
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return QDF_STATUS_SUCCESS;
}
/**
* sta_mlme_vdev_notify_roam_start() - MLME vdev Roam start callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to VDEV MLME on roaming
* to UP state
*
* Return: QDF_STATUS
*/
static
QDF_STATUS sta_mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_sta_mlme_vdev_roam_notify(vdev_mlme, event_data_len,
event_data);
}
/**
* sta_mlme_vdev_disconnect_bss() - MLME vdev disconnect bss callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to disconnect BSS/send deauth to AP
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_disconnect_bss(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_sta_mlme_vdev_disconnect_bss(vdev_mlme, event_data_len,
event_data);
}
/**
* sta_mlme_vdev_stop_send() - MLME vdev stop send callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to send the vdev stop to firmware
*
* Return: QDF_STATUS
*/
static QDF_STATUS sta_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len,
void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_sta_mlme_vdev_stop_send(vdev_mlme, data_len, data);
}
/**
* vdevmgr_mlme_stop_continue() - MLME vdev stop send callback
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to initiate operations on
* LMAC/FW stop response such as remove peer.
*
* Return: QDF_STATUS
*/
static QDF_STATUS vdevmgr_mlme_stop_continue(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len,
void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mlme_vdev_stop_continue(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_start_send () - send vdev start req
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to initiate actions of VDEV start ie start bss
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_start_send(vdev_mlme, data_len, data);
}
/**
* ap_start_continue () - vdev start rsp calback
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to handle the VDEV START/RESTART calback
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_ap_mlme_vdev_start_continue(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_update_beacon() - callback to initiate beacon update
* @vdev_mlme: vdev mlme object
* @op: beacon operation
* @data_len: event data length
* @data: event data
*
* This function is called to update beacon
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme,
enum beacon_update_op op,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_update_beacon(vdev_mlme, op, data_len, data);
}
/**
* ap_mlme_vdev_up_send() - callback to send vdev up
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send vdev up req
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_up_send(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_notify_up_complete() - callback to notify up completion
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to indicate up is completed
*
* Return: QDF_STATUS
*/
static QDF_STATUS
ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
if (!vdev_mlme) {
mlme_legacy_err("data is NULL");
return QDF_STATUS_E_INVAL;
}
pe_debug("Vdev %d is up", wlan_vdev_get_id(vdev_mlme->vdev));
return QDF_STATUS_SUCCESS;
}
/**
* ap_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to disconnect all connected peers
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_disconnect_peers(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_disconnect_peers(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_stop_send() - callback to send stop vdev request
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send stop vdev request
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_stop_send(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_is_newchan_no_cac - VDEV SM CSA complete notification
* @vdev_mlme: VDEV MLME comp object
*
* On CSA complete, checks whether Channel does not needs CAC period, if
* it doesn't need cac return SUCCESS else FAILURE
*
* Return: SUCCESS if new channel doesn't need cac
* else FAILURE
*/
static QDF_STATUS
ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj *vdev_mlme)
{
bool cac_required;
cac_required = mlme_get_cac_required(vdev_mlme->vdev);
mlme_legacy_debug("vdev id = %d cac_required %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id, cac_required);
if (!cac_required)
return QDF_STATUS_SUCCESS;
mlme_set_cac_required(vdev_mlme->vdev, false);
return QDF_STATUS_E_FAILURE;
}
/**
* ap_mlme_vdev_down_send() - callback to send vdev down req
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send vdev down req
*
* Return: QDF_STATUS
*/
static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data);
}
/**
* vdevmgr_notify_down_complete() - callback to indicate vdev down is completed
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to indicate vdev down is completed
*
* Return: QDF_STATUS
*/
static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_start_req_failed () - vdev start req fail callback
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to handle vdev start req/rsp failure
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_start_req_failed(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_start_req_failed(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_restart_send() a callback to send vdev restart
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to initiate and send vdev restart req
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_ap_mlme_vdev_restart_send(vdev_mlme, data_len, data);
}
/**
* ap_mlme_vdev_stop_start_send() - handle vdev stop during start req
* @vdev_mlme: vdev mlme object
* @type: restart req or start req
* @data_len: event data length
* @data: event data
*
* This function is called to handle vdev stop during start req
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_mlme_vdev_stop_start_send(struct vdev_mlme_obj *vdev_mlme,
enum vdev_cmd_type type,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_ap_mlme_vdev_stop_start_send(vdev_mlme, type,
data_len, data);
}
QDF_STATUS mlme_set_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev,
bool val)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->chan_switch_in_progress = val;
return QDF_STATUS_SUCCESS;
}
bool mlme_is_chan_switch_in_progress(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->chan_switch_in_progress;
}
QDF_STATUS
ap_mlme_set_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev,
bool val)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->hidden_ssid_restart_in_progress = val;
return QDF_STATUS_SUCCESS;
}
bool ap_mlme_is_hidden_ssid_restart_in_progress(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->hidden_ssid_restart_in_progress;
}
QDF_STATUS mlme_set_connection_fail(struct wlan_objmgr_vdev *vdev, bool val)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->connection_fail = val;
return QDF_STATUS_SUCCESS;
}
bool mlme_is_connection_fail(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->connection_fail;
}
QDF_STATUS mlme_set_assoc_type(struct wlan_objmgr_vdev *vdev,
enum vdev_assoc_type assoc_type)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->assoc_type = assoc_type;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_get_vdev_bss_peer_mac_addr(
struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *bss_peer_mac_address)
{
struct wlan_objmgr_peer *peer;
if (!vdev) {
mlme_legacy_err("vdev is null");
return QDF_STATUS_E_INVAL;
}
peer = wlan_objmgr_vdev_try_get_bsspeer(vdev, WLAN_MLME_OBJMGR_ID);
if (!peer) {
mlme_legacy_err("peer is null");
return QDF_STATUS_E_INVAL;
}
wlan_peer_obj_lock(peer);
qdf_mem_copy(bss_peer_mac_address->bytes, wlan_peer_get_macaddr(peer),
QDF_MAC_ADDR_SIZE);
wlan_peer_obj_unlock(peer);
wlan_objmgr_peer_release_ref(peer, WLAN_MLME_OBJMGR_ID);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_get_vdev_stop_type(struct wlan_objmgr_vdev *vdev,
uint32_t *vdev_stop_type)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
*vdev_stop_type = mlme_priv->vdev_stop_type;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_set_vdev_stop_type(struct wlan_objmgr_vdev *vdev,
uint32_t vdev_stop_type)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->vdev_stop_type = vdev_stop_type;
return QDF_STATUS_SUCCESS;
}
enum vdev_assoc_type mlme_get_assoc_type(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->assoc_type;
}
QDF_STATUS
mlme_set_vdev_start_failed(struct wlan_objmgr_vdev *vdev, bool val)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->vdev_start_failed = val;
return QDF_STATUS_SUCCESS;
}
bool mlme_get_vdev_start_failed(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->vdev_start_failed;
}
QDF_STATUS mlme_set_cac_required(struct wlan_objmgr_vdev *vdev, bool val)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return QDF_STATUS_E_FAILURE;
}
mlme_priv->cac_required_for_new_channel = val;
return QDF_STATUS_SUCCESS;
}
bool mlme_get_cac_required(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
return false;
}
return mlme_priv->cac_required_for_new_channel;
}
QDF_STATUS mlme_set_mbssid_info(struct wlan_objmgr_vdev *vdev,
struct scan_mbssid_info *mbssid_info)
{
struct vdev_mlme_obj *vdev_mlme;
struct vdev_mlme_mbss_11ax *mbss_11ax;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_legacy_err("vdev component object is NULL");
return QDF_STATUS_E_FAILURE;
}
mbss_11ax = &vdev_mlme->mgmt.mbss_11ax;
mbss_11ax->profile_idx = mbssid_info->profile_num;
mbss_11ax->profile_num = mbssid_info->profile_count;
qdf_mem_copy(mbss_11ax->trans_bssid,
mbssid_info->trans_bssid, QDF_MAC_ADDR_SIZE);
return QDF_STATUS_SUCCESS;
}
void mlme_get_mbssid_info(struct wlan_objmgr_vdev *vdev,
struct vdev_mlme_mbss_11ax *mbss_11ax)
{
struct vdev_mlme_obj *vdev_mlme;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_legacy_err("vdev component object is NULL");
return;
}
mbss_11ax = &vdev_mlme->mgmt.mbss_11ax;
}
/**
* vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object
* @vdev_mlme: vdev mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
vdev_mlme->ext_vdev_ptr =
qdf_mem_malloc(sizeof(struct mlme_legacy_priv));
if (!vdev_mlme->ext_vdev_ptr) {
mlme_legacy_err("failed to allocate meory for ext_vdev_ptr");
return QDF_STATUS_E_NOMEM;
}
return QDF_STATUS_SUCCESS;
}
/**
* vdevmgr_mlme_ext_hdl_destroy () - Destroy mlme legacy priv object
* @vdev_mlme: vdev mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
if (!vdev_mlme->ext_vdev_ptr)
return QDF_STATUS_E_FAILURE;
mlme_free_self_disconnect_ies(vdev_mlme->vdev);
mlme_free_peer_disconnect_ies(vdev_mlme->vdev);
qdf_mem_free(vdev_mlme->ext_vdev_ptr);
vdev_mlme->ext_vdev_ptr = NULL;
return QDF_STATUS_SUCCESS;
}
/**
* ap_vdev_dfs_cac_timer_stop() – callback to stop cac timer
* @vdev_mlme: vdev mlme object
* @event_data_len: event data length
* @event_data: event data
*
* This function is called to stop cac timer
*
* Return: QDF_STATUS
*/
static QDF_STATUS ap_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj *vdev_mlme,
uint16_t event_data_len,
void *event_data)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return QDF_STATUS_SUCCESS;
}
/**
* mon_mlme_vdev_start_restart_send () - send vdev start/restart req
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to initiate actions of VDEV start/restart
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_vdev_start_restart_send(
struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return lim_mon_mlme_vdev_start_send(vdev_mlme, data_len, data);
}
/**
* mon_start_continue () - vdev start rsp calback
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to handle the VDEV START/RESTART calback
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_start_continue(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mon_mlme_vdev_start_continue(vdev_mlme, data_len, data);
}
/**
* mon_mlme_vdev_up_send() - callback to send vdev up
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send vdev up req
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mon_mlme_vdev_up_send(vdev_mlme, data_len, data);
}
/**
* mon_mlme_vdev_disconnect_peers() - callback to disconnect all connected peers
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* montior mode no connected peers, only do VDEV state transition.
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_vdev_disconnect_peers(
struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wlan_vdev_mlme_sm_deliver_evt(
vdev_mlme->vdev,
WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
0, NULL);
}
/**
* mon_mlme_vdev_stop_send() - callback to send stop vdev request
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send stop vdev request
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mon_mlme_vdev_stop_send(vdev_mlme, data_len, data);
}
/**
* mon_mlme_vdev_down_send() - callback to send vdev down req
* @vdev_mlme: vdev mlme object
* @data_len: event data length
* @data: event data
*
* This function is called to send vdev down req
*
* Return: QDF_STATUS
*/
static QDF_STATUS mon_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
uint16_t data_len, void *data)
{
mlme_legacy_debug("vdev id = %d",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_mon_mlme_vdev_down_send(vdev_mlme, data_len, data);
}
/**
* vdevmgr_vdev_delete_rsp_handle() - callback to handle vdev delete response
* @vdev_mlme: vdev mlme object
* @rsp: pointer to vdev delete response
*
* This function is called to handle vdev delete response and send result to
* upper layer
*
* Return: QDF_STATUS
*/
static QDF_STATUS
vdevmgr_vdev_delete_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
struct vdev_delete_response *rsp)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_vdev_detach_callback(vdev_mlme, rsp);
}
/**
* vdevmgr_vdev_stop_rsp_handle() - callback to handle vdev stop response
* @vdev_mlme: vdev mlme object
* @rsp: pointer to vdev stop response
*
* This function is called to handle vdev stop response and send result to
* upper layer
*
* Return: QDF_STATUS
*/
static QDF_STATUS
vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
struct vdev_stop_response *rsp)
{
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
return wma_vdev_stop_resp_handler(vdev_mlme, rsp);
}
/**
* psoc_mlme_ext_hdl_create() - Create mlme legacy priv object
* @psoc_mlme: psoc mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS psoc_mlme_ext_hdl_create(struct psoc_mlme_obj *psoc_mlme)
{
psoc_mlme->ext_psoc_ptr =
qdf_mem_malloc(sizeof(struct wlan_mlme_psoc_ext_obj));
if (!psoc_mlme->ext_psoc_ptr) {
mlme_legacy_err("Failed to allocate memory");
return QDF_STATUS_E_NOMEM;
}
return QDF_STATUS_SUCCESS;
}
/**
* psoc_mlme_ext_hdl_destroy() - Destroy mlme legacy priv object
* @psoc_mlme: psoc mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS psoc_mlme_ext_hdl_destroy(struct psoc_mlme_obj *psoc_mlme)
{
if (!psoc_mlme) {
mlme_err("PSOC MLME is NULL");
return QDF_STATUS_E_FAILURE;
}
if (psoc_mlme->ext_psoc_ptr) {
qdf_mem_free(psoc_mlme->ext_psoc_ptr);
psoc_mlme->ext_psoc_ptr = NULL;
}
return QDF_STATUS_SUCCESS;
}
/**
* vdevmgr_vdev_delete_rsp_handle() - callback to handle vdev delete response
* @vdev_mlme: vdev mlme object
* @rsp: pointer to vdev delete response
*
* This function is called to handle vdev delete response and send result to
* upper layer
*
* Return: QDF_STATUS
*/
static QDF_STATUS
vdevmgr_vdev_start_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
struct vdev_start_response *rsp)
{
QDF_STATUS status;
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
status = wma_vdev_start_resp_handler(vdev_mlme, rsp);
return status;
}
QDF_STATUS mlme_vdev_create_send(struct wlan_objmgr_vdev *vdev)
{
struct vdev_mlme_obj *vdev_mlme = NULL;
QDF_STATUS status;
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
if (!vdev_mlme) {
mlme_err("Failed to get vdev mlme obj for vdev id %d",
wlan_vdev_get_id(vdev));
status = QDF_STATUS_E_INVAL;
goto return_status;
}
status = vdev_mgr_create_send(vdev_mlme);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("Failed to create vdev for vdev id %d",
wlan_vdev_get_id(vdev));
goto return_status;
}
status = wma_post_vdev_create_setup(vdev);
if (QDF_IS_STATUS_ERROR(status))
vdev_mgr_delete_send(vdev_mlme);
return_status:
return status;
}
/**
* struct sta_mlme_ops - VDEV MLME operation callbacks strucutre for sta
* @mlme_vdev_start_send: callback to initiate actions of VDEV
* MLME start operation
* @mlme_vdev_restart_send: callback to initiate actions of VDEV
* MLME restart operation
* @mlme_vdev_stop_start_send: callback to block start/restart VDEV
* request command
* @mlme_vdev_sta_conn_start: callback to initiate connection
* @mlme_vdev_start_continue: callback to initiate operations on
* LMAC/FW start response
* @mlme_vdev_up_send: callback to initiate actions of VDEV
* MLME up operation
* @mlme_vdev_notify_up_complete: callback to notify VDEV MLME on moving
* to UP state
* @mlme_vdev_update_beacon: callback to initiate beacon update
* @mlme_vdev_disconnect_peers: callback to initiate disconnection of
* peers
* @mlme_vdev_stop_send: callback to initiate actions of VDEV
* MLME stop operation
* @mlme_vdev_stop_continue: callback to initiate operations on
* LMAC/FW stop response
* @mlme_vdev_down_send: callback to initiate actions of VDEV
* MLME down operation
* @mlme_vdev_notify_down_complete: callback to notify VDEV MLME on moving
* to INIT state
*/
static struct vdev_mlme_ops sta_mlme_ops = {
.mlme_vdev_start_send = sta_mlme_vdev_start_send,
.mlme_vdev_restart_send = sta_mlme_vdev_restart_send,
.mlme_vdev_start_continue = sta_mlme_start_continue,
.mlme_vdev_start_req_failed = sta_mlme_vdev_start_req_failed,
.mlme_vdev_sta_conn_start = sta_mlme_vdev_start_connection,
.mlme_vdev_up_send = sta_mlme_vdev_up_send,
.mlme_vdev_notify_up_complete = sta_mlme_vdev_notify_up_complete,
.mlme_vdev_notify_roam_start = sta_mlme_vdev_notify_roam_start,
.mlme_vdev_disconnect_peers = sta_mlme_vdev_disconnect_bss,
.mlme_vdev_stop_send = sta_mlme_vdev_stop_send,
.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
};
/**
* struct ap_mlme_ops - VDEV MLME operation callbacks strucutre for beaconing
* interface
* @mlme_vdev_start_send: callback to initiate actions of VDEV
* MLME start operation
* @mlme_vdev_restart_send: callback to initiate actions of VDEV
* MLME restart operation
* @mlme_vdev_stop_start_send: callback to block start/restart VDEV
* request command
* @mlme_vdev_start_continue: callback to initiate operations on
* LMAC/FW start response
* @mlme_vdev_up_send: callback to initiate actions of VDEV
* MLME up operation
* @mlme_vdev_notify_up_complete: callback to notify VDEV MLME on moving
* to UP state
* @mlme_vdev_update_beacon: callback to initiate beacon update
* @mlme_vdev_disconnect_peers: callback to initiate disconnection of
* peers
* @mlme_vdev_dfs_cac_timer_stop: callback to stop the DFS CAC timer
* @mlme_vdev_stop_send: callback to initiate actions of VDEV
* MLME stop operation
* @mlme_vdev_stop_continue: callback to initiate operations on
* LMAC/FW stop response
* @mlme_vdev_down_send: callback to initiate actions of VDEV
* MLME down operation
* @mlme_vdev_notify_down_complete: callback to notify VDEV MLME on moving
* to INIT state
* @mlme_vdev_is_newchan_no_cac: callback to check if new channel is DFS
* and cac is not required
*/
static struct vdev_mlme_ops ap_mlme_ops = {
.mlme_vdev_start_send = ap_mlme_vdev_start_send,
.mlme_vdev_restart_send = ap_mlme_vdev_restart_send,
.mlme_vdev_stop_start_send = ap_mlme_vdev_stop_start_send,
.mlme_vdev_start_continue = ap_mlme_start_continue,
.mlme_vdev_start_req_failed = ap_mlme_vdev_start_req_failed,
.mlme_vdev_up_send = ap_mlme_vdev_up_send,
.mlme_vdev_notify_up_complete = ap_mlme_vdev_notify_up_complete,
.mlme_vdev_update_beacon = ap_mlme_vdev_update_beacon,
.mlme_vdev_disconnect_peers = ap_mlme_vdev_disconnect_peers,
.mlme_vdev_dfs_cac_timer_stop = ap_vdev_dfs_cac_timer_stop,
.mlme_vdev_stop_send = ap_mlme_vdev_stop_send,
.mlme_vdev_stop_continue = vdevmgr_mlme_stop_continue,
.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
.mlme_vdev_is_newchan_no_cac = ap_mlme_vdev_is_newchan_no_cac,
.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
};
static struct vdev_mlme_ops mon_mlme_ops = {
.mlme_vdev_start_send = mon_mlme_vdev_start_restart_send,
.mlme_vdev_restart_send = mon_mlme_vdev_start_restart_send,
.mlme_vdev_start_continue = mon_mlme_start_continue,
.mlme_vdev_up_send = mon_mlme_vdev_up_send,
.mlme_vdev_disconnect_peers = mon_mlme_vdev_disconnect_peers,
.mlme_vdev_stop_send = mon_mlme_vdev_stop_send,
.mlme_vdev_down_send = mon_mlme_vdev_down_send,
.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
.mlme_vdev_ext_start_rsp = vdevmgr_vdev_start_rsp_handle,
};
/**
* struct mlme_ext_ops - MLME legacy global callbacks structure
* @mlme_psoc_ext_hdl_create: callback to invoke creation of legacy
* psoc object
* @mlme_psoc_ext_hdl_destroy: callback to invoke destroy of legacy
* psoc object
* @mlme_vdev_ext_hdl_create: callback to invoke creation of legacy
* vdev object
* @mlme_vdev_ext_hdl_destroy: callback to invoke destroy of legacy
* vdev object
*/
static struct mlme_ext_ops ext_ops = {
.mlme_psoc_ext_hdl_create = psoc_mlme_ext_hdl_create,
.mlme_psoc_ext_hdl_destroy = psoc_mlme_ext_hdl_destroy,
.mlme_vdev_ext_hdl_create = vdevmgr_mlme_ext_hdl_create,
.mlme_vdev_ext_hdl_destroy = vdevmgr_mlme_ext_hdl_destroy,
};