Skip to content

Commit cbe45b4

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1805 from ARMmbed/IOTTHD-2733
FHSS: Separated broadcast schedule channel function
2 parents 327c310 + 8956418 commit cbe45b4

File tree

5 files changed

+40
-40
lines changed

5 files changed

+40
-40
lines changed

nanostack/fhss_config.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ extern "C" {
2929
#endif
3030

3131
#include "fhss_ws_extension.h"
32+
// Just to make the PR work. Will be removed when Application updated.
33+
#define ws_channel_function ws_uc_channel_function
3234

3335
/**
3436
* @brief WS channel functions.
@@ -96,8 +98,11 @@ typedef int32_t fhss_vendor_defined_cf(const fhss_api_t *api, uint16_t slot, uin
9698
*/
9799
typedef struct fhss_ws_configuration
98100
{
99-
/** WS channel function. */
100-
fhss_ws_channel_functions ws_channel_function;
101+
/** WS unicast channel function. */
102+
fhss_ws_channel_functions ws_uc_channel_function;
103+
104+
/** WS broadcast channel function. */
105+
fhss_ws_channel_functions ws_bc_channel_function;
101106

102107
/** Broadcast schedule identifier. */
103108
uint16_t bsi;

nanostack/net_fhss.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@ extern "C" {
3939
extern fhss_api_t *ns_fhss_create(const fhss_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer, fhss_statistics_t *fhss_statistics);
4040

4141
/**
42-
* @brief TODO: description.
42+
* @brief Creates FHSS WS API instance which will be registered to software MAC.
4343
* @param fhss_configuration Basic FHSS configuration.
4444
* @param fhss_timer FHSS platform timer interface and configuration.
45-
* @param fhss_statistics FHSS statistics storage.
4645
* @return New FHSS instance if successful, NULL otherwise.
4746
*/
4847
extern fhss_api_t *ns_fhss_ws_create(const fhss_ws_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer);

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ static fhss_ws_neighbor_timing_info_t *ws_get_neighbor_info(const fhss_api_t *ap
182182
static void ws_bootstrap_llc_hopping_update(struct protocol_interface_info_entry *cur, const fhss_ws_configuration_t *fhss_configuration)
183183
{
184184
memcpy(cur->ws_info->hopping_schdule.channel_mask, fhss_configuration->channel_mask, sizeof(uint32_t) * 8);
185-
cur->ws_info->hopping_schdule.channel_function = fhss_configuration->ws_channel_function;
185+
cur->ws_info->hopping_schdule.channel_function = fhss_configuration->ws_uc_channel_function;
186186
cur->ws_info->hopping_schdule.fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
187187
cur->ws_info->hopping_schdule.fhss_broadcast_interval = fhss_configuration->fhss_broadcast_interval;
188188
cur->ws_info->hopping_schdule.fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
@@ -205,7 +205,7 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
205205
}
206206

207207
fhss_configuration.fhss_uc_dwell_interval = cur->ws_info->fhss_uc_dwell_interval;
208-
fhss_configuration.ws_channel_function = cur->ws_info->fhss_channel_function;
208+
fhss_configuration.ws_uc_channel_function = cur->ws_info->fhss_channel_function;
209209
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->fhss_bc_dwell_interval;
210210
fhss_configuration.fhss_broadcast_interval = cur->ws_info->fhss_bc_interval;
211211

@@ -223,7 +223,7 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
223223
return 0;
224224
}
225225
memcpy(cur->ws_info->fhss_channel_mask, fhss_configuration->channel_mask, sizeof(uint32_t) * 8);
226-
cur->ws_info->fhss_channel_function = fhss_configuration->ws_channel_function;
226+
cur->ws_info->fhss_channel_function = fhss_configuration->ws_uc_channel_function;
227227
cur->ws_info->fhss_bc_dwell_interval = fhss_configuration->fhss_bc_dwell_interval;
228228
cur->ws_info->fhss_bc_interval = fhss_configuration->fhss_broadcast_interval;
229229
cur->ws_info->fhss_uc_dwell_interval = fhss_configuration->fhss_uc_dwell_interval;
@@ -233,7 +233,9 @@ static int8_t ws_fhss_initialize(protocol_interface_info_entry_t *cur)
233233
static int8_t ws_fhss_set_defaults(protocol_interface_info_entry_t *cur, fhss_ws_configuration_t *fhss_configuration)
234234
{
235235
fhss_configuration->fhss_uc_dwell_interval = cur->ws_info->fhss_uc_dwell_interval;
236-
fhss_configuration->ws_channel_function = cur->ws_info->fhss_channel_function;
236+
fhss_configuration->ws_uc_channel_function = cur->ws_info->fhss_channel_function;
237+
// TODO: Just temporarily using hard coded broadcast channel function
238+
fhss_configuration->ws_bc_channel_function = WS_DH1CF;
237239
fhss_configuration->fhss_bc_dwell_interval = cur->ws_info->fhss_bc_dwell_interval;
238240
fhss_configuration->fhss_broadcast_interval = cur->ws_info->fhss_bc_interval;
239241
ws_generate_channel_list(fhss_configuration->channel_mask, cur->ws_info->hopping_schdule.number_of_channels, cur->ws_info->hopping_schdule.regulatory_domain);
@@ -267,7 +269,7 @@ static int8_t ws_fhss_discovery_configure(protocol_interface_info_entry_t *cur)
267269
}
268270

269271
fhss_configuration.fhss_uc_dwell_interval = 0;
270-
fhss_configuration.ws_channel_function = WS_FIXED_CHANNEL;
272+
fhss_configuration.ws_uc_channel_function = WS_FIXED_CHANNEL;
271273
fhss_configuration.fhss_bc_dwell_interval = 0;
272274
fhss_configuration.fhss_broadcast_interval = 0;
273275
cur->ws_info->hopping_schdule.fixed_channel = randLIB_get_random_in_range(0,cur->ws_info->hopping_schdule.number_of_channels - 1);
@@ -312,8 +314,8 @@ static void ws_bootstrap_primary_parent_set(struct protocol_interface_info_entry
312314
ws_fhss_set_defaults(cur, &fhss_configuration);
313315

314316
// Learning unicast network configuration
315-
fhss_configuration.ws_channel_function = neighbor_info->ws_neighbor->fhss_data.uc_timing_info.unicast_channel_function;
316-
if (fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
317+
fhss_configuration.ws_uc_channel_function = neighbor_info->ws_neighbor->fhss_data.uc_timing_info.unicast_channel_function;
318+
if (fhss_configuration.ws_uc_channel_function == WS_FIXED_CHANNEL) {
317319
cur->ws_info->hopping_schdule.fixed_channel = neighbor_info->ws_neighbor->fhss_data.uc_timing_info.fixed_channel;
318320
}
319321
/* Learning different unicast is not working currently at fhss network follows border router

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,15 @@ static int32_t fhss_ws_calc_bc_channel(fhss_structure_t *fhss_structure)
109109
{
110110
int32_t next_channel = fhss_structure->rx_channel;
111111

112-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
112+
if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_TR51CF) {
113113
next_channel = tr51_get_bc_channel_index(fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels, NULL);
114114
if (++fhss_structure->ws->bc_slot == fhss_structure->number_of_channels) {
115115
fhss_structure->ws->bc_slot = 0;
116116
}
117-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_DH1CF) {
117+
} else if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_DH1CF) {
118118
next_channel = dh1cf_get_bc_channel_index(fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
119119
fhss_structure->ws->bc_slot++;
120-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
120+
} else if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_VENDOR_DEF_CF) {
121121
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
122122
next_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, NULL, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
123123
}
@@ -240,7 +240,7 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
240240
}
241241
uint64_t ms_since_seq_start = (cur_slot * dwell_time) + (dwell_time-remaining_time) + time_to_tx;
242242
uint32_t seq_length = 0x10000;
243-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
243+
if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_TR51CF) {
244244
ms_since_seq_start %= (dwell_time*fhss_structure->number_of_channels);
245245
seq_length = fhss_structure->number_of_channels;
246246
}
@@ -289,7 +289,7 @@ static void fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_states
289289
if (!fhss_structure) {
290290
return;
291291
}
292-
if ((fhss_state == FHSS_SYNCHRONIZED) && (fhss_structure->ws->fhss_configuration.ws_channel_function != WS_FIXED_CHANNEL)) {
292+
if (fhss_state == FHSS_SYNCHRONIZED) {
293293
uint32_t fhss_broadcast_interval = fhss_structure->ws->fhss_configuration.fhss_broadcast_interval;
294294
uint8_t fhss_bc_dwell_interval = fhss_structure->ws->fhss_configuration.fhss_bc_dwell_interval;
295295

@@ -298,8 +298,10 @@ static void fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_states
298298
fhss_broadcast_handler(fhss_structure->fhss_api, 0);
299299
}
300300
// Start unicast schedule
301-
fhss_ws_update_uc_channel_callback(fhss_structure);
302-
fhss_start_timer(fhss_structure, fhss_structure->ws->fhss_configuration.fhss_uc_dwell_interval*1000, fhss_unicast_handler);
301+
if ((fhss_structure->ws->fhss_configuration.ws_uc_channel_function != WS_FIXED_CHANNEL)) {
302+
fhss_ws_update_uc_channel_callback(fhss_structure);
303+
fhss_start_timer(fhss_structure, fhss_structure->ws->fhss_configuration.fhss_uc_dwell_interval*1000, fhss_unicast_handler);
304+
}
303305
}
304306

305307
fhss_structure->fhss_state = fhss_state;
@@ -311,17 +313,17 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
311313
uint8_t mac_address[8];
312314
int32_t next_channel = fhss_structure->rx_channel;
313315
fhss_structure->callbacks.read_mac_address(fhss_structure->fhss_api, mac_address);
314-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
316+
if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_FIXED_CHANNEL) {
315317
return;
316-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
318+
} else if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_TR51CF) {
317319
next_channel = fhss_structure->rx_channel = tr51_get_uc_channel_index(fhss_structure->ws->uc_slot, mac_address, fhss_structure->number_of_channels, NULL);
318320
if (++fhss_structure->ws->uc_slot == fhss_structure->number_of_channels) {
319321
fhss_structure->ws->uc_slot = 0;
320322
}
321-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_DH1CF) {
323+
} else if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_DH1CF) {
322324
next_channel = fhss_structure->rx_channel = dh1cf_get_uc_channel_index(fhss_structure->ws->uc_slot, mac_address, fhss_structure->number_of_channels);
323325
fhss_structure->ws->uc_slot++;
324-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
326+
} else if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_VENDOR_DEF_CF) {
325327
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
326328
next_channel = fhss_structure->rx_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, mac_address, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
327329
}
@@ -453,9 +455,6 @@ static bool fhss_ws_check_tx_conditions_callback(const fhss_api_t *api, bool is_
453455
if (!fhss_structure) {
454456
return true;
455457
}
456-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
457-
return true;
458-
}
459458
// Do not allow broadcast destination on unicast channel
460459
if (is_broadcast_addr && (fhss_structure->ws->is_on_bc_channel == false)) {
461460
return false;
@@ -535,7 +534,7 @@ static void fhss_ws_data_tx_done_callback(const fhss_api_t *api, bool waiting_ac
535534
if (!fhss_structure) {
536535
return;
537536
}
538-
if ((fhss_structure->fhss_state == FHSS_SYNCHRONIZED) && (fhss_structure->ws->fhss_configuration.ws_channel_function != WS_FIXED_CHANNEL)) {
537+
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
539538
if (waiting_ack == false) {
540539
if (fhss_structure->ws->is_on_bc_channel == false) {
541540
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, fhss_structure->rx_channel);
@@ -612,7 +611,7 @@ static bool fhss_ws_use_broadcast_queue_cb(const fhss_api_t *api, bool is_broadc
612611
return false;
613612
}
614613
// Do not use broadcast queue when fixed channel
615-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
614+
if (fhss_structure->ws->fhss_configuration.ws_bc_channel_function == WS_FIXED_CHANNEL) {
616615
return false;
617616
}
618617
// Broadcast packets are stored in broadcast queue
@@ -661,9 +660,6 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
661660
if (!fhss_structure->ws) {
662661
return -1;
663662
}
664-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
665-
return 0;
666-
}
667663
if (!bc_timing_info->broadcast_interval || !bc_timing_info->broadcast_dwell_interval) {
668664
return -1;
669665
}
@@ -701,14 +697,15 @@ int fhss_ws_configuration_set(fhss_structure_t *fhss_structure, const fhss_ws_co
701697
if (channel_count <= 0) {
702698
return -1;
703699
}
704-
if ((fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) && (fhss_configuration->ws_channel_function != WS_FIXED_CHANNEL)) {
700+
if ((fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_FIXED_CHANNEL) && (fhss_configuration->ws_uc_channel_function != WS_FIXED_CHANNEL)) {
705701
// Start unicast schedule if channel function changed from fixed channel
706702
fhss_start_timer(fhss_structure, fhss_configuration->fhss_uc_dwell_interval*1000, fhss_unicast_handler);
707703
}
708704
fhss_structure->ws->fhss_configuration = *fhss_configuration;
709705
fhss_structure->number_of_channels = channel_count;
710-
tr_info("fhss Configuration set function:%d channels: %d, uc dwell: %d, bc dwell: %d, bc interval: %d, bsi:%d",
711-
fhss_structure->ws->fhss_configuration.ws_channel_function,
706+
tr_info("fhss Configuration set UC CF: %d, BC CF: %d, channels: %d, uc dwell: %d, bc dwell: %d, bc interval: %d, bsi:%d",
707+
fhss_structure->ws->fhss_configuration.ws_uc_channel_function,
708+
fhss_structure->ws->fhss_configuration.ws_bc_channel_function,
712709
fhss_structure->number_of_channels,
713710
fhss_structure->ws->fhss_configuration.fhss_uc_dwell_interval,
714711
fhss_structure->ws->fhss_configuration.fhss_bc_dwell_interval,

test/nanostack/unittest/service_libs/fhss_ws/test_fhss_ws.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ bool test_fhss_broadcast_handler()
507507
fhss_common_stub.fhss_struct.ws->bc_slot = fhss_common_stub.fhss_struct.number_of_channels - 1;
508508
enable_fhss_struct();
509509
// Test setting TR51 broadcast channel
510-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
510+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_bc_channel_function = WS_TR51CF;
511511
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
512512
if ((fhss_common_stub.fhss_struct.ws->is_on_bc_channel == false) || (4 != fhss_callbacks_stub.uint8_value) || (fhss_common_stub.fhss_struct.ws->bc_slot != 0)) {
513513
return false;
@@ -518,7 +518,7 @@ bool test_fhss_broadcast_handler()
518518
return false;
519519
}
520520
// Test setting direct hash broadcast channel
521-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_DH1CF;
521+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_bc_channel_function = WS_DH1CF;
522522
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
523523
if ((fhss_common_stub.fhss_struct.ws->is_on_bc_channel == false) || (2 != fhss_callbacks_stub.uint8_value) || (fhss_common_stub.fhss_struct.ws->bc_slot != 1)) {
524524
return false;
@@ -530,7 +530,7 @@ bool test_fhss_broadcast_handler()
530530
}
531531
// Test setting vendor defined broadcast channel
532532
fhss_common_stub.fhss_struct.ws->fhss_configuration.vendor_defined_cf = app_channel_function;
533-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_VENDOR_DEF_CF;
533+
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_bc_channel_function = WS_VENDOR_DEF_CF;
534534
fhss_common_stub.fhss_struct.fhss_api->synch_state_set(api, DEFAULT_FHSS_STATE, DEFAULT_PANID);
535535
if ((fhss_common_stub.fhss_struct.ws->is_on_bc_channel == false) || (VENDOR_CHANNEL != fhss_callbacks_stub.uint8_value) || (fhss_common_stub.fhss_struct.ws->bc_slot != 1)) {
536536
return false;
@@ -627,10 +627,7 @@ bool test_fhss_ws_set_parent()
627627
if (-1 != fhss_ws_set_parent(&fake_fhss_structure, dest_address, &bc_timing_info)) {
628628
return false;
629629
}
630-
// Test on fixed channel
631-
if (0 != fhss_ws_set_parent(&fhss_common_stub.fhss_struct, dest_address, &bc_timing_info)) {
632-
return false;
633-
}
630+
634631
// Test success
635632
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
636633
bc_timing_info.broadcast_channel_function = WS_TR51CF;

0 commit comments

Comments
 (0)