Skip to content

Commit 5974344

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1670 from ARMmbed/IOTTHD-2449
FHSS: support FHSS created by application
2 parents 67f578a + 82a8bca commit 5974344

File tree

10 files changed

+100
-30
lines changed

10 files changed

+100
-30
lines changed

nanostack/fhss_config.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,6 @@ typedef struct fhss_configuration
9191
*/
9292
typedef int32_t fhss_vendor_defined_cf(const fhss_api_t *api, uint16_t slot, uint8_t eui64[8], uint16_t bsi, uint16_t number_of_channels);
9393

94-
/**
95-
* @brief Get neighbor timing/hopping schedule.
96-
* @param api FHSS instance.
97-
* @param eui64 EUI-64 address of node for which the info is requested.
98-
* @return Neighbor timing/hopping schedule.
99-
*/
100-
typedef fhss_ws_neighbor_timing_info_t *fhss_get_neighbor_info(const fhss_api_t *api, uint8_t eui64[8]);
101-
10294
/**
10395
* \brief Struct fhss_ws_configuration defines configuration of WS FHSS.
10496
*/
@@ -125,9 +117,6 @@ typedef struct fhss_ws_configuration
125117
/** Vendor defined channel function. */
126118
fhss_vendor_defined_cf *vendor_defined_cf;
127119

128-
/** Get neighbor timing/hopping schedule. */
129-
fhss_get_neighbor_info *get_neighbor_info;
130-
131120
} fhss_ws_configuration_t;
132121

133122
/**

nanostack/fhss_ws_extension.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ typedef struct fhss_ws_neighbor_timing_info {
6565
uint32_t *excluded_channels; /**< Neighbor excluded channels (bit mask) */
6666
} fhss_ws_neighbor_timing_info_t;
6767

68+
/**
69+
* @brief Get neighbor timing/hopping schedule.
70+
* @param api FHSS instance.
71+
* @param eui64 EUI-64 address of node for which the info is requested.
72+
* @return Neighbor timing/hopping schedule.
73+
*/
74+
typedef fhss_ws_neighbor_timing_info_t *fhss_get_neighbor_info(const fhss_api_t *api, uint8_t eui64[8]);
75+
6876
/**
6977
* @brief Set parent which broadcast channels must be listened by FHSS.
7078
* @param fhss_api FHSS instance.
@@ -82,6 +90,15 @@ extern int ns_fhss_ws_set_parent(const fhss_api_t *fhss_api, const uint8_t eui64
8290
*/
8391
extern int ns_fhss_ws_remove_parent(const fhss_api_t *fhss_api, const uint8_t eui64[8]);
8492

93+
/**
94+
* @brief Set neighbor timing/hopping schedule request function.
95+
* @param fhss_api FHSS instance.
96+
* @param get_neighbor_info Neighbor info function pointer.
97+
* @return 0 on success, -1 on fail.
98+
*/
99+
extern int ns_fhss_set_neighbor_info_fp(const fhss_api_t *fhss_api, fhss_get_neighbor_info *get_neighbor_info);
100+
101+
85102
#ifdef __cplusplus
86103
}
87104
#endif

nanostack/net_fhss.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ extern fhss_api_t *ns_fhss_ws_create(const fhss_ws_configuration_t *fhss_configu
5555
*/
5656
extern int ns_fhss_configuration_set(fhss_api_t *fhss_api, const fhss_synch_configuration_t *fhss_synch_configuration);
5757

58+
/**
59+
* @brief Get WS configuration.
60+
* @param fhss_api FHSS instance.
61+
* @return WS configuration.
62+
*/
63+
extern const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fhss_api);
64+
5865
/**
5966
* @brief Deletes a FHSS API instance and removes it from software MAC.
6067
* @param fhss_api FHSS instance.

nanostack/sw_mac.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ extern int8_t ns_sw_mac_virtual_client_unregister(struct mac_api_s *api);
6666
*/
6767
extern int ns_sw_mac_fhss_register(struct mac_api_s *mac_api, struct fhss_api *fhss_api);
6868

69+
/**
70+
* @brief Request registered FHSS API instance from software MAC instance.
71+
* @param mac_api MAC instance.
72+
* @return FHSS api.
73+
*/
74+
extern struct fhss_api *ns_sw_mac_get_fhss_api(struct mac_api_s *mac_api);
75+
6976
/**
7077
* @brief Start collecting statistics from software MAC.
7178
* @param mac_api MAC instance.

source/6LoWPAN/ws/ws_bootstrap.c

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,22 +179,41 @@ static fhss_ws_neighbor_timing_info_t *ws_get_neighbor_info(const fhss_api_t *ap
179179

180180
static 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

@@ -1230,7 +1249,6 @@ static void ws_bootstrap_event_handler(arm_event_s *event)
12301249
cur->ws_info->pan_information.rpl_routing_method = true;
12311250
cur->ws_info->pan_information.use_parent_bs = true;
12321251
cur->ws_info->pan_information.version = WS_FAN_VERSION_1_0;
1233-
cur->ws_info->hopping_schdule.channel_function = WS_FIXED_CHANNEL;
12341252
ws_llc_set_gtkhash(cur, cur->ws_info->gtkhash);
12351253
cur->ws_info->pan_version_timer = PAN_VERSION_LIFETIME;
12361254
ws_bootstrap_fhss_activate(cur);

source/MAC/IEEE802_15_4/sw_mac.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,18 @@ int ns_sw_mac_fhss_register(mac_api_t *mac_api, fhss_api_t *fhss_api)
182182
return 0;
183183
}
184184

185+
struct fhss_api *ns_sw_mac_get_fhss_api(struct mac_api_s *mac_api)
186+
{
187+
if (!mac_api) {
188+
return NULL;
189+
}
190+
protocol_interface_rf_mac_setup_s *mac_setup = get_sw_mac_ptr_by_mac_api(mac_api);
191+
if (!mac_setup) {
192+
return NULL;
193+
}
194+
return mac_setup->fhss_api;
195+
}
196+
185197
int ns_sw_mac_statistics_start(struct mac_api_s *mac_api, struct mac_statistics_s *mac_statistics)
186198
{
187199
if (!mac_api || !mac_statistics) {

source/Service_Libs/fhss/fhss_configuration_interface.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,22 @@ int ns_fhss_configuration_set(fhss_api_t *fhss_api, const fhss_synch_configurati
101101
}
102102
return fhss_set_synch_configuration(fhss_structure, fhss_synch_configuration);
103103
}
104+
105+
int ns_fhss_set_neighbor_info_fp(const fhss_api_t *fhss_api, fhss_get_neighbor_info *get_neighbor_info)
106+
{
107+
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
108+
if (!fhss_structure || !fhss_structure->ws) {
109+
return -1;
110+
}
111+
fhss_structure->ws->get_neighbor_info = get_neighbor_info;
112+
return 0;
113+
}
114+
115+
const fhss_ws_configuration_t *ns_fhss_ws_configuration_get(const fhss_api_t *fhss_api)
116+
{
117+
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
118+
if (!fhss_structure || !fhss_structure->ws) {
119+
return NULL;
120+
}
121+
return &fhss_structure->ws->fhss_configuration;
122+
}

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
264264
return 0;
265265
}
266266
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
267-
fhss_ws_neighbor_timing_info_t *neighbor_timing_info = fhss_structure->ws->fhss_configuration.get_neighbor_info(api, destination_address);
267+
fhss_ws_neighbor_timing_info_t *neighbor_timing_info = fhss_structure->ws->get_neighbor_info(api, destination_address);
268268
if (!neighbor_timing_info) {
269269
tr_err("FHSS: No neighbor info: %s", trace_array(destination_address, 8));
270270
return -2;

source/Service_Libs/fhss/fhss_ws.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ struct fhss_ws
3030
bool is_on_bc_channel;
3131
struct fhss_ws_configuration fhss_configuration;
3232
const struct broadcast_timing_info *parent_bc_info;
33+
fhss_get_neighbor_info *get_neighbor_info;
3334
};
3435

3536
fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static fhss_api_t *test_generate_fhss_api(void)
134134
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_uc_dwell_interval = 200;
135135
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 250;
136136
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1000;
137-
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_get_neighbor_info;
137+
fhss_common_stub.fhss_struct.ws->get_neighbor_info = &app_get_neighbor_info;
138138
fhss_common_stub.fhss_struct.number_of_channels = 50;
139139
fhss_common_stub.fhss_struct.rx_channel = DEFAULT_CHANNEL;
140140
fhss_common_stub.fhss_struct.fhss_state = FHSS_UNSYNCHRONIZED;
@@ -220,12 +220,12 @@ bool test_fhss_ws_tx_handle_callback()
220220
neighbor_info.uc_timing_info.unicast_channel_function = WS_TR51CF;
221221
neighbor_info.uc_timing_info.unicast_number_of_channels = fhss_common_stub.fhss_struct.number_of_channels;
222222
fhss_common_stub.fhss_struct.fhss_state = DEFAULT_FHSS_STATE;
223-
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_no_neighbor_info;
223+
fhss_common_stub.fhss_struct.ws->get_neighbor_info = &app_no_neighbor_info;
224224
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) {
225225
return false;
226226
}
227227
// Test fixed channel
228-
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_get_neighbor_info;
228+
fhss_common_stub.fhss_struct.ws->get_neighbor_info = &app_get_neighbor_info;
229229
neighbor_info.uc_timing_info.unicast_channel_function = WS_FIXED_CHANNEL;
230230
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) {
231231
return false;

0 commit comments

Comments
 (0)