Commit Graph

193 Commits (75dcacd33a15e009ca62adb15a43f68ad9aa0bd7)

Author SHA1 Message Date
Unknown 75dcacd33a Add back PHY computed ping slot window offset
Removed unintentionally in last commit
2020-02-06 18:38:36 +02:00
Unknown 0dfd7d54bd Remove extra beacon debug setting
Was only used to print bad beacon frames
2020-02-06 18:38:36 +02:00
Unknown 002f7fc306 Moved Beacon GPS time set
Moved from stack to class b beacon handler
2020-02-06 18:38:36 +02:00
Unknown 7656e91630 Fix PingSlotInfoReq parsing
PingSlotInfoReq 1 byte payload
2020-02-06 18:38:36 +02:00
Unknown 75b588412a Reorder class b slot types by priority 2020-02-06 18:38:36 +02:00
Unknown a28d6ec615 Fix class b disable timers
Stop beacon acquisition timer
2020-02-06 18:38:36 +02:00
Unknown 78b55c3ffc Stack Class B support
- Switched to millisecond gps time
- Updated process rx/rx_timeout events for  class B windows
- Added beacon event callback
2020-02-06 18:38:36 +02:00
Unknown e6ea8309b3 Add core Class B implementation
Here it is - the main Class B functionaiity
2020-02-06 18:38:36 +02:00
Unknown ff16ddd8c3 Add Class B related MAC Commands
-  PingSlotInfoReq & PingSlotInfoAns 
-  PingSlotChannelReq & PingSlotChannelAns
-  BeaconFreqReq & BeaconFreqAns

Switch to millisecond computation for  device time handling
2020-02-06 18:38:36 +02:00
Unknown 88c44480c4 Add Crypto ping slot random offset computation
Implement ping slot pseudo-random offset computation
2020-02-06 18:38:36 +02:00
Hasnain Virk d7a57fb0f3 Fixing DevTimeAns handling
As per discussion with Nicolas Sornin, any device time synchronization
value must be handled as is (monotonically increasing GPS epoch time guaranteed to be monotonic with granularity 1 second).

Once we receive a response to DevTimeReq (i.e., DevTimeAns is received)
we immediately set our local gps time stamp and take a snapshot of our
local monotonic (ticker or equivalent) clock. This is achieved by
calling 'set_gps_time(...)' API in the LoRaWANTimer module.
After that an event is generated to let the application know that a
device time has been synched.
2020-02-06 18:38:36 +02:00
Hasnain Virk ef6bc1d0a4 Adding network assisted GPS time acquisition
LoRaWANTimer class is responsible for providing time base for the
LoRaWAN stack in Mbed OS. It derives its core monotonic clock from the
EventQueue which is essentially a millisecond ticker or equivalent (in
tickless mode). LoRaWAN network can assist the device for device level
time synchronization using ClockSynchronization protocol (for v1.0.2) or
by replying to DevTimeReq MAC command (for v1.0.3 and above). The time
base used for device synchronization using above methods is purely
based on GPS epoch and needs no conversion to UTC or TAI etc (no
adjustment for leap seconds either).
Therefore we have extended the LoRaWANTimer APIs to account for GPS time
base if assisted by the network.
get_gps_time() is the API to use to acquire GPS time base from the
stack. If the network never assisted the device with a time stamp, a
value of zero is returned which means GPS time base is not available.
set_gps_time(time) API is used to set a given GPS time-stamp when the
network sends it.
These APIs are hooked via LoRaMAC to LoRaWANInterface which exposes the
access to the application.
2020-02-06 18:38:36 +02:00
Antti Kauppila de9e292bf9 fixed include problem 2020-02-06 18:38:36 +02:00
Antti Kauppila e76a55681f astyle fixes 2020-02-06 18:38:15 +02:00
Hasnain Virk 623436d726 Hooking up DeviceTimeReq generation for application
The application can use add_device_time_request() API to attach
DeviceTimeRequest mac command for the next outgoing packet.
It is a non-stick mac command, so if there is no response, the app can
retry. The API indicates if the mac command was queued successfully or
not. The actual indication of successful time and date update will come
through an event 'DEVICE_TIME_SYNCHED'.
2020-02-06 18:38:15 +02:00
Hasnain Virk 6f42adf8e5 Handling DevTimeAns mac cmd properly
DevTimeAns mac command will carry number of seconds since the GPS epoch
in the first four bytes and the fifth byte is the fractional part.
After extracting the time from the command fields, we need to adjust
this time according to the unix time, so we add the Unix to GPS time
diff to it. After that we account for leap seconds and set the time
using standard set_time() call.

We have removed the method time_received() fom LoRaPHY as it is not
important nor required. It doesn't fit into the LoRaPHY context.

Stubs are therefore updated to reflect the change.

mbed_lib.json now contains the configurable parameters for TAI to UTC
and GPS TAI to UTC differences in seconds needed for leap second
correction. They are loaded with values as of 2018.
2020-02-06 18:37:24 +02:00
Antti Kauppila af04a7a638 astyle fixes 2020-02-06 18:37:24 +02:00
Antti Kauppila 4fadc1e773 Increment app DL counter correctly 2020-02-06 18:37:24 +02:00
Antti Kauppila 45aec0c900 Pre-cert fixes 2020-02-06 18:37:24 +02:00
Antti Kauppila 0c7f5684bb LoRaWAN: Moved keys to LoRaMacCrypto class
- Unittests updated to reflect LoRaWAN 1.1 changes
2020-02-06 18:37:24 +02:00
Hasnain Virk 80f3b842d7 Bug fixing for Rejoins
* While starting timer for rejoin request type 0, we should multiply max
time with 1000 as the timer APIs take ms values as parameters.

* RJCountX are incremented every time a Rejoin request is sent. For MIC
calculation we need to take the previous RJCnt value in account.

* Rejoin process should start against an event otherwise it will meddle
with state machine and any ongoing traffic.

* If a Type 1 rejoin is ongoing, we should not trigger a Type 0 rejoin.

* Some bug fixes after Triage with Antti.
2020-02-06 18:37:24 +02:00
Hasnain Virk 341b5e1566 Managing Confirmed traffic based on NbTrans
In 1.1, NbTrans governs both unconfirmed and confirmed traffic.
We cannot set number of retries ourselves. Based upon NbTrans received
in linkADRReq command, we will retry. If NbTrans is 1, we will send only
one message and if ack is not received we will generate TX error event.
Its the NS now which controls how many retransmission a device can do
without incrementing Frame counter. When we fail with TX error after not
receiving an ack, we increment the frame counter. This is necessary as
the NS will drop anything with the  previous counter and it can happen
that the NS may have sent an ack but we didn't receive it.
2020-02-06 18:37:24 +02:00
Hasnain Virk 749b3d459c Adding resets in lieu to Section 6.2.3 of Spec 1.1
Rejoin requests and presence/absence of CFlist demand different
handling.
If a Rejoin request was sent we shall use RJCountX (0,1) instead of dev
nonce for key derivation.
If a Rejoin request is not of type 2, we reset mac, phy parameters
alongwith frame counters. However, if it is type 2, we reset frame
counters only.

If cflist i present, we shall always apply it as it is.
If it's not and rejoin type is not type 2, we restore default channels.
Otherwise the local channels do not change.
2020-02-06 18:37:24 +02:00
Hasnain Virk 475fe0b47f Implementing CR-FcntDwn-usage-in-FOpts-encryption
LoRaWAN specification 1.1.0 is incorrect in handling of FOpts encrytpion.
A CR was made by STMicroelectronics which correctly addresses the issue.
We have taken that CR and implemented in our code base.
2020-02-06 18:37:24 +02:00
Hasnain Virk 2dbbc84da4 RekeyInd mac command handling
RekeyInd Mac command was being handled incorrectly.
parse_mac_commnad_to_repeat() was missing handling for RekeyInd mac
command. Plus it is a sticky mac command as the spec says that it needs
to persist until we receive a RekeyConf mac command.
2020-02-06 18:37:24 +02:00
Hasnain Virk ce6733edc0 Removing incorrect context free
After deriving JSEncKey we were wrongly clearing the AES context.
We shouldn't clear the context until the function is done doing its job.
That was why JSINtKey derivation was wrong which would result in MIC
failures.
2020-02-06 18:37:24 +02:00
Hasnain Virk e490fbf991 Adding handling of packets with no fport field
Although we always add a port field for Uplink traffic, the spec allows
for fport field to be excluded. So there can be network server instances
which would exclude fport field from downlinks. We are now adding
handling for such situations.
2020-02-06 18:37:24 +02:00
Antti Kauppila 78a04ec77c 1.0.3 flag added and add_device_time_req updated to not support 1.0.2 2020-02-06 18:37:24 +02:00
Antti Kauppila cba835bbad set_tx_continuous_wave removed 2020-02-06 18:37:24 +02:00
Antti Kauppila 1fbeb58b85 Auto merge problems solved 2020-02-06 18:37:24 +02:00
Kimmo Vaisanen a8dbad926c Fix MIC calculation 2020-02-06 18:37:24 +02:00
Kimmo Vaisanen 6e60f2e161 MAC commands wip 2020-02-06 18:37:24 +02:00
Kimmo Vaisanen 88781d067c Fix uplink 2020-02-06 18:37:24 +02:00
Kimmo Vaisanen d48aae3692 Uplink (unstable) 2020-02-06 18:37:24 +02:00
Kimmo Vaisanen 1acb5a891e 1.1 join works 2020-02-06 18:37:24 +02:00
Antti Kauppila ccc3675a6a Rejoin logic added
BE to LE fixes, missing MLME types added

LoRaWAN 1.1 Features added (Some LoRaPhy impl missing still + some TODOs in code)

- MLME confirm handling refactored
- Rejoin handling missing
- new CF_LIST mechanism missing (+resets involved)
- NVM handling missing

Rejoin logic added
2020-02-06 18:37:24 +02:00
Antti Kauppila 0d3283e3a0 LoRaWAN 1.1 Features added (Some LoRaPhy impl missing still + some TODOs in code)
- MLME confirm handling refactored
- Rejoin handling missing
- new CF_LIST mechanism missing (+resets involved)
- NVM handling missing

Fixed automerge issue
2020-02-06 18:37:24 +02:00
Kevin Bracey 8b02c4ed1c Add missing <string.h> includes 2020-01-09 14:52:54 +02:00
Kimmo Vaisanen 4da74b6619 LoRa: Fix build warning about _ongoing_tx_msg
_ongoing_tx_msg was incorrectly initialized before _mlme_confirmation.

Fixes following build warning:
[Warning] LoRaMac.h@691,26: 'LoRaMac::_ongoing_tx_msg' will be initialized after [-Wreorder]
[Warning] LoRaMac.h@689,28:   'loramac_mlme_confirm_t LoRaMac::_mlme_confirmation' [-Wreorder]
[Warning] LoRaMac.cpp@68,1:   when initialized here [-Wreorder]
2019-09-30 12:36:55 +03:00
Hugues Kamba a306ad758d Avoid non-trivial copy when initializing lorastack struct
Using memset generates a warning about the non-trivial operation.
Use member-initializer-list instead to initialise the structs members.
2019-09-03 11:08:04 +01:00
Teijo Kinnunen 10c0f20317 LoRaWAN: Terminate RX when receiving uplink messages
This prevents RX2 window to be enabled at the same time when repeating
transmission, when QoS repeated TX is in effect. Failure to do so
seems to place the LoRaWAN stack in a state where send() always fails
with WOULD_BLOCK error.
2019-08-16 12:56:58 +03:00
Hasnain Virk 8fd791db49 Adding TOA and Channel info in RX metadata
We provide now downlink channel frequency and time on air for the
received frame in the RX metadata.
Previously the channel information in both TX and RX metada contained
the index number of the channel. That information wasn't very useful
except the index numbers of default channels. To make more sense of the
meta data, we now store the channel frequency in the channel parameter
rather than the index number of the channel.

RX time on air is collected from the radio driver and it is assumed that
the downlink frame had 8 downlink preamble symbols (plus 4.25 of the
preambles added by the chip) for LoRa modulation.

This commit also include a bit of tidying of RX frequency storage in rx
configuration parameters storage. Previously we were missing filling in
the RX1 frequency correctly.
2019-03-27 10:23:43 +02:00
Cruz Monrreal a0a265ad84
Merge pull request #10196 from hasnainvirk/premature_rx2_fix
LoRaWAN: Fixing premature RX2 closure
2019-03-27 00:26:12 -05:00
Hasnain Virk 2691b83c4e Fixing premature RX2 abort
A bug while setting up RX start timers would result in premature closusre
of RX2 window. The 'ack_Timeout_timer' would be invoked prematurely and
at that time RX2 window may be being demodulating. This resulted in
massive instability with any test that relied on Confirmed traffic or
lower data rates.

To fix the issue, we must know the length of the RX window in
milliseconds and for this purpose we have extended the
'get_rx_window_params(...)' API. The length of the time the window
may remain open must be accounted for while setting up
'ack_timeout_timer'.
2019-03-22 15:15:51 +02:00
itziar 4c1fedd72a Applied suggested astyle fix(es) 2019-03-19 10:11:15 +01:00
itziar 5beef7405c Bug related to downlink sequence counter rollover 2019-03-19 10:11:14 +01:00
Martin Kojtal d030c04a60
Merge pull request #9219 from hasnainvirk/lorawanbase_migration
LoRaWAN: Retiring LoRaWANBase class
2019-02-21 13:55:11 +01:00
Ron Eldor c94b5861e4 Add mbedtls platform setup and teardown to modules
Add calls to `mbedtls_platform_setup()`
and `mbedtls_platform_teardown()` to all modules and tests using Mbed TLS.
2019-02-18 11:43:32 +02:00
Hasnain Virk 726eff9305 Proper size checking for link ADR commands
In a specific branch path 'adr_settings' in link_adr_request() API, the
structure adr_settings of type link_adr_params_t will be rendered
uninitialized. To prevent this we initialize the construct as zero.
In addition to that, to handle the case properly we should check for the
command identifier and the command payload length anticipating contiguous
blocks of adr commands. If we find a discrepency in size, we should
abort.
2019-02-14 17:15:42 +02:00
Hasnain Virk 5fb383c27a Doxygen corrections
Adding group identidier so that LoRaWANInterface class goes to the class
hierarchy section rather than data-structures.

Adding missing documentation for a couple of public functions.

Adding \code and \endcode modifiers for the example code in the
documentation.

Adding compile time NO_DOXYGEN flag for the implementations of the
LoRaPHY Class.

Adding documentation for some of the private structures.
2019-01-10 16:14:19 +02:00