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

Commit b151f31f authored by Rongxuan Liu's avatar Rongxuan Liu
Browse files

Remove released flag divide_long_single_gap_data

Test: atest bluetooth_test_gd_unit
Bug: 310217895
Bug: 303546333
Change-Id: Icf7d6b352d66baee500182ec1d49785d3b817637
parent 048a3931
Loading
Loading
Loading
Loading
+0 −7
Original line number Original line Diff line number Diff line
@@ -8,13 +8,6 @@ flag {
    bug: "308855997"
    bug: "308855997"
}
}


flag {
    name: "divide_long_single_gap_data"
    namespace: "bluetooth"
    description: "Divide long single gap data if length is longer than HCI data length limit"
    bug: "310217895"
}

flag {
flag {
    name: "fix_nonconnectable_scannable_advertisement"
    name: "fix_nonconnectable_scannable_advertisement"
    namespace: "bluetooth"
    namespace: "bluetooth"
+73 −163
Original line number Original line Diff line number Diff line
@@ -955,13 +955,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb


  bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) {
  bool check_extended_advertising_data(std::vector<GapData> data, bool include_flag) {
    uint16_t data_len = 0;
    uint16_t data_len = 0;
    uint16_t data_limit = com::android::bluetooth::flags::divide_long_single_gap_data()
                              ? kLeMaximumGapDataLength
                              : kLeMaximumFragmentLength;
    // check data size
    // check data size
    for (size_t i = 0; i < data.size(); i++) {
    for (size_t i = 0; i < data.size(); i++) {
      if (data[i].size() > data_limit) {
      if (data[i].size() > kLeMaximumGapDataLength) {
        log::warn("AD data len shall not greater than {}", data_limit);
        log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength);
        return false;
        return false;
      }
      }
      data_len += data[i].size();
      data_len += data[i].size();
@@ -1053,13 +1050,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
      } break;
      } break;
      case (AdvertisingApiType::EXTENDED): {
      case (AdvertisingApiType::EXTENDED): {
        uint16_t data_len = 0;
        uint16_t data_len = 0;
        bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data();
        // check data size
        // check data size
        for (size_t i = 0; i < data.size(); i++) {
        for (size_t i = 0; i < data.size(); i++) {
          uint16_t data_limit =
          if (data[i].size() > kLeMaximumGapDataLength) {
              divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength;
            log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength);
          if (data[i].size() > data_limit) {
            log::warn("AD data len shall not greater than {}", data_limit);
            if (advertising_callbacks_ != nullptr) {
            if (advertising_callbacks_ != nullptr) {
              if (set_scan_rsp) {
              if (set_scan_rsp) {
                advertising_callbacks_->OnScanResponseDataSet(
                advertising_callbacks_->OnScanResponseDataSet(
@@ -1101,7 +1095,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
          uint16_t sub_data_len = 0;
          uint16_t sub_data_len = 0;
          Operation operation = Operation::FIRST_FRAGMENT;
          Operation operation = Operation::FIRST_FRAGMENT;


          if (divide_gap_flag) {
          std::vector<std::unique_ptr<packet::RawBuilder>> fragments;
          std::vector<std::unique_ptr<packet::RawBuilder>> fragments;
          packet::FragmentingInserter it(
          packet::FragmentingInserter it(
              kLeMaximumFragmentLength, std::back_insert_iterator(fragments));
              kLeMaximumFragmentLength, std::back_insert_iterator(fragments));
@@ -1118,27 +1111,16 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
                (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation);
                (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation);
            operation = Operation::INTERMEDIATE_FRAGMENT;
            operation = Operation::INTERMEDIATE_FRAGMENT;
          }
          }
          } else {
            for (size_t i = 0; i < data.size(); i++) {
              if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) {
                send_data_fragment(advertiser_id, set_scan_rsp, sub_data, operation);
                operation = Operation::INTERMEDIATE_FRAGMENT;
                sub_data_len = 0;
                sub_data.clear();
              }
              sub_data.push_back(data[i]);
              sub_data_len += data[i].size();
            }
            send_data_fragment(advertiser_id, set_scan_rsp, sub_data, Operation::LAST_FRAGMENT);
          }
        }
        }
      } break;
      } break;
    }
    }
  }
  }


  void send_data_fragment(
  void send_data_fragment(
      AdvertiserId advertiser_id, bool set_scan_rsp, std::vector<GapData> data, Operation operation) {
      AdvertiserId advertiser_id,
    if (com::android::bluetooth::flags::divide_long_single_gap_data()) {
      bool set_scan_rsp,
      std::vector<GapData> data,
      Operation operation) {
    // For first and intermediate fragment, do not trigger advertising_callbacks_.
    // For first and intermediate fragment, do not trigger advertising_callbacks_.
    bool send_callback =
    bool send_callback =
        (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT);
        (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT);
@@ -1161,42 +1143,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
              send_callback,
              send_callback,
              advertiser_id));
              advertiser_id));
    }
    }
    } else {
      if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) {
        if (set_scan_rsp) {
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetExtendedScanResponseDataBuilder::Create(
                  advertiser_id, operation, kFragment_preference, data),
              module_handler_->BindOnceOn(
                  this,
                  &impl::check_status_with_id<LeSetExtendedScanResponseDataCompleteView>,
                  true,
                  advertiser_id));
        } else {
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetExtendedAdvertisingDataBuilder::Create(
                  advertiser_id, operation, kFragment_preference, data),
              module_handler_->BindOnceOn(
                  this,
                  &impl::check_status_with_id<LeSetExtendedAdvertisingDataCompleteView>,
                  true,
                  advertiser_id));
        }
      } else {
        // For first and intermediate fragment, do not trigger advertising_callbacks_.
        if (set_scan_rsp) {
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetExtendedScanResponseDataBuilder::Create(
                  advertiser_id, operation, kFragment_preference, data),
              module_handler_->BindOnce(check_complete<LeSetExtendedScanResponseDataCompleteView>));
        } else {
          le_advertising_interface_->EnqueueCommand(
              hci::LeSetExtendedAdvertisingDataBuilder::Create(
                  advertiser_id, operation, kFragment_preference, data),
              module_handler_->BindOnce(check_complete<LeSetExtendedAdvertisingDataCompleteView>));
        }
      }
    }
  }
  }


  void send_data_fragment_with_raw_builder(
  void send_data_fragment_with_raw_builder(
@@ -1315,12 +1261,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb


  void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) {
  void set_periodic_data(AdvertiserId advertiser_id, std::vector<GapData> data) {
    uint16_t data_len = 0;
    uint16_t data_len = 0;
    bool divide_gap_flag = com::android::bluetooth::flags::divide_long_single_gap_data();
    // check data size
    // check data size
    for (size_t i = 0; i < data.size(); i++) {
    for (size_t i = 0; i < data.size(); i++) {
      uint16_t data_limit = divide_gap_flag ? kLeMaximumGapDataLength : kLeMaximumFragmentLength;
      if (data[i].size() > kLeMaximumGapDataLength) {
      if (data[i].size() > data_limit) {
        log::warn("AD data len shall not greater than {}", kLeMaximumGapDataLength);
        log::warn("AD data len shall not greater than {}", data_limit);
        if (advertising_callbacks_ != nullptr) {
        if (advertising_callbacks_ != nullptr) {
          advertising_callbacks_->OnPeriodicAdvertisingDataSet(
          advertising_callbacks_->OnPeriodicAdvertisingDataSet(
              advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR);
              advertiser_id, AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR);
@@ -1341,16 +1285,13 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
      return;
      return;
    }
    }


    uint16_t data_fragment_limit =
    if (data_len <= kLeMaximumPeriodicDataFragmentLength) {
        divide_gap_flag ? kLeMaximumPeriodicDataFragmentLength : kLeMaximumFragmentLength;
    if (data_len <= data_fragment_limit) {
      send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT);
      send_periodic_data_fragment(advertiser_id, data, Operation::COMPLETE_ADVERTISEMENT);
    } else {
    } else {
      std::vector<GapData> sub_data;
      std::vector<GapData> sub_data;
      uint16_t sub_data_len = 0;
      uint16_t sub_data_len = 0;
      Operation operation = Operation::FIRST_FRAGMENT;
      Operation operation = Operation::FIRST_FRAGMENT;


      if (divide_gap_flag) {
      std::vector<std::unique_ptr<packet::RawBuilder>> fragments;
      std::vector<std::unique_ptr<packet::RawBuilder>> fragments;
      packet::FragmentingInserter it(
      packet::FragmentingInserter it(
          kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments));
          kLeMaximumPeriodicDataFragmentLength, std::back_insert_iterator(fragments));
@@ -1366,24 +1307,11 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
            (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation);
            (i == fragments.size() - 1) ? Operation::LAST_FRAGMENT : operation);
        operation = Operation::INTERMEDIATE_FRAGMENT;
        operation = Operation::INTERMEDIATE_FRAGMENT;
      }
      }
      } else {
        for (size_t i = 0; i < data.size(); i++) {
          if (sub_data_len + data[i].size() > kLeMaximumFragmentLength) {
            send_periodic_data_fragment(advertiser_id, sub_data, operation);
            operation = Operation::INTERMEDIATE_FRAGMENT;
            sub_data_len = 0;
            sub_data.clear();
          }
          sub_data.push_back(data[i]);
          sub_data_len += data[i].size();
        }
        send_periodic_data_fragment(advertiser_id, sub_data, Operation::LAST_FRAGMENT);
      }
    }
    }
  }
  }


  void send_periodic_data_fragment(AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) {
  void send_periodic_data_fragment(
    if (com::android::bluetooth::flags::divide_long_single_gap_data()) {
      AdvertiserId advertiser_id, std::vector<GapData> data, Operation operation) {
    // For first and intermediate fragment, do not trigger advertising_callbacks_.
    // For first and intermediate fragment, do not trigger advertising_callbacks_.
    bool send_callback =
    bool send_callback =
        (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT);
        (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT);
@@ -1394,22 +1322,6 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
            &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>,
            &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>,
            send_callback,
            send_callback,
            advertiser_id));
            advertiser_id));
    } else {
      if (operation == Operation::COMPLETE_ADVERTISEMENT || operation == Operation::LAST_FRAGMENT) {
        le_advertising_interface_->EnqueueCommand(
            hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data),
            module_handler_->BindOnceOn(
                this,
                &impl::check_status_with_id<LeSetPeriodicAdvertisingDataCompleteView>,
                true,
                advertiser_id));
      } else {
        // For first and intermediate fragment, do not trigger advertising_callbacks_.
        le_advertising_interface_->EnqueueCommand(
            hci::LeSetPeriodicAdvertisingDataBuilder::Create(advertiser_id, operation, data),
            module_handler_->BindOnce(check_complete<LeSetPeriodicAdvertisingDataCompleteView>));
      }
    }
  }
  }


  void send_periodic_data_fragment_with_raw_builder(
  void send_periodic_data_fragment_with_raw_builder(
@@ -1772,12 +1684,10 @@ struct LeAdvertisingManager::impl : public bluetooth::hci::LeAddressManagerCallb
      return;
      return;
    }
    }


    if (com::android::bluetooth::flags::divide_long_single_gap_data()) {
    // Do not trigger callback if send_callback is false
    // Do not trigger callback if send_callback is false
    if (!send_callback) {
    if (!send_callback) {
      return;
      return;
    }
    }
    }


    OpCode opcode = view.GetCommandOpCode();
    OpCode opcode = view.GetCommandOpCode();


+10 −35
Original line number Original line Diff line number Diff line
@@ -788,10 +788,7 @@ TEST_F(LeExtendedAdvertisingManagerTest, create_periodic_advertiser_test) {
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test) {
    LeExtendedAdvertisingManagerTest,
    create_advertiser_valid_max_251_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  AdvertisingConfig advertising_config{};
  AdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
@@ -849,10 +846,9 @@ TEST_F_WITH_FLAGS(
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
}
}


TEST_F_WITH_FLAGS(
TEST_F(
    LeExtendedAdvertisingManagerTest,
    LeExtendedAdvertisingManagerTest,
    create_advertiser_valid_max_252_ad_data_length_fragments_test,
    create_advertiser_valid_max_252_ad_data_length_fragments_test) {
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  AdvertisingConfig advertising_config{};
  AdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
@@ -918,10 +914,7 @@ TEST_F_WITH_FLAGS(
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
  ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test) {
    LeExtendedAdvertisingManagerTest,
    create_advertiser_test_invalid_256_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  AdvertisingConfig advertising_config{};
  AdvertisingConfig advertising_config{};
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.advertising_type = AdvertisingType::ADV_IND;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
  advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
@@ -1279,10 +1272,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_length) {
  sync_client_handler();
  sync_client_handler();
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test) {
    LeExtendedAdvertisingAPITest,
    set_data_valid_max_251_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data
  // Set advertising data
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};
  // set data 251 bytes
  // set data 251 bytes
@@ -1317,10 +1307,7 @@ TEST_F_WITH_FLAGS(
      LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
      LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test) {
    LeExtendedAdvertisingAPITest,
    set_data_valid_252_ad_data_length_fragments_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data
  // Set advertising data
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};
  // set data 252 bytes
  // set data 252 bytes
@@ -1391,10 +1378,7 @@ TEST_F_WITH_FLAGS(
      LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
      LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test) {
    LeExtendedAdvertisingAPITest,
    set_data_with_invalid_256_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data with data that greater than le_maximum_advertising_data_length_
  // Set advertising data with data that greater than le_maximum_advertising_data_length_
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};


@@ -1586,10 +1570,7 @@ TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_fragments_test) {
  test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
  test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test) {
    LeExtendedAdvertisingAPITest,
    set_periodic_data_valid_max_252_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data
  // Set advertising data
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};


@@ -1612,10 +1593,7 @@ TEST_F_WITH_FLAGS(
  sync_client_handler();
  sync_client_handler();
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test) {
    LeExtendedAdvertisingAPITest,
    set_periodic_data_valid_253_ad_data_length_fragments_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data
  // Set advertising data
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};


@@ -1653,10 +1631,7 @@ TEST_F_WITH_FLAGS(
      LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
      LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
}
}


TEST_F_WITH_FLAGS(
TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test) {
    LeExtendedAdvertisingAPITest,
    set_periodic_data_invalid_256_ad_data_length_test,
    REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, divide_long_single_gap_data))) {
  // Set advertising data
  // Set advertising data
  std::vector<GapData> advertising_data{};
  std::vector<GapData> advertising_data{};