diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index b66e1952..1de0f646 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -117,7 +117,10 @@ uint8_t MyMesh::handleLoginReq(const mesh::Identity& sender, const uint8_t* secr } MESH_DEBUG_PRINTLN("Login success!"); - client->last_timestamp = sender_timestamp; + // NOTE: don't update last_timestamp here - login uses companion RTC which may differ + // from the app clock used for messages. Mixing the two causes silent message rejection + // when the companion RTC runs ahead of the app clock (see #1551). + // Login replay protection is already handled by hasSeen() in the mesh layer. client->last_activity = getRTCClock()->getCurrentTime(); client->permissions &= ~0x03; client->permissions |= perms; diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index b6485128..75817aa4 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -346,7 +346,10 @@ void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const m } MESH_DEBUG_PRINTLN("Login success!"); - client->last_timestamp = sender_timestamp; + // NOTE: don't update last_timestamp here - login uses companion RTC which may differ + // from the app clock used for messages. Mixing the two causes silent message rejection + // when the companion RTC runs ahead of the app clock (see #1551). + // Login replay protection is already handled by hasSeen() in the mesh layer. client->extra.room.sync_since = sender_sync_since; client->extra.room.pending_ack = 0; client->extra.room.push_failures = 0; diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 59c9aa09..113f9641 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -355,7 +355,10 @@ uint8_t SensorMesh::handleLoginReq(const mesh::Identity& sender, const uint8_t* } MESH_DEBUG_PRINTLN("Login success!"); - client->last_timestamp = sender_timestamp; + // NOTE: don't update last_timestamp here - login uses companion RTC which may differ + // from the app clock used for messages. Mixing the two causes silent message rejection + // when the companion RTC runs ahead of the app clock (see #1551). + // Login replay protection is already handled by hasSeen() in the mesh layer. client->last_activity = getRTCClock()->getCurrentTime(); client->permissions |= PERM_ACL_ADMIN; memcpy(client->shared_secret, secret, PUB_KEY_SIZE);