Skip to content

Commit 6ded598

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 d2c2a6e commit 6ded598

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
@@ -100,10 +100,10 @@
100100

101101
#define MAX_CHANNEL_DATA_LENGTH (MAX_FRAME_SIZE - 9)
102102

103-
#define SEND_TIMEOUT_BASE_MILLIS 500
104-
#define FLOOD_SEND_TIMEOUT_FACTOR 16.0f
105-
#define DIRECT_SEND_PERHOP_FACTOR 6.0f
106-
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 250
103+
#define SEND_TIMEOUT_BASE_MILLIS 1000
104+
#define FLOOD_SEND_TIMEOUT_FACTOR 32.0f
105+
#define DIRECT_SEND_PERHOP_FACTOR 10.0f
106+
#define DIRECT_SEND_PERHOP_EXTRA_MILLIS 500
107107
#define LAZY_CONTACTS_WRITE_DELAY 5000
108108

109109
#define PUBLIC_GROUP_PSK "izOH6cXN6mrJ5e26oRXNcg=="
@@ -840,8 +840,8 @@ void MyMesh::onTraceRecv(mesh::Packet *packet, uint32_t tag, uint32_t auth_code,
840840
}
841841
}
842842

843-
uint32_t MyMesh::calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const {
844-
return SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis);
843+
uint32_t MyMesh::calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt) const {
844+
return (SEND_TIMEOUT_BASE_MILLIS + (FLOOD_SEND_TIMEOUT_FACTOR * pkt_airtime_millis)) * (attempt + 1);
845845
}
846846
uint32_t MyMesh::calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const {
847847
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
@@ -149,7 +149,7 @@ class MyMesh : public BaseChatMesh, public DataStoreHost {
149149
void onTraceRecv(mesh::Packet *packet, uint32_t tag, uint32_t auth_code, uint8_t flags,
150150
const uint8_t *path_snrs, const uint8_t *path_hashes, uint8_t path_len) override;
151151

152-
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis) const override;
152+
uint32_t calcFloodTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t attempt = 0) const override;
153153
uint32_t calcDirectTimeoutMillisFor(uint32_t pkt_airtime_millis, uint8_t path_len) const override;
154154
void onSendTimeout() override;
155155

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
@@ -428,7 +428,7 @@ int BaseChatMesh::sendMessage(const ContactInfo& recipient, uint32_t timestamp,
428428
int rc;
429429
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
430430
sendFloodScoped(recipient, pkt);
431-
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
431+
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t, attempt));
432432
rc = MSG_SEND_SENT_FLOOD;
433433
} else {
434434
sendDirect(pkt, recipient.out_path, recipient.out_path_len);
@@ -454,7 +454,7 @@ int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timest
454454
int rc;
455455
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
456456
sendFloodScoped(recipient, pkt);
457-
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
457+
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t, attempt));
458458
rc = MSG_SEND_SENT_FLOOD;
459459
} else {
460460
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)