1 /*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include <base/logging.h>
17
18 #include "mca_defs.h"
19 #include "mcap_test_mdl.h"
20
21 namespace SYSTEM_BT_TOOLS_MCAP_TOOL {
22
23 /* Test MCAP Channel Configurations */
24 const tMCA_CHNL_CFG MCAP_TEST_CHANNEL_CONFIG = {
25 .fcr_opt =
26 {
27 L2CAP_FCR_ERTM_MODE,
28 MCA_FCR_OPT_TX_WINDOW_SIZE, /* Tx window size */
29 /* Maximum transmissions before disconnecting */
30 MCA_FCR_OPT_MAX_TX_B4_DISCNT,
31 MCA_FCR_OPT_RETX_TOUT, /* retransmission timeout (2 secs) */
32 MCA_FCR_OPT_MONITOR_TOUT, /* Monitor timeout (12 secs) */
33 MCA_FCR_OPT_MPS_SIZE, /* MPS segment size */
34 },
35 .user_rx_buf_size = BT_DEFAULT_BUFFER_SIZE,
36 .user_tx_buf_size = BT_DEFAULT_BUFFER_SIZE,
37 .fcr_rx_buf_size = BT_DEFAULT_BUFFER_SIZE,
38 .fcr_tx_buf_size = BT_DEFAULT_BUFFER_SIZE,
39 .fcs = MCA_FCS_NONE,
40 .data_mtu = 572 /* L2CAP MTU of the MCAP data channel */
41 };
42
get_test_channel_config()43 const tMCA_CHNL_CFG* get_test_channel_config() {
44 return &MCAP_TEST_CHANNEL_CONFIG;
45 }
46
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)47 McapMdl::McapMdl(btmcap_test_interface_t* mcap_test_interface,
48 tMCA_CL mcl_handle, tMCA_DEP mdep_handle, uint16_t mdl_id,
49 uint8_t dep_id, uint8_t cfg) {
50 _mcap_test_interface = mcap_test_interface;
51 _mcl_handle = mcl_handle;
52 _mdep_handle = mdep_handle;
53 _mdl_id = mdl_id;
54 _dep_id = dep_id;
55 _cfg = cfg;
56 }
57
UpdateContext(tMCA_DEP mdep_handle,uint8_t dep_id,uint8_t cfg)58 bool McapMdl::UpdateContext(tMCA_DEP mdep_handle, uint8_t dep_id, uint8_t cfg) {
59 if (!_mdl_handle) {
60 LOG(ERROR) << "MDL handle not initialized";
61 }
62 _mdep_handle = mdep_handle;
63 _dep_id = dep_id;
64 _cfg = cfg;
65 tMCA_RESULT ret = _mcap_test_interface->close_mdl_request(_mdl_handle);
66 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
67 if (ret != MCA_SUCCESS) return false;
68 SetHandle(0);
69 SetResponseCode(-1);
70 SetMtu(0);
71 return true;
72 }
73
Create(uint16_t data_psm,bool should_connect)74 bool McapMdl::Create(uint16_t data_psm, bool should_connect) {
75 tMCA_RESULT ret = _mcap_test_interface->create_mdl_request(
76 _mcl_handle, _mdep_handle, data_psm, _mdl_id, _dep_id, _cfg,
77 should_connect ? &MCAP_TEST_CHANNEL_CONFIG : nullptr);
78 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
79 return ret == MCA_SUCCESS;
80 }
81
Close()82 bool McapMdl::Close() {
83 if (!_mdl_handle) {
84 LOG(ERROR) << "MDL handle not initialized";
85 return false;
86 }
87 tMCA_RESULT ret = _mcap_test_interface->close_mdl_request(_mdl_handle);
88 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
89 return ret == MCA_SUCCESS;
90 }
91
Reconnect(uint16_t data_psm)92 bool McapMdl::Reconnect(uint16_t data_psm) {
93 tMCA_RESULT ret = _mcap_test_interface->reconnect_mdl_request(
94 _mcl_handle, _mdep_handle, data_psm, _mdl_id, &MCAP_TEST_CHANNEL_CONFIG);
95 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
96 return ret == MCA_SUCCESS;
97 }
98
ReconnectResponse()99 bool McapMdl::ReconnectResponse() {
100 tMCA_RESULT ret = _mcap_test_interface->reconnect_mdl_response(
101 _mcl_handle, _mdep_handle, _mdl_id, MCA_RSP_SUCCESS,
102 &MCAP_TEST_CHANNEL_CONFIG);
103 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
104 return ret == MCA_SUCCESS;
105 }
106
CreateResponse()107 bool McapMdl::CreateResponse() {
108 tMCA_RESULT ret = _mcap_test_interface->create_mdl_response(
109 _mcl_handle, _dep_id, _mdl_id, _cfg, MCA_SUCCESS,
110 &MCAP_TEST_CHANNEL_CONFIG);
111 LOG_IF(INFO, ret != MCA_SUCCESS) << "ret=" << (int)ret;
112 return ret == MCA_SUCCESS;
113 }
114
IsConnected()115 bool McapMdl::IsConnected() { return _mdl_handle > 0; }
116
GetId()117 uint16_t McapMdl::GetId() { return _mdl_id; }
118
GetResponseCode()119 int32_t McapMdl::GetResponseCode() { return _mdl_rsp_code; }
120
SetResponseCode(int32_t rsp_code)121 void McapMdl::SetResponseCode(int32_t rsp_code) { _mdl_rsp_code = rsp_code; }
122
SetHandle(tMCA_DL mdl_handle)123 void McapMdl::SetHandle(tMCA_DL mdl_handle) { _mdl_handle = mdl_handle; }
124
GetHandle()125 tMCA_DL McapMdl::GetHandle() { return _mdl_handle; }
126
SetMtu(uint16_t mtu)127 void McapMdl::SetMtu(uint16_t mtu) { _data_mtu = mtu; }
128
GetMtu()129 uint16_t McapMdl::GetMtu() { return _data_mtu; }
130
131 } // namespace SYSTEM_BT_TOOLS_MCAP_TOOL
132