Loading system/bta/csis/csis_client.cc +3 −3 Original line number Diff line number Diff line Loading @@ -1131,14 +1131,14 @@ class CsisClientImpl : public CsisClient { std::vector<RawAddress> GetAllRsiFromAdvertising( const tBTA_DM_INQ_RES* result) { const uint8_t* p_service_data = result->p_eir; uint16_t remaining_data_len = result->eir_len; std::vector<RawAddress> devices; uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), BTM_BLE_AD_TYPE_RSI, &service_data_len))) { result->eir_len - (p_service_data - result->p_eir) - service_data_len, BTM_BLE_AD_TYPE_RSI, &service_data_len))) { RawAddress bda; STREAM_TO_BDADDR(bda, p_service_data); devices.push_back(std::move(bda)); Loading system/stack/btm/btm_ble_gap.cc +1 −2 Original line number Diff line number Diff line Loading @@ -2431,12 +2431,11 @@ void btm_ble_update_inq_result(tINQ_DB_ENT* p_i, uint8_t addr_type, } const uint8_t* p_service_data = data.data(); uint16_t remaining_data_len = data.size(); uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), data.size() - (p_service_data - data.data()) - service_data_len, BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) { uint16_t uuid; STREAM_TO_UINT16(uuid, p_service_data); Loading system/stack/gatt/connection_manager.cc +1 −2 Original line number Diff line number Diff line Loading @@ -121,12 +121,11 @@ std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& address) { bool IsTargetedAnnouncement(const uint8_t* p_eir, uint16_t eir_len) { const uint8_t* p_service_data = p_eir; uint16_t remaining_data_len = eir_len; uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), eir_len - (p_service_data - p_eir) - service_data_len, BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) { uint16_t uuid; uint8_t announcement_type; Loading system/stack/test/ad_parser_unittest.cc +36 −0 Original line number Diff line number Diff line Loading @@ -175,3 +175,39 @@ TEST(AdvertiseDataParserTest, RemoveTrailingZerosMalformed) { EXPECT_TRUE(AdvertiseDataParser::IsValid(glued)); } TEST(AdvertiseDataParserTest, GetFieldByTypeInLoop) { // Single field. const uint8_t AD_TYPE_SVC_DATA = 0x16; const std::vector<uint8_t> data0{ 0x02, 0x01, 0x02, 0x07, 0x2e, 0x6a, 0xc1, 0x19, 0x52, 0x1e, 0x49, 0x09, 0x16, 0x4e, 0x18, 0x00, 0xff, 0x0f, 0x03, 0x00, 0x00, 0x02, 0x0a, 0x7f, 0x03, 0x16, 0x4f, 0x18, 0x04, 0x16, 0x53, 0x18, 0x00, 0x0f, 0x09, 0x48, 0x5f, 0x43, 0x33, 0x45, 0x41, 0x31, 0x36, 0x33, 0x46, 0x35, 0x36, 0x34, 0x46 }; const uint8_t* p_service_data = data0.data(); uint8_t service_data_len = 0; int match_no = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, data0.size() - (p_service_data - data0.data()) - service_data_len, AD_TYPE_SVC_DATA, &service_data_len))) { auto position = (p_service_data - data0.data()); if (match_no == 0) { EXPECT_EQ(position, 13); EXPECT_EQ(service_data_len, 8); } else if (match_no == 1) { EXPECT_EQ(position, 26); EXPECT_EQ(service_data_len, 2); } else if (match_no == 2) { EXPECT_EQ(position, 30); EXPECT_EQ(service_data_len, 3); } match_no++; } EXPECT_EQ(match_no, 3); } No newline at end of file Loading
system/bta/csis/csis_client.cc +3 −3 Original line number Diff line number Diff line Loading @@ -1131,14 +1131,14 @@ class CsisClientImpl : public CsisClient { std::vector<RawAddress> GetAllRsiFromAdvertising( const tBTA_DM_INQ_RES* result) { const uint8_t* p_service_data = result->p_eir; uint16_t remaining_data_len = result->eir_len; std::vector<RawAddress> devices; uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), BTM_BLE_AD_TYPE_RSI, &service_data_len))) { result->eir_len - (p_service_data - result->p_eir) - service_data_len, BTM_BLE_AD_TYPE_RSI, &service_data_len))) { RawAddress bda; STREAM_TO_BDADDR(bda, p_service_data); devices.push_back(std::move(bda)); Loading
system/stack/btm/btm_ble_gap.cc +1 −2 Original line number Diff line number Diff line Loading @@ -2431,12 +2431,11 @@ void btm_ble_update_inq_result(tINQ_DB_ENT* p_i, uint8_t addr_type, } const uint8_t* p_service_data = data.data(); uint16_t remaining_data_len = data.size(); uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), data.size() - (p_service_data - data.data()) - service_data_len, BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) { uint16_t uuid; STREAM_TO_UINT16(uuid, p_service_data); Loading
system/stack/gatt/connection_manager.cc +1 −2 Original line number Diff line number Diff line Loading @@ -121,12 +121,11 @@ std::set<tAPP_ID> get_apps_connecting_to(const RawAddress& address) { bool IsTargetedAnnouncement(const uint8_t* p_eir, uint16_t eir_len) { const uint8_t* p_service_data = p_eir; uint16_t remaining_data_len = eir_len; uint8_t service_data_len = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, (remaining_data_len -= service_data_len), eir_len - (p_service_data - p_eir) - service_data_len, BTM_BLE_AD_TYPE_SERVICE_DATA_TYPE, &service_data_len))) { uint16_t uuid; uint8_t announcement_type; Loading
system/stack/test/ad_parser_unittest.cc +36 −0 Original line number Diff line number Diff line Loading @@ -175,3 +175,39 @@ TEST(AdvertiseDataParserTest, RemoveTrailingZerosMalformed) { EXPECT_TRUE(AdvertiseDataParser::IsValid(glued)); } TEST(AdvertiseDataParserTest, GetFieldByTypeInLoop) { // Single field. const uint8_t AD_TYPE_SVC_DATA = 0x16; const std::vector<uint8_t> data0{ 0x02, 0x01, 0x02, 0x07, 0x2e, 0x6a, 0xc1, 0x19, 0x52, 0x1e, 0x49, 0x09, 0x16, 0x4e, 0x18, 0x00, 0xff, 0x0f, 0x03, 0x00, 0x00, 0x02, 0x0a, 0x7f, 0x03, 0x16, 0x4f, 0x18, 0x04, 0x16, 0x53, 0x18, 0x00, 0x0f, 0x09, 0x48, 0x5f, 0x43, 0x33, 0x45, 0x41, 0x31, 0x36, 0x33, 0x46, 0x35, 0x36, 0x34, 0x46 }; const uint8_t* p_service_data = data0.data(); uint8_t service_data_len = 0; int match_no = 0; while ((p_service_data = AdvertiseDataParser::GetFieldByType( p_service_data + service_data_len, data0.size() - (p_service_data - data0.data()) - service_data_len, AD_TYPE_SVC_DATA, &service_data_len))) { auto position = (p_service_data - data0.data()); if (match_no == 0) { EXPECT_EQ(position, 13); EXPECT_EQ(service_data_len, 8); } else if (match_no == 1) { EXPECT_EQ(position, 26); EXPECT_EQ(service_data_len, 2); } else if (match_no == 2) { EXPECT_EQ(position, 30); EXPECT_EQ(service_data_len, 3); } match_no++; } EXPECT_EQ(match_no, 3); } No newline at end of file