Skip to content

Commit 11c486f

Browse files
author
Jarkko Paso
authored
Implemented unregistering FHSS from MAC. FHSS deleted in ifdown call. (ARMmbed#2266)
1 parent eabca17 commit 11c486f

File tree

6 files changed

+37
-22
lines changed

6 files changed

+37
-22
lines changed

nanostack/sw_mac.h

+7
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ extern int8_t ns_sw_mac_virtual_client_unregister(struct mac_api_s *api);
6767
*/
6868
extern int ns_sw_mac_fhss_register(struct mac_api_s *mac_api, struct fhss_api *fhss_api);
6969

70+
/**
71+
* @brief Unregister FHSS API instance from given software MAC instance.
72+
* @param mac_api MAC instance.
73+
* @return 0 on success, -1 on fail.
74+
*/
75+
extern int ns_sw_mac_fhss_unregister(struct mac_api_s *mac_api);
76+
7077
/**
7178
* @brief Request registered FHSS API instance from software MAC instance.
7279
* @param mac_api MAC instance.

source/6LoWPAN/ws/ws_bootstrap.c

+7-20
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,7 @@ static void ws_bootstrap_llc_hopping_update(struct protocol_interface_info_entry
423423
static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
424424
{
425425
fhss_api_t *fhss_api = ns_sw_mac_get_fhss_api(cur->mac_api);
426-
427-
if (!fhss_api || (fhss_api && cur->ws_info->fhss_owner)) {
426+
if (!fhss_api) {
428427
// When FHSS doesn't exist yet, create one
429428
fhss_ws_configuration_t fhss_configuration;
430429
memset(&fhss_configuration, 0, sizeof(fhss_ws_configuration_t));
@@ -440,26 +439,11 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
440439
fhss_configuration.ws_bc_channel_function = (fhss_ws_channel_functions)cur->ws_info->fhss_bc_channel_function;
441440
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->fhss_bc_dwell_interval;
442441
fhss_configuration.fhss_broadcast_interval = cur->ws_info->fhss_bc_interval;
443-
442+
fhss_api = ns_fhss_ws_create(&fhss_configuration, cur->ws_info->fhss_timer_ptr);
444443
if (!fhss_api) {
445-
fhss_api = ns_fhss_ws_create(&fhss_configuration, cur->ws_info->fhss_timer_ptr);
446-
if (!fhss_api) {
447-
tr_error("fhss create failed");
448-
return -1;
449-
}
450-
ns_sw_mac_fhss_register(cur->mac_api, fhss_api);
451-
cur->ws_info->fhss_owner = true;
452-
} else {
453-
//Configuration set
454-
ns_fhss_ws_configuration_set(cur->ws_info->fhss_api, &fhss_configuration);
455-
456-
if (cur->bootsrap_mode == ARM_NWK_BOOTSRAP_MODE_6LoWPAN_BORDER_ROUTER) {
457-
ns_fhss_ws_set_hop_count(cur->ws_info->fhss_api, 0);
458-
} else {
459-
//Clear OWN HOP
460-
ns_fhss_ws_set_hop_count(cur->ws_info->fhss_api, 0xff);
461-
}
444+
return -1;
462445
}
446+
ns_sw_mac_fhss_register(cur->mac_api, fhss_api);
463447
} else {
464448
// Read defaults from the configuration to help FHSS testing
465449
const fhss_ws_configuration_t *fhss_configuration = ns_fhss_ws_configuration_get(fhss_api);
@@ -810,6 +794,9 @@ static int8_t ws_bootstrap_down(protocol_interface_info_entry_t *cur)
810794
tr_info("Wi-SUN ifdown");
811795
// Reset MAC for safe upper layer memory free
812796
protocol_mac_reset(cur);
797+
ns_sw_mac_fhss_unregister(cur->mac_api);
798+
ns_fhss_delete(cur->ws_info->fhss_api);
799+
cur->ws_info->fhss_api = NULL;
813800
// Reset WS information
814801
// ws_common_reset(cur)
815802
ws_llc_reset(cur);

source/6LoWPAN/ws/ws_common.h

-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ typedef struct ws_info_s {
9797
bool trickle_pa_running: 1;
9898
bool trickle_pcs_running: 1;
9999
bool trickle_pc_running: 1;
100-
bool fhss_owner: 1;
101100
ws_pending_key_index_t pending_key_index_info;
102101
// default fhss parameters for this device
103102
uint8_t fhss_uc_dwell_interval;

source/MAC/IEEE802_15_4/sw_mac.c

+14
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,20 @@ int ns_sw_mac_fhss_register(mac_api_t *mac_api, fhss_api_t *fhss_api)
197197
return 0;
198198
}
199199

200+
int ns_sw_mac_fhss_unregister(mac_api_t *mac_api)
201+
{
202+
if (!mac_api) {
203+
return -1;
204+
}
205+
// Get a pointer to MAC setup structure
206+
protocol_interface_rf_mac_setup_s *mac_setup = get_sw_mac_ptr_by_mac_api(mac_api);
207+
if (!mac_setup) {
208+
return -1;
209+
}
210+
mac_setup->fhss_api = NULL;
211+
return 0;
212+
}
213+
200214
struct fhss_api *ns_sw_mac_get_fhss_api(struct mac_api_s *mac_api)
201215
{
202216
if (!mac_api) {

source/Service_Libs/fhss/fhss_common.c

+2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ int8_t fhss_disable(fhss_structure_t *fhss_structure)
113113
}
114114
fhss_structure->fhss_api->synch_state_set(fhss_structure->fhss_api, FHSS_UNSYNCHRONIZED, 0);
115115
ns_dyn_mem_free(fhss_structure->bs);
116+
ns_dyn_mem_free(fhss_structure->ws->tr51_channel_table);
117+
ns_dyn_mem_free(fhss_structure->ws->tr51_output_table);
116118
ns_dyn_mem_free(fhss_structure->ws);
117119
ns_dyn_mem_free(fhss_structure);
118120
fhss_struct = 0;

source/Service_Libs/fhss/fhss_ws.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,11 @@ static void fhss_event_timer_cb(int8_t timer_id, uint16_t slots)
305305
{
306306
(void) slots;
307307
uint16_t queue_size = 0;
308-
fhss_structure_t *fhss_structure = fhss_get_object_with_timer_id(timer_id);
309308

309+
fhss_structure_t *fhss_structure = fhss_get_object_with_timer_id(timer_id);
310+
if (!fhss_structure) {
311+
return;
312+
}
310313

311314
if (fhss_structure->ws->is_on_bc_channel == true) {
312315
queue_size = fhss_structure->callbacks.read_tx_queue_size(fhss_structure->fhss_api, true);
@@ -407,6 +410,9 @@ static int16_t fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_stat
407410
}
408411
} else if (fhss_state == FHSS_UNSYNCHRONIZED) {
409412
fhss_structure->ws->synchronization_time = 0;
413+
eventOS_callback_timer_stop(fhss_structure->fhss_event_timer);
414+
fhss_stop_timer(fhss_structure, fhss_unicast_handler);
415+
fhss_stop_timer(fhss_structure, fhss_broadcast_handler);
410416
}
411417

412418
fhss_structure->fhss_state = fhss_state;

0 commit comments

Comments
 (0)