|
|
|
@ -617,6 +617,38 @@ bool SensorMesh::handleIncomingMsg(ClientInfo& from, uint32_t timestamp, uint8_t |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
#define CTL_TYPE_NODE_DISCOVER_REQ 0x80 |
|
|
|
#define CTL_TYPE_NODE_DISCOVER_RESP 0x90 |
|
|
|
|
|
|
|
void SensorMesh::onControlDataRecv(mesh::Packet* packet) { |
|
|
|
uint8_t type = packet->payload[0] & 0xF0; // just test upper 4 bits
|
|
|
|
if (type == CTL_TYPE_NODE_DISCOVER_REQ && packet->payload_len >= 6) { |
|
|
|
// TODO: apply rate limiting to these!
|
|
|
|
int i = 1; |
|
|
|
uint8_t filter = packet->payload[i++]; |
|
|
|
uint32_t tag; |
|
|
|
memcpy(&tag, &packet->payload[i], 4); i += 4; |
|
|
|
uint32_t since; |
|
|
|
if (packet->payload_len >= i+4) { // optional since field
|
|
|
|
memcpy(&since, &packet->payload[i], 4); i += 4; |
|
|
|
} else { |
|
|
|
since = 0; |
|
|
|
} |
|
|
|
|
|
|
|
if ((filter & (1 << ADV_TYPE_SENSOR)) != 0 && _prefs.discovery_mod_timestamp >= since) { |
|
|
|
uint8_t data[6 + PUB_KEY_SIZE]; |
|
|
|
data[0] = CTL_TYPE_NODE_DISCOVER_RESP | ADV_TYPE_SENSOR; // low 4-bits for node type
|
|
|
|
data[1] = packet->_snr; // let sender know the inbound SNR ( x 4)
|
|
|
|
memcpy(&data[2], &tag, 4); // include tag from request, for client to match to
|
|
|
|
memcpy(&data[6], self_id.pub_key, PUB_KEY_SIZE); |
|
|
|
auto resp = createControlData(data, sizeof(data)); |
|
|
|
if (resp) { |
|
|
|
sendZeroHop(resp, getRetransmitDelay(resp)); // apply random delay, as multiple nodes can respond to this
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool SensorMesh::onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) { |
|
|
|
int i = matching_peer_indexes[sender_idx]; |
|
|
|
if (i < 0 || i >= acl.getNumClients()) { |
|
|
|
|