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
26using std::vector;
27
28namespace test_vendor_lib {
29
30Packet::Packet(serial_data_type_t type, vector<uint8_t> header)
31    : type_(type), header_(std::move(header)) {
32  payload_ = {0};
33}
34
35bool 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
46bool 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
63bool 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
73bool Packet::IncrementPayloadCounter(size_t index) {
74  if (payload_.size() < index - 1) return false;
75
76  payload_[index]++;
77  return true;
78}
79
80bool 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
89const vector<uint8_t>& Packet::GetHeader() const {
90  // Every packet must have a header.
91  CHECK(GetHeaderSize() > 0);
92  return header_;
93}
94
95uint8_t Packet::GetHeaderSize() const { return header_.size(); }
96
97size_t Packet::GetPacketSize() const {
98  // Add one for the type octet.
99  return 1 + header_.size() + payload_.size();
100}
101
102const vector<uint8_t>& Packet::GetPayload() const { return payload_; }
103
104size_t Packet::GetPayloadSize() const { return payload_.size(); }
105
106serial_data_type_t Packet::GetType() const { return type_; }
107
108}  // namespace test_vendor_lib
109