qcacmn: Add TDLS ucfg changes for sta connect/disconnect

Add TDLS ucfg interface changes for sta connect, sta
disconnect and tx/rx data sample

Change-Id: Ic57a91b70fe462ee031dc0cf54112601aae0dfc4
CRs-Fixed: 2034220
This commit is contained in:
Kabilan Kannan
2017-04-14 23:36:42 -07:00
committed by Sandeep Puligilla
부모 3e4752133a
커밋 791f7aa23b
7개의 변경된 파일461개의 추가작업 그리고 26개의 파일을 삭제

파일 보기

@@ -1759,3 +1759,60 @@ QDF_STATUS tdls_process_connection_tracker_notify(struct wlan_objmgr_vdev *vdev,
/*TODO connection tracker update*/
return QDF_STATUS_SUCCESS;
}
/**
* tdls_process_set_responder() - Set/clear TDLS peer's responder role
* @set_req: set responder request
*
* Return: 0 for success or -EINVAL otherwise
*/
static
int tdls_process_set_responder(struct tdls_set_responder_req *set_req)
{
struct tdls_peer *curr_peer;
struct tdls_vdev_priv_obj *tdls_vdev;
tdls_vdev = wlan_vdev_get_tdls_vdev_obj(set_req->vdev);
if (!tdls_vdev) {
tdls_err("tdls vdev obj is NULL");
return -EINVAL;
}
curr_peer = tdls_get_peer(tdls_vdev, set_req->peer_mac);
if (curr_peer == NULL) {
tdls_err("curr_peer is NULL");
return -EINVAL;
}
curr_peer->is_responder = set_req->responder;
return 0;
}
/**
* tdls_set_responder() - Set/clear TDLS peer's responder role
* @set_req: set responder request
*
* Return: 0 for success or -EINVAL otherwise
*/
int tdls_set_responder(struct tdls_set_responder_req *set_req)
{
QDF_STATUS status;
if (!set_req || !set_req->vdev) {
tdls_err("Invalid input params %p", set_req);
return -EINVAL;
}
status = wlan_objmgr_vdev_try_get_ref(set_req->vdev, WLAN_TDLS_NB_ID);
if (QDF_STATUS_SUCCESS != status) {
tdls_err("vdev object is deleted");
return -EINVAL;
}
status = tdls_process_set_responder(set_req);
wlan_objmgr_vdev_release_ref(set_req->vdev, WLAN_TDLS_NB_ID);
qdf_mem_free(set_req);
return status;
}

파일 보기

@@ -259,4 +259,12 @@ QDF_STATUS tdls_process_connection_tracker_notify(struct wlan_objmgr_vdev *vdev,
*/
int tdls_validate_mgmt_request(struct tdls_validate_action_req *tdls_validate);
/**
* tdls_set_responder() - Set/clear TDLS peer's responder role
* @set_req: set responder request
*
* Return: 0 for success or -EINVAL otherwise
*/
int tdls_set_responder(struct tdls_set_responder_req *set_req);
#endif

파일 보기

@@ -241,6 +241,23 @@ QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg)
break;
case TDLS_CMD_CONFIG_UPDATE:
break;
case TDLS_CMD_SET_RESPONDER:
tdls_set_responder(msg->bodyptr);
break;
case TDLS_NOTIFY_STA_CONNECTION:
tdls_notify_sta_connect(msg->bodyptr);
break;
case TDLS_NOTIFY_STA_DISCONNECTION:
tdls_notify_sta_disconnect(msg->bodyptr);
break;
case TDLS_CMD_SET_TDLS_MODE:
tdls_set_operation_mode(msg->bodyptr);
break;
case TDLS_CMD_SESSION_INCREMENT:
case TDLS_CMD_SESSION_DECREMENT:
tdls_process_policy_mgr_notification(msg->bodyptr);
break;
default:
break;
}
@@ -1053,3 +1070,35 @@ static void tdls_set_current_mode(struct tdls_soc_priv_obj *tdls_soc,
tdls_soc->tdls_current_mode = tdls_mode;
}
QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode)
{
struct tdls_soc_priv_obj *tdls_soc;
struct tdls_vdev_priv_obj *tdls_vdev;
QDF_STATUS status;
if (!tdls_set_mode || !tdls_set_mode->vdev)
return QDF_STATUS_E_INVAL;
if (QDF_STATUS_SUCCESS !=
wlan_objmgr_vdev_try_get_ref(tdls_set_mode->vdev,
WLAN_TDLS_NB_ID))
return QDF_STATUS_E_INVAL;
status = tdls_get_vdev_objects(tdls_set_mode->vdev,
&tdls_vdev, &tdls_soc);
if (status != QDF_STATUS_SUCCESS)
goto release_mode_ref;
tdls_set_current_mode(tdls_soc,
tdls_set_mode->tdls_mode,
tdls_set_mode->update_last,
tdls_set_mode->source);
release_mode_ref:
wlan_objmgr_vdev_release_ref(tdls_set_mode->vdev, WLAN_TDLS_NB_ID);
qdf_mem_free(tdls_set_mode);
return status;
}

파일 보기

@@ -533,42 +533,39 @@ QDF_STATUS tdls_get_vdev_objects(struct wlan_objmgr_vdev *vdev,
*/
void tdls_set_ct_mode(struct wlan_objmgr_psoc *psoc);
/**
* tdls_set_operation_mode() - set tdls operating mode
* @tdls_set_mode: tdls mode set params
*
* Return: QDF_STATUS
*/
QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode);
/**
* tdls_notify_sta_connect() - Update tdls state for every
* connect event.
* @vdev: vdev object manager
* @tdls_prohibited: flag to tell whether tdls prohibited in this bss
* @tdls_chan_swit_prohibited: flag to tell whether tdls channel switch
* prohibited in this bss
* @session_id: session id
* @notify: sta connect params
*
* After every connect event in the system, check whether TDLS
* can be enabled in the system. If TDLS can be enabled, update the
* TDLS state as needed.
*
* Return: None
* Return: QDF_STATUS
*/
void tdls_notify_sta_connect(struct wlan_objmgr_vdev *vdev,
bool tdls_prohibited,
bool tdls_chan_swit_prohibited,
uint8_t session_id);
QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify);
/**
* tdls_notify_sta_disconnect() - Update tdls state for every
* disconnect event.
* @vdev: vdev object manager
* @lfr_roam: roaming case
* @session_id: session id
* @notify: sta disconnect params
*
* After every disconnect event in the system, check whether TDLS
* can be disabled/enabled in the system and update the
* TDLS state as needed.
*
* Return: None
* Return: QDF_STATUS
*/
void tdls_notify_sta_disconnect(struct wlan_objmgr_vdev *vdev,
bool lfr_roam,
uint8_t session_id);
QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify);
/**
* tdls_notify_decrement_session() - Notify the session decrement

파일 보기

@@ -178,7 +178,14 @@ enum tdls_command_type {
TDLS_CMD_CONFIG_FORCE_PEER,
TDLS_CMD_REMOVE_FORCE_PEER,
TDLS_CMD_STATS_UPDATE,
TDLS_CMD_CONFIG_UPDATE
TDLS_CMD_CONFIG_UPDATE,
TDLS_CMD_SCAN_DONE,
TDLS_CMD_SET_RESPONDER,
TDLS_NOTIFY_STA_CONNECTION,
TDLS_NOTIFY_STA_DISCONNECTION,
TDLS_CMD_SET_TDLS_MODE,
TDLS_CMD_SESSION_INCREMENT,
TDLS_CMD_SESSION_DECREMENT,
};
/**
@@ -350,21 +357,21 @@ enum tdls_feature_bit {
};
#define TDLS_IS_OFF_CHANNEL_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_OFF_CHANNEL, flags)
CHECK_BIT(flags, TDLS_FEATURE_OFF_CHANNEL)
#define TDLS_IS_WMM_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_WMM, flags)
CHECK_BIT(flags, TDLS_FEATURE_WMM)
#define TDLS_IS_BUFFER_STA_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_BUFFER_STA, flags)
CHECK_BIT(flags, TDLS_FEATURE_BUFFER_STA)
#define TDLS_IS_SLEEP_STA_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_SLEEP_STA, flags)
CHECK_BIT(flags, TDLS_FEATURE_SLEEP_STA)
#define TDLS_IS_SCAN_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_SCAN, flags)
CHECK_BIT(flags, TDLS_FEATURE_SCAN)
#define TDLS_IS_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_ENABLE, flags)
CHECK_BIT(flags, TDLS_FEATURE_ENABLE)
#define TDLS_IS_IMPLICIT_TRIG_ENABLED(flags) \
CHECK_BIT(TDLS_FEAUTRE_IMPLICIT_TRIGGER, flags)
CHECK_BIT(flags, TDLS_FEAUTRE_IMPLICIT_TRIGGER)
#define TDLS_IS_EXTERNAL_CONTROL_ENABLED(flags) \
CHECK_BIT(TDLS_FEATURE_EXTERNAL_CONTROL, flags)
CHECK_BIT(flags, TDLS_FEATURE_EXTERNAL_CONTROL)
/**
* struct tdls_user_config - TDLS user configuration
@@ -448,6 +455,47 @@ struct tdls_tx_cnf {
int status;
};
/**
* struct tdls_rx_mgmt_frame - rx mgmt frame structure
* @frame_len: frame length
* @rx_chan: rx channel
* @vdev_id: vdev id
* @frm_type: frame type
* @rx_rssi: rx rssi
* @buf: buffer address
*/
struct tdls_rx_mgmt_frame {
uint32_t frame_len;
uint32_t rx_chan;
uint32_t vdev_id;
uint32_t frm_type;
uint32_t rx_rssi;
uint8_t buf[1];
};
/**
* tdls_rx_callback() - Callback for rx mgmt frame
* @user_data: user data associated to this rx mgmt frame.
* @rx_frame: RX mgmt frame
*
* This callback will be used to give rx frames to hdd.
*
* Return: None
*/
typedef void (*tdls_rx_callback)(void *user_data,
struct tdls_rx_mgmt_frame *rx_frame);
/**
* tdls_wmm_check() - Callback for wmm info
* @psoc: psoc object
*
* This callback will be used to check wmm information
*
* Return: true or false
*/
typedef bool (*tdls_wmm_check)(struct wlan_objmgr_vdev **vdev);
/* This callback is used to report state change of peer to wpa_supplicant */
typedef int (*tdls_state_change_callback)(const uint8_t *mac,
uint32_t opclass,
@@ -497,6 +545,10 @@ struct tdls_start_params {
uint16_t tdls_add_sta_req;
uint16_t tdls_del_sta_req;
uint16_t tdls_update_peer_state;
tdls_rx_callback tdls_rx_cb;
void *tdls_rx_cb_data;
tdls_wmm_check tdls_wmm_cb;
void *tdls_wmm_cb_data;
tdls_evt_callback tdls_event_cb;
void *tdls_evt_cb_data;
tdls_tx_ack_cnf_callback ack_cnf_cb;
@@ -848,6 +900,7 @@ struct tdls_event_notify {
* @dialog: dialog token used in the frame.
* @status_code: status to be incuded in the frame
* @responder: Tdls request type
* @len: lenght of additional Ies
* @peer_capability: peer cpabilities
* @len: lenght of additional Ies
* @buf: additional IEs to be included
@@ -864,15 +917,39 @@ struct tdls_send_mgmt {
uint8_t *buf;
};
/**
* struct tdls_validate_action_req - tdls validate mgmt request
* @vdev: vdev object
* @action_code: action code
* @peer_mac: peer mac address
* @dialog_token: dialog code
* @status_code: status code to add
* @len: len of the frame
* @responder: whether to respond or not
* @max_sta_failed: mgmt failure reason
*/
struct tdls_validate_action_req {
struct wlan_objmgr_vdev *vdev;
uint8_t action_code;
uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
uint8_t dialog_token;
uint8_t status_code;
size_t len;
int responder;
int max_sta_failed;
};
/**
* struct tdls_send_action_frame_request - tdls send mgmt request
* @vdev: vdev object
* @chk_frame: frame validation structure
* @session_id: session id
* @vdev_id: vdev id
* @tdls_mgmt: tdls managment
*/
struct tdls_action_frame_request {
struct wlan_objmgr_vdev *vdev;
struct tdls_validate_action_req *chk_frame;
uint8_t session_id;
uint8_t vdev_id;
const uint8_t *cmd_buf;
@@ -880,4 +957,46 @@ struct tdls_action_frame_request {
struct tdls_send_mgmt tdls_mgmt;
};
/**
* struct tdls_set_responder_req - tdls set responder in peer
* @vdev: vdev object
* @peer_mac: peer mac address
* @responder: whether to respond or not
*/
struct tdls_set_responder_req {
struct wlan_objmgr_vdev *vdev;
uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
uint8_t responder;
};
/**
* struct tdls_sta_notify_params - STA connection notify info
* @vdev: vdev object
* @tdls_prohibited: peer mac addr
* @tdls_chan_swit_prohibited: peer type
* @lfr_roam: is trigger due to lfr
* @session_id: session id
*/
struct tdls_sta_notify_params {
struct wlan_objmgr_vdev *vdev;
bool tdls_prohibited;
bool tdls_chan_swit_prohibited;
bool lfr_roam;
uint8_t session_id;
};
/**
* struct tdls_set_mode_params - TDLS set mode params
* @vdev: vdev object
* @tdls_mode: tdls mode to set
* @update_last: inform to update last tdls mode
* @source: mode change requester
*/
struct tdls_set_mode_params {
struct wlan_objmgr_vdev *vdev;
enum tdls_feature_mode tdls_mode;
bool update_last;
enum tdls_disable_sources source;
};
#endif

파일 보기

@@ -130,4 +130,59 @@ QDF_STATUS ucfg_tdls_oper(struct wlan_objmgr_vdev *vdev,
QDF_STATUS ucfg_tdls_send_mgmt_frame(
struct tdls_action_frame_request *mgmt_req);
/**
* ucfg_tdls_responder() - set responder in TDLS peer
* @msg_req: responder msg
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *msg_req);
/**
* ucfg_tdls_notify_sta_connect() - notify sta connect
* @notify_info: sta notification info
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_tdls_notify_sta_connect(
struct tdls_sta_notify_params *notify_info);
/**
* ucfg_tdls_notify_sta_disconnect() - notify sta disconnect
* @notify_info: sta notification info
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_tdls_notify_sta_disconnect(
struct tdls_sta_notify_params *notify_info);
/**
* ucfg_tdls_set_operating_mode() - set operating mode
* @set_mode_params: set mode params
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_tdls_set_operating_mode(
struct tdls_set_mode_params *set_mode_params);
/**
* ucfg_tdls_update_rx_pkt_cnt() - update rx pkt count
* @vdev: tdls vdev object
* @mac_addr: peer mac address
*
* Return: None
*/
void ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
/**
* ucfg_tdls_update_tx_pkt_cnt() - update tx pkt count
* @vdev: tdls vdev object
* @mac_addr: peer mac address
*
* Return: None
*/
void ucfg_tdls_update_tx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr);
#endif

파일 보기

@@ -26,6 +26,7 @@
#include <wlan_tdls_tgt_api.h>
#include "../../core/src/wlan_tdls_main.h"
#include "../../core/src/wlan_tdls_cmds_process.h"
#include "../../core/src/wlan_tdls_ct.h"
#include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_cmn.h>
#include "wlan_policy_mgr_api.h"
@@ -486,3 +487,152 @@ QDF_STATUS ucfg_tdls_send_mgmt_frame(
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_tdls_responder(struct tdls_set_responder_req *req)
{
struct scheduler_msg msg = {0, };
struct tdls_set_responder_req *msg_req;
QDF_STATUS status;
if (!req || !req->vdev) {
tdls_err("invalid input %p", req);
return QDF_STATUS_E_NULL_VALUE;
}
msg_req = qdf_mem_malloc(sizeof(*msg_req));
if (!msg_req)
return QDF_STATUS_E_NULL_VALUE;
msg_req->responder = req->responder;
msg_req->vdev = req->vdev;
qdf_mem_copy(msg_req->peer_mac, req->peer_mac, QDF_MAC_ADDR_SIZE);
msg.bodyptr = msg_req;
msg.callback = tdls_process_cmd;
msg.type = TDLS_CMD_SET_RESPONDER;
status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
return status;
}
QDF_STATUS ucfg_tdls_notify_sta_connect(
struct tdls_sta_notify_params *notify_info)
{
struct scheduler_msg msg = {0, };
struct tdls_sta_notify_params *notify;
if (!notify_info || !notify_info->vdev) {
tdls_err("notify_info->vdev: %p, notify_info %p",
notify_info->vdev, notify_info);
return QDF_STATUS_E_NULL_VALUE;
}
tdls_notice("Enter ");
notify = qdf_mem_malloc(sizeof(*notify));
if (!notify)
return QDF_STATUS_E_NULL_VALUE;
notify->session_id = notify_info->session_id;
notify->tdls_chan_swit_prohibited =
notify_info->tdls_chan_swit_prohibited;
notify->tdls_prohibited = notify_info->tdls_prohibited;
notify->vdev = notify_info->vdev;
msg.bodyptr = notify;
msg.callback = tdls_process_cmd;
msg.type = TDLS_NOTIFY_STA_CONNECTION;
scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
tdls_notice("Exit ");
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_tdls_notify_sta_disconnect(
struct tdls_sta_notify_params *notify_info)
{
struct scheduler_msg msg = {0, };
struct tdls_sta_notify_params *notify;
if (!notify_info || !notify_info->vdev) {
tdls_err("notify_info->vdev: %p, notify_info %p",
notify_info->vdev, notify_info);
return QDF_STATUS_E_NULL_VALUE;
}
tdls_notice("Enter ");
notify = qdf_mem_malloc(sizeof(*notify));
if (!notify)
return QDF_STATUS_E_NULL_VALUE;
notify->session_id = notify_info->session_id;
notify->tdls_chan_swit_prohibited = false;
notify->tdls_prohibited = false;
notify->vdev = notify_info->vdev;
msg.bodyptr = notify;
msg.callback = tdls_process_cmd;
msg.type = TDLS_NOTIFY_STA_DISCONNECTION;
scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
tdls_notice("Exit ");
return QDF_STATUS_SUCCESS;
}
QDF_STATUS ucfg_tdls_set_operating_mode(
struct tdls_set_mode_params *set_mode_params)
{
struct scheduler_msg msg = {0, };
struct tdls_set_mode_params *set_mode;
if (!set_mode_params || !set_mode_params->vdev) {
tdls_err("vdev: %p, set_mode_params %p",
set_mode_params->vdev, set_mode_params);
return QDF_STATUS_E_NULL_VALUE;
}
tdls_notice("Enter ");
set_mode = qdf_mem_malloc(sizeof(*set_mode));
if (!set_mode)
return QDF_STATUS_E_NULL_VALUE;
set_mode->source = set_mode_params->source;
set_mode->tdls_mode = set_mode_params->tdls_mode;
set_mode->update_last = set_mode_params->update_last;
set_mode->vdev = set_mode_params->vdev;
msg.bodyptr = set_mode;
msg.callback = tdls_process_cmd;
msg.type = TDLS_CMD_SET_TDLS_MODE;
scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
tdls_notice("Exit ");
return QDF_STATUS_SUCCESS;
}
void ucfg_tdls_update_rx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr)
{
QDF_STATUS status;
status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
if (status != QDF_STATUS_SUCCESS)
return;
tdls_update_rx_pkt_cnt(vdev, mac_addr);
wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
}
void ucfg_tdls_update_tx_pkt_cnt(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_addr)
{
QDF_STATUS status;
status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_TDLS_NB_ID);
if (status != QDF_STATUS_SUCCESS)
return;
tdls_update_tx_pkt_cnt(vdev, mac_addr);
wlan_objmgr_vdev_release_ref(vdev, WLAN_TDLS_NB_ID);
}