Skip to content

Commit 007dfa2

Browse files
author
Jarkko Paso
authored
Allow transmitting on RX slot for 1st hop device in expedited forwarding mode (ARMmbed#2607)
* FHSS WS: Allow transmitting on RX slot for 1st hop in EF mode * Unit tests for allowing TX on RX slot in EF mode * Allow sending retries on RX slot for 1st hop in EF mode
1 parent 6524872 commit 007dfa2

File tree

2 files changed

+106
-2
lines changed

2 files changed

+106
-2
lines changed

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
8484
static void fhss_unicast_handler(const fhss_api_t *fhss_api, uint16_t delay);
8585
static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay);
8686
static bool fhss_ws_check_tx_allowed(fhss_structure_t *fhss_structure);
87+
static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure);
8788
static int32_t fhss_channel_index_from_mask(const uint32_t *channel_mask, int32_t channel_index, uint16_t number_of_channels);
8889

8990
// This function supports rounding up
@@ -658,7 +659,7 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
658659
return -3;
659660
}
660661
// Check TX/RX slot
661-
if (!fhss_ws_check_tx_allowed(fhss_structure)) {
662+
if (!fhss_allow_transmitting_on_rx_slot(fhss_structure) && !fhss_ws_check_tx_allowed(fhss_structure)) {
662663
return -1;
663664
}
664665
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
@@ -773,6 +774,18 @@ static bool fhss_ws_check_tx_time(fhss_structure_t *fhss_structure, uint16_t tx_
773774
#endif
774775
}
775776

777+
static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure)
778+
{
779+
// This is allowed only for 1st hop devices in expedited forwarding mode
780+
if (!fhss_structure->ws->expedited_forwarding_enabled_us) {
781+
return false;
782+
}
783+
if (fhss_structure->own_hop != 1) {
784+
return false;
785+
}
786+
return true;
787+
}
788+
776789
static bool fhss_ws_check_tx_conditions_callback(const fhss_api_t *api, bool is_broadcast_addr, uint8_t handle, int frame_type, uint16_t frame_length, uint8_t phy_header_length, uint8_t phy_tail_length)
777790
{
778791
(void) frame_type;
@@ -797,7 +810,7 @@ static bool fhss_ws_check_tx_conditions_callback(const fhss_api_t *api, bool is_
797810
return false;
798811
}
799812
// Check TX/RX slot for unicast frames
800-
if (!is_broadcast_addr && !fhss_ws_check_tx_allowed(fhss_structure)) {
813+
if (!is_broadcast_addr && !fhss_allow_transmitting_on_rx_slot(fhss_structure) && !fhss_ws_check_tx_allowed(fhss_structure)) {
801814
return false;
802815
}
803816
return true;
@@ -959,6 +972,10 @@ static uint32_t fhss_ws_get_retry_period_callback(const fhss_api_t *api, uint8_t
959972
if (fhss_structure->ws->is_on_bc_channel == true) {
960973
return return_value;
961974
}
975+
// No need to wait until TX slot when sending on RX slot is allowed
976+
if (fhss_allow_transmitting_on_rx_slot(fhss_structure) == true) {
977+
return return_value;
978+
}
962979

963980
uint32_t txrx_slot_length_us = MS_TO_US(fhss_structure->ws->txrx_slot_length_ms);
964981
uint32_t unicast_start_us = fhss_structure->ws->unicast_start_time_us;

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

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,30 @@ bool test_fhss_ws_tx_handle_callback()
352352
if ((fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0) || (fhss_callbacks_stub.uint8_value != VENDOR_CHANNEL)) {
353353
return false;
354354
}
355+
// Test TX allowed on RX slot for 1st hop in expedited forwarding mode
356+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
357+
fhss_common_stub.fhss_struct.own_hop = 1;
358+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
359+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
360+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
361+
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
362+
fhss_platform_stub.remaining_slots_value = 750000;
363+
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0) {
364+
printf("Fail: TX handle, 1st hop, EF enabled on RX slot\r\n");
365+
return false;
366+
}
367+
// Test TX not allowed on RX slot for 1st hop when expedited forwarding mode disabled
368+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
369+
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != -1) {
370+
printf("Fail: TX handle, 1st hop, EF disabled on RX slot\r\n");
371+
return false;
372+
}
373+
// Test TX allowed on TX slot for 1st hop when expedited forwarding mode disabled
374+
fhss_platform_stub.remaining_slots_value = 700000;
375+
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0) {
376+
printf("Fail: TX handle, 1st hop, EF disabled on TX slot\r\n");
377+
return false;
378+
}
355379

356380
return true;
357381
}
@@ -433,6 +457,46 @@ bool test_fhss_ws_check_tx_conditions_callback()
433457
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
434458
return false;
435459
}
460+
// Test TX allowed on RX slot for 1st hop in expedited forwarding mode
461+
fhss_common_stub.fhss_struct.own_hop = 1;
462+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
463+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
464+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
465+
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
466+
fhss_platform_stub.remaining_slots_value = 750000;
467+
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != true) {
468+
printf("Fail: TX conditions, 1st hop, EF enabled on RX slot\r\n");
469+
return false;
470+
}
471+
// Test TX not allowed on RX slot for 1st hop when expedited forwarding mode disabled
472+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
473+
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
474+
printf("Fail: TX conditions, 1st hop, EF disabled on RX slot\r\n");
475+
return false;
476+
}
477+
// Test TX not allowed on RX slot for 2nd hop in expedited forwarding mode
478+
fhss_common_stub.fhss_struct.own_hop = 2;
479+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
480+
fhss_platform_stub.remaining_slots_value = 700000;
481+
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
482+
printf("Fail: TX conditions, 2nd hop, EF enabled on RX slot\r\n");
483+
return false;
484+
}
485+
// Test TX allowed on TX slot for 2nd hop in expedited forwarding mode
486+
fhss_common_stub.fhss_struct.own_hop = 2;
487+
fhss_platform_stub.remaining_slots_value = 650000;
488+
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != true) {
489+
printf("Fail: TX conditions, 2nd hop, EF enabled on TX slot\r\n");
490+
return false;
491+
}
492+
// Test TX not allowed on RX slot for 3rd hop in expedited forwarding mode
493+
fhss_common_stub.fhss_struct.own_hop = 3;
494+
fhss_platform_stub.remaining_slots_value = 750000;
495+
if (fhss_common_stub.fhss_struct.fhss_api->check_tx_conditions(api, DEFAULT_IS_BC_DEST, DEFAULT_HANDLE, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH) != false) {
496+
printf("Fail: TX conditions, 3rd hop, EF enabled on RX slot\r\n");
497+
return false;
498+
}
499+
436500
return true;
437501
}
438502

@@ -821,6 +885,29 @@ bool test_fhss_ws_get_retry_period_callback()
821885
if (fhss_common_stub.fhss_struct.fhss_api->get_retry_period(api, NULL, 0) != 385000) {
822886
return false;
823887
}
888+
// Test retrying allowed on RX slot for 1st hop in expedited forwarding mode
889+
fhss_common_stub.fhss_struct.own_hop = 1;
890+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
891+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
892+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
893+
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
894+
fhss_common_stub.fhss_struct.ws->unicast_start_time_us = 0;
895+
fhss_callbacks_stub.uint32_value = 65000;
896+
fhss_platform_stub.remaining_slots_value = 750000;
897+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = false;
898+
retry_period = fhss_common_stub.fhss_struct.fhss_api->get_retry_period(api, NULL, 0);
899+
if (retry_period != 0) {
900+
printf("Fail: Retry period: %u us for 1st hop, EF enabled on RX slot\r\n", retry_period);
901+
return false;
902+
}
903+
// Test retrying not allowed on RX slot for 2nd hop in expedited forwarding mode
904+
fhss_common_stub.fhss_struct.own_hop = 2;
905+
fhss_platform_stub.remaining_slots_value = 700000;
906+
retry_period = fhss_common_stub.fhss_struct.fhss_api->get_retry_period(api, NULL, 0);
907+
if (retry_period != 70000) {
908+
printf("Fail: Retry period: %u us for 2nd hop, EF enabled on RX slot\r\n", retry_period);
909+
return false;
910+
}
824911
return true;
825912
}
826913

0 commit comments

Comments
 (0)