|
|
|
|
@@ -39,7 +39,7 @@ mesh::Packet* BaseChatMesh::createSelfAdvert(const char* name, double lat, doubl
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseChatMesh::sendAckTo(const ContactInfo& dest, uint32_t ack_hash) {
|
|
|
|
|
if (dest.out_path_len < 0) {
|
|
|
|
|
if (dest.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
mesh::Packet* ack = createAck(ack_hash);
|
|
|
|
|
if (ack) sendFloodScoped(dest, ack, TXT_ACK_DELAY);
|
|
|
|
|
} else {
|
|
|
|
|
@@ -92,7 +92,7 @@ ContactInfo* BaseChatMesh::allocateContactSlot() {
|
|
|
|
|
void BaseChatMesh::populateContactFromAdvert(ContactInfo& ci, const mesh::Identity& id, const AdvertDataParser& parser, uint32_t timestamp) {
|
|
|
|
|
memset(&ci, 0, sizeof(ci));
|
|
|
|
|
ci.id = id;
|
|
|
|
|
ci.out_path_len = -1; // initially out_path is unknown
|
|
|
|
|
ci.out_path_len = OUT_PATH_UNKNOWN;
|
|
|
|
|
StrHelper::strncpy(ci.name, parser.getName(), sizeof(ci.name));
|
|
|
|
|
ci.type = parser.getType();
|
|
|
|
|
if (parser.hasLatLon()) {
|
|
|
|
|
@@ -263,7 +263,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
|
|
|
|
|
} else {
|
|
|
|
|
mesh::Packet* reply = createDatagram(PAYLOAD_TYPE_RESPONSE, from.id, secret, temp_buf, reply_len);
|
|
|
|
|
if (reply) {
|
|
|
|
|
if (from.out_path_len >= 0) { // we have an out_path, so send DIRECT
|
|
|
|
|
if (from.out_path_len != OUT_PATH_UNKNOWN) { // we have an out_path, so send DIRECT
|
|
|
|
|
sendDirect(reply, from.out_path, from.out_path_len, SERVER_RESPONSE_DELAY);
|
|
|
|
|
} else {
|
|
|
|
|
sendFloodScoped(from, reply, SERVER_RESPONSE_DELAY);
|
|
|
|
|
@@ -273,7 +273,7 @@ void BaseChatMesh::onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender
|
|
|
|
|
}
|
|
|
|
|
} else if (type == PAYLOAD_TYPE_RESPONSE && len > 0) {
|
|
|
|
|
onContactResponse(from, data, len);
|
|
|
|
|
if (packet->isRouteFlood() && from.out_path_len >= 0) {
|
|
|
|
|
if (packet->isRouteFlood() && from.out_path_len != OUT_PATH_UNKNOWN) {
|
|
|
|
|
// we have direct path, but other node is still sending flood response, so maybe they didn't receive reciprocal path properly(?)
|
|
|
|
|
handleReturnPathRetry(from, packet->path, packet->path_len);
|
|
|
|
|
}
|
|
|
|
|
@@ -295,7 +295,7 @@ bool BaseChatMesh::onPeerPathRecv(mesh::Packet* packet, int sender_idx, const ui
|
|
|
|
|
bool BaseChatMesh::onContactPathRecv(ContactInfo& from, uint8_t* in_path, uint8_t in_path_len, uint8_t* out_path, uint8_t out_path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) {
|
|
|
|
|
// NOTE: default impl, we just replace the current 'out_path' regardless, whenever sender sends us a new out_path.
|
|
|
|
|
// FUTURE: could store multiple out_paths per contact, and try to find which is the 'best'(?)
|
|
|
|
|
memcpy(from.out_path, out_path, from.out_path_len = out_path_len); // store a copy of path, for sendDirect()
|
|
|
|
|
from.out_path_len = mesh::Packet::copyPath(from.out_path, out_path, out_path_len); // store a copy of path, for sendDirect()
|
|
|
|
|
from.lastmod = getRTCClock()->getCurrentTime();
|
|
|
|
|
|
|
|
|
|
onContactPathUpdated(from);
|
|
|
|
|
@@ -317,7 +317,7 @@ void BaseChatMesh::onAckRecv(mesh::Packet* packet, uint32_t ack_crc) {
|
|
|
|
|
txt_send_timeout = 0; // matched one we're waiting for, cancel timeout timer
|
|
|
|
|
packet->markDoNotRetransmit(); // ACK was for this node, so don't retransmit
|
|
|
|
|
|
|
|
|
|
if (packet->isRouteFlood() && from->out_path_len >= 0) {
|
|
|
|
|
if (packet->isRouteFlood() && from->out_path_len != OUT_PATH_UNKNOWN) {
|
|
|
|
|
// we have direct path, but other node is still sending flood, so maybe they didn't receive reciprocal path properly(?)
|
|
|
|
|
handleReturnPathRetry(*from, packet->path, packet->path_len);
|
|
|
|
|
}
|
|
|
|
|
@@ -386,7 +386,7 @@ int BaseChatMesh::sendMessage(const ContactInfo& recipient, uint32_t timestamp,
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
|
|
|
|
|
int rc;
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
|
|
|
|
|
rc = MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -412,7 +412,7 @@ int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timest
|
|
|
|
|
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
int rc;
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
txt_send_timeout = futureMillis(est_timeout = calcFloodTimeoutMillisFor(t));
|
|
|
|
|
rc = MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -500,7 +500,7 @@ int BaseChatMesh::sendLogin(const ContactInfo& recipient, const char* password,
|
|
|
|
|
}
|
|
|
|
|
if (pkt) {
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
est_timeout = calcFloodTimeoutMillisFor(t);
|
|
|
|
|
return MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -525,7 +525,7 @@ int BaseChatMesh::sendAnonReq(const ContactInfo& recipient, const uint8_t* data,
|
|
|
|
|
}
|
|
|
|
|
if (pkt) {
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
est_timeout = calcFloodTimeoutMillisFor(t);
|
|
|
|
|
return MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -552,7 +552,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, const uint8_t* req_
|
|
|
|
|
}
|
|
|
|
|
if (pkt) {
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
est_timeout = calcFloodTimeoutMillisFor(t);
|
|
|
|
|
return MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -579,7 +579,7 @@ int BaseChatMesh::sendRequest(const ContactInfo& recipient, uint8_t req_type, u
|
|
|
|
|
}
|
|
|
|
|
if (pkt) {
|
|
|
|
|
uint32_t t = _radio->getEstAirtimeFor(pkt->getRawLength());
|
|
|
|
|
if (recipient.out_path_len < 0) {
|
|
|
|
|
if (recipient.out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
sendFloodScoped(recipient, pkt);
|
|
|
|
|
est_timeout = calcFloodTimeoutMillisFor(t);
|
|
|
|
|
return MSG_SEND_SENT_FLOOD;
|
|
|
|
|
@@ -683,7 +683,7 @@ void BaseChatMesh::checkConnections() {
|
|
|
|
|
MESH_DEBUG_PRINTLN("checkConnections(): Keep_alive contact not found!");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (contact->out_path_len < 0) {
|
|
|
|
|
if (contact->out_path_len == OUT_PATH_UNKNOWN) {
|
|
|
|
|
MESH_DEBUG_PRINTLN("checkConnections(): Keep_alive contact, no out_path!");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
@@ -710,7 +710,7 @@ void BaseChatMesh::checkConnections() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BaseChatMesh::resetPathTo(ContactInfo& recipient) {
|
|
|
|
|
recipient.out_path_len = -1;
|
|
|
|
|
recipient.out_path_len = OUT_PATH_UNKNOWN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static ContactInfo* table; // pass via global :-(
|
|
|
|
|
|