/* * Copyright 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "mca_defs.h" #include "mcap_test_mdl.h" namespace SYSTEM_BT_TOOLS_MCAP_TOOL { /* Test MCAP Channel Configurations */ const tMCA_CHNL_CFG MCAP_TEST_CHANNEL_CONFIG = { .fcr_opt = { L2CAP_FCR_ERTM_MODE, MCA_FCR_OPT_TX_WINDOW_SIZE, /* Tx window size */ /* Maximum transmissions before disconnecting */ MCA_FCR_OPT_MAX_TX_B4_DISCNT, MCA_FCR_OPT_RETX_TOUT, /* retransmission timeout (2 secs) */ MCA_FCR_OPT_MONITOR_TOUT, /* Monitor timeout (12 secs) */ MCA_FCR_OPT_MPS_SIZE, /* MPS segment size */ }, .user_rx_buf_size = BT_DEFAULT_BUFFER_SIZE, .user_tx_buf_size = BT_DEFAULT_BUFFER_SIZE, .fcr_rx_buf_size = BT_DEFAULT_BUFFER_SIZE, .fcr_tx_buf_size = BT_DEFAULT_BUFFER_SIZE, .fcs = MCA_FCS_NONE, .data_mtu = 572 /* L2CAP MTU of the MCAP data channel */ }; const tMCA_CHNL_CFG* get_test_channel_config() { return &MCAP_TEST_CHANNEL_CONFIG; } McapMdl::McapMdl(btmcap_test_interface_t* mcap_test_interface, tMCA_CL mcl_handle, tMCA_DEP mdep_handle, uint16_t mdl_id, uint8_t dep_id, uint8_t cfg) { _mcap_test_interface = mcap_test_interface; _mcl_handle = mcl_handle; _mdep_handle = mdep_handle; _mdl_id = mdl_id; _dep_id = dep_id; _cfg = cfg; } bool McapMdl::UpdateContext(tMCA_DEP mdep_handle, uint8_t dep_id, uint8_t cfg) { if (!_mdl_handle) { LOG(ERROR) << "MDL handle not initialized"; } _mdep_handle = mdep_handle; _dep_id = dep_id; _cfg = cfg; tMCA_RESULT ret = _mcap_test_interface->close_mdl_request(_mdl_handle); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; if (ret != MCA_SUCCESS) return false; SetHandle(0); SetResponseCode(-1); SetMtu(0); return true; } bool McapMdl::Create(uint16_t data_psm, bool should_connect) { tMCA_RESULT ret = _mcap_test_interface->create_mdl_request( _mcl_handle, _mdep_handle, data_psm, _mdl_id, _dep_id, _cfg, should_connect ? &MCAP_TEST_CHANNEL_CONFIG : nullptr); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; return ret == MCA_SUCCESS; } bool McapMdl::Close() { if (!_mdl_handle) { LOG(ERROR) << "MDL handle not initialized"; return false; } tMCA_RESULT ret = _mcap_test_interface->close_mdl_request(_mdl_handle); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; return ret == MCA_SUCCESS; } bool McapMdl::Reconnect(uint16_t data_psm) { tMCA_RESULT ret = _mcap_test_interface->reconnect_mdl_request( _mcl_handle, _mdep_handle, data_psm, _mdl_id, &MCAP_TEST_CHANNEL_CONFIG); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; return ret == MCA_SUCCESS; } bool McapMdl::ReconnectResponse() { tMCA_RESULT ret = _mcap_test_interface->reconnect_mdl_response( _mcl_handle, _mdep_handle, _mdl_id, MCA_RSP_SUCCESS, &MCAP_TEST_CHANNEL_CONFIG); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; return ret == MCA_SUCCESS; } bool McapMdl::CreateResponse() { tMCA_RESULT ret = _mcap_test_interface->create_mdl_response( _mcl_handle, _dep_id, _mdl_id, _cfg, MCA_SUCCESS, &MCAP_TEST_CHANNEL_CONFIG); LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret; return ret == MCA_SUCCESS; } bool McapMdl::IsConnected() { return _mdl_handle > 0; } uint16_t McapMdl::GetId() { return _mdl_id; } int32_t McapMdl::GetResponseCode() { return _mdl_rsp_code; } void McapMdl::SetResponseCode(int32_t rsp_code) { _mdl_rsp_code = rsp_code; } void McapMdl::SetHandle(tMCA_DL mdl_handle) { _mdl_handle = mdl_handle; } tMCA_DL McapMdl::GetHandle() { return _mdl_handle; } void McapMdl::SetMtu(uint16_t mtu) { _data_mtu = mtu; } uint16_t McapMdl::GetMtu() { return _data_mtu; } } // namespace SYSTEM_BT_TOOLS_MCAP_TOOL