diff --git a/core/src/wlan_tdls_cmds_process.c b/core/src/wlan_tdls_cmds_process.c index f8622a82cf..06f6813a6c 100644 --- a/core/src/wlan_tdls_cmds_process.c +++ b/core/src/wlan_tdls_cmds_process.c @@ -1501,6 +1501,19 @@ QDF_STATUS tdls_process_del_peer_rsp(struct tdls_del_sta_rsp *rsp) id = wlan_vdev_get_id(vdev); +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + if (TDLS_IS_LINK_CONNECTED(curr_peer)) { + soc_obj->tdls_dereg_peer( + soc_obj->tdls_peer_context, + id, curr_peer->sta_id); + tdls_decrement_peer_count(soc_obj); + } else if (TDLS_LINK_CONNECTING == + curr_peer->link_status) { + soc_obj->tdls_dereg_peer( + soc_obj->tdls_peer_context, + id, curr_peer->sta_id); + } +#else if (TDLS_IS_LINK_CONNECTED(curr_peer)) { soc_obj->tdls_dereg_tl_peer( soc_obj->tdls_tl_peer_data, @@ -1512,6 +1525,7 @@ QDF_STATUS tdls_process_del_peer_rsp(struct tdls_del_sta_rsp *rsp) soc_obj->tdls_tl_peer_data, id, curr_peer->sta_id); } +#endif } tdls_reset_peer(vdev_obj, macaddr); conn_rec[sta_idx].sta_id = 0; @@ -1683,11 +1697,17 @@ QDF_STATUS tdls_process_enable_link(struct tdls_oper_request *req) TDLS_LINK_SUCCESS); id = wlan_vdev_get_id(vdev); +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + status = soc_obj->tdls_reg_peer(soc_obj->tdls_peer_context, + id, mac, peer->sta_id, + peer->qos); +#else status = soc_obj->tdls_reg_tl_peer(soc_obj->tdls_tl_peer_data, id, mac, peer->sta_id, peer->signature, peer->qos); +#endif if (QDF_IS_STATUS_ERROR(status)) { - tdls_err("TDLS register with TL fail, status %d", status); + tdls_err("TDLS register peer fail, status %d", status); goto error; } diff --git a/core/src/wlan_tdls_ct.c b/core/src/wlan_tdls_ct.c index 2327fc4744..d6839a3e27 100644 --- a/core/src/wlan_tdls_ct.c +++ b/core/src/wlan_tdls_ct.c @@ -1274,12 +1274,19 @@ void tdls_disable_offchan_and_teardown_links( */ tdls_reset_peer(tdls_vdev, curr_peer->peer_mac.bytes); +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + if (tdls_soc->tdls_dereg_peer) + tdls_soc->tdls_dereg_peer( + tdls_soc->tdls_peer_context, + wlan_vdev_get_id(vdev), + curr_peer->sta_id); +#else if (tdls_soc->tdls_dereg_tl_peer) tdls_soc->tdls_dereg_tl_peer( tdls_soc->tdls_tl_peer_data, wlan_vdev_get_id(vdev), curr_peer->sta_id); - +#endif tdls_decrement_peer_count(tdls_soc); tdls_soc->tdls_conn_info[staidx].sta_id = 0; tdls_soc->tdls_conn_info[staidx].session_id = 255; diff --git a/core/src/wlan_tdls_main.h b/core/src/wlan_tdls_main.h index 0dee99c63f..14b2b65ca1 100644 --- a/core/src/wlan_tdls_main.h +++ b/core/src/wlan_tdls_main.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 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 @@ -170,9 +170,15 @@ struct tdls_set_state_info { * @tx_ack_cnf_cb_data: user data to tdls_tx_cnf_cb * @tdls_event_cb: tdls event callback * @tdls_evt_cb_data: tdls event user data +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + * @tdls_peer_context: userdata for register/deregister TDLS peer + * @tdls_reg_peer: register tdls peer with datapath + * @tdls_dereg_peer: deregister tdls peer from datapath +#else + * @tdls_tl_peer_data: userdata for register/deregister TDLS peer * @tdls_reg_tl_peer: callback to register the TDLS peer with TL * @tdls_dereg_tl_peer: callback to unregister the TDLS peer - * @tdls_tl_peer_data: userdata for register/deregister TDLS peer +#endif * @tx_q_ack: queue for tx frames waiting for ack * @tdls_con_cap: tdls concurrency support * @tdls_send_mgmt_req: store eWNI_SME_TDLS_SEND_MGMT_REQ value @@ -213,10 +219,16 @@ struct tdls_soc_priv_obj { void *tx_ack_cnf_cb_data; tdls_evt_callback tdls_event_cb; void *tdls_evt_cb_data; +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + void *tdls_peer_context; + tdls_register_peer_callback tdls_reg_peer; + tdls_deregister_peer_callback tdls_dereg_peer; +#else + void *tdls_tl_peer_data; tdls_register_tl_peer_callback tdls_reg_tl_peer; tdls_deregister_tl_peer_callback tdls_dereg_tl_peer; +#endif tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update; - void *tdls_tl_peer_data; qdf_list_t tx_q_ack; enum tdls_conc_cap tdls_con_cap; uint16_t tdls_send_mgmt_req; diff --git a/dispatcher/inc/wlan_tdls_public_structs.h b/dispatcher/inc/wlan_tdls_public_structs.h index 457a3ded55..0ada980ae6 100644 --- a/dispatcher/inc/wlan_tdls_public_structs.h +++ b/dispatcher/inc/wlan_tdls_public_structs.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 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 @@ -547,6 +547,22 @@ typedef void (*tdls_evt_callback) (void *data, typedef int (*tdls_tx_ack_cnf_callback)(void *user_data, struct tdls_tx_cnf *tx_ack_cnf_cb_data); +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + +/* This callback is used to register TDLS peer with the datapath */ +typedef QDF_STATUS (*tdls_register_peer_callback)(void *userdata, + uint32_t vdev_id, + const uint8_t *mac, + uint16_t stat_id, + uint8_t qos); + +/* This callback is used to deregister TDLS peer from the datapath */ +typedef QDF_STATUS (*tdls_deregister_peer_callback)(void *userdata, + uint32_t vdev_id, + uint8_t sta_id); + +#else + /* This callback is used to register TDLS peer with TL */ typedef QDF_STATUS (*tdls_register_tl_peer_callback)(void *userdata, uint32_t vdev_id, @@ -560,6 +576,8 @@ typedef QDF_STATUS (*tdls_deregister_tl_peer_callback)(void *userdata, uint32_t vdev_id, uint8_t sta_id); +#endif + /* This callback is used to update datapath vdev flags */ typedef QDF_STATUS (*tdls_dp_vdev_update_flags_callback)(void *cbk_data, @@ -580,10 +598,16 @@ typedef QDF_STATUS * @tdls_evt_cb_data: tdls event data * @ack_cnf_cb: tdls tx ack callback to indicate the tx status * @tx_ack_cnf_cb_data: tdls tx ack user data +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + * @tdls_peer_context: userdata for register/deregister TDLS peer + * @tdls_reg_peer: register tdls peer with datapath + * @tdls_dereg_peer: deregister tdls peer from datapath +#else + * @tdls_tl_peer_data: userdata for register/deregister TDLS peer * @tdls_reg_tl_peer: tdls register tdls peer * @tdls_dereg_tl_peer: tdls deregister tdls peer +#endif * @tdls_dp_vdev_update: update vdev flags in datapath - * @tdls_tl_peer_data: userdata for register/deregister TDLS peer */ struct tdls_start_params { struct tdls_user_config config; @@ -601,10 +625,16 @@ struct tdls_start_params { void *tdls_evt_cb_data; tdls_tx_ack_cnf_callback ack_cnf_cb; void *tx_ack_cnf_cb_data; +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + void *tdls_peer_context; + tdls_register_peer_callback tdls_reg_peer; + tdls_deregister_peer_callback tdls_dereg_peer; +#else + void *tdls_tl_peer_data; tdls_register_tl_peer_callback tdls_reg_tl_peer; tdls_deregister_tl_peer_callback tdls_dereg_tl_peer; +#endif tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update; - void *tdls_tl_peer_data; }; /** diff --git a/dispatcher/src/wlan_tdls_ucfg_api.c b/dispatcher/src/wlan_tdls_ucfg_api.c index 1bae8eb0a6..f4aecc1502 100644 --- a/dispatcher/src/wlan_tdls_ucfg_api.c +++ b/dispatcher/src/wlan_tdls_ucfg_api.c @@ -207,10 +207,17 @@ QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc, soc_obj->tdls_tx_cnf_cb = req->ack_cnf_cb; soc_obj->tx_ack_cnf_cb_data = req->tx_ack_cnf_cb_data; +#ifdef USE_NEW_TDLS_PEER_CALLBACKS + /* Save callbacks to register/deregister TDLS sta with TL */ + soc_obj->tdls_reg_peer = req->tdls_reg_peer; + soc_obj->tdls_dereg_peer = req->tdls_dereg_peer; + soc_obj->tdls_peer_context = req->tdls_peer_context; +#else /* Save callbacks to register/deregister TDLS sta with TL */ soc_obj->tdls_reg_tl_peer = req->tdls_reg_tl_peer; soc_obj->tdls_dereg_tl_peer = req->tdls_dereg_tl_peer; soc_obj->tdls_tl_peer_data = req->tdls_tl_peer_data; +#endif /* Save legacy PE/WMA commands in TDLS soc object */ soc_obj->tdls_send_mgmt_req = req->tdls_send_mgmt_req;