Skip to content

Commit

Permalink
Merge pull request ARMmbed#1674 from ARMmbed/IOTTHD-2443
Browse files Browse the repository at this point in the history
FHSS: Learn FHSS configuration from parent PA config
  • Loading branch information
Jarkko Paso authored Apr 26, 2018
2 parents f578c26 + 32db0cd commit 34dcbb6
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 2 deletions.
8 changes: 8 additions & 0 deletions nanostack/net_fhss.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ extern int ns_fhss_configuration_set(fhss_api_t *fhss_api, const fhss_synch_conf
*/
extern const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fhss_api);

/**
* @brief Set WS configuration.
* @param fhss_api FHSS instance.
* @param fhss_configuration Basic FHSS configuration.
* @return 0 on success, -1 on fail.
*/
extern int ns_fhss_ws_configuration_set(const fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration);

/**
* @brief Deletes a FHSS API instance and removes it from software MAC.
* @param fhss_api FHSS instance.
Expand Down
11 changes: 10 additions & 1 deletion source/6LoWPAN/ws/ws_bootstrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
if (cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->hopping_schdule.fhss_bc_dwell_interval;
fhss_configuration.fhss_broadcast_interval = cur->ws_info->hopping_schdule.fhss_broadcast_interval;
fhss_configuration.bsi = cur->ws_info->hopping_schdule.fhss_bsi;
}
fhss_api = ns_fhss_ws_create(&fhss_configuration, cur->ws_info->fhss_timer_ptr);
if (!fhss_api) {
Expand All @@ -208,6 +209,7 @@ static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
cur->ws_info->hopping_schdule.fhss_broadcast_interval = fhss_configuration->fhss_broadcast_interval;
cur->ws_info->hopping_schdule.fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
cur->ws_info->hopping_schdule.fhss_bsi = fhss_configuration->bsi;
}
// Set neighbor info callback
if (ns_fhss_set_neighbor_info_fp(fhss_api, &ws_get_neighbor_info)) {
Expand Down Expand Up @@ -566,7 +568,14 @@ static void ws_bootstrap_pan_config_analyse(struct protocol_interface_info_entry
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = ws_bs_ie.dwell_interval;

cur->ws_info->hopping_schdule.channel_function = ws_bs_ie.channel_function;
// TODO: Restart unicast schedule if configuration changed

fhss_ws_configuration_t fhss_configuration;
memcpy(&fhss_configuration, ns_fhss_ws_configuration_get(cur->ws_info->fhss_api), sizeof(fhss_ws_configuration_t));
fhss_configuration.fhss_uc_dwell_interval = neighbor_info.ws_neighbor->fhss_data.uc_timing_info.unicast_dwell_interval;
fhss_configuration.ws_channel_function = neighbor_info.ws_neighbor->fhss_data.uc_timing_info.unicast_channel_function;
fhss_configuration.bsi = neighbor_info.ws_neighbor->fhss_data.bc_timing_info.broadcast_schedule_id;
ns_fhss_ws_configuration_set(cur->ws_info->fhss_api, &fhss_configuration);

ns_fhss_ws_set_parent(cur->ws_info->fhss_api, data->SrcAddr, &neighbor_info.ws_neighbor->fhss_data.bc_timing_info);

if (!cur->ws_info->configuration_learned) {
Expand Down
2 changes: 1 addition & 1 deletion source/6LoWPAN/ws/ws_ie_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ uint8_t *ws_wp_nested_hopping_schedule_write(uint8_t *ptr,struct ws_hopping_sche
if (!unicast_schedule) {
ptr = mac_ie_nested_ie_long_base_write(ptr,WP_PAYLOAD_IE_BS_TYPE, length);
ptr = common_write_32_bit_inverse(hopping_schedule->fhss_broadcast_interval, ptr);
ptr = common_write_16_bit(hopping_schedule->fhss_bsi, ptr);
ptr = common_write_16_bit_inverse(hopping_schedule->fhss_bsi, ptr);
*ptr++ = hopping_schedule->fhss_bc_dwell_interval;
} else {
ptr = mac_ie_nested_ie_long_base_write(ptr,WP_PAYLOAD_IE_US_TYPE, length);
Expand Down
9 changes: 9 additions & 0 deletions source/Service_Libs/fhss/fhss_configuration_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,12 @@ const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fh
}
return &fhss_structure->ws->fhss_configuration;
}

int ns_fhss_ws_configuration_set(const fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration)
{
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
if (!fhss_structure || !fhss_structure->ws) {
return -1;
}
return fhss_ws_configuration_set(fhss_structure, fhss_configuration);
}
15 changes: 15 additions & 0 deletions source/Service_Libs/fhss/fhss_ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -554,3 +554,18 @@ int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[
fhss_structure->ws->parent_bc_info = NULL;
return 0;
}

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);
if (channel_count <= 0) {
return -1;
}
if ((fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) && (fhss_configuration->ws_channel_function != WS_FIXED_CHANNEL)) {
// Start unicast schedule if channel function changed from fixed channel
fhss_start_timer(fhss_structure, fhss_configuration->fhss_uc_dwell_interval*1000, fhss_unicast_handler);
}
fhss_structure->ws->fhss_configuration = *fhss_configuration;
fhss_structure->number_of_channels = channel_count;
return 0;
}
1 change: 1 addition & 0 deletions source/Service_Libs/fhss/fhss_ws.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,6 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure);
int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info);
int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8]);
int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration);

#endif /*FHSS_WS_H_*/
5 changes: 5 additions & 0 deletions test/nanostack/unittest/stub/fhss_ws_stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,8 @@ int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[
{
return 0;
}

int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration)
{
return 0;
}

0 comments on commit 34dcbb6

Please sign in to comment.