Home | History | Annotate | Download | only in mcap_tool
      1 /*
      2  * Copyright 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 #pragma once
     17 
     18 #include <vector>
     19 
     20 #include "mca_api.h"
     21 #include "mcap_test_mdl.h"
     22 
     23 namespace SYSTEM_BT_TOOLS_MCAP_TOOL {
     24 
     25 class McapMcl {
     26  public:
     27   /**
     28    * A controller for a MCAP Communication Link (MCL)
     29    * @param mcap_test_interface Underlining interface to Bluetooth stack
     30    * @param mcap_handle Parent application handle
     31    * @param peer_bd_addr Peer Bluetooth MAC address
     32    */
     33   McapMcl(btmcap_test_interface_t* mcap_test_interface, tMCA_HANDLE mcap_handle,
     34           const RawAddress& peer_bd_addr);
     35   /**
     36    * Connect this MCL's control channel
     37    * @param ctrl_psm Control channel L2CAP PSM
     38    * @param sec_mask Security mask
     39    * @return True on success
     40    */
     41   bool Connect(uint16_t ctrl_psm, uint16_t sec_mask);
     42   /**
     43    * Disconnect from control channel
     44    * @return
     45    */
     46   bool Disconnect();
     47   /**
     48    * Close this MCL connection
     49    * @return
     50    */
     51   bool Close();
     52   /**
     53    * Allocate an MCAP Data Link (MDL) object and save to this MCL object
     54    * @param mdep_handle MDEP handle for data, MDEP must be prior created
     55    * @param mdl_id Desired MDL ID, user supported
     56    * @param dep_id Peer MDEP ID
     57    * @param cfg Configuration flags
     58    * @return True on success
     59    */
     60   McapMdl* AllocateMdl(tMCA_DEP mdep_handle, uint16_t mdl_id, uint8_t dep_id,
     61                        uint8_t cfg);
     62   /**
     63    * Send CREATE_MDL message to peer device, will allocate an MDL if the MDL for
     64    * corresponding MDL ID was not allocated before
     65    * @param mdep_handle MDEP handle for data, MDEP must be prior created
     66    * @param data_psm Data channel L2CAP PSM
     67    * @param mdl_id Desired MDL ID, user supported
     68    * @param peer_dep_id Peer MDEP ID
     69    * @param cfg Configuration flags
     70    * @param should_connect whether we should connect L2CAP immediately
     71    * @return True on success
     72    */
     73   bool CreateMdl(tMCA_DEP mdep_handle, uint16_t data_psm, uint16_t mdl_id,
     74                  uint8_t peer_dep_id, uint8_t cfg, bool should_connect);
     75   /**
     76    * Configure data channel, unblock any pending MDL L2CAP connection requests
     77    * @return True on Success
     78    */
     79   bool DataChannelConfig();
     80   /**
     81    * Respond to CREATE_MDL message received from peer device, will allocate an
     82    * MDL if the MDL for corresponding MDL ID was not allocated before
     83    * @param mdep_handle MDEP handle for data, MDEP must be prior created
     84    * @param mdl_id Desired MDL ID, peer supported
     85    * @param my_dep_id My MDEP ID
     86    * @param cfg Configuration flags
     87    * @return True on success
     88    */
     89   bool CreateMdlResponse(tMCA_DEP mdep_handle, uint16_t mdl_id,
     90                          uint8_t my_dep_id, uint8_t cfg);
     91   /**
     92    * Send ABORT_MDL request, aborting all pending CREATE_MDL requests
     93    * @return
     94    */
     95   bool AbortMdl();
     96   /**
     97    * Send DELETE_MDL request to remote
     98    * @param mdl_id None zero value mdl_id, 0xFFFF for all remote MDLs
     99    * @return True on success
    100    */
    101   bool DeleteMdl(uint16_t mdl_id);
    102   // Simple methods that are self-explanatory
    103   RawAddress& GetPeerAddress();
    104   void SetHandle(tMCA_CL handle);
    105   tMCA_CL GetHandle() const;
    106   void SetMtu(uint16_t mtu);
    107   uint16_t GetMtu();
    108   McapMdl* FindMdlById(uint16_t mdl_id);
    109   McapMdl* FindMdlByHandle(tMCA_DL mdl_handle);
    110   void RemoveAllMdl();
    111   void RemoveMdl(uint16_t mdl_id);
    112   void ResetAllMdl();
    113   void ResetMdl(uint16_t mdl_id);
    114   bool IsConnected();
    115   int ConnectedMdlCount();
    116   bool HasAvailableMdl();
    117 
    118  private:
    119   // Initialized during start up
    120   btmcap_test_interface_t* _mcap_test_interface;
    121   tMCA_HANDLE _mcap_handle;
    122   RawAddress _peer_bd_addr;
    123   std::vector<McapMdl> _mdl_list;
    124 
    125   // Initialized later
    126   tMCA_CL _mcl_handle = 0;
    127   uint16_t _control_mtu = 0;
    128 };
    129 
    130 }  // namespace SYSTEM_BT_TOOLS_MCAP_TOOL
    131