Merge "SecurityManager: Don't use iterator after erase()"
diff --git a/gd/Android.bp b/gd/Android.bp
index 46108c6..9145772 100644
--- a/gd/Android.bp
+++ b/gd/Android.bp
@@ -618,13 +618,12 @@
   allow_undefined_symbols: true,
 }
 
-cc_library{
+cc_library_host_shared{
   name: "bluetooth_packets_python3",
   defaults: [
     "gd_defaults",
     "bluetooth_py3_native_extension_defaults"
   ],
-  host_supported: true,
   srcs: [
     "packet/python3_module.cc",
     "l2cap/fcs.cc",
diff --git a/gd/hci/hci_packets.pdl b/gd/hci/hci_packets.pdl
index e3ee19e..da4b9cd 100644
--- a/gd/hci/hci_packets.pdl
+++ b/gd/hci/hci_packets.pdl
@@ -2276,7 +2276,7 @@
 packet LeSetAdvertisingData : LeAdvertisingCommand (op_code = LE_SET_ADVERTISING_DATA) {
   _size_(advertising_data) : 8,
   advertising_data : GapData[],
-  _padding_[31], // Zero padding to 31 bytes of advertising_data
+  _padding_[35], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size
 }
 
 packet LeSetAdvertisingDataComplete : CommandComplete (command_op_code = LE_SET_ADVERTISING_DATA) {
@@ -2286,7 +2286,7 @@
 packet LeSetScanResponseData : LeAdvertisingCommand (op_code = LE_SET_SCAN_RESPONSE_DATA) {
   _size_(advertising_data) : 8,
   advertising_data : GapData[],
-  _padding_[31], // Zero padding to 31 bytes of advertising_data
+  _padding_[35], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size
 }
 
 packet LeSetScanResponseDataComplete : CommandComplete (command_op_code = LE_SET_SCAN_RESPONSE_DATA) {
@@ -3016,7 +3016,7 @@
 packet LeMultiAdvtSetData : LeMultiAdvt (sub_cmd = SET_DATA) {
   _size_(advertising_data) : 8,
   advertising_data : GapData[],
-  _padding_[31], // Zero padding to 31 bytes of advertising_data
+  _padding_[36], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size + 1 set
   advertising_instance : 8,
 }
 
@@ -3026,7 +3026,7 @@
 packet LeMultiAdvtSetScanResp : LeMultiAdvt (sub_cmd = SET_SCAN_RESP) {
   _size_(advertising_data) : 8,
   advertising_data : GapData[],
-  _padding_[31], // Zero padding to 31 bytes of advertising_data
+  _padding_[36], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size + 1 set
   advertising_instance : 8,
 }
 
diff --git a/gd/hci/hci_packets_test.cc b/gd/hci/hci_packets_test.cc
index 48a929c..7876f21 100644
--- a/gd/hci/hci_packets_test.cc
+++ b/gd/hci/hci_packets_test.cc
@@ -594,5 +594,81 @@
 DEFINE_AND_INSTANTIATE_LeSetExtendedAdvertisingEnableCompleteReflectionTest(
     le_set_extended_advertising_enable_complete);
 
+TEST(HciPacketsTest, testLeSetAdvertisingDataBuilderLength) {
+  GapData gap_data;
+  gap_data.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
+  gap_data.data_ = std::vector<uint8_t>({'A', ' ', 'g', 'o', 'o', 'd', ' ', 'n', 'a', 'm', 'e'});
+  auto builder = LeSetAdvertisingDataBuilder::Create({gap_data});
+  ASSERT_EQ(2 /*opcode*/ + 1 /* parameter size */ + 1 /* data_length */ + 31 /* data */, builder->size());
+
+  auto packet_bytes = std::make_shared<std::vector<uint8_t>>();
+  packet_bytes->reserve(builder->size());
+  BitInserter bit_inserter(*packet_bytes);
+  builder->Serialize(bit_inserter);
+  auto command_view = LeAdvertisingCommandView::Create(CommandPacketView::Create(packet_bytes));
+  ASSERT(command_view.IsValid());
+  ASSERT_EQ(1 /* data_length */ + 31 /* data */, command_view.GetPayload().size());
+  auto view = LeSetAdvertisingDataView::Create(command_view);
+  ASSERT(view.IsValid());
+}
+
+TEST(HciPacketsTest, testLeSetScanResponseDataBuilderLength) {
+  GapData gap_data;
+  gap_data.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
+  gap_data.data_ = std::vector<uint8_t>({'A', ' ', 'g', 'o', 'o', 'd', ' ', 'n', 'a', 'm', 'e'});
+  auto builder = LeSetScanResponseDataBuilder::Create({gap_data});
+  ASSERT_EQ(2 /*opcode*/ + 1 /* parameter size */ + 1 /*data_length */ + 31 /* data */, builder->size());
+
+  auto packet_bytes = std::make_shared<std::vector<uint8_t>>();
+  packet_bytes->reserve(builder->size());
+  BitInserter bit_inserter(*packet_bytes);
+  builder->Serialize(bit_inserter);
+  auto command_view = LeAdvertisingCommandView::Create(CommandPacketView::Create(packet_bytes));
+  ASSERT(command_view.IsValid());
+  ASSERT_EQ(1 /* data_length */ + 31 /* data */, command_view.GetPayload().size());
+  auto view = LeSetScanResponseDataView::Create(command_view);
+  ASSERT(view.IsValid());
+}
+
+TEST(HciPacketsTest, testLeMultiAdvSetAdvertisingDataBuilderLength) {
+  GapData gap_data;
+  gap_data.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
+  gap_data.data_ = std::vector<uint8_t>({'A', ' ', 'g', 'o', 'o', 'd', ' ', 'n', 'a', 'm', 'e'});
+  uint8_t set = 3;
+  auto builder = LeMultiAdvtSetDataBuilder::Create({gap_data}, set);
+  ASSERT_EQ(2 /*opcode*/ + 1 /* parameter size */ + 1 /* data_length */ + 31 /* data */ + 1 /* set */, builder->size());
+
+  auto packet_bytes = std::make_shared<std::vector<uint8_t>>();
+  packet_bytes->reserve(builder->size());
+  BitInserter bit_inserter(*packet_bytes);
+  builder->Serialize(bit_inserter);
+  auto command_view =
+      LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(CommandPacketView::Create(packet_bytes)));
+  ASSERT(command_view.IsValid());
+  EXPECT_EQ(1 /* data_length */ + 31 /* data */ + 1 /* set */, command_view.GetPayload().size());
+  auto view = LeMultiAdvtSetDataView::Create(command_view);
+  ASSERT(view.IsValid());
+}
+
+TEST(HciPacketsTest, testLeMultiAdvSetScanResponseDataBuilderLength) {
+  GapData gap_data;
+  gap_data.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
+  gap_data.data_ = std::vector<uint8_t>({'A', ' ', 'g', 'o', 'o', 'd', ' ', 'n', 'a', 'm', 'e'});
+  uint8_t set = 3;
+  auto builder = LeMultiAdvtSetScanRespBuilder::Create({gap_data}, set);
+  EXPECT_EQ(2 /*opcode*/ + 1 /* parameter size */ + 1 /*data_length */ + 31 /* data */ + 1 /* set */, builder->size());
+
+  auto packet_bytes = std::make_shared<std::vector<uint8_t>>();
+  packet_bytes->reserve(builder->size());
+  BitInserter bit_inserter(*packet_bytes);
+  builder->Serialize(bit_inserter);
+  auto command_view =
+      LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(CommandPacketView::Create(packet_bytes)));
+  ASSERT(command_view.IsValid());
+  ASSERT_EQ(1 /* data_length */ + 31 /* data */ + 1 /* set */, command_view.GetPayload().size());
+  auto view = LeMultiAdvtSetScanRespView::Create(command_view);
+  ASSERT(view.IsValid());
+}
+
 }  // namespace hci
 }  // namespace bluetooth