mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
* refactored the hasSeen(Packet) stuff.
This commit is contained in:
parent
8983584dd8
commit
20fccac2b7
10 changed files with 68 additions and 133 deletions
|
|
@ -7,7 +7,7 @@
|
|||
#include <helpers/RadioLibWrappers.h>
|
||||
#include <helpers/ArduinoHelpers.h>
|
||||
#include <helpers/StaticPoolPacketManager.h>
|
||||
#include <helpers/SimpleSeenTable.h>
|
||||
#include <helpers/SimpleMeshTables.h>
|
||||
|
||||
/* ------------------------------ Config -------------------------------- */
|
||||
|
||||
|
|
@ -21,7 +21,6 @@
|
|||
/* ------------------------------ Code -------------------------------- */
|
||||
|
||||
class MyMesh : public mesh::Mesh {
|
||||
SimpleSeenTable* _table;
|
||||
uint32_t last_advert_timestamp = 0;
|
||||
mesh::Identity server_id;
|
||||
uint8_t server_secret[PUB_KEY_SIZE];
|
||||
|
|
@ -54,8 +53,6 @@ protected:
|
|||
|
||||
void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, uint8_t* data, size_t len) override {
|
||||
if (type == PAYLOAD_TYPE_RESPONSE) {
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
Serial.println("Received PING Reply!");
|
||||
|
||||
if (packet->isRouteFlood()) {
|
||||
|
|
@ -67,8 +64,6 @@ protected:
|
|||
}
|
||||
|
||||
void onPeerPathRecv(mesh::Packet* packet, int sender_idx, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override {
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
// must be from server_id
|
||||
Serial.printf("PATH to server, path_len=%d\n", (uint32_t) path_len);
|
||||
|
||||
|
|
@ -86,8 +81,8 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleSeenTable& table)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16)), _table(&table)
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -110,9 +105,9 @@ public:
|
|||
|
||||
SPIClass spi;
|
||||
StdRNG fast_rng;
|
||||
SimpleSeenTable table;
|
||||
SimpleMeshTables tables;
|
||||
SX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), fast_rng, *new VolatileRTCClock(), table);
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), fast_rng, *new VolatileRTCClock(), tables);
|
||||
unsigned long nextPing;
|
||||
|
||||
void halt() {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <helpers/RadioLibWrappers.h>
|
||||
#include <helpers/ArduinoHelpers.h>
|
||||
#include <helpers/StaticPoolPacketManager.h>
|
||||
#include <helpers/SimpleMeshTables.h>
|
||||
|
||||
/* ------------------------------ Config -------------------------------- */
|
||||
|
||||
|
|
@ -56,7 +57,7 @@ protected:
|
|||
|
||||
auto client = putClient(sender); // add to known clients (if not already known)
|
||||
if (client == NULL || timestamp <= client->last_timestamp) {
|
||||
return; // FATAL: client table is full -OR- replay attack -OR- have seen this packet before
|
||||
return; // FATAL: client table is full -OR- replay attack
|
||||
}
|
||||
|
||||
client->last_timestamp = timestamp;
|
||||
|
|
@ -123,8 +124,8 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
MyMesh(mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc)
|
||||
: mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(16))
|
||||
MyMesh(mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables)
|
||||
: mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(16), tables)
|
||||
{
|
||||
num_clients = 0;
|
||||
}
|
||||
|
|
@ -132,8 +133,9 @@ public:
|
|||
|
||||
SPIClass spi;
|
||||
StdRNG fast_rng;
|
||||
SimpleMeshTables tables;
|
||||
SX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), *new ArduinoMillis(), fast_rng, *new VolatileRTCClock());
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), *new ArduinoMillis(), fast_rng, *new VolatileRTCClock(), tables);
|
||||
|
||||
unsigned long nextAnnounce;
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ struct ClientInfo {
|
|||
|
||||
class MyMesh : public mesh::Mesh {
|
||||
RadioLibWrapper* my_radio;
|
||||
mesh::MeshTables* _tables;
|
||||
float airtime_factor;
|
||||
uint8_t reply_data[MAX_PACKET_PAYLOAD];
|
||||
int num_clients;
|
||||
|
|
@ -145,12 +144,6 @@ protected:
|
|||
}
|
||||
|
||||
bool allowPacketForward(const mesh::Packet* packet) override {
|
||||
uint8_t hash[MAX_HASH_SIZE];
|
||||
packet->calculatePacketHash(hash);
|
||||
|
||||
if (_tables->hasForwarded(hash)) return false; // has already been forwarded
|
||||
|
||||
_tables->setHasForwarded(hash); // mark packet as forwarded
|
||||
return true; // Yes, allow packet to be forwarded
|
||||
}
|
||||
|
||||
|
|
@ -162,7 +155,7 @@ protected:
|
|||
if (memcmp(&data[4], ADMIN_PASSWORD, 8) == 0) { // check for valid password
|
||||
auto client = putClient(sender); // add to known clients (if not already known)
|
||||
if (client == NULL || timestamp <= client->last_timestamp) {
|
||||
return; // FATAL: client table is full -OR- replay attack -OR- have seen this packet before
|
||||
return; // FATAL: client table is full -OR- replay attack
|
||||
}
|
||||
|
||||
client->last_timestamp = timestamp;
|
||||
|
|
@ -222,7 +215,7 @@ protected:
|
|||
uint32_t timestamp;
|
||||
memcpy(×tamp, data, 4);
|
||||
|
||||
if (timestamp > client->last_timestamp) { // prevent replay attacks AND receiving via multiple paths
|
||||
if (timestamp > client->last_timestamp) { // prevent replay attacks
|
||||
int reply_len = handleRequest(client, &data[4], len - 4);
|
||||
if (reply_len == 0) return; // invalid command
|
||||
|
||||
|
|
@ -267,7 +260,7 @@ protected:
|
|||
|
||||
public:
|
||||
MyMesh(RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables)
|
||||
: mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32)), _tables(&tables)
|
||||
: mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables)
|
||||
{
|
||||
my_radio = &radio;
|
||||
airtime_factor = 5.0; // 1/6th
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#include <helpers/RadioLibWrappers.h>
|
||||
#include <helpers/ArduinoHelpers.h>
|
||||
#include <helpers/StaticPoolPacketManager.h>
|
||||
#include <helpers/SimpleSeenTable.h>
|
||||
#include <helpers/SimpleMeshTables.h>
|
||||
|
||||
/* ---------------------------------- CONFIGURATION ------------------------------------- */
|
||||
|
||||
|
|
@ -52,7 +52,6 @@ struct ContactInfo {
|
|||
|
||||
class MyMesh : public mesh::Mesh {
|
||||
public:
|
||||
SimpleSeenTable* _table;
|
||||
ContactInfo contacts[MAX_CONTACTS];
|
||||
int num_contacts;
|
||||
|
||||
|
|
@ -111,7 +110,6 @@ protected:
|
|||
// NOTE: this is a 'first packet wins' impl. When receiving from multiple paths, the first to arrive wins.
|
||||
// For flood mode, the path may not be the 'best' in terms of hops.
|
||||
// FUTURE: could send back multiple paths, using createPathReturn(), and let sender choose which to use(?)
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
int i = matching_peer_indexes[sender_idx];
|
||||
if (i < 0 && i >= num_contacts) {
|
||||
|
|
@ -152,8 +150,6 @@ protected:
|
|||
}
|
||||
|
||||
void onPeerPathRecv(mesh::Packet* packet, int sender_idx, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override {
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
int i = matching_peer_indexes[sender_idx];
|
||||
if (i < 0 && i >= num_contacts) {
|
||||
MESH_DEBUG_PRINTLN("onPeerPathRecv: Invalid sender idx: %d", i);
|
||||
|
|
@ -199,8 +195,8 @@ protected:
|
|||
public:
|
||||
uint32_t expected_ack_crc;
|
||||
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleSeenTable& table)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16)), _table(&table)
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables)
|
||||
{
|
||||
num_contacts = 0;
|
||||
}
|
||||
|
|
@ -233,9 +229,9 @@ public:
|
|||
|
||||
SPIClass spi;
|
||||
StdRNG fast_rng;
|
||||
SimpleSeenTable table;
|
||||
SimpleMeshTables tables;
|
||||
SX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), fast_rng, *new VolatileRTCClock(), table);
|
||||
MyMesh the_mesh(*new RadioLibWrapper(radio, board), fast_rng, *new VolatileRTCClock(), tables);
|
||||
|
||||
void halt() {
|
||||
while (1) ;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
#include <RadioLib.h>
|
||||
#include <helpers/CustomSX1262Wrapper.h>
|
||||
#include <helpers/ArduinoHelpers.h>
|
||||
#include <helpers/SimpleSeenTable.h>
|
||||
#include <helpers/SimpleMeshTables.h>
|
||||
#include <helpers/StaticPoolPacketManager.h>
|
||||
|
||||
/* ---------------------------------- CONFIGURATION ------------------------------------- */
|
||||
|
|
@ -41,7 +41,6 @@ struct RepeaterStats {
|
|||
};
|
||||
|
||||
class MyMesh : public mesh::Mesh {
|
||||
SimpleSeenTable* _table;
|
||||
uint32_t last_advert_timestamp = 0;
|
||||
mesh::Identity server_id;
|
||||
uint8_t server_secret[PUB_KEY_SIZE];
|
||||
|
|
@ -105,8 +104,6 @@ protected:
|
|||
|
||||
void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, uint8_t* data, size_t len) override {
|
||||
if (type == PAYLOAD_TYPE_RESPONSE) {
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
handleResponse(data, len);
|
||||
|
||||
if (packet->isRouteFlood()) {
|
||||
|
|
@ -118,8 +115,6 @@ protected:
|
|||
}
|
||||
|
||||
void onPeerPathRecv(mesh::Packet* packet, int sender_idx, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override {
|
||||
if (_table->hasSeenPacket(packet)) return;
|
||||
|
||||
// must be from server_id
|
||||
Serial.printf("PATH to repeater, path_len=%d\n", (uint32_t) path_len);
|
||||
|
||||
|
|
@ -137,8 +132,8 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleSeenTable& table)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16)), _table(&table)
|
||||
MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables)
|
||||
: mesh::Mesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -206,14 +201,14 @@ public:
|
|||
};
|
||||
|
||||
StdRNG fast_rng;
|
||||
SimpleSeenTable table;
|
||||
SimpleMeshTables tables;
|
||||
#if defined(P_LORA_SCLK)
|
||||
SPIClass spi;
|
||||
CustomSX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi);
|
||||
#else
|
||||
CustomSX1262 radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY);
|
||||
#endif
|
||||
MyMesh the_mesh(*new CustomSX1262Wrapper(radio, board), fast_rng, *new VolatileRTCClock(), table);
|
||||
MyMesh the_mesh(*new CustomSX1262Wrapper(radio, board), fast_rng, *new VolatileRTCClock(), tables);
|
||||
|
||||
void halt() {
|
||||
while (1) ;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue