diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index ae225d36..953ede67 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -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; diff --git a/src/Packet.cpp b/src/Packet.cpp index e338b60d..48f7699e 100644 --- a/src/Packet.cpp +++ b/src/Packet.cpp @@ -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; diff --git a/src/Packet.h b/src/Packet.h index e20b3a49..08e78899 100644 --- a/src/Packet.h +++ b/src/Packet.h @@ -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