From 944f9345392477e5d6c3ac9956f772a877c95206 Mon Sep 17 00:00:00 2001 From: Jarkko Paso Date: Fri, 8 Jan 2021 09:40:14 +0200 Subject: [PATCH] Added channel mask size to FHSS configuration (#2536) --- CHANGELOG.md | 2 +- nanostack/fhss_config.h | 3 +++ source/6LoWPAN/ws/ws_bootstrap.c | 1 + source/Service_Libs/fhss/fhss_common.h | 1 + source/Service_Libs/fhss/fhss_ws.c | 23 ++++++++++++----------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe21cf91effc..8c0c08731d9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ * MAC layer send ACK even buffer allocation fails. ### Bugfix -* +* Use all allowed channels with Brazil domain ## Release v12.7.0 (14-12-2020) diff --git a/nanostack/fhss_config.h b/nanostack/fhss_config.h index 5c55965733f6..545cb98cda8a 100644 --- a/nanostack/fhss_config.h +++ b/nanostack/fhss_config.h @@ -132,6 +132,9 @@ typedef struct fhss_ws_configuration { /** Wi-SUN specific unicast channel mask */ uint32_t unicast_channel_mask[8]; + /** Channel mask size */ + uint16_t channel_mask_size; + /** Vendor defined channel function. */ fhss_vendor_defined_cf *vendor_defined_cf; diff --git a/source/6LoWPAN/ws/ws_bootstrap.c b/source/6LoWPAN/ws/ws_bootstrap.c index a63f874a8693..78e5b4e59d30 100644 --- a/source/6LoWPAN/ws/ws_bootstrap.c +++ b/source/6LoWPAN/ws/ws_bootstrap.c @@ -624,6 +624,7 @@ static uint8_t ws_generate_exluded_channel_list_from_active_channels(ws_excluded static void ws_fhss_configure_channel_masks(protocol_interface_info_entry_t *cur, fhss_ws_configuration_t *fhss_configuration) { + fhss_configuration->channel_mask_size = cur->ws_info->hopping_schdule.number_of_channels; ws_generate_channel_list(fhss_configuration->channel_mask, cur->ws_info->hopping_schdule.number_of_channels, cur->ws_info->hopping_schdule.regulatory_domain, cur->ws_info->hopping_schdule.operating_class, cur->ws_info->hopping_schdule.channel_plan_id); ws_generate_channel_list(fhss_configuration->unicast_channel_mask, cur->ws_info->hopping_schdule.number_of_channels, cur->ws_info->hopping_schdule.regulatory_domain, cur->ws_info->hopping_schdule.operating_class, cur->ws_info->hopping_schdule.channel_plan_id); // using bitwise AND operation for user set channel mask to remove channels not allowed in this device diff --git a/source/Service_Libs/fhss/fhss_common.h b/source/Service_Libs/fhss/fhss_common.h index 724351d02955..71c2d9a4d117 100644 --- a/source/Service_Libs/fhss/fhss_common.h +++ b/source/Service_Libs/fhss/fhss_common.h @@ -41,6 +41,7 @@ struct fhss_structure { uint8_t active_fhss_events; uint16_t number_of_channels; uint16_t number_of_uc_channels; + uint16_t number_of_bc_channels; uint16_t optimal_packet_length; fhss_states fhss_state; uint32_t fhss_timeout; diff --git a/source/Service_Libs/fhss/fhss_ws.c b/source/Service_Libs/fhss/fhss_ws.c index ce6f14467125..fcd097791468 100644 --- a/source/Service_Libs/fhss/fhss_ws.c +++ b/source/Service_Libs/fhss/fhss_ws.c @@ -246,14 +246,14 @@ static int32_t fhss_ws_calc_bc_channel(fhss_structure_t *fhss_structure) int32_t next_channel = fhss_structure->ws->fhss_configuration.broadcast_fixed_channel; if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_TR51CF) { - next_channel = tr51_get_bc_channel_index(fhss_structure->ws->tr51_channel_table, fhss_structure->ws->tr51_output_table, fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels, NULL); + next_channel = tr51_get_bc_channel_index(fhss_structure->ws->tr51_channel_table, fhss_structure->ws->tr51_output_table, fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_bc_channels, NULL); next_channel = fhss_channel_index_from_mask(fhss_structure->ws->fhss_configuration.channel_mask, next_channel, fhss_structure->number_of_channels); - if (++fhss_structure->ws->bc_slot == fhss_structure->number_of_channels) { + if (++fhss_structure->ws->bc_slot == fhss_structure->number_of_bc_channels) { fhss_structure->ws->bc_slot = 0; } } else if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_DH1CF) { fhss_structure->ws->bc_slot++; - next_channel = dh1cf_get_bc_channel_index(fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels); + next_channel = dh1cf_get_bc_channel_index(fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_bc_channels); next_channel = fhss_channel_index_from_mask(fhss_structure->ws->fhss_configuration.channel_mask, next_channel, fhss_structure->number_of_channels); } else if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_VENDOR_DEF_CF) { if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) { @@ -343,7 +343,7 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay) } if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_TR51CF) { - fhss_structure->ws->bc_slot %= fhss_structure->number_of_channels; + fhss_structure->ws->bc_slot %= fhss_structure->number_of_bc_channels; } if (fhss_structure->ws->is_on_bc_channel == false) { @@ -1086,13 +1086,13 @@ int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[ int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration) { - int channel_count = channel_list_count_channels(fhss_configuration->channel_mask); + int channel_count_bc = channel_list_count_channels(fhss_configuration->channel_mask); int channel_count_uc = channel_list_count_channels(fhss_configuration->unicast_channel_mask); - if (channel_count <= 0) { + if (channel_count_bc <= 0 || fhss_configuration->channel_mask_size == 0) { return -1; } - if (fhss_structure->number_of_channels < channel_count || + if (fhss_structure->number_of_bc_channels < channel_count_bc || (channel_count_uc && fhss_structure->number_of_uc_channels < channel_count_uc)) { // Channel amount changed to largeneed to reallocate channel table ns_dyn_mem_free(fhss_structure->ws->tr51_channel_table); @@ -1100,7 +1100,7 @@ int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_co ns_dyn_mem_free(fhss_structure->ws->tr51_output_table); fhss_structure->ws->tr51_output_table = NULL; - if (fhss_ws_manage_channel_table_allocation(fhss_structure, channel_count_uc > channel_count ? channel_count_uc : channel_count)) { + if (fhss_ws_manage_channel_table_allocation(fhss_structure, channel_count_uc > channel_count_bc ? channel_count_uc : channel_count_bc)) { return -1; } } @@ -1123,10 +1123,11 @@ int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_co for (uint8_t i = 0; i < 8; i++) { fhss_structure->ws->fhss_configuration.unicast_channel_mask[i] = fhss_configuration->channel_mask[i]; } - channel_count_uc = channel_count; + channel_count_uc = channel_count_bc; } - fhss_structure->number_of_channels = channel_count; + fhss_structure->number_of_channels = fhss_configuration->channel_mask_size; + fhss_structure->number_of_bc_channels = channel_count_bc; fhss_structure->number_of_uc_channels = channel_count_uc; if (fhss_configuration->ws_uc_channel_function == WS_FIXED_CHANNEL) { fhss_structure->rx_channel = fhss_configuration->unicast_fixed_channel; @@ -1137,7 +1138,7 @@ int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_co fhss_structure->ws->fhss_configuration.broadcast_fixed_channel, fhss_structure->ws->fhss_configuration.ws_uc_channel_function, fhss_structure->ws->fhss_configuration.ws_bc_channel_function, - fhss_structure->number_of_channels, + fhss_structure->number_of_bc_channels, fhss_structure->number_of_uc_channels, fhss_structure->ws->fhss_configuration.fhss_uc_dwell_interval, fhss_structure->ws->fhss_configuration.fhss_bc_dwell_interval,