Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions examples/companion_radio/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,7 @@ void MyMesh::handleCmdFrame(size_t len) {
memcpy(&default_scope.key, _prefs.default_scope_key, sizeof(default_scope.key));
sendFloodScoped(default_scope, pkt, delay_millis);
} else {
sendZeroHop(pkt);
sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);
}
writeOKFrame();
} else {
Expand Down Expand Up @@ -1970,7 +1970,7 @@ void MyMesh::handleCmdFrame(size_t len) {
} else if (cmd_frame[0] == CMD_SEND_CONTROL_DATA && len >= 2 && (cmd_frame[1] & 0x80) != 0) {
auto resp = createControlData(&cmd_frame[1], len - 1);
if (resp) {
sendZeroHop(resp);
sendZeroHop(resp, (uint32_t)0, _prefs.path_hash_mode + 1);
writeOKFrame();
} else {
writeErrFrame(ERR_CODE_TABLE_FULL);
Expand Down Expand Up @@ -2258,7 +2258,7 @@ bool MyMesh::advert() {
pkt = createSelfAdvert(_prefs.node_name, sensors.node_lat, sensors.node_lon);
}
if (pkt) {
sendZeroHop(pkt);
sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);
return true;
} else {
return false;
Expand Down
8 changes: 4 additions & 4 deletions examples/simple_repeater/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -811,7 +811,7 @@ void MyMesh::onControlDataRecv(mesh::Packet* packet) {
memcpy(&data[6], self_id.pub_key, PUB_KEY_SIZE);
auto resp = createControlData(data, prefix_only ? 6 + 8 : 6 + PUB_KEY_SIZE);
if (resp) {
sendZeroHop(resp, getRetransmitDelay(resp)*4); // apply random delay (widened x4), as multiple nodes can respond to this
sendZeroHop(resp, getRetransmitDelay(resp)*4, _prefs.path_hash_mode + 1); // apply random delay (widened x4), as multiple nodes can respond to this
}
}
} else if (type == CTL_TYPE_NODE_DISCOVER_RESP && packet->payload_len >= 6) {
Expand Down Expand Up @@ -854,7 +854,7 @@ void MyMesh::sendNodeDiscoverReq() {

auto pkt = createControlData(data, sizeof(data));
if (pkt) {
sendZeroHop(pkt);
sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);
}
}

Expand Down Expand Up @@ -1035,7 +1035,7 @@ void MyMesh::sendSelfAdvertisement(int delay_millis, bool flood) {
if (flood) {
sendFloodScoped(default_scope, pkt, delay_millis, _prefs.path_hash_mode + 1);
} else {
sendZeroHop(pkt, delay_millis);
sendZeroHop(pkt, delay_millis, _prefs.path_hash_mode + 1);
}
} else {
MESH_DEBUG_PRINTLN("ERROR: unable to create advertisement packet!");
Expand Down Expand Up @@ -1301,7 +1301,7 @@ void MyMesh::loop() {
updateAdvertTimer(); // also schedule local advert (so they don't overlap)
} else if (next_local_advert && millisHasNowPassed(next_local_advert)) {
mesh::Packet *pkt = createSelfAdvert();
if (pkt) sendZeroHop(pkt);
if (pkt) sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);

updateAdvertTimer(); // schedule next local advert
}
Expand Down
4 changes: 2 additions & 2 deletions examples/simple_room_server/MyMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ void MyMesh::sendSelfAdvertisement(int delay_millis, bool flood) {
if (flood) {
sendFloodScoped(default_scope, pkt, delay_millis, _prefs.path_hash_mode + 1);
} else {
sendZeroHop(pkt, delay_millis);
sendZeroHop(pkt, delay_millis, _prefs.path_hash_mode + 1);
}
} else {
MESH_DEBUG_PRINTLN("ERROR: unable to create advertisement packet!");
Expand Down Expand Up @@ -1047,7 +1047,7 @@ void MyMesh::loop() {
updateAdvertTimer(); // also schedule local advert (so they don't overlap)
} else if (next_local_advert && millisHasNowPassed(next_local_advert)) {
mesh::Packet *pkt = createSelfAdvert();
if (pkt) sendZeroHop(pkt);
if (pkt) sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);

updateAdvertTimer(); // schedule next local advert
}
Expand Down
2 changes: 1 addition & 1 deletion examples/simple_secure_chat/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ class MyMesh : public BaseChatMesh, ContactVisitor {
} else if (strcmp(command, "advert") == 0) {
auto pkt = createSelfAdvert(_prefs.node_name, _prefs.node_lat, _prefs.node_lon);
if (pkt) {
sendZeroHop(pkt);
sendZeroHop(pkt); // no path.hash.mode in this example, 1-byte default stands
Serial.println(" (advert sent, zero hop).");
} else {
Serial.println(" ERR: unable to send");
Expand Down
6 changes: 3 additions & 3 deletions examples/simple_sensor/SensorMesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ void SensorMesh::onControlDataRecv(mesh::Packet* packet) {
memcpy(&data[6], self_id.pub_key, PUB_KEY_SIZE);
auto resp = createControlData(data, prefix_only ? 6 + 8 : 6 + PUB_KEY_SIZE);
if (resp) {
sendZeroHop(resp, getRetransmitDelay(resp)*4); // apply random delay (widened x4), as multiple nodes can respond to this
sendZeroHop(resp, getRetransmitDelay(resp)*4, _prefs.path_hash_mode + 1); // apply random delay (widened x4), as multiple nodes can respond to this
}
}
}
Expand Down Expand Up @@ -826,7 +826,7 @@ void SensorMesh::sendSelfAdvertisement(int delay_millis, bool flood) {
if (flood) {
sendFlood(pkt, delay_millis, _prefs.path_hash_mode + 1);
} else {
sendZeroHop(pkt, delay_millis);
sendZeroHop(pkt, delay_millis, _prefs.path_hash_mode + 1);
}
} else {
MESH_DEBUG_PRINTLN("ERROR: unable to create advertisement packet!");
Expand Down Expand Up @@ -908,7 +908,7 @@ void SensorMesh::loop() {
updateAdvertTimer(); // also schedule local advert (so they don't overlap)
} else if (next_local_advert && millisHasNowPassed(next_local_advert)) {
mesh::Packet* pkt = createSelfAdvert();
if (pkt) sendZeroHop(pkt);
if (pkt) sendZeroHop(pkt, (uint32_t)0, _prefs.path_hash_mode + 1);

updateAdvertTimer(); // schedule next local advert
}
Expand Down
22 changes: 18 additions & 4 deletions src/Mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -714,24 +714,38 @@ void Mesh::sendDirect(Packet* packet, const uint8_t* path, uint8_t path_len, uin
sendPacket(packet, pri, delay_millis);
}

void Mesh::sendZeroHop(Packet* packet, uint32_t delay_millis) {
void Mesh::sendZeroHop(Packet* packet, uint32_t delay_millis, uint8_t path_hash_size) {
if (path_hash_size == 0 || path_hash_size > 3) {
MESH_DEBUG_PRINTLN("%s Mesh::sendZeroHop(): invalid path_hash_size", getLogDateTime());
return;
}

packet->header &= ~PH_ROUTE_MASK;
packet->header |= ROUTE_TYPE_DIRECT;

packet->path_len = 0; // path_len of zero means Zero Hop
// Zero hop = zero path segments, but the path hash size still has to be
// written: it lives in the upper 2 bits of the same byte, so the previous
// `path_len = 0` cleared it as well and every zero hop packet went out
// declaring a 1-byte path hash regardless of the node's path.hash.mode.
packet->setPathHashSizeAndCount(path_hash_size, 0);

_tables->markSeen(packet); // mark this packet as already sent in case it is rebroadcast back to us

sendPacket(packet, 0, delay_millis);
}

void Mesh::sendZeroHop(Packet* packet, uint16_t* transport_codes, uint32_t delay_millis) {
void Mesh::sendZeroHop(Packet* packet, uint16_t* transport_codes, uint32_t delay_millis, uint8_t path_hash_size) {
if (path_hash_size == 0 || path_hash_size > 3) {
MESH_DEBUG_PRINTLN("%s Mesh::sendZeroHop(): invalid path_hash_size", getLogDateTime());
return;
}

packet->header &= ~PH_ROUTE_MASK;
packet->header |= ROUTE_TYPE_TRANSPORT_DIRECT;
packet->transport_codes[0] = transport_codes[0];
packet->transport_codes[1] = transport_codes[1];

packet->path_len = 0; // path_len of zero means Zero Hop
packet->setPathHashSizeAndCount(path_hash_size, 0); // see note in the overload above

_tables->markSeen(packet); // mark this packet as already sent in case it is rebroadcast back to us

Expand Down
6 changes: 4 additions & 2 deletions src/Mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,14 +214,16 @@ class Mesh : public Dispatcher {

/**
* \brief send a locally-generated Packet to just neighbor nodes (zero hops)
* \param path_hash_size width this node advertises in the path byte (1..3)
*/
void sendZeroHop(Packet* packet, uint32_t delay_millis=0);
void sendZeroHop(Packet* packet, uint32_t delay_millis=0, uint8_t path_hash_size=1);

/**
* \brief send a locally-generated Packet to just neighbor nodes (zero hops), with specific transport codes
* \param transport_codes array of 2 codes to attach to packet
* \param path_hash_size width this node advertises in the path byte (1..3)
*/
void sendZeroHop(Packet* packet, uint16_t* transport_codes, uint32_t delay_millis=0);
void sendZeroHop(Packet* packet, uint16_t* transport_codes, uint32_t delay_millis=0, uint8_t path_hash_size=1);

};

Expand Down