1
1
/*
2
- * Copyright (c) 2018 ARM Limited. All rights reserved.
2
+ * Copyright (c) 2018-2019 ARM Limited. All rights reserved.
3
3
* SPDX-License-Identifier: Apache-2.0
4
4
* Licensed under the Apache License, Version 2.0 (the License); you may
5
5
* not use this file except in compliance with the License.
@@ -68,11 +68,20 @@ typedef struct {
68
68
int8_t network_interface_id ;
69
69
} wisun_tasklet_data_str_t ;
70
70
71
+ typedef struct {
72
+ char * network_name ;
73
+ uint8_t regulatory_domain ;
74
+ uint8_t rd_operating_class ;
75
+ uint8_t rd_operating_mode ;
76
+ } wisun_network_settings_t ;
77
+
78
+ #define WS_NA 0xff // Not applicable value
71
79
72
80
/* Tasklet data */
73
81
static wisun_tasklet_data_str_t * wisun_tasklet_data_ptr = NULL ;
82
+ static wisun_network_settings_t wisun_settings_str = {NULL , WS_NA , WS_NA , WS_NA };
74
83
static mac_api_t * mac_api = NULL ;
75
- static char * network_name = MBED_CONF_MBED_MESH_API_WISUN_NETWORK_NAME ;
84
+
76
85
extern fhss_timer_t fhss_functions ;
77
86
78
87
/* private function prototypes */
@@ -201,7 +210,7 @@ static void wisun_tasklet_parse_network_event(arm_event_s *event)
201
210
*/
202
211
static void wisun_tasklet_configure_and_connect_to_network (void )
203
212
{
204
- int8_t status ;
213
+ int status ;
205
214
fhss_timer_t * fhss_timer_ptr = & fhss_functions ;
206
215
207
216
wisun_tasklet_data_ptr -> operating_mode = NET_6LOWPAN_ROUTER ;
@@ -212,10 +221,28 @@ static void wisun_tasklet_configure_and_connect_to_network(void)
212
221
wisun_tasklet_data_ptr -> operating_mode ,
213
222
wisun_tasklet_data_ptr -> operating_mode_extension );
214
223
215
- ws_management_node_init (wisun_tasklet_data_ptr -> network_interface_id ,
216
- MBED_CONF_MBED_MESH_API_WISUN_REGULATORY_DOMAIN ,
217
- network_name ,
218
- fhss_timer_ptr );
224
+ status = ws_management_node_init (wisun_tasklet_data_ptr -> network_interface_id ,
225
+ MBED_CONF_MBED_MESH_API_WISUN_REGULATORY_DOMAIN ,
226
+ wisun_settings_str .network_name ,
227
+ fhss_timer_ptr );
228
+ if (status < 0 ) {
229
+ tr_error ("Failed to initialize WS" );
230
+ return ;
231
+ }
232
+
233
+ if (wisun_settings_str .regulatory_domain != WS_NA ||
234
+ wisun_settings_str .rd_operating_class != WS_NA ||
235
+ wisun_settings_str .rd_operating_mode != WS_NA ) {
236
+ status = ws_management_regulatory_domain_set (wisun_tasklet_data_ptr -> network_interface_id ,
237
+ wisun_settings_str .regulatory_domain ,
238
+ wisun_settings_str .rd_operating_class ,
239
+ wisun_settings_str .rd_operating_mode );
240
+
241
+ if (status < 0 ) {
242
+ tr_error ("Failed to set regulatory domain!" );
243
+ return ;
244
+ }
245
+ }
219
246
220
247
#if defined(MBED_CONF_MBED_MESH_API_CERTIFICATE_HEADER )
221
248
arm_certificate_chain_entry_s chain_info ;
@@ -267,7 +294,7 @@ int8_t wisun_tasklet_get_router_ip_address(char *address, int8_t len)
267
294
268
295
int8_t wisun_tasklet_connect (mesh_interface_cb callback , int8_t nwk_interface_id )
269
296
{
270
- int8_t re_connecting = true;
297
+ bool re_connecting = true;
271
298
int8_t tasklet_id = wisun_tasklet_data_ptr -> tasklet ;
272
299
273
300
if (wisun_tasklet_data_ptr -> network_interface_id != INVALID_INTERFACE_ID ) {
@@ -318,7 +345,8 @@ int8_t wisun_tasklet_disconnect(bool send_cb)
318
345
void wisun_tasklet_init (void )
319
346
{
320
347
if (wisun_tasklet_data_ptr == NULL ) {
321
- wisun_tasklet_data_ptr = ns_dyn_mem_alloc (sizeof (wisun_tasklet_data_str_t ));
348
+ wisun_tasklet_data_ptr = (wisun_tasklet_data_str_t * )ns_dyn_mem_alloc (sizeof (wisun_tasklet_data_str_t ));
349
+ // allocation not validated, in case of failure execution stops here
322
350
memset (wisun_tasklet_data_ptr , 0 , sizeof (wisun_tasklet_data_str_t ));
323
351
wisun_tasklet_data_ptr -> tasklet_state = TASKLET_STATE_CREATED ;
324
352
wisun_tasklet_data_ptr -> network_interface_id = INVALID_INTERFACE_ID ;
@@ -336,5 +364,54 @@ int8_t wisun_tasklet_network_init(int8_t device_id)
336
364
if (!mac_api ) {
337
365
mac_api = ns_sw_mac_create (device_id , & storage_sizes );
338
366
}
367
+
368
+ if (!wisun_settings_str .network_name ) {
369
+ // No network name set by API, use network name from configuration
370
+ int wisun_network_name_len = sizeof (MBED_CONF_MBED_MESH_API_WISUN_NETWORK_NAME );
371
+ wisun_settings_str .network_name = (char * )ns_dyn_mem_alloc (wisun_network_name_len );
372
+ if (!wisun_settings_str .network_name ) {
373
+ return -3 ;
374
+ }
375
+ strncpy (wisun_settings_str .network_name , MBED_CONF_MBED_MESH_API_WISUN_NETWORK_NAME , wisun_network_name_len );
376
+ }
377
+
339
378
return arm_nwk_interface_lowpan_init (mac_api , INTERFACE_NAME );
340
379
}
380
+
381
+ int wisun_tasklet_network_name_set (int8_t nwk_interface_id , char * network_name_ptr )
382
+ {
383
+ if (!network_name_ptr || strlen (network_name_ptr ) > 32 ) {
384
+ return -1 ;
385
+ }
386
+
387
+ // save the network name to have support for disconnect/connect
388
+ ns_dyn_mem_free (wisun_settings_str .network_name );
389
+ wisun_settings_str .network_name = (char * )ns_dyn_mem_alloc (strlen (network_name_ptr ) + 1 );
390
+ if (!wisun_settings_str .network_name ) {
391
+ return -2 ;
392
+ }
393
+
394
+ strcpy (wisun_settings_str .network_name , network_name_ptr );
395
+
396
+ if (wisun_tasklet_data_ptr && wisun_tasklet_data_ptr -> tasklet_state == TASKLET_STATE_BOOTSTRAP_READY ) {
397
+ // interface is up, try to change name dynamically
398
+ return ws_management_network_name_set (nwk_interface_id , wisun_settings_str .network_name );
399
+ }
400
+
401
+ return 0 ;
402
+ }
403
+
404
+ int wisun_tasklet_regulatory_domain_set (int8_t nwk_interface_id , uint8_t regulatory_domain , uint8_t operating_class , uint8_t operating_mode )
405
+ {
406
+ int status = 0 ;
407
+
408
+ wisun_settings_str .regulatory_domain = regulatory_domain ;
409
+ wisun_settings_str .rd_operating_class = operating_class ;
410
+ wisun_settings_str .rd_operating_mode = operating_mode ;
411
+
412
+ if (wisun_tasklet_data_ptr && wisun_tasklet_data_ptr -> tasklet_state == TASKLET_STATE_BOOTSTRAP_READY ) {
413
+ status = ws_management_regulatory_domain_set (nwk_interface_id , regulatory_domain , operating_class , operating_mode );
414
+ }
415
+
416
+ return status ;
417
+ }
0 commit comments