Skip to content

Commit 98f9991

Browse files
author
Jarkko Paso
committed
FHSS: Set neighbor info get function
- Use neighbor info to find destination channel
1 parent 126275b commit 98f9991

File tree

10 files changed

+69
-29
lines changed

10 files changed

+69
-29
lines changed

nanostack/fhss_ws_extension.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ extern "C" {
3636
typedef struct unicast_timing_info {
3737
unsigned unicast_channel_function:3; /**< Unicast schedule channel function */
3838
uint8_t unicast_dwell_interval; /**< Unicast dwell interval */
39+
uint16_t unicast_number_of_channels; /**< Unicast number of channels */
3940
uint_fast24_t ufsi; /**< Unicast fractional sequence interval */
4041
uint32_t utt_rx_timestamp; /**< UTT-IE reception timestamp */
4142
} unicast_timing_info_t;

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,23 @@ static int8_t ws_bootsrap_event_trig(ws_bootsrap_event_type_e event_type, int8_t
138138
return eventOS_event_send(&event);
139139
}
140140

141+
static fhss_ws_neighbor_timing_info_t *ws_get_neighbor_info(const fhss_api_t *api, uint8_t eui64[8])
142+
{
143+
protocol_interface_info_entry_t *cur = protocol_stack_interface_info_get_by_fhss_api(api);
144+
if (!cur || !cur->mac_parameters || !cur->mac_parameters->mac_neighbor_table) {
145+
return NULL;
146+
}
147+
mac_neighbor_table_entry_t *mac_neighbor = mac_neighbor_table_address_discover(cur->mac_parameters->mac_neighbor_table, eui64, MAC_ADDR_MODE_64_BIT);
148+
if (!mac_neighbor) {
149+
return NULL;
150+
}
151+
ws_neighbor_class_entry_t *ws_neighbor = ws_neighbor_class_entry_get(&cur->ws_info->neighbor_storage, mac_neighbor->index);
152+
if (!ws_neighbor) {
153+
return NULL;
154+
}
155+
return &ws_neighbor->fhss_data;
156+
}
157+
141158
static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
142159
{
143160
fhss_ws_configuration_t fhss_configuration;
@@ -146,10 +163,12 @@ static int8_t ws_enable_fhss(protocol_interface_info_entry_t *cur)
146163
fhss_configuration.fhss_bc_dwell_interval = cur->ws_info->hopping_schdule.fhss_bc_dwell_interval;
147164
fhss_configuration.fhss_broadcast_interval = cur->ws_info->hopping_schdule.fhss_broadcast_interval;
148165
fhss_configuration.fhss_uc_dwell_interval = cur->ws_info->hopping_schdule.fhss_uc_dwell_interval;
166+
fhss_configuration.get_neighbor_info = &ws_get_neighbor_info;
149167
fhss_configuration.ws_channel_function = cur->ws_info->hopping_schdule.channel_function;
150168
fhss_api_t *fhss_api = ns_fhss_ws_create(&fhss_configuration, cur->ws_info->fhss_timer_ptr);
151169
if (fhss_api) {
152170
ns_sw_mac_fhss_register(cur->mac_api, fhss_api);
171+
cur->ws_info->fhss_api = fhss_api;
153172
}
154173
return 0;
155174
}

source/6LoWPAN/ws/ws_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ typedef struct ws_info_s {
5656
ws_hopping_schedule_t hopping_schdule;
5757
struct ws_neighbor_class_s neighbor_storage;
5858
struct fhss_timer *fhss_timer_ptr; // Platform adaptation for FHSS timers.
59+
struct fhss_api *fhss_api;
5960
} ws_info_t;
6061

6162
#ifdef HAVE_WS

source/6LoWPAN/ws/ws_ie_lib.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ bool ws_wh_utt_read(uint8_t *data, uint16_t length, struct ws_utt_ie *utt_ie)
256256
}
257257
data = utt_ie_data.content_ptr;
258258
utt_ie->message_type = *data++;
259-
utt_ie->ufsi = common_read_24_bit_inverse(data + 1);
259+
utt_ie->ufsi = common_read_24_bit_inverse(data);
260260
return true;
261261
}
262262

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@ static int8_t mac_data_sap_rx_handler(mac_pre_parsed_frame_t *buf, protocol_inte
698698

699699
data_ind->mpduLinkQuality = buf->LQI;
700700
data_ind->signal_dbm = buf->dbm;
701+
data_ind->timestamp = buf->timestamp;
701702
/* Parse security part */
702703
mac_header_security_components_read(buf, &data_ind->Key);
703704

source/MAC/IEEE802_15_4/mac_pd_sap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void mac_pd_sap_state_machine(protocol_interface_rf_mac_setup_s *rf_mac_setup)
218218
int tx_handle_retval = rf_mac_setup->fhss_api->tx_handle(rf_mac_setup->fhss_api, !mac_is_ack_request_set(active_buf),
219219
active_buf->DstAddr, mac_convert_frame_type_to_fhss(active_buf->fcf_dsn.frametype),
220220
active_buf->mac_payload_length, rf_mac_setup->dev_driver->phy_driver->phy_header_length,
221-
rf_mac_setup->dev_driver->phy_driver->phy_tail_length, 0);
221+
rf_mac_setup->dev_driver->phy_driver->phy_tail_length, active_buf->tx_time);
222222
// When FHSS TX handle returns -1, transmission of the packet is currently not allowed -> restart CCA timer
223223
if (tx_handle_retval == -1) {
224224
timer_mac_start(rf_mac_setup, MAC_TIMER_CCA, randLIB_get_random_in_range(20, 400) + 1);

source/NWK_INTERFACE/Include/protocol_abstract.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "ns_types.h"
2222

2323
struct rpl_domain;
24+
struct fhss_api;
2425

2526
/*!
2627
* \enum nwk_interface_id
@@ -43,5 +44,6 @@ extern int protocol_core_buffers_in_event_queue;
4344
protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_id(int8_t nwk_id);
4445
protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_bootstrap_id(int8_t id);
4546
protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_rpl_domain(const struct rpl_domain *domain, int8_t last_id);
47+
protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_fhss_api(const struct fhss_api *fhss_api);
4648

4749
#endif /* NWK_INTERFACE_INCLUDE_PROTOCOL_ABSTRACT_H_ */

source/NWK_INTERFACE/protocol_core.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,18 @@ protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_rpl_domain
767767
return NULL;
768768
}
769769

770+
protocol_interface_info_entry_t *protocol_stack_interface_info_get_by_fhss_api(const struct fhss_api *fhss_api)
771+
{
772+
#ifdef HAVE_WS
773+
ns_list_foreach(protocol_interface_info_entry_t, cur, &protocol_interface_info_list) {
774+
if (cur->ws_info->fhss_api == fhss_api) {
775+
return cur;
776+
}
777+
}
778+
#endif //HAVE_WS
779+
return NULL;
780+
}
781+
770782
protocol_interface_info_entry_t *protocol_stack_interface_sleep_possibility(void)
771783
{
772784
ns_list_foreach(protocol_interface_info_entry_t, cur, &protocol_interface_info_list) {

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,22 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
148148
uint32_t remaining_time = (fhss_structure->platform_functions.fhss_get_remaining_slots(fhss_unicast_handler, fhss_structure->fhss_api) / 1000);
149149
uint32_t time_to_tx = (tx_time - fhss_structure->fhss_api->read_timestamp(fhss_structure->fhss_api)) / 1000;
150150
uint64_t ms_since_seq_start = (cur_slot * dwell_time) + (dwell_time-remaining_time) + time_to_tx;
151-
ms_since_seq_start %= (dwell_time*fhss_structure->number_of_channels);
152151
uint32_t seq_length = 0x10000;
153152
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
153+
ms_since_seq_start %= (dwell_time*fhss_structure->number_of_channels);
154154
seq_length = fhss_structure->number_of_channels;
155155
}
156156
return own_floor((float)(ms_since_seq_start * DEF_2E24) / (seq_length*dwell_time));
157157
}
158158

159-
static uint16_t fhss_ws_calculate_destination_slot(fhss_structure_t *fhss_structure, fhss_ws_neighbor_timing_info_t *neighbor_timing_info, uint32_t tx_time)
159+
static uint16_t fhss_ws_calculate_destination_slot(fhss_ws_neighbor_timing_info_t *neighbor_timing_info, uint32_t tx_time)
160160
{
161161
uint_fast24_t ufsi = neighbor_timing_info->uc_timing_info.ufsi;
162162
uint32_t ufsi_timestamp = neighbor_timing_info->uc_timing_info.utt_rx_timestamp;
163163
uint8_t dwell_time = neighbor_timing_info->uc_timing_info.unicast_dwell_interval;
164164
uint32_t seq_length = 0x10000;
165-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
166-
seq_length = fhss_structure->number_of_channels;
165+
if (neighbor_timing_info->uc_timing_info.unicast_channel_function == WS_TR51CF) {
166+
seq_length = neighbor_timing_info->uc_timing_info.unicast_number_of_channels;
167167
}
168168
uint32_t dest_ms_since_seq_start = own_ceil((float)(ufsi*seq_length*dwell_time) / DEF_2E24);
169169
return (own_floor(((float)((tx_time - ufsi_timestamp)/1000 + dest_ms_since_seq_start) / dwell_time)) % seq_length);
@@ -242,29 +242,27 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
242242
return 0;
243243
}
244244
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
245-
// TODO: Waits for neighbor table support
246-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
247-
return -2;
248-
}
249-
250245
fhss_ws_neighbor_timing_info_t *neighbor_timing_info = fhss_structure->ws->fhss_configuration.get_neighbor_info(api, destination_address);
251246
if (!neighbor_timing_info) {
252-
return -1;
247+
tr_err("FHSS: No neighbor info: %s", trace_array(destination_address, 8));
248+
return -2;
253249
}
254-
uint16_t destination_slot = fhss_ws_calculate_destination_slot(fhss_structure, neighbor_timing_info, tx_time);
250+
// TODO: WS bootstrap has to store neighbors number of channels
251+
neighbor_timing_info->uc_timing_info.unicast_number_of_channels = fhss_structure->number_of_channels;
252+
uint16_t destination_slot = fhss_ws_calculate_destination_slot(neighbor_timing_info, tx_time);
255253
int32_t tx_channel;
256-
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
257-
tx_channel = tr51_get_uc_channel_index(destination_slot, destination_address, fhss_structure->number_of_channels, NULL, 0);
258-
} else if(fhss_structure->ws->fhss_configuration.ws_channel_function == WS_DH1CF) {
259-
tx_channel = dh1cf_get_uc_channel_index(destination_slot, destination_address, fhss_structure->number_of_channels);
260-
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
254+
if (neighbor_timing_info->uc_timing_info.unicast_channel_function == WS_TR51CF) {
255+
tx_channel = tr51_get_uc_channel_index(destination_slot, destination_address, neighbor_timing_info->uc_timing_info.unicast_number_of_channels, NULL, 0);
256+
} else if(neighbor_timing_info->uc_timing_info.unicast_channel_function == WS_DH1CF) {
257+
tx_channel = dh1cf_get_uc_channel_index(destination_slot, destination_address, neighbor_timing_info->uc_timing_info.unicast_number_of_channels);
258+
} else if (neighbor_timing_info->uc_timing_info.unicast_channel_function == WS_VENDOR_DEF_CF) {
261259
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
262-
tx_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, destination_address, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
260+
tx_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, destination_address, fhss_structure->ws->fhss_configuration.bsi, neighbor_timing_info->uc_timing_info.unicast_number_of_channels);
263261
} else {
264262
return -1;
265263
}
266264
} else {
267-
return -1;
265+
return 0;
268266
}
269267
#ifdef FHSS_CHANNEL_DEBUG
270268
tr_debug("TX channel: %u %u", tx_channel, destination_slot+1);
@@ -334,6 +332,11 @@ static void fhss_ws_data_tx_done_callback(const fhss_api_t *api, bool waiting_ac
334332
if (!fhss_structure) {
335333
return;
336334
}
335+
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
336+
if ((waiting_ack == false) && (fhss_structure->ws->is_on_bc_channel == false)) {
337+
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, fhss_structure->rx_channel);
338+
}
339+
}
337340
}
338341

339342
static bool fhss_ws_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, int frame_type)

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,24 +208,25 @@ bool test_fhss_ws_tx_handle_callback()
208208
return false;
209209
}
210210
// Test when no neighbor info found
211-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
211+
neighbor_info.uc_timing_info.unicast_channel_function = WS_TR51CF;
212+
neighbor_info.uc_timing_info.unicast_number_of_channels = fhss_common_stub.fhss_struct.number_of_channels;
212213
fhss_common_stub.fhss_struct.fhss_state = DEFAULT_FHSS_STATE;
213214
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_no_neighbor_info;
214-
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != -1) {
215+
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != -2) {
215216
return false;
216217
}
217218
// Test fixed channel
218219
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_get_neighbor_info;
219-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_FIXED_CHANNEL;
220-
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != -2) {
220+
neighbor_info.uc_timing_info.unicast_channel_function = WS_FIXED_CHANNEL;
221+
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0) {
221222
return false;
222223
}
223224
/* Test TR51 channel function
224225
* Dest. slot: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
225226
* |dest. ufsi| 900ms |
226227
* timestamps: 100000us| 1000000us|
227228
*/
228-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
229+
neighbor_info.uc_timing_info.unicast_channel_function = WS_TR51CF;
229230
if ((fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0)
230231
|| (channel_functions_stub.uint8_value != 7)) {
231232
return false;
@@ -236,7 +237,7 @@ bool test_fhss_ws_tx_handle_callback()
236237
* timestamps: 4294867000us| 900000us|
237238
*/
238239
neighbor_info.uc_timing_info.utt_rx_timestamp = 4294867000;
239-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
240+
neighbor_info.uc_timing_info.unicast_channel_function = WS_TR51CF;
240241
if ((fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, 900000) != 0)
241242
|| (channel_functions_stub.uint8_value != 7)) {
242243
return false;
@@ -248,20 +249,20 @@ bool test_fhss_ws_tx_handle_callback()
248249
*/
249250
neighbor_info.uc_timing_info.utt_rx_timestamp = 100000;
250251
uint32_t tx_time = neighbor_info.uc_timing_info.utt_rx_timestamp + (fhss_common_stub.fhss_struct.number_of_channels * neighbor_info.uc_timing_info.unicast_dwell_interval * 1000);
251-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_TR51CF;
252+
neighbor_info.uc_timing_info.unicast_channel_function = WS_TR51CF;
252253
if ((fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, tx_time) != 0)
253254
|| (channel_functions_stub.uint8_value != 2)) {
254255
return false;
255256
}
256257
// For more coverage, set neighbor info NULL
257258
memset(&neighbor_info, 0, sizeof(fhss_ws_neighbor_timing_info_t));
258259
// Test direct hash channel function
259-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_DH1CF;
260+
neighbor_info.uc_timing_info.unicast_channel_function = WS_DH1CF;
260261
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != 0) {
261262
return false;
262263
}
263264
// Test vendor defined channel function without application callback
264-
fhss_common_stub.fhss_struct.ws->fhss_configuration.ws_channel_function = WS_VENDOR_DEF_CF;
265+
neighbor_info.uc_timing_info.unicast_channel_function = WS_VENDOR_DEF_CF;
265266
if (fhss_common_stub.fhss_struct.fhss_api->tx_handle(api, DEFAULT_IS_BC_DEST, dest_address, DEFAULT_FRAME_TYPE, DEFAULT_FRAME_LENGTH, DEFAULT_PHY_HEAD_LENGTH, DEFAULT_PHY_TAIL_LENGTH, DEFAULT_TX_TIME) != -1) {
266267
return false;
267268
}

0 commit comments

Comments
 (0)