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