Loading system/bta/csis/csis_client.cc +78 −32 Original line number Diff line number Diff line Loading @@ -343,11 +343,16 @@ class CsisClientImpl : public CsisClient { } /* In case of GATT ERROR */ LOG(ERROR) << __func__ << " Incorrect write status " << loghex((int)(status)); LOG_ERROR("Incorrect write status=0x%02x", (int)(status)); /* Unlock previous devices */ HandleCsisLockProcedureError(csis_group, device); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } return; } Loading Loading @@ -848,6 +853,12 @@ class CsisClientImpl : public CsisClient { BtaGattQueue::Clean(conn_id); return; } if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } } void OnCsisNotification(uint16_t conn_id, uint16_t handle, uint16_t len, Loading Loading @@ -964,13 +975,18 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_DEBUG("%s, status: 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1008,13 +1024,18 @@ class CsisClientImpl : public CsisClient { return; } LOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_INFO("%s, status 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1043,13 +1064,18 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status) << " rank:" << int(value[0]); LOG_DEBUG("%s, status: 0x%02x, rank: %d", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status, value[0]); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1347,17 +1373,22 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_DEBUG("%s, status: 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { /* TODO handle error codes: * kCsisErrorCodeLockAccessSirkRejected * kCsisErrorCodeLockOobSirkOnly */ LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1452,9 +1483,7 @@ class CsisClientImpl : public CsisClient { CsisActiveDiscovery(csis_group); } void DoDisconnectCleanUp(std::shared_ptr<CsisDevice> device) { DLOG(INFO) << __func__ << ": device=" << ADDRESS_TO_LOGGABLE_STR(device->addr); void DeregisterNotifications(std::shared_ptr<CsisDevice> device) { device->ForEachCsisInstance( [&](const std::shared_ptr<CsisInstance>& csis_inst) { DisableGattNotification(device->conn_id, device->addr, Loading @@ -1464,6 +1493,12 @@ class CsisClientImpl : public CsisClient { DisableGattNotification(device->conn_id, device->addr, csis_inst->svc_data.size_handle.val_hdl); }); } void DoDisconnectCleanUp(std::shared_ptr<CsisDevice> device) { LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); DeregisterNotifications(device); if (device->IsConnected()) { BtaGattQueue::Clean(device->conn_id); Loading Loading @@ -1863,20 +1898,31 @@ class CsisClientImpl : public CsisClient { } } void OnGattServiceChangeEvent(const RawAddress& address) { auto device = FindDeviceByAddress(address); if (!device) { LOG(WARNING) << "Skipping unknown device" << ADDRESS_TO_LOGGABLE_STR(address); void ClearDeviceInformationAndStartSearch( std::shared_ptr<CsisDevice> device) { LOG_INFO("%s ", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); if (device->is_gatt_service_valid == false) { LOG_DEBUG("Device database already invalidated."); return; } DLOG(INFO) << __func__ << ": address=" << ADDRESS_TO_LOGGABLE_STR(address); /* Invalidate service discovery results */ BtaGattQueue::Clean(device->conn_id); device->first_connection = true; DeregisterNotifications(device); device->ClearSvcData(); BTA_GATTC_ServiceSearchRequest(device->conn_id, &kCsisServiceUuid); } void OnGattServiceChangeEvent(const RawAddress& address) { auto device = FindDeviceByAddress(address); if (!device) { LOG(WARNING) << "Skipping unknown device" << address; return; } LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(address)); ClearDeviceInformationAndStartSearch(device); } void OnGattServiceDiscoveryDoneEvent(const RawAddress& address) { Loading system/bta/csis/csis_client_test.cc +36 −0 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,42 @@ TEST_F(CsisClientTest, test_storage_content) { TestAppUnregister(); } TEST_F(CsisClientTest, test_database_out_of_sync) { auto test_address = GetTestAddress(0); auto conn_id = 1; TestAppRegister(); SetSampleDatabaseCsis(conn_id, 1); TestConnect(test_address); InjectConnectedEvent(test_address, conn_id); GetSearchCompleteEvent(conn_id); ASSERT_EQ(1, CsisClient::Get()->GetGroupId( test_address, bluetooth::Uuid::From16Bit(0x0000))); // Simulated database changed on the remote side. ON_CALL(gatt_queue, WriteCharacteristic(_, _, _, _, _, _)) .WillByDefault( Invoke([this](uint16_t conn_id, uint16_t handle, std::vector<uint8_t> value, tGATT_WRITE_TYPE write_type, GATT_WRITE_OP_CB cb, void* cb_data) { auto* svc = gatt::FindService(services_map[conn_id], handle); if (svc == nullptr) return; tGATT_STATUS status = GATT_DATABASE_OUT_OF_SYNC; if (cb) cb(conn_id, status, handle, value.size(), value.data(), cb_data); })); ON_CALL(gatt_interface, ServiceSearchRequest(_, _)).WillByDefault(Return()); EXPECT_CALL(gatt_interface, ServiceSearchRequest(_, _)); CsisClient::Get()->LockGroup( 1, true, base::BindOnce([](int group_id, bool locked, CsisGroupLockStatus status) { csis_lock_callback_mock->CsisGroupLockCb(group_id, locked, status); })); TestAppUnregister(); } } // namespace } // namespace internal } // namespace csis Loading Loading
system/bta/csis/csis_client.cc +78 −32 Original line number Diff line number Diff line Loading @@ -343,11 +343,16 @@ class CsisClientImpl : public CsisClient { } /* In case of GATT ERROR */ LOG(ERROR) << __func__ << " Incorrect write status " << loghex((int)(status)); LOG_ERROR("Incorrect write status=0x%02x", (int)(status)); /* Unlock previous devices */ HandleCsisLockProcedureError(csis_group, device); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } return; } Loading Loading @@ -848,6 +853,12 @@ class CsisClientImpl : public CsisClient { BtaGattQueue::Clean(conn_id); return; } if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } } void OnCsisNotification(uint16_t conn_id, uint16_t handle, uint16_t len, Loading Loading @@ -964,13 +975,18 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_DEBUG("%s, status: 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1008,13 +1024,18 @@ class CsisClientImpl : public CsisClient { return; } LOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_INFO("%s, status 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1043,13 +1064,18 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status) << " rank:" << int(value[0]); LOG_DEBUG("%s, status: 0x%02x, rank: %d", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status, value[0]); if (status != GATT_SUCCESS) { LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1347,17 +1373,22 @@ class CsisClientImpl : public CsisClient { return; } DLOG(INFO) << __func__ << " " << ADDRESS_TO_LOGGABLE_STR(device->addr) << " status: " << loghex(+status); LOG_DEBUG("%s, status: 0x%02x", ADDRESS_TO_LOGGABLE_CSTR(device->addr), status); if (status != GATT_SUCCESS) { /* TODO handle error codes: * kCsisErrorCodeLockAccessSirkRejected * kCsisErrorCodeLockOobSirkOnly */ LOG(ERROR) << __func__ << " Could not read characteristic at handle=" << loghex(handle); if (status == GATT_DATABASE_OUT_OF_SYNC) { LOG_INFO("Database out of sync for %s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); ClearDeviceInformationAndStartSearch(device); } else { LOG_ERROR("Could not read characteristic at handle=0x%04x", handle); BTA_GATTC_Close(device->conn_id); } return; } Loading Loading @@ -1452,9 +1483,7 @@ class CsisClientImpl : public CsisClient { CsisActiveDiscovery(csis_group); } void DoDisconnectCleanUp(std::shared_ptr<CsisDevice> device) { DLOG(INFO) << __func__ << ": device=" << ADDRESS_TO_LOGGABLE_STR(device->addr); void DeregisterNotifications(std::shared_ptr<CsisDevice> device) { device->ForEachCsisInstance( [&](const std::shared_ptr<CsisInstance>& csis_inst) { DisableGattNotification(device->conn_id, device->addr, Loading @@ -1464,6 +1493,12 @@ class CsisClientImpl : public CsisClient { DisableGattNotification(device->conn_id, device->addr, csis_inst->svc_data.size_handle.val_hdl); }); } void DoDisconnectCleanUp(std::shared_ptr<CsisDevice> device) { LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); DeregisterNotifications(device); if (device->IsConnected()) { BtaGattQueue::Clean(device->conn_id); Loading Loading @@ -1863,20 +1898,31 @@ class CsisClientImpl : public CsisClient { } } void OnGattServiceChangeEvent(const RawAddress& address) { auto device = FindDeviceByAddress(address); if (!device) { LOG(WARNING) << "Skipping unknown device" << ADDRESS_TO_LOGGABLE_STR(address); void ClearDeviceInformationAndStartSearch( std::shared_ptr<CsisDevice> device) { LOG_INFO("%s ", ADDRESS_TO_LOGGABLE_CSTR(device->addr)); if (device->is_gatt_service_valid == false) { LOG_DEBUG("Device database already invalidated."); return; } DLOG(INFO) << __func__ << ": address=" << ADDRESS_TO_LOGGABLE_STR(address); /* Invalidate service discovery results */ BtaGattQueue::Clean(device->conn_id); device->first_connection = true; DeregisterNotifications(device); device->ClearSvcData(); BTA_GATTC_ServiceSearchRequest(device->conn_id, &kCsisServiceUuid); } void OnGattServiceChangeEvent(const RawAddress& address) { auto device = FindDeviceByAddress(address); if (!device) { LOG(WARNING) << "Skipping unknown device" << address; return; } LOG_INFO("%s", ADDRESS_TO_LOGGABLE_CSTR(address)); ClearDeviceInformationAndStartSearch(device); } void OnGattServiceDiscoveryDoneEvent(const RawAddress& address) { Loading
system/bta/csis/csis_client_test.cc +36 −0 Original line number Diff line number Diff line Loading @@ -1124,6 +1124,42 @@ TEST_F(CsisClientTest, test_storage_content) { TestAppUnregister(); } TEST_F(CsisClientTest, test_database_out_of_sync) { auto test_address = GetTestAddress(0); auto conn_id = 1; TestAppRegister(); SetSampleDatabaseCsis(conn_id, 1); TestConnect(test_address); InjectConnectedEvent(test_address, conn_id); GetSearchCompleteEvent(conn_id); ASSERT_EQ(1, CsisClient::Get()->GetGroupId( test_address, bluetooth::Uuid::From16Bit(0x0000))); // Simulated database changed on the remote side. ON_CALL(gatt_queue, WriteCharacteristic(_, _, _, _, _, _)) .WillByDefault( Invoke([this](uint16_t conn_id, uint16_t handle, std::vector<uint8_t> value, tGATT_WRITE_TYPE write_type, GATT_WRITE_OP_CB cb, void* cb_data) { auto* svc = gatt::FindService(services_map[conn_id], handle); if (svc == nullptr) return; tGATT_STATUS status = GATT_DATABASE_OUT_OF_SYNC; if (cb) cb(conn_id, status, handle, value.size(), value.data(), cb_data); })); ON_CALL(gatt_interface, ServiceSearchRequest(_, _)).WillByDefault(Return()); EXPECT_CALL(gatt_interface, ServiceSearchRequest(_, _)); CsisClient::Get()->LockGroup( 1, true, base::BindOnce([](int group_id, bool locked, CsisGroupLockStatus status) { csis_lock_callback_mock->CsisGroupLockCb(group_id, locked, status); })); TestAppUnregister(); } } // namespace } // namespace internal } // namespace csis Loading