From 9a6c0ae71c21346d3835e4ec90e8331a31e94763 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Sun, 1 Nov 2026 17:52:27 +1100 Subject: [PATCH] * misc fixes --- examples/simple_repeater/MyMesh.cpp | 6 +++++- examples/simple_sensor/SensorMesh.cpp | 11 +++++++++-- examples/simple_sensor/SensorMesh.h | 2 +- src/helpers/BaseChatMesh.cpp | 4 ++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 7945ef74a..11d23ed22 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -636,7 +636,11 @@ void MyMesh::onAnonDataRecv(mesh::Packet *packet, const uint8_t *secret, const m // a DIRECT login can reply via the stored out_path, as onPeerDataRecv() does for REQ ClientInfo* client = acl.getClient(sender.pub_key, PUB_KEY_SIZE); if (client == NULL) { - MESH_DEBUG_PRINTLN("onAnonDataRecv: client ACL cannot find slot!"); // This shouldn't happen! + // prob one of ANON_REQ_TYPE_REGIONS/_OWNER/_BASIC, and not in ACL + if (reply_path_len != 0xFF) { + mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, sender, secret, reply_data, reply_len); + if (reply) { sendDirect(reply, reply_path, reply_path_len, SERVER_RESPONSE_DELAY); } + } return; } diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 706bbaad0..43d12b343 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -657,7 +657,9 @@ void SensorMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_i ClientInfo* from = acl.getClientByIdx(i); if (crypto_type == CRYPTO_NEW_DIRECT) { - from->direct_mode = (DM_MODE_SEQ_NORMAL << 4) | CRYPTO_NEW_DIRECT; // have received from Client in new scheme, so they must support it + if (from->direct_mode == CRYPTO_LEGACY) { + from->direct_mode = (DM_MODE_SEQ_NORMAL << 4) | CRYPTO_NEW_DIRECT; // have received from Client in new scheme, so they must support it + } } if (type == PAYLOAD_TYPE_REQ) { // request (from a known contact) @@ -794,7 +796,7 @@ void SensorMesh::onControlDataRecv(mesh::Packet* packet) { } } -bool SensorMesh::onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) { +bool SensorMesh::onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len, uint8_t crypto_type) { int i = matching_peer_indexes[sender_idx]; if (i < 0 || i >= acl.getNumClients()) { MESH_DEBUG_PRINTLN("onPeerPathRecv: Invalid sender idx: %d", i); @@ -802,6 +804,11 @@ bool SensorMesh::onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint } ClientInfo* from = acl.getClientByIdx(i); + if (crypto_type == CRYPTO_NEW_DIRECT) { + if (from->direct_mode == CRYPTO_LEGACY) { + from->direct_mode = (DM_MODE_SEQ_NORMAL << 4) | CRYPTO_NEW_DIRECT; // have received from Client in new scheme, so they must support it + } + } MESH_DEBUG_PRINTLN("PATH to contact, path_len=%d", (uint32_t) path_len); // NOTE: for this impl, we just replace the current 'out_path' regardless, whenever sender sends us a new out_path. diff --git a/examples/simple_sensor/SensorMesh.h b/examples/simple_sensor/SensorMesh.h index 92ddcfbda..b5112797f 100644 --- a/examples/simple_sensor/SensorMesh.h +++ b/examples/simple_sensor/SensorMesh.h @@ -136,7 +136,7 @@ protected: int searchPeersByHash(const uint8_t* hash) override; void getPeerSharedSecret(uint8_t* dest_secret, int peer_idx) override; void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t* secret, uint8_t* data, size_t len, uint8_t crypto_type) override; - bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override; + bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len, uint8_t crypto_type) override; void onControlDataRecv(mesh::Packet* packet) override; void onAckRecv(mesh::Packet* packet, uint32_t ack_crc) override; diff --git a/src/helpers/BaseChatMesh.cpp b/src/helpers/BaseChatMesh.cpp index b03ddc5a7..fd37c07f1 100644 --- a/src/helpers/BaseChatMesh.cpp +++ b/src/helpers/BaseChatMesh.cpp @@ -747,7 +747,7 @@ int BaseChatMesh::sendRequest(ContactInfo& recipient, const uint8_t* req_data, memcpy(temp, &tag, 4); // mostly an extra blob to help make packet_hash unique memcpy(&temp[4], req_data, data_len); - auto pkt = obtainPacketFor(recipient); + pkt = obtainPacketFor(recipient); if (pkt == NULL) return MSG_SEND_FAILED; encodeDatagram(pkt, PAYLOAD_TYPE_REQ, recipient.id, recipient.getSharedSecret(self_id), temp, 4 + data_len); @@ -766,7 +766,7 @@ int BaseChatMesh::sendRequest(ContactInfo& recipient, uint8_t req_type, uint32_ memset(&temp[5], 0, 4); // reserved (possibly for 'since' param) getRNG()->random(&temp[9], 4); // random blob to help make packet-hash unique - auto pkt = obtainPacketFor(recipient); + pkt = obtainPacketFor(recipient); if (pkt == NULL) return MSG_SEND_FAILED; encodeDatagram(pkt, PAYLOAD_TYPE_REQ, recipient.id, recipient.getSharedSecret(self_id), temp, sizeof(temp));