Loading system/vendor_libs/test_vendor_lib/include/l2cap_packet.h +0 −12 Original line number Diff line number Diff line Loading @@ -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 Loading system/vendor_libs/test_vendor_lib/include/l2cap_sdu.h +12 −0 Original line number Diff line number Diff line Loading @@ -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_; Loading system/vendor_libs/test_vendor_lib/src/l2cap_packet.cc +7 −23 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } Loading @@ -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(); Loading Loading @@ -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 system/vendor_libs/test_vendor_lib/src/l2cap_sdu.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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] = { Loading Loading @@ -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 Loading
system/vendor_libs/test_vendor_lib/include/l2cap_packet.h +0 −12 Original line number Diff line number Diff line Loading @@ -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 Loading
system/vendor_libs/test_vendor_lib/include/l2cap_sdu.h +12 −0 Original line number Diff line number Diff line Loading @@ -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_; Loading
system/vendor_libs/test_vendor_lib/src/l2cap_packet.cc +7 −23 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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; } Loading @@ -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(); Loading Loading @@ -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
system/vendor_libs/test_vendor_lib/src/l2cap_sdu.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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] = { Loading Loading @@ -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