@@ -179,22 +179,41 @@ static fhss_ws_neighbor_timing_info_t *ws_get_neighbor_info(const fhss_api_t *ap
179179
180180static int8_t ws_enable_fhss (protocol_interface_info_entry_t * cur )
181181{
182- fhss_ws_configuration_t fhss_configuration ;
183- memset (& fhss_configuration , 0 , sizeof (fhss_ws_configuration_t ));
184- fhss_configuration .bsi = cur -> ws_info -> hopping_schdule .fhss_bsi ;
185- memcpy (fhss_configuration .channel_mask , cur -> ws_info -> hopping_schdule .channel_mask , sizeof (uint32_t ) * 8 );
186- if (cur -> bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER ) {
187- fhss_configuration .fhss_bc_dwell_interval = cur -> ws_info -> hopping_schdule .fhss_bc_dwell_interval ;
188- fhss_configuration .fhss_broadcast_interval = cur -> ws_info -> hopping_schdule .fhss_broadcast_interval ;
189- }
190- fhss_configuration .fhss_uc_dwell_interval = cur -> ws_info -> hopping_schdule .fhss_uc_dwell_interval ;
191- fhss_configuration .get_neighbor_info = & ws_get_neighbor_info ;
192- fhss_configuration .ws_channel_function = cur -> ws_info -> hopping_schdule .channel_function ;
193- fhss_api_t * fhss_api = ns_fhss_ws_create (& fhss_configuration , cur -> ws_info -> fhss_timer_ptr );
194- if (fhss_api ) {
182+ fhss_api_t * fhss_api = ns_sw_mac_get_fhss_api (cur -> mac_api );
183+ if (!fhss_api ) {
184+ // When FHSS doesn't exist yet, create one
185+ fhss_ws_configuration_t fhss_configuration ;
186+ memset (& fhss_configuration , 0 , sizeof (fhss_ws_configuration_t ));
187+ fhss_configuration .bsi = cur -> ws_info -> hopping_schdule .fhss_bsi ;
188+ memcpy (fhss_configuration .channel_mask , cur -> ws_info -> hopping_schdule .channel_mask , sizeof (uint32_t ) * 8 );
189+ fhss_configuration .fhss_uc_dwell_interval = cur -> ws_info -> hopping_schdule .fhss_uc_dwell_interval ;
190+ fhss_configuration .ws_channel_function = cur -> ws_info -> hopping_schdule .channel_function ;
191+ if (cur -> bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER ) {
192+ fhss_configuration .fhss_bc_dwell_interval = cur -> ws_info -> hopping_schdule .fhss_bc_dwell_interval ;
193+ fhss_configuration .fhss_broadcast_interval = cur -> ws_info -> hopping_schdule .fhss_broadcast_interval ;
194+ }
195+ fhss_api = ns_fhss_ws_create (& fhss_configuration , cur -> ws_info -> fhss_timer_ptr );
196+ if (!fhss_api ) {
197+ return -1 ;
198+ }
195199 ns_sw_mac_fhss_register (cur -> mac_api , fhss_api );
196- cur -> ws_info -> fhss_api = fhss_api ;
200+ } else {
201+ // Read configuration of existing FHSS
202+ const fhss_ws_configuration_t * fhss_configuration = ns_fhss_ws_configuration_get (fhss_api );
203+ if (!fhss_configuration ) {
204+ return -1 ;
205+ }
206+ memcpy (cur -> ws_info -> hopping_schdule .channel_mask , fhss_configuration -> channel_mask , sizeof (uint32_t ) * 8 );
207+ cur -> ws_info -> hopping_schdule .channel_function = fhss_configuration -> ws_channel_function ;
208+ cur -> ws_info -> hopping_schdule .fhss_bc_dwell_interval = fhss_configuration -> fhss_bc_dwell_interval ;
209+ cur -> ws_info -> hopping_schdule .fhss_broadcast_interval = fhss_configuration -> fhss_broadcast_interval ;
210+ cur -> ws_info -> hopping_schdule .fhss_uc_dwell_interval = fhss_configuration -> fhss_uc_dwell_interval ;
211+ }
212+ // Set neighbor info callback
213+ if (ns_fhss_set_neighbor_info_fp (fhss_api , & ws_get_neighbor_info )) {
214+ return -1 ;
197215 }
216+ cur -> ws_info -> fhss_api = fhss_api ;
198217 return 0 ;
199218}
200219
@@ -1204,7 +1223,6 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
12041223 cur -> ws_info -> pan_information .rpl_routing_method = true;
12051224 cur -> ws_info -> pan_information .use_parent_bs = true;
12061225 cur -> ws_info -> pan_information .version = WS_FAN_VERSION_1_0 ;
1207- cur -> ws_info -> hopping_schdule .channel_function = WS_FIXED_CHANNEL ;
12081226 ws_llc_set_gtkhash (cur , cur -> ws_info -> gtkhash );
12091227 cur -> ws_info -> pan_version_timer = PAN_VERSION_LIFETIME ;
12101228 ws_bootstrap_fhss_activate (cur );
0 commit comments