Home | History | Annotate | Download | only in src
      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 
     17 #define LOG_TAG "acl_packet"
     18 
     19 #include "acl_packet.h"
     20 
     21 #include "base/logging.h"
     22 #include "osi/include/log.h"
     23 #include "stack/include/hcidefs.h"
     24 
     25 using std::vector;
     26 
     27 namespace test_vendor_lib {
     28 
     29 AclPacket::AclPacket(uint16_t channel,
     30                      AclPacket::PacketBoundaryFlags packet_boundary,
     31                      AclPacket::BroadcastFlags broadcast)
     32     : raw_packet_({static_cast<uint8_t>(channel & 0xff),
     33                    static_cast<uint8_t>(((channel >> 8) & 0x0f) |
     34                                         ((packet_boundary & 0x3) << 4) |
     35                                         (broadcast & 0x3) << 6),
     36                    0x00, 0x00}) {}
     37 
     38 void AclPacket::AddPayloadOctets(size_t octets, const vector<uint8_t>& bytes) {
     39   CHECK(bytes.size() == octets);
     40 
     41   raw_packet_.insert(raw_packet_.end(), bytes.begin(), bytes.end());
     42 
     43   raw_packet_[2] =
     44       static_cast<uint8_t>((raw_packet_.size() - kHeaderSize) & 0xff);
     45   raw_packet_[3] =
     46       static_cast<uint8_t>(((raw_packet_.size() - kHeaderSize) >> 8) & 0xff);
     47 }
     48 
     49 void AclPacket::AddPayloadOctets(size_t octets, uint64_t value) {
     50   vector<uint8_t> val_vector;
     51 
     52   uint64_t v = value;
     53 
     54   CHECK(octets <= sizeof(uint64_t));
     55 
     56   for (size_t i = 0; i < octets; i++) {
     57     val_vector.push_back(v & 0xff);
     58     v = v >> 8;
     59   }
     60 
     61   CHECK(v == 0);
     62 
     63   AddPayloadOctets(octets, val_vector);
     64 }
     65 
     66 size_t AclPacket::GetPacketSize() const { return raw_packet_.size(); }
     67 
     68 const std::vector<uint8_t>& AclPacket::GetPacket() const { return raw_packet_; }
     69 
     70 }  // namespace test_vendor_lib
     71