Skip to content

Commit 1d25c87

Browse files
committed
Refactor bridge packet handling to use common magic number and size constants
1 parent 7fca204 commit 1d25c87

File tree

6 files changed

+40
-37
lines changed

6 files changed

+40
-37
lines changed

src/helpers/bridges/BridgeBase.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@ class BridgeBase : public AbstractBridge {
2121
public:
2222
virtual ~BridgeBase() = default;
2323

24+
/**
25+
* @brief Common magic number used by all bridge implementations for packet identification
26+
*
27+
* This magic number is placed at the beginning of bridge packets to identify
28+
* them as mesh bridge packets and provide frame synchronization.
29+
*/
30+
static constexpr uint16_t BRIDGE_PACKET_MAGIC = 0xC03E;
31+
32+
/**
33+
* @brief Common field sizes used by bridge implementations
34+
*
35+
* These constants define the size of common packet fields used across bridges.
36+
* BRIDGE_MAGIC_SIZE is used by all bridges for packet identification.
37+
* BRIDGE_LENGTH_SIZE is used by bridges that need explicit length fields (like RS232).
38+
* BRIDGE_CHECKSUM_SIZE is used by all bridges for Fletcher-16 checksums.
39+
*/
40+
static constexpr uint16_t BRIDGE_MAGIC_SIZE = sizeof(BRIDGE_PACKET_MAGIC);
41+
static constexpr uint16_t BRIDGE_LENGTH_SIZE = sizeof(uint16_t);
42+
static constexpr uint16_t BRIDGE_CHECKSUM_SIZE = sizeof(uint16_t);
43+
2444
protected:
2545
/** Packet manager for allocating and queuing mesh packets */
2646
mesh::PacketManager *_mgr;

src/helpers/bridges/ESPNowBridge.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void ESPNowBridge::xorCrypt(uint8_t *data, size_t len) {
6666

6767
void ESPNowBridge::onDataRecv(const uint8_t *mac, const uint8_t *data, int32_t len) {
6868
// Ignore packets that are too small to contain header + checksum
69-
if (len < (MAGIC_HEADER_SIZE + CHECKSUM_SIZE)) {
69+
if (len < (BRIDGE_MAGIC_SIZE + BRIDGE_CHECKSUM_SIZE)) {
7070
#if MESH_PACKET_LOGGING
7171
Serial.printf("%s: ESPNOW BRIDGE: RX packet too small, len=%d\n", getLogDateTime(), len);
7272
#endif
@@ -83,7 +83,7 @@ void ESPNowBridge::onDataRecv(const uint8_t *mac, const uint8_t *data, int32_t l
8383

8484
// Check packet header magic
8585
uint16_t received_magic = (data[0] << 8) | data[1];
86-
if (received_magic != ESPNOW_HEADER_MAGIC) {
86+
if (received_magic != BRIDGE_PACKET_MAGIC) {
8787
#if MESH_PACKET_LOGGING
8888
Serial.printf("%s: ESPNOW BRIDGE: RX invalid magic 0x%04X\n", getLogDateTime(), received_magic);
8989
#endif
@@ -92,17 +92,17 @@ void ESPNowBridge::onDataRecv(const uint8_t *mac, const uint8_t *data, int32_t l
9292

9393
// Make a copy we can decrypt
9494
uint8_t decrypted[MAX_ESPNOW_PACKET_SIZE];
95-
const size_t encryptedDataLen = len - MAGIC_HEADER_SIZE;
96-
memcpy(decrypted, data + MAGIC_HEADER_SIZE, encryptedDataLen);
95+
const size_t encryptedDataLen = len - BRIDGE_MAGIC_SIZE;
96+
memcpy(decrypted, data + BRIDGE_MAGIC_SIZE, encryptedDataLen);
9797

9898
// Try to decrypt (checksum + payload)
9999
xorCrypt(decrypted, encryptedDataLen);
100100

101101
// Validate checksum
102102
uint16_t received_checksum = (decrypted[0] << 8) | decrypted[1];
103-
const size_t payloadLen = encryptedDataLen - CHECKSUM_SIZE;
103+
const size_t payloadLen = encryptedDataLen - BRIDGE_CHECKSUM_SIZE;
104104

105-
if (!validateChecksum(decrypted + CHECKSUM_SIZE, payloadLen, received_checksum)) {
105+
if (!validateChecksum(decrypted + BRIDGE_CHECKSUM_SIZE, payloadLen, received_checksum)) {
106106
// Failed to decrypt - likely from a different network
107107
#if MESH_PACKET_LOGGING
108108
Serial.printf("%s: ESPNOW BRIDGE: RX checksum mismatch, rcv=0x%04X\n", getLogDateTime(),
@@ -119,7 +119,7 @@ void ESPNowBridge::onDataRecv(const uint8_t *mac, const uint8_t *data, int32_t l
119119
mesh::Packet *pkt = _instance->_mgr->allocNew();
120120
if (!pkt) return;
121121

122-
if (pkt->readFrom(decrypted + CHECKSUM_SIZE, payloadLen)) {
122+
if (pkt->readFrom(decrypted + BRIDGE_CHECKSUM_SIZE, payloadLen)) {
123123
_instance->onPacketReceived(pkt);
124124
} else {
125125
_instance->_mgr->free(pkt);
@@ -161,11 +161,11 @@ void ESPNowBridge::onPacketTransmitted(mesh::Packet *packet) {
161161
uint8_t buffer[MAX_ESPNOW_PACKET_SIZE];
162162

163163
// Write magic header (2 bytes)
164-
buffer[0] = (ESPNOW_HEADER_MAGIC >> 8) & 0xFF;
165-
buffer[1] = ESPNOW_HEADER_MAGIC & 0xFF;
164+
buffer[0] = (BRIDGE_PACKET_MAGIC >> 8) & 0xFF;
165+
buffer[1] = BRIDGE_PACKET_MAGIC & 0xFF;
166166

167167
// Write packet payload starting after magic header and checksum
168-
const size_t packetOffset = MAGIC_HEADER_SIZE + CHECKSUM_SIZE;
168+
const size_t packetOffset = BRIDGE_MAGIC_SIZE + BRIDGE_CHECKSUM_SIZE;
169169
memcpy(buffer + packetOffset, sizingBuffer, meshPacketLen);
170170

171171
// Calculate and add checksum (only of the payload)
@@ -174,10 +174,10 @@ void ESPNowBridge::onPacketTransmitted(mesh::Packet *packet) {
174174
buffer[3] = checksum & 0xFF; // Low byte
175175

176176
// Encrypt payload and checksum (not including magic header)
177-
xorCrypt(buffer + MAGIC_HEADER_SIZE, meshPacketLen + CHECKSUM_SIZE);
177+
xorCrypt(buffer + BRIDGE_MAGIC_SIZE, meshPacketLen + BRIDGE_CHECKSUM_SIZE);
178178

179179
// Total packet size: magic header + checksum + payload
180-
const size_t totalPacketSize = MAGIC_HEADER_SIZE + CHECKSUM_SIZE + meshPacketLen;
180+
const size_t totalPacketSize = BRIDGE_MAGIC_SIZE + BRIDGE_CHECKSUM_SIZE + meshPacketLen;
181181

182182
// Broadcast using ESP-NOW
183183
uint8_t broadcastAddress[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };

src/helpers/bridges/ESPNowBridge.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,7 @@ class ESPNowBridge : public BridgeBase {
6565
/**
6666
* Size constants for packet parsing
6767
*/
68-
static const size_t MAGIC_HEADER_SIZE = 2;
69-
static const size_t CHECKSUM_SIZE = 2;
70-
static const size_t MAX_PAYLOAD_SIZE = MAX_ESPNOW_PACKET_SIZE - (MAGIC_HEADER_SIZE + CHECKSUM_SIZE);
71-
72-
/**
73-
* Magic bytes to identify ESPNowBridge packets
74-
*/
75-
static const uint16_t ESPNOW_HEADER_MAGIC = 0xC03E;
68+
static const size_t MAX_PAYLOAD_SIZE = MAX_ESPNOW_PACKET_SIZE - (BRIDGE_MAGIC_SIZE + BRIDGE_CHECKSUM_SIZE);
7669

7770
/** Buffer for receiving ESP-NOW packets */
7871
uint8_t _rx_buffer[MAX_ESPNOW_PACKET_SIZE];

src/helpers/bridges/RS232Bridge.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ void RS232Bridge::onPacketTransmitted(mesh::Packet *packet) {
5252
}
5353

5454
// Build packet header
55-
buffer[0] = (SERIAL_PKT_MAGIC >> 8) & 0xFF; // Magic high byte
56-
buffer[1] = SERIAL_PKT_MAGIC & 0xFF; // Magic low byte
55+
buffer[0] = (BRIDGE_PACKET_MAGIC >> 8) & 0xFF; // Magic high byte
56+
buffer[1] = BRIDGE_PACKET_MAGIC & 0xFF; // Magic low byte
5757
buffer[2] = (len >> 8) & 0xFF; // Length high byte
5858
buffer[3] = len & 0xFF; // Length low byte
5959

@@ -77,14 +77,14 @@ void RS232Bridge::loop() {
7777

7878
if (_rx_buffer_pos < 2) {
7979
// Waiting for magic word
80-
if ((_rx_buffer_pos == 0 && b == ((SERIAL_PKT_MAGIC >> 8) & 0xFF)) ||
81-
(_rx_buffer_pos == 1 && b == (SERIAL_PKT_MAGIC & 0xFF))) {
80+
if ((_rx_buffer_pos == 0 && b == ((BRIDGE_PACKET_MAGIC >> 8) & 0xFF)) ||
81+
(_rx_buffer_pos == 1 && b == (BRIDGE_PACKET_MAGIC & 0xFF))) {
8282
_rx_buffer[_rx_buffer_pos++] = b;
8383
} else {
8484
// Invalid magic byte, reset and start over
8585
_rx_buffer_pos = 0;
8686
// Check if this byte could be the start of a new magic word
87-
if (b == ((SERIAL_PKT_MAGIC >> 8) & 0xFF)) {
87+
if (b == ((BRIDGE_PACKET_MAGIC >> 8) & 0xFF)) {
8888
_rx_buffer[_rx_buffer_pos++] = b;
8989
}
9090
}

src/helpers/bridges/RS232Bridge.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,21 +113,11 @@ class RS232Bridge : public BridgeBase {
113113
* Total overhead: 6 bytes
114114
*/
115115

116-
/** Magic number to identify start of RS232Bridge packets */
117-
static constexpr uint16_t SERIAL_PKT_MAGIC = 0xC03E;
118-
119-
/**
120-
* Size constants for packet parsing and construction
121-
*/
122-
static constexpr uint16_t MAGIC_HEADER_SIZE = 2;
123-
static constexpr uint16_t LENGTH_FIELD_SIZE = 2;
124-
static constexpr uint16_t CHECKSUM_SIZE = 2;
125-
126116
/**
127117
* @brief The total overhead of the serial protocol in bytes.
128118
* Includes: MAGIC_WORD (2) + LENGTH (2) + CHECKSUM (2) = 6 bytes
129119
*/
130-
static constexpr uint16_t SERIAL_OVERHEAD = MAGIC_HEADER_SIZE + LENGTH_FIELD_SIZE + CHECKSUM_SIZE;
120+
static constexpr uint16_t SERIAL_OVERHEAD = BRIDGE_MAGIC_SIZE + BRIDGE_LENGTH_SIZE + BRIDGE_CHECKSUM_SIZE;
131121

132122
/**
133123
* @brief The maximum size of a complete packet on the serial line.

variants/lilygo_tlora_v2_1/platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ build_flags =
198198
-D MAX_NEIGHBOURS=8
199199
-D WITH_ESPNOW_BRIDGE=1
200200
-D WITH_ESPNOW_BRIDGE_SECRET='"shared-secret"'
201-
; -D MESH_PACKET_LOGGING=1
201+
-D MESH_PACKET_LOGGING=1
202202
; -D MESH_DEBUG=1
203203
; -D CORE_DEBUG_LEVEL=3
204204
lib_deps =

0 commit comments

Comments
 (0)