* Packet::header, new: ROUTE_TYPE_TRANS_FLOOD, ROUTE_TYPE_TRANS_DIRECT

* Packet wire format change: (optional) extra 4 bytes for two trans_codes
This commit is contained in:
Scott Powell 2025-04-11 04:56:13 +10:00
parent a5f210779f
commit 3c7ff8da29
3 changed files with 27 additions and 4 deletions

View file

@ -101,6 +101,12 @@ void Dispatcher::checkRecv() {
#endif
pkt->header = raw[i++];
if (pkt->hasTransCodes()) {
memcpy(&pkt->trans_codes[0], &raw[i], 2); i += 2;
memcpy(&pkt->trans_codes[1], &raw[i], 2); i += 2;
} else {
pkt->trans_codes[0] = pkt->trans_codes[1] = 0;
}
pkt->path_len = raw[i++];
if (pkt->path_len > MAX_PATH_SIZE || i + pkt->path_len > len) {
@ -212,6 +218,10 @@ void Dispatcher::checkSend() {
raw[len++] = NODE_ID;
#endif
raw[len++] = outbound->header;
if (outbound->hasTransCodes()) {
memcpy(&raw[len], &outbound->trans_codes[0], 2); len += 2;
memcpy(&raw[len], &outbound->trans_codes[1], 2); len += 2;
}
raw[len++] = outbound->path_len;
memcpy(&raw[len], outbound->path, outbound->path_len); len += outbound->path_len;

View file

@ -24,6 +24,10 @@ void Packet::calculatePacketHash(uint8_t* hash) const {
uint8_t Packet::writeTo(uint8_t dest[]) const {
uint8_t i = 0;
dest[i++] = header;
if (hasTransCodes()) {
memcpy(&dest[i], &trans_codes[0], 2); i += 2;
memcpy(&dest[i], &trans_codes[1], 2); i += 2;
}
dest[i++] = path_len;
memcpy(&dest[i], path, path_len); i += path_len;
memcpy(&dest[i], payload, payload_len); i += payload_len;
@ -33,6 +37,12 @@ uint8_t Packet::writeTo(uint8_t dest[]) const {
bool Packet::readFrom(const uint8_t src[], uint8_t len) {
uint8_t i = 0;
header = src[i++];
if (hasTransCodes()) {
memcpy(&trans_codes[0], &src[i], 2); i += 2;
memcpy(&trans_codes[1], &src[i], 2); i += 2;
} else {
trans_codes[0] = trans_codes[1] = 0;
}
path_len = src[i++];
if (path_len > sizeof(path)) return false; // bad encoding
memcpy(path, &src[i], path_len); i += path_len;

View file

@ -11,10 +11,10 @@ namespace mesh {
#define PH_VER_SHIFT 6
#define PH_VER_MASK 0x03 // 2-bits
#define ROUTE_TYPE_RESERVED1 0x00 // FUTURE
#define ROUTE_TYPE_TRANS_FLOOD 0x00 // flood mode + transport codes
#define ROUTE_TYPE_FLOOD 0x01 // flood mode, needs 'path' to be built up (max 64 bytes)
#define ROUTE_TYPE_DIRECT 0x02 // direct route, 'path' is supplied
#define ROUTE_TYPE_RESERVED2 0x03 // FUTURE
#define ROUTE_TYPE_TRANS_DIRECT 0x03 // direct route + transport codes
#define PAYLOAD_TYPE_REQ 0x00 // request (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob)
#define PAYLOAD_TYPE_RESPONSE 0x01 // response to REQ or ANON_REQ (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob)
@ -43,6 +43,7 @@ public:
uint8_t header;
uint16_t payload_len, path_len;
uint16_t trans_codes[2];
uint8_t path[MAX_PATH_SIZE];
uint8_t payload[MAX_PACKET_PAYLOAD];
int8_t _snr;
@ -58,8 +59,10 @@ public:
*/
uint8_t getRouteType() const { return header & PH_ROUTE_MASK; }
bool isRouteFlood() const { return getRouteType() == ROUTE_TYPE_FLOOD; }
bool isRouteDirect() const { return getRouteType() == ROUTE_TYPE_DIRECT; }
bool isRouteFlood() const { return getRouteType() == ROUTE_TYPE_FLOOD || getRouteType() == ROUTE_TYPE_TRANS_FLOOD; }
bool isRouteDirect() const { return getRouteType() == ROUTE_TYPE_DIRECT || getRouteType() == ROUTE_TYPE_TRANS_DIRECT; }
bool hasTransCodes() const { return getRouteType() == ROUTE_TYPE_TRANS_FLOOD || getRouteType() == ROUTE_TYPE_TRANS_DIRECT; }
/**
* \returns one of PAYLOAD_TYPE_ values