Handle bluetooth-meshd life cycle
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-mesh.c
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * @author: Anupam Roy  <anupam.r@samsung.com>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *              http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include "bluetooth-api.h"
21 #include "bt-internal-types.h"
22
23 #include "bt-common.h"
24 #include "bt-request-sender.h"
25 #include "bt-event-handler.h"
26
27 #include "bluetooth-mesh-api.h"
28
29 #define BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX 100
30 #define BLUETOOTH_MESH_TOKEN_STRING_MAX 100
31
32 BT_EXPORT_API int bluetooth_mesh_init(mesh_cb_func_ptr cb,
33                         void *user_data)
34 {
35         int ret;
36
37         if (cb == NULL) {
38                 BT_ERR("callback is NULL");
39                 return BLUETOOTH_ERROR_INVALID_PARAM;
40         }
41
42         BT_INIT_PARAMS();
43         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
44
45         ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_INIT,
46                 in_param1, in_param2, in_param3, in_param4, &out_param);
47
48         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
49
50         if (ret != BLUETOOTH_ERROR_NONE) {
51                 BT_ERR("Fail to init the mesh in bt-service");
52                 return ret;
53         }
54
55         ret = _bt_init_event_handler();
56
57         if (ret != BLUETOOTH_ERROR_NONE &&
58                         ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
59                 BT_ERR("Fail to init the event handler");
60                 return ret;
61         }
62
63         _bt_set_user_data(BT_MESH, (void *)cb, user_data);
64
65         /* Register All events */
66         ret = _bt_register_event(BT_MESH_EVENT, (void *)cb, user_data);
67         if (ret != BLUETOOTH_ERROR_NONE &&
68                         ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
69                 _bt_deinit_event_handler();
70                 return ret;
71         }
72
73         BT_INFO("Mesh: Event registsred");
74         return BLUETOOTH_ERROR_NONE;
75 }
76
77 BT_EXPORT_API int bluetooth_mesh_deinit(void)
78 {
79         int ret;
80
81         _bt_unregister_event(BT_MESH_EVENT);
82         _bt_set_user_data(BT_MESH, NULL, NULL);
83
84         BT_INIT_PARAMS();
85         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
86
87         ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_DEINIT,
88                 in_param1, in_param2, in_param3, in_param4, &out_param);
89
90         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
91
92         if (ret != BLUETOOTH_ERROR_NONE) {
93                 BT_ERR("Fail to init the mesh in bt-service");
94                 return ret;
95         }
96
97         return BLUETOOTH_ERROR_NONE;
98 }
99
100 BT_EXPORT_API int bluetooth_mesh_network_create(
101         const char *net_name, bluetooth_mesh_node_t *node,
102                 uint16_t total_models, bluetooth_mesh_model_t **models,
103                         bluetooth_mesh_network_t *network)
104 {
105         int result;
106         char network_name[BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX+1];
107
108         BT_CHECK_PARAMETER(net_name, return);
109         BT_CHECK_PARAMETER(node, return);
110         BT_CHECK_PARAMETER(models, return);
111
112         BT_INIT_PARAMS();
113         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
114
115         g_array_append_vals(in_param1, node,  sizeof(bluetooth_mesh_node_t));
116
117         g_strlcpy(network_name, net_name, sizeof(network_name));
118         g_array_append_vals(in_param2, network_name,
119                         BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX);
120
121         for(int i = 0; i < total_models; i++)
122                 g_array_append_vals(in_param3, models[i],
123                                 sizeof(bluetooth_mesh_model_t));
124
125         result = _bt_send_request(BT_BLUEZ_SERVICE,
126                         BT_MESH_NETWORK_CREATE,
127                                 in_param1, in_param2, in_param3,
128                                         in_param4, &out_param);
129
130         if (result == BLUETOOTH_ERROR_NONE) {
131                 *network = g_array_index(out_param,
132                                 bluetooth_mesh_network_t, 0);
133         }
134
135         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
136
137         return result;
138 }
139
140 BT_EXPORT_API int bluetooth_mesh_network_load(
141                 const char *token,
142                         bluetooth_mesh_network_t *network)
143 {
144         int result;
145         char token_string[BLUETOOTH_MESH_TOKEN_STRING_MAX + 1];
146
147         BT_CHECK_PARAMETER(token, return);
148         BT_CHECK_PARAMETER(network, return);
149
150         BT_INIT_PARAMS();
151         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
152
153         g_strlcpy(token_string, token, sizeof(token_string));
154         g_array_append_vals(in_param1, token_string, BLUETOOTH_MESH_TOKEN_STRING_MAX);
155
156         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_LOAD,
157                         in_param1, in_param2, in_param3, in_param4, &out_param);
158
159         if (result == BLUETOOTH_ERROR_NONE) {
160                 *network = g_array_index(out_param,
161                                 bluetooth_mesh_network_t, 0);
162         }
163
164         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
165
166         return result;
167 }
168
169 BT_EXPORT_API int bluetooth_mesh_network_scan(
170                         bluetooth_mesh_network_t *network,
171                                 bluetooth_mesh_scan_param_t *scan_param)
172 {
173         int result;
174
175         BT_CHECK_PARAMETER(network, return);
176         BT_CHECK_PARAMETER(scan_param, return);
177
178         BT_INIT_PARAMS();
179         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
180
181         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
182
183         g_array_append_vals(in_param2, scan_param, sizeof(bluetooth_mesh_scan_param_t));
184
185         BT_INFO("Mesh:Start Scan, time [%u]", scan_param->scan_time);
186         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SCAN,
187                         in_param1, in_param2, in_param3, in_param4, &out_param);
188         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
189
190         return result;
191 }
192
193 BT_EXPORT_API int bluetooth_mesh_network_cancel_scan(
194                 bluetooth_mesh_network_t *network)
195 {
196         int result;
197
198         BT_CHECK_PARAMETER(network, return);
199
200         BT_INIT_PARAMS();
201         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
202
203         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
204
205         BT_INFO("Mesh: Cancel Scan");
206         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CANCEL_SCAN,
207                         in_param1, in_param2, in_param3, in_param4, &out_param);
208         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
209
210         return result;
211 }
212
213 BT_EXPORT_API int bluetooth_mesh_network_set_capabilities(
214         bluetooth_mesh_network_t *network,
215                 bluetooth_mesh_provisioner_caps_t *caps)
216 {
217         int result;
218
219         BT_CHECK_PARAMETER(network, return);
220         BT_CHECK_PARAMETER(caps, return);
221
222         BT_INIT_PARAMS();
223         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
224
225         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
226
227         g_array_append_vals(in_param2, caps, sizeof(bluetooth_mesh_provisioner_caps_t));
228
229         BT_INFO("Mesh: Set Provisioner capabilities");
230         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_CAPABILITIES,
231                         in_param1, in_param2, in_param3, in_param4, &out_param);
232         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
233
234         return result;
235 }
236
237 BT_EXPORT_API int bluetooth_mesh_network_provision_device(
238                 bluetooth_mesh_provisioning_request_t *req)
239 {
240         int result;
241         bt_user_info_t *user_info;
242
243         BT_CHECK_PARAMETER(req, return);
244
245         user_info = _bt_get_user_data(BT_MESH);
246         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
247
248         BT_INIT_PARAMS();
249         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
250
251         g_array_append_vals(in_param1, req,
252                         sizeof(bluetooth_mesh_provisioning_request_t));
253
254         BT_INFO("Mesh: Set Provision Device");
255         result = _bt_send_request_async(BT_BLUEZ_SERVICE,
256                         BT_MESH_NETWORK_PROVISION_DEVICE,
257                         in_param1, in_param2, in_param3, in_param4,
258                         user_info->cb, user_info->user_data);
259
260         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
261
262         return result;
263 }
264
265 BT_EXPORT_API int bluetooth_mesh_authentication_reply(int auth_type,
266                 const char *auth_val, gboolean reply)
267 {
268         int result;
269
270         char auth_string[BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX];
271
272         BT_CHECK_PARAMETER(auth_val, return);
273
274         BT_INIT_PARAMS();
275         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
276
277         g_strlcpy(auth_string, auth_val,
278                         sizeof(auth_string));
279         g_array_append_vals(in_param1,
280                         &auth_type, sizeof(int));
281         g_array_append_vals(in_param2, auth_string,
282                         BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX);
283         g_array_append_vals(in_param3, &reply, sizeof(gboolean));
284
285         BT_INFO("Mesh: Set Provisioner Authentication Reply");
286         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_AUTHENTICATION_REPLY,
287                         in_param1, in_param2, in_param3, in_param4, &out_param);
288
289         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
290
291         return result;
292 }
293
294 BT_EXPORT_API int bluetooth_mesh_network_set_name(
295         bluetooth_mesh_network_t *network)
296 {
297         int result;
298
299         BT_CHECK_PARAMETER(network, return);
300
301         BT_INIT_PARAMS();
302         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
303
304         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
305
306         BT_INFO("Mesh:Set Network Name");
307         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_NAME,
308                         in_param1, in_param2, in_param3, in_param4, &out_param);
309         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
310
311         return result;
312 }
313
314 BT_EXPORT_API int bluetooth_mesh_network_add_netkey(
315                 bluetooth_mesh_network_t *network,
316                         uint16_t *netkey_idx)
317 {
318         int result;
319
320         BT_CHECK_PARAMETER(network, return);
321         BT_CHECK_PARAMETER(netkey_idx, return);
322
323         BT_INIT_PARAMS();
324         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
325
326         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
327
328         BT_INFO("Mesh:Set Create Subnetwork key");
329         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_NETKEY,
330                         in_param1, in_param2, in_param3, in_param4, &out_param);
331         if (result == BLUETOOTH_ERROR_NONE) {
332                 *netkey_idx = g_array_index(out_param, guint16, 0);
333         }
334         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
335
336         return result;
337 }
338
339 BT_EXPORT_API int bluetooth_mesh_network_delete_netkey(
340         bluetooth_mesh_network_t *network,
341                 uint16_t netkey_idx)
342 {
343         int result;
344
345         BT_CHECK_PARAMETER(network, return);
346
347         BT_INIT_PARAMS();
348         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
349
350         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
351         g_array_append_vals(in_param2, &netkey_idx,  sizeof(guint16));
352
353         BT_INFO("Mesh: Delete Subnetwork key");
354         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_NETKEY,
355                         in_param1, in_param2, in_param3, in_param4, &out_param);
356         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
357
358         return result;
359 }
360
361 BT_EXPORT_API int bluetooth_mesh_network_update_netkey(
362         bluetooth_mesh_network_t *network,
363                 uint16_t netkey_idx)
364 {
365         int result;
366
367         BT_CHECK_PARAMETER(network, return);
368
369         BT_INIT_PARAMS();
370         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
371
372         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
373         g_array_append_vals(in_param2, &netkey_idx,  sizeof(guint16));
374
375         BT_INFO("Mesh: Update Subnetwork key");
376         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_NETKEY,
377                         in_param1, in_param2, in_param3, in_param4, &out_param);
378         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
379
380         return result;
381 }
382
383 BT_EXPORT_API int bluetooth_mesh_network_add_appkey(
384                 bluetooth_mesh_network_t *network,
385                         uint16_t netkey_index,
386                                 uint16_t *appkey_index)
387 {
388         int result;
389
390         BT_CHECK_PARAMETER(network, return);
391         BT_CHECK_PARAMETER(appkey_index, return);
392
393         BT_INIT_PARAMS();
394         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
395
396         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
397         g_array_append_vals(in_param2, &netkey_index,  sizeof(guint16));
398
399         BT_INFO("Mesh: Create AppKey");
400         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_APPKEY,
401                         in_param1, in_param2, in_param3, in_param4, &out_param);
402
403         if (result == BLUETOOTH_ERROR_NONE) {
404                 *appkey_index = g_array_index(out_param, guint16, 0);
405         }
406         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
407
408         return result;
409 }
410
411 BT_EXPORT_API int bluetooth_mesh_network_update_appkey(
412                 bluetooth_mesh_network_t *network,
413                         uint16_t netkey_index, uint16_t appkey_index)
414 {
415         int result;
416
417         BT_CHECK_PARAMETER(network, return);
418
419         BT_INIT_PARAMS();
420         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
421
422         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
423         g_array_append_vals(in_param2, &netkey_index,  sizeof(guint16));
424         g_array_append_vals(in_param3, &appkey_index,  sizeof(guint16));
425
426         BT_INFO("Mesh:BTAPI: Update AppKey");
427         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_APPKEY,
428                         in_param1, in_param2, in_param3, in_param4, &out_param);
429
430         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
431
432         return result;
433 }
434
435 BT_EXPORT_API int bluetooth_mesh_network_delete_appkey(bluetooth_mesh_network_t *network,
436                         uint16_t netkey_index, uint16_t appkey_index)
437 {
438         int result;
439
440         BT_CHECK_PARAMETER(network, return);
441
442         BT_INIT_PARAMS();
443         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
444
445         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
446         g_array_append_vals(in_param2, &netkey_index,  sizeof(guint16));
447         g_array_append_vals(in_param3, &appkey_index,  sizeof(guint16));
448
449         BT_INFO("Mesh: Delete AppKey");
450         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_APPKEY,
451                         in_param1, in_param2, in_param3, in_param4, &out_param);
452
453         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
454
455         return result;
456 }
457
458 BT_EXPORT_API int bluetooth_mesh_network_get_all_nodes(
459                 bluetooth_mesh_network_t *network,
460                         GPtrArray **nodes)
461 {
462         int result = BLUETOOTH_ERROR_NONE;
463         guint size;
464         int i;
465         bluetooth_mesh_node_info_t *info;
466
467         BT_CHECK_PARAMETER(network, return);
468         BT_CHECK_PARAMETER(nodes, return);
469
470         BT_INIT_PARAMS();
471         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
472
473         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
474
475         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NODES,
476                         in_param1, in_param2, in_param3, in_param4, &out_param);
477
478         if (result == BLUETOOTH_ERROR_NONE) {
479                 if (out_param == NULL) {
480                         BT_ERR("Mesh: out_param is NULL");
481                         result = BLUETOOTH_ERROR_INTERNAL;
482                 } else {
483                         size = (out_param->len) / sizeof(bluetooth_mesh_node_info_t);
484
485                         for (i = 0; i < size; i++) {
486                                 bluetooth_mesh_node_info_t *data;
487
488                                 info = &g_array_index(out_param,
489                                                 bluetooth_mesh_node_info_t, i);
490
491                                 data= g_memdup(info, sizeof(bluetooth_mesh_node_info_t));
492                                 g_ptr_array_add(*nodes, (gpointer)data);
493                         }
494                 }
495         }
496
497         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
498
499         return result;
500 }
501
502 BT_EXPORT_API int bluetooth_mesh_element_get_all_models(
503         bluetooth_mesh_network_t *network,
504                 uint16_t node_addr, int elem_idx,
505                         GPtrArray **models)
506 {
507         int result = BLUETOOTH_ERROR_NONE;
508         guint size;
509         int i;
510
511         BT_CHECK_PARAMETER(network, return);
512         BT_CHECK_PARAMETER(models, return);
513
514         BT_INIT_PARAMS();
515         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
516
517         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
518         g_array_append_vals(in_param2, &node_addr,  sizeof(guint16));
519         g_array_append_vals(in_param3, &elem_idx,  sizeof(int));
520
521         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_ELEMENT_GET_MODELS,
522                         in_param1, in_param2, in_param3, in_param4, &out_param);
523
524         if (result == BLUETOOTH_ERROR_NONE) {
525                 if (out_param == NULL) {
526                         BT_ERR("Mesh: out_param is NULL");
527                         result = BLUETOOTH_ERROR_INTERNAL;
528                 } else {
529                         size = (out_param->len) / sizeof(guint16);
530
531                         for (i = 0; i < size; i++) {
532                                 uint32_t model_obj;
533                                 uint32_t *model_ptr = NULL;
534
535                                 model_obj = g_array_index(out_param,
536                                                 guint32, i);
537
538                                 model_ptr = g_memdup(&model_obj, sizeof(guint32));
539                                 g_ptr_array_add(*models, (gpointer)model_ptr);
540                         }
541                 }
542         }
543
544         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
545
546         return result;
547 }
548
549 BT_EXPORT_API int bluetooth_mesh_node_browse_vendor_features(
550                         bluetooth_mesh_node_features_t *req)
551 {
552         int result;
553         bt_user_info_t *user_info;
554
555         BT_CHECK_PARAMETER(req, return);
556
557         user_info = _bt_get_user_data(BT_MESH);
558         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
559
560         BT_INIT_PARAMS();
561         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
562
563         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_features_t));
564
565         BT_INFO("Mesh: Browse Vendor features of Node");
566         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_VENDOR_FEATURES,
567                         in_param1, in_param2, in_param3, in_param4,
568                         user_info->cb, user_info->user_data);
569
570         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
571
572         return result;
573 }
574
575 BT_EXPORT_API int bluetooth_mesh_browse_remote_node(
576                         bluetooth_mesh_node_discover_t *req)
577 {
578         int result;
579         bt_user_info_t *user_info;
580
581         BT_CHECK_PARAMETER(req, return);
582
583         user_info = _bt_get_user_data(BT_MESH);
584         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
585
586         BT_INIT_PARAMS();
587         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
588
589         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_discover_t));
590
591         BT_INFO("Mesh: Browse remote Node");
592         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_BROWSE,
593                         in_param1, in_param2, in_param3, in_param4,
594                         user_info->cb, user_info->user_data);
595
596         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
597
598         return result;
599 }
600
601 BT_EXPORT_API int bluetooth_mesh_node_ttl_execute(
602                         bluetooth_mesh_node_ttl_info_t *req)
603 {
604         int result;
605         bt_user_info_t *user_info;
606
607         BT_CHECK_PARAMETER(req, return);
608
609         user_info = _bt_get_user_data(BT_MESH);
610         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
611
612         BT_INIT_PARAMS();
613         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
614
615         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_ttl_info_t));
616
617         BT_INFO("Mesh: Node TTL Execute");
618         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_TTL_EXECUTE,
619                         in_param1, in_param2, in_param3, in_param4,
620                         user_info->cb, user_info->user_data);
621
622         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
623
624         return result;
625 }
626
627 BT_EXPORT_API int bluetooth_mesh_model_configure_appkey(
628                         bluetooth_mesh_model_configure_t *req)
629 {
630         int result;
631         bt_user_info_t *user_info;
632
633         BT_CHECK_PARAMETER(req, return);
634
635         user_info = _bt_get_user_data(BT_MESH);
636         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
637
638         BT_INIT_PARAMS();
639         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
640
641         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
642
643         BT_INFO("Mesh: Node Model Configure AppKey");
644         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIGURE_APPKEY,
645                         in_param1, in_param2, in_param3, in_param4,
646                         user_info->cb, user_info->user_data);
647
648         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
649
650         return result;
651 }
652
653 BT_EXPORT_API int bluetooth_mesh_node_configure_key(
654                         bluetooth_mesh_key_configure_t *req)
655 {
656         int result;
657         bt_user_info_t *user_info;
658
659         BT_CHECK_PARAMETER(req, return);
660
661         user_info = _bt_get_user_data(BT_MESH);
662         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
663
664         BT_INIT_PARAMS();
665         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
666
667         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_key_configure_t));
668
669         BT_INFO("Mesh:BTAPI: Node Key Configure");
670         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_CONFIGURE_KEY,
671                         in_param1, in_param2, in_param3, in_param4,
672                         user_info->cb, user_info->user_data);
673
674         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
675
676         return result;
677 }
678
679 BT_EXPORT_API int bluetooth_mesh_network_get_all_groups(
680                 bluetooth_mesh_network_t *network,
681                         GPtrArray **groups)
682 {
683         int result = BLUETOOTH_ERROR_NONE;
684         guint size;
685         int i;
686
687         BT_CHECK_PARAMETER(network, return);
688         BT_CHECK_PARAMETER(groups, return);
689
690         BT_INIT_PARAMS();
691         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
692
693         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
694
695         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_GROUPS,
696                         in_param1, in_param2, in_param3, in_param4, &out_param);
697
698         if (result == BLUETOOTH_ERROR_NONE) {
699                 if (out_param == NULL) {
700                         BT_ERR("Mesh: out_param is NULL");
701                         result = BLUETOOTH_ERROR_INTERNAL;
702                 } else {
703                         size = (out_param->len) / sizeof(guint16);
704
705                         if (size == 0) {
706                                 BT_INFO("Mesh: No Groups created for the network");
707                         }
708
709                         for (i = 0; i < size; i++) {
710                                 uint16_t group_addr;
711                                 uint16_t *group_ptr = NULL;
712
713                                 group_addr = g_array_index(out_param,
714                                                 guint16, i);
715
716                                 group_ptr = g_memdup(&group_addr, sizeof(guint16));
717                                 g_ptr_array_add(*groups, (gpointer)group_ptr);
718                         }
719                 }
720         }
721
722         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
723
724         return result;
725 }
726
727 BT_EXPORT_API int bluetooth_mesh_network_get_all_netkey(
728                 bluetooth_mesh_network_t *network,
729                         GPtrArray **netkeys)
730 {
731         int result = BLUETOOTH_ERROR_NONE;
732         guint size;
733         int i;
734
735         BT_CHECK_PARAMETER(network, return);
736         BT_CHECK_PARAMETER(netkeys, return);
737
738         BT_INIT_PARAMS();
739         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
740
741         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
742
743         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NETKEYS,
744                         in_param1, in_param2, in_param3, in_param4, &out_param);
745
746         if (result == BLUETOOTH_ERROR_NONE) {
747                 if (out_param == NULL) {
748                         BT_ERR("Mesh: out_param is NULL");
749                         result = BLUETOOTH_ERROR_INTERNAL;
750                 } else {
751                         size = (out_param->len) / sizeof(guint16);
752
753                         if (size == 0) {
754                                 BT_ERR("Mesh: No netkeys created for the network");
755                                 result = BLUETOOTH_ERROR_NOT_FOUND;
756                         }
757
758                         for (i = 0; i < size; i++) {
759                                 uint16_t netkey_index;
760                                 uint16_t *netkey_idx = NULL;
761
762                                 netkey_index = g_array_index(out_param,
763                                                 guint16, i);
764
765                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
766                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
767                         }
768                 }
769         }
770
771         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
772
773         return result;
774 }
775
776 BT_EXPORT_API int bluetooth_mesh_netkey_get_all_appkey(
777                 bluetooth_mesh_network_t *network,
778                         uint16_t netkey_idx,
779                                 GPtrArray **appkeys)
780 {
781         int result = BLUETOOTH_ERROR_NONE;
782         guint size;
783         int i;
784
785         BT_CHECK_PARAMETER(network, return);
786         BT_CHECK_PARAMETER(appkeys, return);
787
788         BT_INIT_PARAMS();
789         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
790
791         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
792         g_array_append_vals(in_param2, &netkey_idx,  sizeof(guint16));
793
794         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_APPKEYS,
795                         in_param1, in_param2, in_param3, in_param4, &out_param);
796
797         if (result == BLUETOOTH_ERROR_NONE) {
798                 if (out_param == NULL) {
799                         BT_ERR("Mesh: out_param is NULL");
800                         result = BLUETOOTH_ERROR_INTERNAL;
801                 } else {
802                         size = (out_param->len) / sizeof(guint16);
803
804                         if (size == 0) {
805                                 BT_ERR("Mesh: No Appkeys created for the NetKey in the network");
806                         }
807
808                         for (i = 0; i < size; i++) {
809                                 uint16_t appkey_index;
810                                 uint16_t *appkey_idx = NULL;
811
812                                 appkey_index = g_array_index(out_param,
813                                                 guint16, i);
814
815                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
816                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
817                         }
818                 }
819         }
820
821         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
822
823         return result;
824 }
825
826 BT_EXPORT_API int bluetooth_mesh_node_get_all_netkeys(
827                 bluetooth_mesh_node_discover_t *node,
828                         GPtrArray **netkeys)
829 {
830         int result = BLUETOOTH_ERROR_NONE;
831         guint size;
832         int i;
833
834         BT_CHECK_PARAMETER(node, return);
835         BT_CHECK_PARAMETER(netkeys, return);
836
837         BT_INIT_PARAMS();
838         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
839
840         g_array_append_vals(in_param1, node,  sizeof(bluetooth_mesh_node_discover_t));
841
842         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_NETKEYS,
843                         in_param1, in_param2, in_param3, in_param4, &out_param);
844
845         if (result == BLUETOOTH_ERROR_NONE) {
846                 if (out_param == NULL) {
847                         BT_ERR("Mesh: out_param is NULL");
848                         result = BLUETOOTH_ERROR_INTERNAL;
849                 } else {
850                         size = (out_param->len) / sizeof(guint16);
851
852                         for (i = 0; i < size; i++) {
853                                 uint16_t netkey_index;
854                                 uint16_t *netkey_idx = NULL;
855
856                                 netkey_index = g_array_index(out_param,
857                                                 guint16, i);
858
859                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
860                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
861                         }
862                 }
863         }
864
865         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
866
867         return result;
868 }
869
870 BT_EXPORT_API int bluetooth_mesh_node_get_all_appkeys(
871         bluetooth_mesh_node_discover_t *req, GPtrArray **appkeys)
872 {
873         int result = BLUETOOTH_ERROR_NONE;
874         guint size;
875         int i;
876
877         BT_CHECK_PARAMETER(req, return);
878         BT_CHECK_PARAMETER(appkeys, return);
879
880         BT_INIT_PARAMS();
881         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
882
883         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_discover_t));
884
885         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_APPKEYS,
886                         in_param1, in_param2, in_param3, in_param4, &out_param);
887
888         if (result == BLUETOOTH_ERROR_NONE) {
889                 if (out_param == NULL) {
890                         BT_ERR("Mesh: out_param is NULL");
891                         result = BLUETOOTH_ERROR_INTERNAL;
892                 } else {
893                         size = (out_param->len) / sizeof(guint16);
894
895                         for (i = 0; i < size; i++) {
896                                 uint16_t appkey_index;
897                                 uint16_t *appkey_idx = NULL;
898
899                                 appkey_index = g_array_index(out_param,
900                                                 guint16, i);
901
902                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
903                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
904                         }
905                 }
906         }
907
908         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
909
910         return result;
911 }
912
913 BT_EXPORT_API int bluetooth_mesh_model_get_all_appkeys(
914                         bluetooth_mesh_model_configure_t *req)
915 {
916         int result = 0;
917         bt_user_info_t *user_info;
918
919         BT_CHECK_PARAMETER(req, return);
920
921         user_info = _bt_get_user_data(BT_MESH);
922         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
923
924         BT_INIT_PARAMS();
925         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
926
927         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
928
929         BT_INFO("Mesh:Node Model Get AppKey List ");
930         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_APPKEY_LIST,
931                         in_param1, in_param2, in_param3, in_param4,
932                         user_info->cb, user_info->user_data);
933
934         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
935         return result;
936 }
937
938 BT_EXPORT_API int bluetooth_mesh_model_set_publication(
939                         bluetooth_mesh_model_configure_t *req)
940 {
941         int result = 0;
942         bt_user_info_t *user_info;
943
944         BT_CHECK_PARAMETER(req, return);
945
946         user_info = _bt_get_user_data(BT_MESH);
947         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
948
949         BT_INIT_PARAMS();
950         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
951
952         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
953
954         BT_INFO("Mesh: Model Set Publication");
955         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_SET_PUBLICATION,
956                         in_param1, in_param2, in_param3, in_param4,
957                         user_info->cb, user_info->user_data);
958
959         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
960         return result;
961 }
962
963 BT_EXPORT_API int bluetooth_mesh_model_get_publication(
964                         bluetooth_mesh_model_configure_t *req)
965 {
966         int result = 0;
967         bt_user_info_t *user_info;
968
969         BT_CHECK_PARAMETER(req, return);
970
971         user_info = _bt_get_user_data(BT_MESH);
972         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
973
974         BT_INIT_PARAMS();
975         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
976
977         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
978
979         BT_INFO("Mesh:BTAPI:  Model Get Publication");
980         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_PUBLICATION,
981                         in_param1, in_param2, in_param3, in_param4,
982                         user_info->cb, user_info->user_data);
983
984         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
985         return result;
986 }
987
988 BT_EXPORT_API int bluetooth_mesh_model_get_subscriptopn_list(
989                         bluetooth_mesh_model_configure_t *req)
990 {
991         int result = 0;
992         bt_user_info_t *user_info;
993
994         BT_CHECK_PARAMETER(req, return);
995
996         user_info = _bt_get_user_data(BT_MESH);
997         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
998
999         BT_INIT_PARAMS();
1000         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1001
1002         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1003
1004         BT_INFO("Mesh:BTAPI:  Model Get Subscription List ");
1005         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
1006                         in_param1, in_param2, in_param3, in_param4,
1007                         user_info->cb, user_info->user_data);
1008
1009         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1010         return result;
1011 }
1012
1013 BT_EXPORT_API int bluetooth_mesh_network_create_group(
1014                 bluetooth_mesh_network_t *network, bool is_virtual,
1015                         uint16_t grp_addr, bluetooth_mesh_network_group_info_t *info)
1016 {
1017         int result;
1018
1019         BT_CHECK_PARAMETER(network, return);
1020         BT_CHECK_PARAMETER(info, return);
1021
1022         BT_INIT_PARAMS();
1023         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1024
1025         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
1026         g_array_append_vals(in_param2, &is_virtual,  sizeof(gboolean));
1027         g_array_append_vals(in_param3, &grp_addr,  sizeof(guint16));
1028
1029         BT_INFO("Mesh: Create Group Request");
1030         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CREATE_GROUP,
1031                         in_param1, in_param2, in_param3, in_param4, &out_param);
1032
1033         if (result == BLUETOOTH_ERROR_NONE) {
1034                 *info = g_array_index(out_param,
1035                                 bluetooth_mesh_network_group_info_t, 0);
1036         }
1037         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1038
1039         return result;
1040 }
1041
1042 BT_EXPORT_API int bluetooth_mesh_model_configure_group_sub(
1043                         bluetooth_mesh_model_configure_t *req)
1044 {
1045         int result = 0;
1046         bt_user_info_t *user_info;
1047
1048         BT_CHECK_PARAMETER(req, return);
1049
1050         user_info = _bt_get_user_data(BT_MESH);
1051         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1052
1053         BT_INIT_PARAMS();
1054         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1055
1056         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1057
1058         BT_INFO("Mesh:Model Group Subscription Request");
1059         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIG_GROUP_SUB,
1060                         in_param1, in_param2, in_param3, in_param4,
1061                         user_info->cb, user_info->user_data);
1062
1063         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1064         return result;
1065 }
1066
1067 BT_EXPORT_API int bluetooth_mesh_model_configure_virtual_group_sub(
1068                         bluetooth_mesh_model_configure_t *req)
1069 {
1070         int result = 0;
1071         bt_user_info_t *user_info;
1072
1073         BT_CHECK_PARAMETER(req, return);
1074
1075         user_info = _bt_get_user_data(BT_MESH);
1076         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1077
1078         BT_INIT_PARAMS();
1079         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1080
1081         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1082
1083         BT_INFO("Mesh: Model Virtual Group Subscription Request");
1084         result = _bt_send_request_async(BT_BLUEZ_SERVICE,
1085                         BT_MESH_MODEL_CONFIG_VIRTUAL_GROUP_SUB,
1086                         in_param1, in_param2, in_param3, in_param4,
1087                         user_info->cb, user_info->user_data);
1088
1089         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1090         return result;
1091 }