Skip to content

Commit

Permalink
FHSS WS: Allow transmitting unicast frames on broadcast channel for 1…
Browse files Browse the repository at this point in the history
…st 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
  • Loading branch information
Jarkko Paso committed Apr 13, 2021
1 parent 2f5e5e2 commit f1b03bc
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 3 deletions.
22 changes: 19 additions & 3 deletions source/Service_Libs/fhss/fhss_ws.c
Expand Up @@ -85,6 +85,7 @@ static void fhss_unicast_handler(const fhss_api_t *fhss_api, uint16_t delay);
static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay);
static bool fhss_ws_check_tx_allowed(fhss_structure_t *fhss_structure);
static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure);
static bool fhss_allow_unicast_on_broadcast_channel(fhss_structure_t *fhss_structure);
static int32_t fhss_channel_index_from_mask(const uint32_t *channel_mask, int32_t channel_index, uint16_t number_of_channels);

// This function supports rounding up
Expand Down Expand Up @@ -654,8 +655,11 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
if (is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == false)) {
return -3;
}
// Do not allow unicast destination on broadcast channel
// Do not allow unicast destination on broadcast channel unless it is specifically enabled
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true)) {
if (fhss_allow_unicast_on_broadcast_channel(fhss_structure)) {
return 0;
}
return -3;
}
// Check TX/RX slot
Expand Down Expand Up @@ -786,6 +790,18 @@ static bool fhss_allow_transmitting_on_rx_slot(fhss_structure_t *fhss_structure)
return true;
}

static bool fhss_allow_unicast_on_broadcast_channel(fhss_structure_t *fhss_structure)
{
// This is allowed only for 1st hop devices in expedited forwarding mode
if (!fhss_structure->ws->expedited_forwarding_enabled_us) {
return false;
}
if (fhss_structure->own_hop != 1) {
return false;
}
return true;
}

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)
{
(void) frame_type;
Expand All @@ -797,8 +813,8 @@ static bool fhss_ws_check_tx_conditions_callback(const fhss_api_t *api, bool is_
if (is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == false)) {
return false;
}
// Do not allow unicast destination on broadcast channel
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true)) {
// Do not allow unicast destination on broadcast channel unless it is specifically enabled
if (!is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == true) && !fhss_allow_unicast_on_broadcast_channel(fhss_structure)) {
return false;
}
// This condition will check that message is not sent on bad channel
Expand Down
53 changes: 53 additions & 0 deletions test/nanostack/unittest/service_libs/fhss_ws/test_fhss_ws.c
Expand Up @@ -376,6 +376,34 @@ bool test_fhss_ws_tx_handle_callback()
printf("Fail: TX handle, 1st hop, EF disabled on TX slot\r\n");
return false;
}
// Test TX allowed on broadcast channel for 1st hop in expedited forwarding mode
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
fhss_common_stub.fhss_struct.own_hop = 1;
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
fhss_platform_stub.remaining_slots_value = 750000;
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) {
printf("Fail: TX handle, 1st hop, EF enabled on BC\r\n");
return false;
}
// Test TX not allowed on broadcast channel for 2nd hop in expedited forwarding mode
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
fhss_common_stub.fhss_struct.own_hop = 2;
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
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) {
printf("Fail: TX handle, 2nd hop, EF enabled on BC\r\n");
return false;
}
// Test TX not allowed on broadcast channel for 1st hop when expedited forwarding mode disabled
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
fhss_common_stub.fhss_struct.own_hop = 1;
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
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) {
printf("Fail: TX handle, 1st hop, EF disabled on BC\r\n");
return false;
}

return true;
}
Expand Down Expand Up @@ -496,6 +524,31 @@ bool test_fhss_ws_check_tx_conditions_callback()
printf("Fail: TX conditions, 3rd hop, EF enabled on RX slot\r\n");
return false;
}
// Test TX allowed on broadcast channel for 1st hop in expedited forwarding mode
fhss_common_stub.fhss_struct.own_hop = 1;
fhss_common_stub.fhss_struct.ws->is_on_bc_channel = true;
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 1000000;
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1020;
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 255;
fhss_common_stub.fhss_struct.ws->txrx_slot_length_ms = 54;
fhss_platform_stub.remaining_slots_value = 750000;
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) {
printf("Fail: TX conditions, 1st hop, EF enabled on BC\r\n");
return false;
}
// Test TX not allowed on broadcast channel for 2nd hop in expedited forwarding mode
fhss_common_stub.fhss_struct.own_hop = 2;
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) {
printf("Fail: TX conditions, 2nd hop, EF enabled on BC\r\n");
return false;
}
// Test TX not allowed on broadcast channel for 1st hop when expedited forwarding mode disabled
fhss_common_stub.fhss_struct.own_hop = 1;
fhss_common_stub.fhss_struct.ws->expedited_forwarding_enabled_us = 0;
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) {
printf("Fail: TX conditions, 1st hop, EF disabled on BC\r\n");
return false;
}

return true;
}
Expand Down

0 comments on commit f1b03bc

Please sign in to comment.