1// 2// Copyright 2015 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 17#pragma once 18 19#include <cstdint> 20#include <vector> 21 22#include "bt_address.h" 23#include "hci/include/hci_hal.h" 24 25namespace test_vendor_lib { 26 27const size_t kReservedZero = 0; 28 29// Abstract base class that is subclassed to provide type-specifc accessors on 30// data. Manages said data's memory and guarantees the data's persistence for IO 31// operations. 32class Packet { 33 public: 34 virtual ~Packet() = default; 35 36 // Returns the size in octets of the entire packet, which consists of the type 37 // octet, the header, and the payload. 38 size_t GetPacketSize() const; 39 40 const std::vector<uint8_t>& GetPayload() const; 41 42 size_t GetPayloadSize() const; 43 44 const std::vector<uint8_t>& GetHeader() const; 45 46 uint8_t GetHeaderSize() const; 47 48 serial_data_type_t GetType() const; 49 50 // Add |octets| bytes to the payload. Return true if: 51 // - the size of |bytes| is equal to |octets| and 52 // - the new size of the payload is still < |kMaxPacketOctets| 53 bool AddPayloadOctets(size_t octets, const std::vector<uint8_t>& bytes); 54 55 private: 56 // Add |octets| bytes to the payload. Return true if: 57 // - the value of |value| fits in |octets| bytes and 58 // - the new size of the payload is still < |kMaxPacketOctets| 59 bool AddPayloadOctets(size_t octets, uint64_t value); 60 61 public: 62 // Add type-checking versions 63 bool AddPayloadOctets1(uint8_t value) { return AddPayloadOctets(1, value); } 64 bool AddPayloadOctets2(uint16_t value) { return AddPayloadOctets(2, value); } 65 bool AddPayloadOctets3(uint32_t value) { return AddPayloadOctets(3, value); } 66 bool AddPayloadOctets4(uint32_t value) { return AddPayloadOctets(4, value); } 67 bool AddPayloadOctets6(uint64_t value) { return AddPayloadOctets(6, value); } 68 bool AddPayloadOctets8(uint64_t value) { return AddPayloadOctets(8, value); } 69 70 // Add |address| to the payload. Return true if: 71 // - the new size of the payload is still < |kMaxPacketOctets| 72 bool AddPayloadBtAddress(const BtAddress& address); 73 74 protected: 75 // Constructs an empty packet of type |type| and header |header| 76 Packet(serial_data_type_t type, std::vector<uint8_t> header); 77 78 bool IncrementPayloadCounter(size_t index); 79 bool IncrementPayloadCounter(size_t index, uint8_t max_val); 80 81 private: 82 const size_t kMaxPacketOctets = 256; // Includes the Octet count 83 84 // Underlying containers for storing the actual packet 85 86 // The packet type is one of DATA_TYPE_ACL, DATA_TYPE_COMMAND, 87 // DATA_TYPE_EVENT, or DATA_TYPE_SCO. 88 serial_data_type_t type_; 89 90 std::vector<uint8_t> header_; 91 92 std::vector<uint8_t> payload_; 93}; 94 95} // namespace test_vendor_lib 96