Skip to content

Commit 0d7e48c

Browse files
committed
Be more patient: increase companion timeouts
And use attempt to progressively wait longer. Currently we only wait 3-4 hops of airtime. When destination is 10-20 hops away we send 3 flood messages before the first one will have a chance of arriving.
1 parent cdd3d5f commit 0d7e48c

5 files changed

Lines changed: 12 additions & 12 deletions

File tree

examples/companion_radio/MyMesh.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@
9292
#define RESP_CODE_AUTOADD_CONFIG 25
9393
#define RESP_ALLOWED_REPEAT_FREQ 26
9494

95-
#define SEND_TIMEOUT_BASE_MILLIS 500
96-
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f
97-
#define DIRECT_SEND_PERHOP_FACTOR 6.0f
98-
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 250
95+
#define SEND_TIMEOUT_BASE_MILLIS 1000
96+
#define FLOOD_SEND_TIMEOUT_FACTOR 32.0f
97+
#define DIRECT_SEND_PERHOP_FACTOR 10.0f
98+
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 500
9999
#define LAZY_CONTACTS_WRITE_DELAY 5000
100100

101101
#define PUBLIC_GROUP_PSK "izOH6cXN6mrJ5e26oRXNcg=="
@@ -783,8 +783,8 @@ void MyMesh::onTraceRecv(mesh::Packet *packet, uint32_t tag, uint32_t auth_code,
783783
}
784784
}
785785

786-
uint32_t MyMesh::calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const {
787-
return SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis);
786+
uint32_t MyMesh::calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt) const {
787+
return (SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis)) * (attempt + 1);
788788
}
789789
uint32_t MyMesh::calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const {
790790
uint8_t path_hash_count = path_len & 63;

examples/companion_radio/MyMesh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class MyMesh : public BaseChatMesh, public DataStoreHost {
146146
void onTraceRecv(mesh::Packet *packet, uint32_t tag, uint32_t auth_code, uint8_t flags,
147147
const uint8_t *path_snrs, const uint8_t *path_hashes, uint8_t path_len) override;
148148

149-
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const override;
149+
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt = 0) const override;
150150
uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const override;
151151
void onSendTimeout() override;
152152

examples/simple_secure_chat/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,8 @@ class MyMesh : public BaseChatMesh, ContactVisitor {
262262
// not supported
263263
}
264264

265-
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const override {
266-
return SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis);
265+
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt = 0) const override {
266+
return (SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis)) * (attempt + 1);
267267
}
268268
uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const override {
269269
uint8_t path_hash_count = path_len & 63;

src/helpers/BaseChatMesh.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ int BaseChatMesh::sendMessage(const ContactInfo& recipient, uint32_t timestamp,
397397
int rc;
398398
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
399399
sendFloodScoped(recipient, pkt);
400-
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
400+
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t, attempt));
401401
rc = MSG_SEND_SENT_FLOOD;
402402
} else {
403403
sendDirect(pkt, recipient.out_path, recipient.out_path_len);
@@ -423,7 +423,7 @@ int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timest
423423
int rc;
424424
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
425425
sendFloodScoped(recipient, pkt);
426-
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
426+
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t, attempt));
427427
rc = MSG_SEND_SENT_FLOOD;
428428
} else {
429429
sendDirect(pkt, recipient.out_path, recipient.out_path_len);

src/helpers/BaseChatMesh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class BaseChatMesh : public mesh::Mesh {
107107
virtual void onMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) = 0;
108108
virtual void onCommandDataRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const char *text) = 0;
109109
virtual void onSignedMessageRecv(const ContactInfo& contact, mesh::Packet* pkt, uint32_t sender_timestamp, const uint8_t *sender_prefix, const char *text) = 0;
110-
virtual uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const = 0;
110+
virtual uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt = 0) const = 0;
111111
virtual uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const = 0;
112112
virtual void onSendTimeout() = 0;
113113
virtual void onChannelMessageRecv(const mesh::GroupChannel& channel, mesh::Packet* pkt, uint32_t timestamp, const char *text) = 0;

0 commit comments

Comments
 (0)