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 #define LOG_TAG "packet"
18 
19 #include "packet.h"
20 
21 #include <algorithm>
22 
23 #include <base/logging.h>
24 #include "osi/include/log.h"
25 
26 using std::vector;
27 
28 namespace test_vendor_lib {
29 
Packet(serial_data_type_t type,vector<uint8_t> header)30 Packet::Packet(serial_data_type_t type, vector<uint8_t> header)
31     : type_(type), header_(std::move(header)) {
32   payload_ = {0};
33 }
34 
AddPayloadOctets(size_t octets,const vector<uint8_t> & bytes)35 bool Packet::AddPayloadOctets(size_t octets, const vector<uint8_t>& bytes) {
36   if (octets + payload_.size() > kMaxPacketOctets) return false;
37 
38   if (octets != bytes.size()) return false;
39 
40   payload_.insert(payload_.end(), bytes.begin(), bytes.end());
41   payload_[0] = payload_.size() - 1;
42 
43   return true;
44 }
45 
AddPayloadOctets(size_t octets,uint64_t value)46 bool Packet::AddPayloadOctets(size_t octets, uint64_t value) {
47   vector<uint8_t> val_vector;
48 
49   uint64_t v = value;
50 
51   if (octets > sizeof(uint64_t)) return false;
52 
53   for (size_t i = 0; i < octets; i++) {
54     val_vector.push_back(v & 0xff);
55     v = v >> 8;
56   }
57 
58   if (v != 0) return false;
59 
60   return AddPayloadOctets(octets, val_vector);
61 }
62 
AddPayloadBtAddress(const BtAddress & address)63 bool Packet::AddPayloadBtAddress(const BtAddress& address) {
64   if (BtAddress::kOctets + payload_.size() > kMaxPacketOctets) return false;
65 
66   address.ToVector(payload_);
67 
68   payload_[0] = payload_.size() - 1;
69 
70   return true;
71 }
72 
IncrementPayloadCounter(size_t index)73 bool Packet::IncrementPayloadCounter(size_t index) {
74   if (payload_.size() < index - 1) return false;
75 
76   payload_[index]++;
77   return true;
78 }
79 
IncrementPayloadCounter(size_t index,uint8_t max_val)80 bool Packet::IncrementPayloadCounter(size_t index, uint8_t max_val) {
81   if (payload_.size() < index - 1) return false;
82 
83   if (payload_[index] + 1 > max_val) return false;
84 
85   payload_[index]++;
86   return true;
87 }
88 
GetHeader() const89 const vector<uint8_t>& Packet::GetHeader() const {
90   // Every packet must have a header.
91   CHECK(GetHeaderSize() > 0);
92   return header_;
93 }
94 
GetHeaderSize() const95 uint8_t Packet::GetHeaderSize() const { return header_.size(); }
96 
GetPacketSize() const97 size_t Packet::GetPacketSize() const {
98   // Add one for the type octet.
99   return 1 + header_.size() + payload_.size();
100 }
101 
GetPayload() const102 const vector<uint8_t>& Packet::GetPayload() const { return payload_; }
103 
GetPayloadSize() const104 size_t Packet::GetPayloadSize() const { return payload_.size(); }
105 
GetType() const106 serial_data_type_t Packet::GetType() const { return type_; }
107 
108 }  // namespace test_vendor_lib
109