Skip to content

Commit 32db0cd

Browse files
author
Jarkko Paso
committed
FHSS: Learn FHSS configuration from parent PA config
1 parent 5974344 commit 32db0cd

File tree

7 files changed

+49
-2
lines changed

7 files changed

+49
-2
lines changed

nanostack/net_fhss.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ extern int ns_fhss_configuration_set(fhss_api_t *fhss_api, const fhss_synch_conf
6262
*/
6363
extern const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fhss_api);
6464

65+
/**
66+
* @brief Set WS configuration.
67+
* @param fhss_api FHSS instance.
68+
* @param fhss_configuration Basic FHSS configuration.
69+
* @return 0 on success, -1 on fail.
70+
*/
71+
extern int ns_fhss_ws_configuration_set(const fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration);
72+
6573
/**
6674
* @brief Deletes a FHSS API instance and removes it from software MAC.
6775
* @param fhss_api FHSS instance.

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
191191
if (cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
192192
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->hopping_schdule.fhss_bc_dwell_interval;
193193
fhss_configuration.fhss_broadcast_interval = cur->ws_info->hopping_schdule.fhss_broadcast_interval;
194+
fhss_configuration.bsi = cur->ws_info->hopping_schdule.fhss_bsi;
194195
}
195196
fhss_api = ns_fhss_ws_create(&fhss_configuration, cur->ws_info->fhss_timer_ptr);
196197
if (!fhss_api) {
@@ -208,6 +209,7 @@ static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
208209
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
209210
cur->ws_info->hopping_schdule.fhss_broadcast_interval = fhss_configuration->fhss_broadcast_interval;
210211
cur->ws_info->hopping_schdule.fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
212+
cur->ws_info->hopping_schdule.fhss_bsi = fhss_configuration->bsi;
211213
}
212214
// Set neighbor info callback
213215
if (ns_fhss_set_neighbor_info_fp(fhss_api, &ws_get_neighbor_info)) {
@@ -566,7 +568,14 @@ static void ws_bootstrap_pan_config_analyse(struct protocol_interface_info_entry
566568
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = ws_bs_ie.dwell_interval;
567569

568570
cur->ws_info->hopping_schdule.channel_function = ws_bs_ie.channel_function;
569-
// TODO: Restart unicast schedule if configuration changed
571+
572+
fhss_ws_configuration_t fhss_configuration;
573+
memcpy(&fhss_configuration, ns_fhss_ws_configuration_get(cur->ws_info->fhss_api), sizeof(fhss_ws_configuration_t));
574+
fhss_configuration.fhss_uc_dwell_interval = neighbor_info.ws_neighbor->fhss_data.uc_timing_info.unicast_dwell_interval;
575+
fhss_configuration.ws_channel_function = neighbor_info.ws_neighbor->fhss_data.uc_timing_info.unicast_channel_function;
576+
fhss_configuration.bsi = neighbor_info.ws_neighbor->fhss_data.bc_timing_info.broadcast_schedule_id;
577+
ns_fhss_ws_configuration_set(cur->ws_info->fhss_api, &fhss_configuration);
578+
570579
ns_fhss_ws_set_parent(cur->ws_info->fhss_api, data->SrcAddr, &neighbor_info.ws_neighbor->fhss_data.bc_timing_info);
571580

572581
if (!cur->ws_info->configuration_learned) {

source/6LoWPAN/ws/ws_ie_lib.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ uint8_t *ws_wp_nested_hopping_schedule_write(uint8_t *ptr,struct ws_hopping_sche
136136
if (!unicast_schedule) {
137137
ptr = mac_ie_nested_ie_long_base_write(ptr,WP_PAYLOAD_IE_BS_TYPE, length);
138138
ptr = common_write_32_bit_inverse(hopping_schedule->fhss_broadcast_interval, ptr);
139-
ptr = common_write_16_bit(hopping_schedule->fhss_bsi, ptr);
139+
ptr = common_write_16_bit_inverse(hopping_schedule->fhss_bsi, ptr);
140140
*ptr++ = hopping_schedule->fhss_bc_dwell_interval;
141141
} else {
142142
ptr = mac_ie_nested_ie_long_base_write(ptr,WP_PAYLOAD_IE_US_TYPE, length);

source/Service_Libs/fhss/fhss_configuration_interface.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,12 @@ const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fh
120120
}
121121
return &fhss_structure->ws->fhss_configuration;
122122
}
123+
124+
int ns_fhss_ws_configuration_set(const fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration)
125+
{
126+
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
127+
if (!fhss_structure || !fhss_structure->ws) {
128+
return -1;
129+
}
130+
return fhss_ws_configuration_set(fhss_structure, fhss_configuration);
131+
}

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,3 +554,18 @@ int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[
554554
fhss_structure->ws->parent_bc_info = NULL;
555555
return 0;
556556
}
557+
558+
int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration)
559+
{
560+
int channel_count = channel_list_count_channels(fhss_configuration->channel_mask);
561+
if (channel_count <= 0) {
562+
return -1;
563+
}
564+
if ((fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) && (fhss_configuration->ws_channel_function != WS_FIXED_CHANNEL)) {
565+
// Start unicast schedule if channel function changed from fixed channel
566+
fhss_start_timer(fhss_structure, fhss_configuration->fhss_uc_dwell_interval*1000, fhss_unicast_handler);
567+
}
568+
fhss_structure->ws->fhss_configuration = *fhss_configuration;
569+
fhss_structure->number_of_channels = channel_count;
570+
return 0;
571+
}

source/Service_Libs/fhss/fhss_ws.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
3737
int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure);
3838
int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info);
3939
int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8]);
40+
int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration);
4041

4142
#endif /*FHSS_WS_H_*/

test/nanostack/unittest/stub/fhss_ws_stub.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,8 @@ int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[
4747
{
4848
return 0;
4949
}
50+
51+
int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_configuration_t *fhss_configuration)
52+
{
53+
return 0;
54+
}

0 commit comments

Comments
 (0)