/****************************************************************************** * * Copyright 2018 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 <gmock/gmock.h> #include "bt_types.h" namespace bluetooth { namespace rfcomm { class RfcommCallback { public: virtual void PortManagementCallback(uint32_t code, uint16_t port_handle, uint16_t callback_index) = 0; virtual void PortEventCallback(uint32_t code, uint16_t port_handle, uint16_t callback_index) = 0; virtual ~RfcommCallback() = default; }; class MockRfcommCallback : public RfcommCallback { public: MOCK_METHOD3(PortManagementCallback, void(uint32_t code, uint16_t port_handle, uint16_t callback_index)); MOCK_METHOD3(PortEventCallback, void(uint32_t code, uint16_t port_handle, uint16_t callback_index)); }; /** * Create DLCI using direction of service channel number * * @param on_originator_side is this a channel on initiator side * @param scn service channel number * @return DLCI */ uint8_t GetDlci(bool on_originator_side, uint8_t scn); /** * Create address field in RFCOMM packet * * @param ea end of field byte, true if field only has 1 byte, false otherwise * @param cr command and response bit, true if packet is from initiator, * false otherwise, not actual "command" and "response" * @param dlci DLCI of this pcaket, RFCOMM_MX_DLCI for multiplexer control * @return address field */ uint8_t GetAddressField(bool ea, bool cr, uint8_t dlci); /** * Create control field in RFCOMM packet * * @param pf Poll/Finish bit, normally 1 for multiplexer control channel * @param frame_type frame type * @return control field */ uint8_t GetControlField(bool pf, uint8_t frame_type); /** * Create Multiplexer control channel parameter negotiation frame * * @param dlci DLCI to be configured * @param i_bits i bits * @param cl_bits cl bits * @param priority priority * @param timer_value timer value * @param rfcomm_mtu rfcomm mtu * @param max_num_retransmission maximum number of retransmission * @param err_recovery_window_k error recovery window k * @return vector of bytes of this frame */ std::vector<uint8_t> CreateMccPnFrame(uint8_t dlci, uint8_t i_bits, uint8_t cl_bits, uint8_t priority, uint8_t timer_value, uint16_t rfcomm_mtu, uint8_t max_num_retransmission, uint8_t err_recovery_window_k); /** * Create Multiplexer Control Modem Status Configuration Frame * * @param dlci DLCI to be configured * @param fc flow control * @param rtc ready to communicate * @param rtr ready to receive * @param ic incoming call indicator * @param dv is data valid * @return vector of bytes */ std::vector<uint8_t> CreateMccMscFrame(uint8_t dlci, bool fc, bool rtc, bool rtr, bool ic, bool dv); /** * Create Multiplexer Control Frame * * @param command_type type of command * @param cr command or response flag, true when this is a command, false when * this is a response, regardless of connection direction * @param data frame data * @return vector of bytes */ std::vector<uint8_t> CreateMultiplexerControlFrame( uint8_t command_type, bool cr, const std::vector<uint8_t>& data); /** * Create a general RFCOMM packet * * @param address address byte * @param control control byte * @param credits number of credits, <= 0 will cause this to be ignored * @param data frame data * @return vector of bytes */ std::vector<uint8_t> CreateRfcommPacket(uint8_t address, uint8_t control, int credits, const std::vector<uint8_t>& data); /* * Various shortcut for getting frequently used packets */ /** * Create SABM packet that is used to connect to a service channel number in a * multiplexer * * @param dlci DLCI to be connected * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickSabmPacket(uint8_t dlci, uint16_t l2cap_lcid, uint16_t acl_handle); /** * Create UA packet that is used to acknowledge service channel connection * * @param dlci DLCI to be connected * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickUaPacket(uint8_t dlci, uint16_t l2cap_lcid, uint16_t acl_handle); /** * Create parameter negotiation packet used to setup parameters for a DLCI * * @param rfc_cr RFCOMM command/response bit, true of initiator * @param target_dlci DLCI to be configured * @param mx_cr multiplexer command or reponse, regardless of initiator * @param rfc_mtu RFCOMM mtu to be used for DLCI * @param cl CL bit * @param priority prirority * @param k error recovery window k * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickPnPacket(bool rfc_cr, uint8_t target_dlci, bool mx_cr, uint16_t rfc_mtu, uint8_t cl, uint8_t priority, uint8_t k, uint16_t l2cap_lcid, uint16_t acl_handle); /** * Create modem signal control packet * * @param rfc_cr RFCOMM command/response bit, true of initiator * @param dlci DLCI to be configured * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @param mx_cr multiplexer command or reponse, regardless of initiator * @param fc flow control * @param rtc ready to communicate * @param rtr ready to receive * @param ic incoming call indicator * @param dv data valid * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickMscPacket(bool rfc_cr, uint8_t dlci, uint16_t l2cap_lcid, uint16_t acl_handle, bool mx_cr, bool fc, bool rtc, bool rtr, bool ic, bool dv); /** * Create a quick RFCOMM data packet * * @param dlci DLCI of this packet * @param cr command or control, true for initiator * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @param credits number of credits * @param data data bytes * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickDataPacket(uint8_t dlci, bool cr, uint16_t l2cap_lcid, uint16_t acl_handle, int credits, const std::vector<uint8_t>& data); /** * Create a quick RFCOMM data packet * * @param dlci DLCI of this packet * @param cr command or control, true for initiator * @param l2cap_lcid L2CAP channel ID * @param acl_handle ACL handle * @param credits number of credits * @param str message in string format * @return vector of bytes of unwrapped ACL packet */ std::vector<uint8_t> CreateQuickDataPacket(uint8_t dlci, bool cr, uint16_t l2cap_lcid, uint16_t acl_handle, int credits, const std::string& str); } // namespace rfcomm } // namespace bluetooth