diff --git a/src/TypeDef.h b/src/TypeDef.h index da3eccc8..1d59bf6c 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -499,7 +499,7 @@ #define RADIOLIB_ERR_INVALID_REVISION (-1103) /*! - \brief Invalid LoRaWAN uplink port requested by user. + \brief Invalid LoRaWAN uplink port requested by user, or downlink received at invalid port. */ #define RADIOLIB_ERR_INVALID_PORT (-1104) diff --git a/src/protocols/LoRaWAN/LoRaWAN.cpp b/src/protocols/LoRaWAN/LoRaWAN.cpp index e61c0045..3958c497 100644 --- a/src/protocols/LoRaWAN/LoRaWAN.cpp +++ b/src/protocols/LoRaWAN/LoRaWAN.cpp @@ -877,9 +877,13 @@ int16_t LoRaWANNode::uplink(uint8_t* data, size_t len, uint8_t fPort, bool isCon } // check destination fPort - if(fPort > 0xDF) { + if(fPort > RADIOLIB_LORAWAN_FPORT_RESERVED) { + RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Requested uplink at FPort %d - rejected! This FPort is RFU.", fPort); return(RADIOLIB_ERR_INVALID_PORT); } + if(fPort == RADIOLIB_LORAWAN_FPORT_TS009 && this->TS009 == false) { + RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Requested uplink at FPort %d - rejected! TS009 was not enabled.", fPort); + } // fPort 0 is only allowed for MAC-only payloads if(fPort == RADIOLIB_LORAWAN_FPORT_MAC_COMMAND) { if (!this->isMACPayload) { @@ -900,9 +904,12 @@ int16_t LoRaWANNode::uplink(uint8_t* data, size_t len, uint8_t fPort, bool isCon // check maximum payload len as defined in phy if(len > this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]) { - return(RADIOLIB_ERR_PACKET_TOO_LONG); - // if testing with TS009 specification verification protocol, don't throw error but clip the message - // len = this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]; + // normally, throw an error if the packet is too long + if(this->TS009 == false) { + return(RADIOLIB_ERR_PACKET_TOO_LONG); + } + // if testing with TS009 Specification Verification Protocol, don't throw error but clip the message + len = this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]; } bool adrAckReq = false; @@ -1383,6 +1390,22 @@ int16_t LoRaWANNode::downlink(uint8_t* data, size_t* len, LoRaWANEvent_t* event) if(payLen > 0) { payLen -= 1; // subtract one as fPort is set fPort = downlinkMsg[RADIOLIB_LORAWAN_FHDR_FPORT_POS(fOptsLen)]; + // check if fPort value is actually allowed + if(fPort > RADIOLIB_LORAWAN_FPORT_RESERVED) { + RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Received downlink at FPort %d - rejected! This FPort is RFU!", fPort); + #if !RADIOLIB_STATIC_ONLY + delete[] downlinkMsg; + #endif + return(RADIOLIB_ERR_INVALID_PORT); + } + if(fPort == RADIOLIB_LORAWAN_FPORT_TS009 && this->TS009 == false) { + RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Received downlink at FPort %d - rejected! TS009 was not enabled.", fPort); + #if !RADIOLIB_STATIC_ONLY + delete[] downlinkMsg; + #endif + return(RADIOLIB_ERR_INVALID_PORT); + } + if(fPort > RADIOLIB_LORAWAN_FPORT_MAC_COMMAND) { isAppDownlink = true; } else { diff --git a/src/protocols/LoRaWAN/LoRaWAN.h b/src/protocols/LoRaWAN/LoRaWAN.h index 674b0189..f9c8ab8f 100644 --- a/src/protocols/LoRaWAN/LoRaWAN.h +++ b/src/protocols/LoRaWAN/LoRaWAN.h @@ -41,7 +41,8 @@ // fPort field #define RADIOLIB_LORAWAN_FPORT_MAC_COMMAND (0x00 << 0) // 7 0 payload contains MAC commands only -#define RADIOLIB_LORAWAN_FPORT_RESERVED (0xE0 << 0) // 7 0 reserved fPort values +#define RADIOLIB_LORAWAN_FPORT_TS009 (0xE0 << 0) // 7 0 fPort used for TS009 testing +#define RADIOLIB_LORAWAN_FPORT_RESERVED (0xE0 << 0) // 7 0 fPort values equal to and larger than this are reserved // MAC commands - only those sent from end-device to gateway #define RADIOLIB_LORAWAN_LINK_CHECK_REQ (0x02 << 0) // 7 0 MAC command: request to check connectivity to network @@ -849,10 +850,16 @@ class LoRaWANNode { uint64_t getDevAddr(); /*! - \brief Get the Time-on-air of the last uplink message - \returns (RadioLibTime_t) time-on-air (ToA) of last uplink message + \brief Get the Time-on-air of the last uplink message. + \returns (RadioLibTime_t) time-on-air (ToA) of last uplink message. */ - RadioLibTime_t getLastToA(); + RadioLibTime_t getLastToA(); + + /*! + \brief TS009 Protocol Specification Verification switch + (allows FPort 224 and cuts off uplink payload instead of rejecting if maximum length exceeded). + */ + bool TS009 = false; #if !RADIOLIB_GODMODE private: