Skip to content

Commit f1b03bc

Browse files
author
Jarkko Paso
authored
FHSS WS: Allow transmitting unicast frames on broadcast channel for 1st hop node in EF mode (ARMmbed#2609)
* FHSS WS: Allow unicast on broadcast channel for 1st hop in EF mode * Unit tests for FHSS EF mode updated
1 parent 2f5e5e2 commit f1b03bc

File tree

2 files changed

+72
-3
lines changed

2 files changed

+72
-3
lines changed

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ 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);
8787
static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure);
88+
static bool fhss_allow_unicast_on_broadcast_channel(fhss_structure_t *fhss_structure);
8889
static int32_t fhss_channel_index_from_mask(const uint32_t *channel_mask, int32_t channel_index, uint16_t number_of_channels);
8990

9091
// This function supports rounding up
@@ -654,8 +655,11 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
654655
if (is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == false)) {
655656
return -3;
656657
}
657-
// Do not allow unicast destination on broadcast channel
658+
// Do not allow unicast destination on broadcast channel unless it is specifically enabled
658659
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true)) {
660+
if (fhss_allow_unicast_on_broadcast_channel(fhss_structure)) {
661+
return 0;
662+
}
659663
return -3;
660664
}
661665
// Check TX/RX slot
@@ -786,6 +790,18 @@ static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure)
786790
return true;
787791
}
788792

793+
static bool fhss_allow_unicast_on_broadcast_channel(fhss_structure_t *fhss_structure)
794+
{
795+
// This is allowed only for 1st hop devices in expedited forwarding mode
796+
if (!fhss_structure->ws->expedited_forwarding_enabled_us) {
797+
return false;
798+
}
799+
if (fhss_structure->own_hop != 1) {
800+
return false;
801+
}
802+
return true;
803+
}
804+
789805
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)
790806
{
791807
(void) frame_type;
@@ -797,8 +813,8 @@ static bool fhss_ws_check_tx_conditions_callback(const fhss_api_t *api, bool is_
797813
if (is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == false)) {
798814
return false;
799815
}
800-
// Do not allow unicast destination on broadcast channel
801-
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true)) {
816+
// Do not allow unicast destination on broadcast channel unless it is specifically enabled
817+
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true) && !fhss_allow_unicast_on_broadcast_channel(fhss_structure)) {
802818
return false;
803819
}
804820
// This condition will check that message is not sent on bad channel

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,34 @@ bool test_fhss_ws_tx_handle_callback()
376376
printf("Fail: TX handle, 1st hop, EF disabled on TX slot\r\n");
377377
return false;
378378
}
379+
// Test TX allowed on broadcast channel for 1st hop in expedited forwarding mode
380+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
381+
fhss_common_stub.fhss_struct.own_hop = 1;
382+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
383+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
384+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
385+
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
386+
fhss_platform_stub.remaining_slots_value = 750000;
387+
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) {
388+
printf("Fail: TX handle, 1st hop, EF enabled on BC\r\n");
389+
return false;
390+
}
391+
// Test TX not allowed on broadcast channel for 2nd hop in expedited forwarding mode
392+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
393+
fhss_common_stub.fhss_struct.own_hop = 2;
394+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
395+
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) != -3) {
396+
printf("Fail: TX handle, 2nd hop, EF enabled on BC\r\n");
397+
return false;
398+
}
399+
// Test TX not allowed on broadcast channel for 1st hop when expedited forwarding mode disabled
400+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
401+
fhss_common_stub.fhss_struct.own_hop = 1;
402+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
403+
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) != -3) {
404+
printf("Fail: TX handle, 1st hop, EF disabled on BC\r\n");
405+
return false;
406+
}
379407

380408
return true;
381409
}
@@ -496,6 +524,31 @@ bool test_fhss_ws_check_tx_conditions_callback()
496524
printf("Fail: TX conditions, 3rd hop, EF enabled on RX slot\r\n");
497525
return false;
498526
}
527+
// Test TX allowed on broadcast channel for 1st hop in expedited forwarding mode
528+
fhss_common_stub.fhss_struct.own_hop = 1;
529+
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
530+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
531+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
532+
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
533+
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
534+
fhss_platform_stub.remaining_slots_value = 750000;
535+
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) {
536+
printf("Fail: TX conditions, 1st hop, EF enabled on BC\r\n");
537+
return false;
538+
}
539+
// Test TX not allowed on broadcast channel for 2nd hop in expedited forwarding mode
540+
fhss_common_stub.fhss_struct.own_hop = 2;
541+
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) {
542+
printf("Fail: TX conditions, 2nd hop, EF enabled on BC\r\n");
543+
return false;
544+
}
545+
// Test TX not allowed on broadcast channel for 1st hop when expedited forwarding mode disabled
546+
fhss_common_stub.fhss_struct.own_hop = 1;
547+
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
548+
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) {
549+
printf("Fail: TX conditions, 1st hop, EF disabled on BC\r\n");
550+
return false;
551+
}
499552

500553
return true;
501554
}

0 commit comments

Comments
 (0)