[LoRaWAN] Fix downlink port, Fcnt 'underflow', user MAC processing
This commit is contained in:
parent
eb0c115665
commit
ab67097587
2 changed files with 30 additions and 10 deletions
|
@ -956,7 +956,7 @@ int16_t LoRaWANNode::uplink(uint8_t* data, size_t len, uint8_t port, bool isConf
|
||||||
// check maximum payload len as defined in phy
|
// check maximum payload len as defined in phy
|
||||||
if(len > this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]) {
|
if(len > this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]]) {
|
||||||
return(RADIOLIB_ERR_PACKET_TOO_LONG);
|
return(RADIOLIB_ERR_PACKET_TOO_LONG);
|
||||||
// if testing with TS008 specification verification protocol, don't throw error but clip the message
|
// 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]];
|
// len = this->band->payloadLenMax[this->dataRates[RADIOLIB_LORAWAN_CHANNEL_DIR_UPLINK]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1612,7 +1612,7 @@ int16_t LoRaWANNode::downlink(uint8_t* data, size_t* len, LoRaWANEvent_t* event)
|
||||||
event->freq = currentChannels[event->dir].freq;
|
event->freq = currentChannels[event->dir].freq;
|
||||||
event->power = this->txPowerMax - this->txPowerCur * 2;
|
event->power = this->txPowerMax - this->txPowerCur * 2;
|
||||||
event->fcnt = isAppDownlink ? this->aFcntDown : this->nFcntDown;
|
event->fcnt = isAppDownlink ? this->aFcntDown : this->nFcntDown;
|
||||||
event->port = downlinkMsg[RADIOLIB_LORAWAN_FHDR_FPORT_POS(foptsLen)];
|
event->port = isAppDownlink ? downlinkMsg[RADIOLIB_LORAWAN_FHDR_FPORT_POS(foptsLen)] : RADIOLIB_LORAWAN_FPORT_MAC_COMMAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
// process Application payload (if there is any)
|
// process Application payload (if there is any)
|
||||||
|
@ -1626,8 +1626,6 @@ int16_t LoRaWANNode::downlink(uint8_t* data, size_t* len, LoRaWANEvent_t* event)
|
||||||
return(RADIOLIB_ERR_NONE);
|
return(RADIOLIB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// there is payload, and so there should be a port too
|
|
||||||
// TODO pass the port?
|
|
||||||
*len = payLen - 1;
|
*len = payLen - 1;
|
||||||
|
|
||||||
// TODO it COULD be the case that the assumed rollover is incorrect, then figure out a way to catch this and retry with just fcnt16
|
// TODO it COULD be the case that the assumed rollover is incorrect, then figure out a way to catch this and retry with just fcnt16
|
||||||
|
@ -1676,7 +1674,11 @@ void LoRaWANNode::setDeviceStatus(uint8_t battLevel) {
|
||||||
this->battLevel = battLevel;
|
this->battLevel = battLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// return Fcnt of last uplink; also return 0 if no uplink occured yet
|
||||||
uint32_t LoRaWANNode::getFcntUp() {
|
uint32_t LoRaWANNode::getFcntUp() {
|
||||||
|
if(this->fcntUp == 0) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
return(this->fcntUp - 1);
|
return(this->fcntUp - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2239,6 +2241,10 @@ bool LoRaWANNode::execMacCommand(LoRaWANMacCommand_t* cmd, bool saveToEeprom) {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case(RADIOLIB_LORAWAN_MAC_LINK_CHECK): {
|
case(RADIOLIB_LORAWAN_MAC_LINK_CHECK): {
|
||||||
|
// delete any existing response (does nothing if there is none)
|
||||||
|
deleteMacCommand(RADIOLIB_LORAWAN_MAC_LINK_CHECK, &this->commandsDown);
|
||||||
|
|
||||||
|
// insert response into MAC downlink queue
|
||||||
pushMacCommand(cmd, &this->commandsDown);
|
pushMacCommand(cmd, &this->commandsDown);
|
||||||
return(false);
|
return(false);
|
||||||
} break;
|
} break;
|
||||||
|
@ -2623,6 +2629,10 @@ bool LoRaWANNode::execMacCommand(LoRaWANMacCommand_t* cmd, bool saveToEeprom) {
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case(RADIOLIB_LORAWAN_MAC_DEVICE_TIME): {
|
case(RADIOLIB_LORAWAN_MAC_DEVICE_TIME): {
|
||||||
|
// delete any existing response (does nothing if there is none)
|
||||||
|
deleteMacCommand(RADIOLIB_LORAWAN_MAC_DEVICE_TIME, &this->commandsDown);
|
||||||
|
|
||||||
|
// insert response into MAC downlink queue
|
||||||
pushMacCommand(cmd, &this->commandsDown);
|
pushMacCommand(cmd, &this->commandsDown);
|
||||||
return(false);
|
return(false);
|
||||||
} break;
|
} break;
|
||||||
|
@ -2887,7 +2897,7 @@ int16_t LoRaWANNode::getMacDeviceTimeAns(uint32_t* gpsEpoch, uint8_t* fraction,
|
||||||
if(gpsEpoch) {
|
if(gpsEpoch) {
|
||||||
*gpsEpoch = LoRaWANNode::ntoh<uint32_t>(&payload[0]);
|
*gpsEpoch = LoRaWANNode::ntoh<uint32_t>(&payload[0]);
|
||||||
if(returnUnix) {
|
if(returnUnix) {
|
||||||
uint32_t unixOffset = 315964800 - 19; // 19 leap seconds between Jan. 6th 1980
|
uint32_t unixOffset = 315964800 - 18; // 18 leap seconds between Jan. 6th 1980
|
||||||
*gpsEpoch += unixOffset;
|
*gpsEpoch += unixOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,18 +587,28 @@ class LoRaWANNode {
|
||||||
*/
|
*/
|
||||||
void setDeviceStatus(uint8_t battLevel);
|
void setDeviceStatus(uint8_t battLevel);
|
||||||
|
|
||||||
/*! \brief Returns the last uplink's frame counter */
|
/*!
|
||||||
|
\brief Returns the last uplink's frame counter;
|
||||||
|
also 0 if no uplink occured yet.
|
||||||
|
*/
|
||||||
uint32_t getFcntUp();
|
uint32_t getFcntUp();
|
||||||
|
|
||||||
/*! \brief Returns the last network downlink's frame counter */
|
/*!
|
||||||
|
\brief Returns the last network downlink's frame counter;
|
||||||
|
also 0 if no network downlink occured yet.
|
||||||
|
*/
|
||||||
uint32_t getNFcntDown();
|
uint32_t getNFcntDown();
|
||||||
|
|
||||||
/*! \brief Returns the last application downlink's frame counter */
|
/*!
|
||||||
|
\brief Returns the last application downlink's frame counter;
|
||||||
|
also 0 if no application downlink occured yet.
|
||||||
|
*/
|
||||||
uint32_t getAFcntDown();
|
uint32_t getAFcntDown();
|
||||||
|
|
||||||
/*! \brief Reset the downlink frame counters (application and network)
|
/*!
|
||||||
|
\brief Reset the downlink frame counters (application and network)
|
||||||
This is unsafe and can possibly allow replay attacks using downlinks.
|
This is unsafe and can possibly allow replay attacks using downlinks.
|
||||||
It mainly exists as part of the TS008 Specification Verification protocol.
|
It mainly exists as part of the TS009 Specification Verification protocol.
|
||||||
*/
|
*/
|
||||||
void resetFcntDown();
|
void resetFcntDown();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue