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'.
pull/10196/head
Hasnain Virk 2019-03-22 15:05:03 +02:00
parent 2618813c70
commit 2691b83c4e
4 changed files with 21 additions and 7 deletions

View File

@ -667,13 +667,14 @@ void LoRaMac::on_radio_tx_done(lorawan_time_t timestamp)
if (get_device_class() == CLASS_C) { if (get_device_class() == CLASS_C) {
_lora_time.start(_rx2_closure_timer_for_class_c, _lora_time.start(_rx2_closure_timer_for_class_c,
(_params.rx_window2_delay - time_diff) + (_params.rx_window2_delay - time_diff) +
_params.rx_window2_config.window_timeout); _params.rx_window2_config.window_timeout_ms);
} }
// start timer after which ack wait will timeout (for Confirmed messages) // start timer after which ack wait will timeout (for Confirmed messages)
if (_params.is_node_ack_requested) { if (_params.is_node_ack_requested) {
_lora_time.start(_params.timers.ack_timeout_timer, _lora_time.start(_params.timers.ack_timeout_timer,
(_params.rx_window2_delay - time_diff) + (_params.rx_window2_delay - time_diff) +
_params.rx_window2_config.window_timeout_ms +
_lora_phy->get_ack_timeout()); _lora_phy->get_ack_timeout());
} }
} else { } else {
@ -1097,6 +1098,8 @@ lorawan_status_t LoRaMac::schedule_tx()
{ {
channel_selection_params_t next_channel; channel_selection_params_t next_channel;
lorawan_time_t backoff_time = 0; lorawan_time_t backoff_time = 0;
lorawan_time_t aggregated_timeoff = 0;
uint8_t channel = 0;
uint8_t fopts_len = 0; uint8_t fopts_len = 0;
if (_params.sys_params.max_duty_cycle == 255) { if (_params.sys_params.max_duty_cycle == 255) {
@ -1122,9 +1125,12 @@ lorawan_status_t LoRaMac::schedule_tx()
next_channel.last_aggregate_tx_time = _params.timers.aggregated_last_tx_time; next_channel.last_aggregate_tx_time = _params.timers.aggregated_last_tx_time;
lorawan_status_t status = _lora_phy->set_next_channel(&next_channel, lorawan_status_t status = _lora_phy->set_next_channel(&next_channel,
&_params.channel, &channel,
&backoff_time, &backoff_time,
&_params.timers.aggregated_timeoff); &aggregated_timeoff);
_params.channel = channel;
_params.timers.aggregated_timeoff = aggregated_timeoff;
switch (status) { switch (status) {
case LORAWAN_STATUS_NO_CHANNEL_FOUND: case LORAWAN_STATUS_NO_CHANNEL_FOUND:

View File

@ -406,7 +406,8 @@ float LoRaPHY::compute_symb_timeout_fsk(uint8_t phy_dr)
void LoRaPHY::get_rx_window_params(float t_symb, uint8_t min_rx_symb, void LoRaPHY::get_rx_window_params(float t_symb, uint8_t min_rx_symb,
float error_fudge, float wakeup_time, float error_fudge, float wakeup_time,
uint32_t *window_length, int32_t *window_offset, uint32_t *window_length, uint32_t *window_length_ms,
int32_t *window_offset,
uint8_t phy_dr) uint8_t phy_dr)
{ {
float target_rx_window_offset; float target_rx_window_offset;
@ -442,6 +443,7 @@ void LoRaPHY::get_rx_window_params(float t_symb, uint8_t min_rx_symb,
// Setting the window_length in terms of 'symbols' for LoRa modulation or // Setting the window_length in terms of 'symbols' for LoRa modulation or
// in terms of 'bytes' for FSK // in terms of 'bytes' for FSK
*window_length = (uint32_t) ceil(window_len_in_ms / t_symb); *window_length = (uint32_t) ceil(window_len_in_ms / t_symb);
*window_length_ms = window_len_in_ms;
} }
int8_t LoRaPHY::compute_tx_power(int8_t tx_power_idx, float max_eirp, int8_t LoRaPHY::compute_tx_power(int8_t tx_power_idx, float max_eirp,
@ -848,7 +850,8 @@ void LoRaPHY::compute_rx_win_params(int8_t datarate, uint8_t min_rx_symbols,
} }
get_rx_window_params(t_symbol, min_rx_symbols, (float) rx_error, MBED_CONF_LORA_WAKEUP_TIME, get_rx_window_params(t_symbol, min_rx_symbols, (float) rx_error, MBED_CONF_LORA_WAKEUP_TIME,
&rx_conf_params->window_timeout, &rx_conf_params->window_offset, &rx_conf_params->window_timeout, &rx_conf_params->window_timeout_ms,
&rx_conf_params->window_offset,
rx_conf_params->datarate); rx_conf_params->datarate);
} }

View File

@ -626,7 +626,8 @@ protected:
*/ */
void get_rx_window_params(float t_symbol, uint8_t min_rx_symbols, void get_rx_window_params(float t_symbol, uint8_t min_rx_symbols,
float rx_error, float wakeup_time, float rx_error, float wakeup_time,
uint32_t *window_length, int32_t *window_offset, uint32_t *window_length, uint32_t *window_length_ms,
int32_t *window_offset,
uint8_t phy_dr); uint8_t phy_dr);
/** /**

View File

@ -1007,9 +1007,13 @@ typedef struct {
*/ */
uint32_t frequency; uint32_t frequency;
/*! /*!
* The RX window timeout * The RX window timeout - Symbols
*/ */
uint32_t window_timeout; uint32_t window_timeout;
/*!
* The RX window timeout - Milliseconds
*/
uint32_t window_timeout_ms;
/*! /*!
* The RX window offset * The RX window offset
*/ */