Skip to content

Commit 6bc8dd2

Browse files
author
Scott Powell
committed
* CommonCLI: new "multi.acks" config setting
1 parent 3a0dfc1 commit 6bc8dd2

File tree

6 files changed

+44
-49
lines changed

6 files changed

+44
-49
lines changed

examples/simple_repeater/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
339339
int getAGCResetInterval() const override {
340340
return ((int)_prefs.agc_reset_interval) * 4000; // milliseconds
341341
}
342+
uint8_t getExtraAckTransmitCount() const override {
343+
return _prefs.multi_acks;
344+
}
342345

343346
void onAnonDataRecv(mesh::Packet* packet, const uint8_t* secret, const mesh::Identity& sender, uint8_t* data, size_t len) override {
344347
if (packet->getPayloadType() == PAYLOAD_TYPE_ANON_REQ) { // received an initial request by a possible admin client (unknown at this stage)

examples/simple_room_server/main.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
424424
int getAGCResetInterval() const override {
425425
return ((int)_prefs.agc_reset_interval) * 4000; // milliseconds
426426
}
427+
uint8_t getExtraAckTransmitCount() const override {
428+
return _prefs.multi_acks;
429+
}
427430

428431
bool allowPacketForward(const mesh::Packet* packet) override {
429432
if (_prefs.disable_fwd) return false;
@@ -583,12 +586,16 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
583586
if (ack) sendFlood(ack, TXT_ACK_DELAY);
584587
delay_millis = TXT_ACK_DELAY + REPLY_DELAY_MILLIS;
585588
} else {
586-
mesh::Packet* a1 = createMultiAck(ack_hash, 1);
587-
if (a1) sendDirect(a1, client->out_path, client->out_path_len, TXT_ACK_DELAY);
589+
uint32_t d = TXT_ACK_DELAY;
590+
if (getExtraAckTransmitCount() > 0) {
591+
mesh::Packet* a1 = createMultiAck(ack_hash, 1);
592+
if (a1) sendDirect(a1, client->out_path, client->out_path_len, d);
593+
d += 300;
594+
}
588595

589596
mesh::Packet* a2 = createAck(ack_hash);
590-
if (a2) sendDirect(a2, client->out_path, client->out_path_len, TXT_ACK_DELAY + 300);
591-
delay_millis = TXT_ACK_DELAY + REPLY_DELAY_MILLIS + 300;
597+
if (a2) sendDirect(a2, client->out_path, client->out_path_len, d);
598+
delay_millis = d + REPLY_DELAY_MILLIS;
592599
}
593600
} else {
594601
delay_millis = 0;

src/Mesh.cpp

Lines changed: 15 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ uint32_t Mesh::getRetransmitDelay(const mesh::Packet* packet) {
2222
uint32_t Mesh::getDirectRetransmitDelay(const Packet* packet) {
2323
return 0; // by default, no delay
2424
}
25+
uint8_t Mesh::getExtraAckTransmitCount() const {
26+
return 0;
27+
}
2528

2629
uint32_t Mesh::getCADFailRetryDelay() const {
2730
return _rng->nextInt(1, 4)*120;
@@ -99,7 +102,6 @@ DispatcherAction Mesh::onRecvPacket(Packet* pkt) {
99102
} else if (!_tables->hasSeen(pkt)) {
100103
onAckRecv(pkt, ack_crc);
101104
action = routeRecvPacket(pkt);
102-
// routeRecvAcks(pkt, 0); // experimental, double Acks in flood mode(?)
103105
}
104106
break;
105107
}
@@ -280,7 +282,6 @@ DispatcherAction Mesh::onRecvPacket(Packet* pkt) {
280282
memcpy(&ack_crc, tmp.payload, 4);
281283

282284
onAckRecv(&tmp, ack_crc);
283-
// routeRecvAcks(&tmp, ((uint32_t)remaining) * 600); // expect multipart ACK 300ms apart (x2)
284285
//action = routeRecvPacket(&tmp); // NOTE: currently not needed, as multipart ACKs not sent Flood
285286
}
286287
} else {
@@ -324,37 +325,6 @@ DispatcherAction Mesh::routeRecvPacket(Packet* packet) {
324325
return ACTION_RELEASE;
325326
}
326327

327-
#if 0
328-
void Mesh::routeRecvAcks(Packet* packet, uint32_t delay_millis) {
329-
if (packet->isRouteFlood() && !packet->isMarkedDoNotRetransmit()
330-
&& packet->path_len + PATH_HASH_SIZE <= MAX_PATH_SIZE && allowPacketForward(packet)) {
331-
// append this node's hash to 'path'
332-
packet->path_len += self_id.copyHashTo(&packet->path[packet->path_len]);
333-
334-
uint32_t crc;
335-
memcpy(&crc, packet->payload, 4);
336-
337-
delay_millis += getRetransmitDelay(packet);
338-
auto a1 = createMultiAck(crc, 1);
339-
if (a1) {
340-
memcpy(a1->path, packet->path, a1->path_len = packet->path_len);
341-
a1->header &= ~PH_ROUTE_MASK;
342-
a1->header |= ROUTE_TYPE_FLOOD;
343-
sendPacket(a1, 1, delay_millis);
344-
}
345-
346-
delay_millis += 300;
347-
auto a2 = createAck(crc);
348-
if (a2) {
349-
memcpy(a2->path, packet->path, a2->path_len = packet->path_len);
350-
a2->header &= ~PH_ROUTE_MASK;
351-
a2->header |= ROUTE_TYPE_FLOOD;
352-
sendPacket(a2, 1, delay_millis);
353-
}
354-
}
355-
}
356-
#endif
357-
358328
DispatcherAction Mesh::forwardMultipartDirect(Packet* pkt) {
359329
uint8_t remaining = pkt->payload[0] >> 4; // num of packets in this multipart sequence still to be sent
360330
uint8_t type = pkt->payload[0] & 0x0F;
@@ -369,7 +339,7 @@ DispatcherAction Mesh::forwardMultipartDirect(Packet* pkt) {
369339

370340
if (!_tables->hasSeen(&tmp)) { // don't retransmit!
371341
removeSelfFromPath(&tmp);
372-
routeDirectRecvAcks(&tmp, ((uint32_t)remaining) * 600); // expect multipart ACKs 300ms apart (x2)
342+
routeDirectRecvAcks(&tmp, ((uint32_t)remaining + 1) * 300); // expect multipart ACKs 300ms apart (x2)
373343
}
374344
}
375345
return ACTION_RELEASE;
@@ -380,16 +350,19 @@ void Mesh::routeDirectRecvAcks(Packet* packet, uint32_t delay_millis) {
380350
uint32_t crc;
381351
memcpy(&crc, packet->payload, 4);
382352

383-
delay_millis += getDirectRetransmitDelay(packet);
384-
auto a1 = createMultiAck(crc, 1);
385-
if (a1) {
386-
memcpy(a1->path, packet->path, a1->path_len = packet->path_len);
387-
a1->header &= ~PH_ROUTE_MASK;
388-
a1->header |= ROUTE_TYPE_DIRECT;
389-
sendPacket(a1, 0, delay_millis);
353+
uint8_t extra = getExtraAckTransmitCount();
354+
while (extra > 0) {
355+
delay_millis += getDirectRetransmitDelay(packet) + 300;
356+
auto a1 = createMultiAck(crc, extra);
357+
if (a1) {
358+
memcpy(a1->path, packet->path, a1->path_len = packet->path_len);
359+
a1->header &= ~PH_ROUTE_MASK;
360+
a1->header |= ROUTE_TYPE_DIRECT;
361+
sendPacket(a1, 0, delay_millis);
362+
}
363+
extra--;
390364
}
391365

392-
delay_millis += 300;
393366
auto a2 = createAck(crc);
394367
if (a2) {
395368
memcpy(a2->path, packet->path, a2->path_len = packet->path_len);

src/Mesh.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class Mesh : public Dispatcher {
5959
*/
6060
virtual uint32_t getDirectRetransmitDelay(const Packet* packet);
6161

62+
/**
63+
* \returns number of extra (Direct) ACK transmissions wanted.
64+
*/
65+
virtual uint8_t getExtraAckTransmitCount() const;
66+
6267
/**
6368
* \brief Perform search of local DB of peers/contacts.
6469
* \returns Number of peers with matching hash

src/helpers/CommonCLI.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
5151
file.read((uint8_t *) &_prefs->sf, sizeof(_prefs->sf)); // 112
5252
file.read((uint8_t *) &_prefs->cr, sizeof(_prefs->cr)); // 113
5353
file.read((uint8_t *) &_prefs->allow_read_only, sizeof(_prefs->allow_read_only)); // 114
54-
file.read((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
54+
file.read((uint8_t *) &_prefs->multi_acks, sizeof(_prefs->multi_acks)); // 115
5555
file.read((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
5656
file.read((uint8_t *) &_prefs->agc_reset_interval, sizeof(_prefs->agc_reset_interval)); // 120
5757
file.read(pad, 3); // 121
@@ -69,6 +69,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
6969
_prefs->sf = constrain(_prefs->sf, 7, 12);
7070
_prefs->cr = constrain(_prefs->cr, 5, 8);
7171
_prefs->tx_power_dbm = constrain(_prefs->tx_power_dbm, 1, 30);
72+
_prefs->multi_acks = constrain(_prefs->multi_acks, 0, 1);
7273

7374
file.close();
7475
}
@@ -106,7 +107,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
106107
file.write((uint8_t *) &_prefs->sf, sizeof(_prefs->sf)); // 112
107108
file.write((uint8_t *) &_prefs->cr, sizeof(_prefs->cr)); // 113
108109
file.write((uint8_t *) &_prefs->allow_read_only, sizeof(_prefs->allow_read_only)); // 114
109-
file.write((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
110+
file.write((uint8_t *) &_prefs->multi_acks, sizeof(_prefs->multi_acks)); // 115
110111
file.write((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
111112
file.write((uint8_t *) &_prefs->agc_reset_interval, sizeof(_prefs->agc_reset_interval)); // 120
112113
file.write(pad, 3); // 121
@@ -180,6 +181,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
180181
sprintf(reply, "> %d", (uint32_t) _prefs->interference_threshold);
181182
} else if (memcmp(config, "agc.reset.interval", 18) == 0) {
182183
sprintf(reply, "> %d", ((uint32_t) _prefs->agc_reset_interval) * 4);
184+
} else if (memcmp(config, "multi.acks", 10) == 0) {
185+
sprintf(reply, "> %d", (uint32_t) _prefs->multi_acks);
183186
} else if (memcmp(config, "allow.read.only", 15) == 0) {
184187
sprintf(reply, "> %s", _prefs->allow_read_only ? "on" : "off");
185188
} else if (memcmp(config, "flood.advert.interval", 21) == 0) {
@@ -235,6 +238,10 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
235238
_prefs->agc_reset_interval = atoi(&config[19]) / 4;
236239
savePrefs();
237240
strcpy(reply, "OK");
241+
} else if (memcmp(config, "multi.acks ", 11) == 0) {
242+
_prefs->multi_acks = atoi(&config[11]);
243+
savePrefs();
244+
strcpy(reply, "OK");
238245
} else if (memcmp(config, "allow.read.only ", 16) == 0) {
239246
_prefs->allow_read_only = memcmp(&config[16], "on", 2) == 0;
240247
savePrefs();

src/helpers/CommonCLI.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct NodePrefs { // persisted to file
2121
uint8_t sf;
2222
uint8_t cr;
2323
uint8_t allow_read_only;
24-
uint8_t reserved2;
24+
uint8_t multi_acks;
2525
float bw;
2626
uint8_t flood_max;
2727
uint8_t interference_threshold;

0 commit comments

Comments
 (0)