Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3420bc9 authored by jruthe's avatar jruthe Committed by android-build-merger
Browse files

test_vendor: Move SDU checks to L2capSdu

am: aab2816f

Change-Id: I71c55861389356e6cf83ac335cfb558d954c0b6a
parents 4204af9d aab2816f
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -53,18 +53,6 @@ class L2capPacket {
    return std::next(l2cap_packet_.begin(), kSduHeaderLength);
  }

  // Returns true if the SDU control sequence for Segmentation and
  // Reassembly is 00b, false otherwise.
  static bool check_if_only_sdu(const uint8_t bytes);

  // Returns true if the SDU control sequence for Segmentation and
  // Reassembly is 01b, false otherwise.
  static bool check_if_starting_sdu(const uint8_t bytes);

  // Returns true if the SDU control sequence for Segmentation and
  // Reasembly is 10b, false otherwise.
  static bool check_if_ending_sdu(const uint8_t bytes);

  DISALLOW_COPY_AND_ASSIGN(L2capPacket);
};  // L2capPacket

+12 −0
Original line number Diff line number Diff line
@@ -100,6 +100,18 @@ class L2capSdu {

  uint16_t get_channel_id() const;

  // Returns true if the SDU control sequence for Segmentation and
  // Reassembly is 00b, false otherwise.
  static bool is_complete_l2cap(const L2capSdu& sdu);

  // Returns true if the SDU control sequence for Segmentation and
  // Reassembly is 01b, false otherwise.
  static bool is_starting_sdu(const L2capSdu& sdu);

  // Returns true if the SDU control sequence for Segmentation and
  // Reasembly is 10b, false otherwise.
  static bool is_ending_sdu(const L2capSdu& sdu);

 private:
  // This is the SDU packet in bytes.
  std::vector<uint8_t> sdu_data_;
+7 −23
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@
namespace test_vendor_lib {

const int kL2capHeaderLength = 4;
const uint16_t kSduSarBits = 0xe000;
const uint16_t kSduTxSeqBits = 0x007e;
const int kSduStandardHeaderLength = 6;
const int kSduFirstHeaderLength = 8;
@@ -42,6 +41,9 @@ std::unique_ptr<L2capPacket> L2capPacket::assemble(
  if (sdu_packets.size() == 0) {
    return nullptr;
  }
  if (sdu_packets.size() == 1 && !L2capSdu::is_complete_l2cap(sdu_packets[0])) {
    return nullptr;
  }

  first_packet_channel_id = sdu_packets[0].get_channel_id();

@@ -69,9 +71,6 @@ std::unique_ptr<L2capPacket> L2capPacket::assemble(

    uint16_t controls = sdu_packets[i].get_controls();

    uint16_t continuation_bits = controls & kSduSarBits;
    continuation_bits = continuation_bits >> 12;

    if (sdu_packets[i].get_channel_id() != first_packet_channel_id) {
      return nullptr;
    }
@@ -87,28 +86,25 @@ std::unique_ptr<L2capPacket> L2capPacket::assemble(
    // set to 11b.
    uint16_t starting_index;
    uint8_t txseq = controls & kSduTxSeqBits;
    if (sdu_packets.size() == 1 && !check_if_only_sdu(continuation_bits)) {
      return nullptr;
    }
    if (sdu_packets.size() > 1 && i == 0 &&
        !check_if_starting_sdu(continuation_bits)) {
        !L2capSdu::is_starting_sdu(sdu_packets[i])) {
      return nullptr;
    }
    if (i != 0 && check_if_starting_sdu(continuation_bits)) {
    if (i != 0 && L2capSdu::is_starting_sdu(sdu_packets[i])) {
      return nullptr;
    }
    if (txseq != (txseq_start + (static_cast<uint8_t>(i) << 1))) {
      return nullptr;
    }
    if (sdu_packets.size() > 1 && i == sdu_packets.size() - 1 &&
        !check_if_ending_sdu(continuation_bits)) {
        !L2capSdu::is_ending_sdu(sdu_packets[i])) {
      return nullptr;
    }

    // Subtract the control and fcs from every SDU payload length.
    l2cap_payload_length += (payload_length - 4);

    if (check_if_starting_sdu(continuation_bits)) {
    if (L2capSdu::is_starting_sdu(sdu_packets[i])) {
      starting_index = kSduFirstHeaderLength;
      total_expected_l2cap_length = sdu_packets[i].get_total_l2cap_length();

@@ -155,16 +151,4 @@ uint16_t L2capPacket::get_l2cap_cid() const {
  return ((l2cap_packet_[3] << 8) | l2cap_packet_[2]);
}

bool L2capPacket::check_if_only_sdu(const uint8_t bits) {
  return ((bits & 0xc) == 0x0);
}

bool L2capPacket::check_if_starting_sdu(const uint8_t bits) {
  return ((bits & 0xc) == 0x4);
}

bool L2capPacket::check_if_ending_sdu(const uint8_t bits) {
  return ((bits & 0xc) == 0x8);
}

}  // namespace test_vendor_lib
+20 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@

namespace test_vendor_lib {

const uint16_t kSduSarBits = 0xe000;

// Define the LFSR table of precalculated values defined by the
// Bluetooth specification version 4.2 volume 3 part A section 3.3.5.
const uint16_t L2capSdu::lfsr_table_[256] = {
@@ -116,4 +118,22 @@ uint16_t L2capSdu::get_channel_id() const {

size_t L2capSdu::get_vector_size() const { return sdu_data_.size(); }

bool L2capSdu::is_complete_l2cap(const L2capSdu& sdu) {
  uint16_t sar_bits = (sdu.get_controls() & kSduSarBits);

  return (sar_bits == 0x0000);
}

bool L2capSdu::is_starting_sdu(const L2capSdu& sdu) {
  uint16_t sar_bits = (sdu.get_controls() & kSduSarBits);

  return (sar_bits == 0x4000);
}

bool L2capSdu::is_ending_sdu(const L2capSdu& sdu) {
  uint16_t sar_bits = (sdu.get_controls() & kSduSarBits);

  return (sar_bits == 0x8000);
}

}  // namespace test_vendor_lib