From c127712c5e4c90ad17ffe721ccbe025fb2d0cb21 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 19 Nov 2020 17:07:32 +0100 Subject: [PATCH] [SX127x] Added check for LoRa header CRC mismatch (#200) --- src/TypeDef.h | 5 +++++ src/modules/SX127x/SX1272.cpp | 1 + src/modules/SX127x/SX1278.cpp | 1 + src/modules/SX127x/SX127x.cpp | 11 +++++++++-- src/modules/SX127x/SX127x.h | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/TypeDef.h b/src/TypeDef.h index aa4c41af..a2726ded 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -283,6 +283,11 @@ */ #define ERR_INVALID_ENCODING -23 +/*! + \brief LoRa packet header has been damaged. +*/ +#define ERR_LORA_HEADER_DAMAGED -24 + // RF69-specific status codes /*! diff --git a/src/modules/SX127x/SX1272.cpp b/src/modules/SX127x/SX1272.cpp index ca1cc5a0..4cfa2e07 100644 --- a/src/modules/SX127x/SX1272.cpp +++ b/src/modules/SX127x/SX1272.cpp @@ -361,6 +361,7 @@ float SX1272::getRSSI() { int16_t SX1272::setCRC(bool enableCRC) { if(getActiveModem() == SX127X_LORA) { // set LoRa CRC + SX127x::_crcEnabled = enableCRC; if(enableCRC) { return(_mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_2, SX1272_RX_CRC_MODE_ON, 2, 2)); } else { diff --git a/src/modules/SX127x/SX1278.cpp b/src/modules/SX127x/SX1278.cpp index 938118ac..ca0b8fab 100644 --- a/src/modules/SX127x/SX1278.cpp +++ b/src/modules/SX127x/SX1278.cpp @@ -439,6 +439,7 @@ float SX1278::getRSSI() { int16_t SX1278::setCRC(bool enableCRC) { if(getActiveModem() == SX127X_LORA) { // set LoRa CRC + SX127x::_crcEnabled = enableCRC; if(enableCRC) { return(_mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_2, SX1278_RX_CRC_MODE_ON, 2, 2)); } else { diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 0b877fd3..c6fa95a9 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -490,11 +490,18 @@ int16_t SX127x::readData(uint8_t* data, size_t len) { length = getPacketLength(); } - // check integrity CRC + // check packet header integrity + if(_crcEnabled && (_mod->SPIgetRegValue(SX127X_REG_HOP_CHANNEL, 6, 6)) == 0) { + // CRC is disabled according to packet header and enabled according to user + // most likely damaged packet header + clearIRQFlags(); + return(ERR_LORA_HEADER_DAMAGED); + } + + // check payload CRC if(_mod->SPIgetRegValue(SX127X_REG_IRQ_FLAGS, 5, 5) == SX127X_CLEAR_IRQ_FLAG_PAYLOAD_CRC_ERROR) { // clear interrupt flags clearIRQFlags(); - return(ERR_CRC_MISMATCH); } diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index f7f44166..27bf3f6c 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -950,6 +950,7 @@ class SX127x: public PhysicalLayer { float _br = 0; float _rxBw = 0; bool _ook = false; + bool _crcEnabled = false; int16_t setFrequencyRaw(float newFreq); int16_t config();