/* * 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. */ #pragma once #include <vector> #include "mca_api.h" #include "mcap_test_mdl.h" namespace SYSTEM_BT_TOOLS_MCAP_TOOL { class McapMcl { public: /** * A controller for a MCAP Communication Link (MCL) * @param mcap_test_interface Underlining interface to Bluetooth stack * @param mcap_handle Parent application handle * @param peer_bd_addr Peer Bluetooth MAC address */ McapMcl(btmcap_test_interface_t* mcap_test_interface, tMCA_HANDLE mcap_handle, const RawAddress& peer_bd_addr); /** * Connect this MCL's control channel * @param ctrl_psm Control channel L2CAP PSM * @param sec_mask Security mask * @return True on success */ bool Connect(uint16_t ctrl_psm, uint16_t sec_mask); /** * Disconnect from control channel * @return */ bool Disconnect(); /** * Close this MCL connection * @return */ bool Close(); /** * Allocate an MCAP Data Link (MDL) object and save to this MCL object * @param mdep_handle MDEP handle for data, MDEP must be prior created * @param mdl_id Desired MDL ID, user supported * @param dep_id Peer MDEP ID * @param cfg Configuration flags * @return True on success */ McapMdl* AllocateMdl(tMCA_DEP mdep_handle, uint16_t mdl_id, uint8_t dep_id, uint8_t cfg); /** * Send CREATE_MDL message to peer device, will allocate an MDL if the MDL for * corresponding MDL ID was not allocated before * @param mdep_handle MDEP handle for data, MDEP must be prior created * @param data_psm Data channel L2CAP PSM * @param mdl_id Desired MDL ID, user supported * @param peer_dep_id Peer MDEP ID * @param cfg Configuration flags * @param should_connect whether we should connect L2CAP immediately * @return True on success */ bool CreateMdl(tMCA_DEP mdep_handle, uint16_t data_psm, uint16_t mdl_id, uint8_t peer_dep_id, uint8_t cfg, bool should_connect); /** * Configure data channel, unblock any pending MDL L2CAP connection requests * @return True on Success */ bool DataChannelConfig(); /** * Respond to CREATE_MDL message received from peer device, will allocate an * MDL if the MDL for corresponding MDL ID was not allocated before * @param mdep_handle MDEP handle for data, MDEP must be prior created * @param mdl_id Desired MDL ID, peer supported * @param my_dep_id My MDEP ID * @param cfg Configuration flags * @return True on success */ bool CreateMdlResponse(tMCA_DEP mdep_handle, uint16_t mdl_id, uint8_t my_dep_id, uint8_t cfg); /** * Send ABORT_MDL request, aborting all pending CREATE_MDL requests * @return */ bool AbortMdl(); /** * Send DELETE_MDL request to remote * @param mdl_id None zero value mdl_id, 0xFFFF for all remote MDLs * @return True on success */ bool DeleteMdl(uint16_t mdl_id); // Simple methods that are self-explanatory RawAddress& GetPeerAddress(); void SetHandle(tMCA_CL handle); tMCA_CL GetHandle() const; void SetMtu(uint16_t mtu); uint16_t GetMtu(); McapMdl* FindMdlById(uint16_t mdl_id); McapMdl* FindMdlByHandle(tMCA_DL mdl_handle); void RemoveAllMdl(); void RemoveMdl(uint16_t mdl_id); void ResetAllMdl(); void ResetMdl(uint16_t mdl_id); bool IsConnected(); int ConnectedMdlCount(); bool HasAvailableMdl(); private: // Initialized during start up btmcap_test_interface_t* _mcap_test_interface; tMCA_HANDLE _mcap_handle; RawAddress _peer_bd_addr; std::vector<McapMdl> _mdl_list; // Initialized later tMCA_CL _mcl_handle = 0; uint16_t _control_mtu = 0; }; } // namespace SYSTEM_BT_TOOLS_MCAP_TOOL