Skip to content

Commit aecadc4

Browse files
author
Jarkko Paso
authored
Fixed delayed interrupt (#2596)
* Unit tests for delayed interrupts * Fixed delayed interrupt on broadcast channel * Updated change log
1 parent 1fca2c1 commit aecadc4

File tree

6 files changed

+187
-1
lines changed

6 files changed

+187
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
### Bugfix
2020
* All MAC TX failure causes now trigger target change on supplicant EAPOL inititial-key sending
21+
* Fixed compensating delayed interrupt on broadcast channel.
2122

2223
## Release v12.8.1 (22-01-2021)
2324

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
341341
fhss_structure->ws->is_on_bc_channel = false;
342342
}
343343
delay_us %= MS_TO_US(fhss_structure->ws->fhss_configuration.fhss_broadcast_interval);
344+
delay_us %= MS_TO_US(fhss_structure->ws->fhss_configuration.fhss_broadcast_interval - fhss_structure->ws->fhss_configuration.fhss_bc_dwell_interval);
344345
}
345346

346347
if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_TR51CF) {

test/nanostack/unittest/service_libs/fhss/test_fhss.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ static fhss_api_t *test_generate_fhss_api(void)
137137
FHSS.callbacks.synch_lost_notification = &mac_synch_lost;
138138
FHSS.callbacks.broadcast_notify = &mac_broadcast_notification;
139139
FHSS.callbacks.read_timestamp = &mac_read_phy_timestamp;
140+
fhss_callbacks_stub.datarate = 250000;
140141
test_set_fhss_default_configs();
141142
test_set_platform_api(&FHSS.platform_functions);
142143
fhss_set_callbacks(&FHSS);

test/nanostack/unittest/service_libs/fhss_ws/test_fhss_ws.c

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ static bool test_ufsi(uint8_t *ufsi_ptr, uint_fast24_t test_value)
112112
return true;
113113
}
114114

115+
static void test_set_interrupt_delay_us(uint32_t delay_us, bool bc)
116+
{
117+
fhss_callbacks_stub.uint32_value = delay_us + 15752684;
118+
if (bc) {
119+
fhss_common_stub.fhss_struct.ws->next_bc_timeout = fhss_callbacks_stub.uint32_value - delay_us;
120+
} else {
121+
fhss_common_stub.fhss_struct.ws->next_uc_timeout = fhss_callbacks_stub.uint32_value - delay_us;
122+
}
123+
}
124+
115125
static void test_set_platform_api(fhss_timer_t *fhss_timer)
116126
{
117127
fhss_timer->fhss_resolution_divider = 1;
@@ -158,6 +168,48 @@ static fhss_api_t *test_generate_fhss_api(void)
158168
return &fhss_api;
159169
}
160170

171+
static fhss_api_t *test_generate_fhss_api_default_settings(void)
172+
{
173+
memset(&ws, 0, sizeof(fhss_ws_t));
174+
memset(&fhss_callbacks_stub, 0, sizeof(fhss_callbacks_stub_def));
175+
memset(&fhss_common_stub, 0, sizeof(fhss_common_stub_def));
176+
neighbor_info.uc_timing_info.ufsi = 1000000;
177+
neighbor_info.uc_timing_info.unicast_channel_function = WS_DH1CF;
178+
neighbor_info.uc_timing_info.unicast_dwell_interval = 200;
179+
neighbor_info.uc_timing_info.utt_rx_timestamp = 100000;
180+
fhss_common_stub.fhss_struct.fhss_api = &fhss_api;
181+
fhss_common_stub.fhss_struct.ws = &ws;
182+
fhss_common_stub.fhss_struct.ws->uc_slot = 3;
183+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_uc_channel_function = WS_DH1CF;
184+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_bc_channel_function = WS_DH1CF;
185+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_uc_dwell_interval = 255;
186+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
187+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
188+
fhss_common_stub.fhss_struct.ws->get_neighbor_info = &app_get_neighbor_info;
189+
fhss_common_stub.fhss_struct.number_of_channels = 35;
190+
fhss_common_stub.fhss_struct.number_of_uc_channels = 35;
191+
fhss_common_stub.fhss_struct.number_of_bc_channels = 35;
192+
fhss_common_stub.fhss_struct.ws->fhss_configuration.unicast_channel_mask[1] = 0x00000007;
193+
fhss_common_stub.fhss_struct.ws->fhss_configuration.unicast_channel_mask[0] = 0xffffffff;
194+
fhss_common_stub.fhss_struct.ws->fhss_configuration.channel_mask[1] = 0x00000007;
195+
fhss_common_stub.fhss_struct.ws->fhss_configuration.channel_mask[0] = 0xffffffff;
196+
fhss_common_stub.fhss_struct.rx_channel = DEFAULT_CHANNEL;
197+
fhss_common_stub.fhss_struct.fhss_state = FHSS_UNSYNCHRONIZED;
198+
fhss_common_stub.fhss_struct.own_hop = 0xff;
199+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
200+
fhss_common_stub.fhss_struct.optimal_packet_length = OPTIMAL_PACKET_LENGTH;
201+
fhss_common_stub.fhss_struct.callbacks.change_channel = &mac_set_channel;
202+
fhss_common_stub.fhss_struct.callbacks.read_mac_address = &mac_read_64bit_mac_address;
203+
fhss_common_stub.fhss_struct.callbacks.read_tx_queue_size = &mac_read_tx_queue_sizes;
204+
fhss_common_stub.fhss_struct.callbacks.read_timestamp = &mac_read_phy_timestamp;
205+
fhss_common_stub.fhss_struct.callbacks.read_datarate = &mac_read_phy_datarate;
206+
fhss_common_stub.fhss_struct.callbacks.tx_poll = &mac_poll_tx_queue;
207+
fhss_callbacks_stub.datarate = 150000;
208+
test_set_platform_api(&fhss_common_stub.fhss_struct.platform_functions);
209+
fhss_ws_set_callbacks(&fhss_common_stub.fhss_struct);
210+
return &fhss_api;
211+
}
212+
161213
bool test_fhss_ws_enable()
162214
{
163215
fhss_api_t fhss_api;
@@ -565,6 +617,107 @@ bool test_fhss_broadcast_handler()
565617
// Test when FHSS struct not found
566618
disable_fhss_struct();
567619
fhss_common_stub.callback[1](fhss_common_stub.fhss_struct.fhss_api, DEFAULT_TIMER_DELAY);
620+
// Test delayed interrupts
621+
api = test_generate_fhss_api_default_settings();
622+
enable_fhss_struct();
623+
// Test when broadcast channel enabled
624+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
625+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
626+
test_set_interrupt_delay_us(1000000, true);
627+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
628+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 20000)) ||
629+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60002)) {
630+
return false;
631+
}
632+
test_set_interrupt_delay_us(1985000, true);
633+
fhss_common_stub.fhss_struct.ws->bc_slot = 65535;
634+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
635+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
636+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 55000)) ||
637+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 2)) {
638+
return false;
639+
}
640+
test_set_interrupt_delay_us(2905000, true);
641+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
642+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
643+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
644+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 155000)) ||
645+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60004)) {
646+
return false;
647+
}
648+
test_set_interrupt_delay_us(500000, true);
649+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
650+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
651+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
652+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 265000)) ||
653+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60000)) {
654+
return false;
655+
}
656+
test_set_interrupt_delay_us(1720000, true);
657+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
658+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
659+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
660+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 65000)) ||
661+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60001)) {
662+
return false;
663+
}
664+
test_set_interrupt_delay_us(2340000, true);
665+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
666+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
667+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
668+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 465000)) ||
669+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60002)) {
670+
return false;
671+
}
672+
// Test when broadcast channel disabled
673+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
674+
test_set_interrupt_delay_us(100000, true);
675+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
676+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
677+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 155000)) ||
678+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60001)) {
679+
return false;
680+
}
681+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
682+
test_set_interrupt_delay_us(1220000, true);
683+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
684+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
685+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 55000)) ||
686+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60002)) {
687+
return false;
688+
}
689+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
690+
test_set_interrupt_delay_us(2280000, true);
691+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
692+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
693+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 15000)) ||
694+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != true) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60003)) {
695+
return false;
696+
}
697+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
698+
test_set_interrupt_delay_us(555000, true);
699+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
700+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
701+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 465000)) ||
702+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60001)) {
703+
return false;
704+
}
705+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
706+
test_set_interrupt_delay_us(1975000, true);
707+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
708+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
709+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 65000)) ||
710+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60002)) {
711+
return false;
712+
}
713+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
714+
test_set_interrupt_delay_us(2395000, true);
715+
fhss_common_stub.fhss_struct.ws->bc_slot = 60000;
716+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
717+
if ((fhss_common_stub.fhss_struct.ws->next_bc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 665000)) ||
718+
(fhss_common_stub.fhss_struct.ws->is_on_bc_channel != false) || (fhss_common_stub.fhss_struct.ws->bc_slot != 60003)) {
719+
return false;
720+
}
568721
return true;
569722
}
570723

@@ -734,6 +887,35 @@ bool test_fhss_unicast_handler()
734887
// Test when FHSS struct not found
735888
disable_fhss_struct();
736889
fhss_common_stub.callback[0](fhss_common_stub.fhss_struct.fhss_api, DEFAULT_TIMER_DELAY);
890+
// Test delayed interrupts
891+
api = test_generate_fhss_api_default_settings();
892+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 0;
893+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 0;
894+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_uc_channel_function = WS_DH1CF;
895+
enable_fhss_struct();
896+
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
897+
898+
fhss_common_stub.fhss_struct.ws->uc_slot = 10000;
899+
test_set_interrupt_delay_us(100000, false);
900+
fhss_common_stub.callback[0](fhss_common_stub.fhss_struct.fhss_api, DEFAULT_TIMER_DELAY);
901+
if ((fhss_common_stub.fhss_struct.ws->next_uc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 155000)) ||
902+
fhss_common_stub.fhss_struct.ws->uc_slot != 10001) {
903+
return false;
904+
}
905+
fhss_common_stub.fhss_struct.ws->uc_slot = 10000;
906+
test_set_interrupt_delay_us(405000, false);
907+
fhss_common_stub.callback[0](fhss_common_stub.fhss_struct.fhss_api, DEFAULT_TIMER_DELAY);
908+
if ((fhss_common_stub.fhss_struct.ws->next_uc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 105000)) ||
909+
fhss_common_stub.fhss_struct.ws->uc_slot != 10002) {
910+
return false;
911+
}
912+
fhss_common_stub.fhss_struct.ws->uc_slot = 10000;
913+
test_set_interrupt_delay_us(1835000, false);
914+
fhss_common_stub.callback[0](fhss_common_stub.fhss_struct.fhss_api, DEFAULT_TIMER_DELAY);
915+
if ((fhss_common_stub.fhss_struct.ws->next_uc_timeout != (fhss_common_stub.fhss_struct.callbacks.read_timestamp(fhss_common_stub.fhss_struct.fhss_api) + 205000)) ||
916+
fhss_common_stub.fhss_struct.ws->uc_slot != 10008) {
917+
return false;
918+
}
737919
return true;
738920
}
739921

test/nanostack/unittest/stub/fhss_callbacks_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ int mac_read_64bit_mac_address(const fhss_api_t *fhss_api, uint8_t *mac_address)
3232

3333
uint32_t mac_read_phy_datarate(const fhss_api_t *fhss_api)
3434
{
35-
return 250000;
35+
return fhss_callbacks_stub.datarate;
3636
}
3737

3838
uint32_t mac_read_phy_timestamp(const fhss_api_t *fhss_api)

test/nanostack/unittest/stub/fhss_callbacks_stub.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ typedef struct {
2525
uint8_t uint8_value;
2626
int8_t int8_value;
2727
uint32_t uint32_value;
28+
uint32_t datarate;
2829
uint8_t address[8];
2930
} fhss_callbacks_stub_def;
3031

0 commit comments

Comments
 (0)