Mesh: Refactor Network group Removal logic
[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         bluetooth_mesh_network_group_info_t *info;
685         guint size;
686         int i;
687
688         BT_CHECK_PARAMETER(network, return);
689         BT_CHECK_PARAMETER(groups, return);
690
691         BT_INIT_PARAMS();
692         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
693
694         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
695
696         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_GROUPS,
697                         in_param1, in_param2, in_param3, in_param4, &out_param);
698
699         if (result == BLUETOOTH_ERROR_NONE) {
700                 if (out_param == NULL) {
701                         BT_ERR("Mesh: out_param is NULL");
702                         result = BLUETOOTH_ERROR_INTERNAL;
703                 } else {
704                         size = (out_param->len) / sizeof(bluetooth_mesh_network_group_info_t);
705
706                         if (size == 0) {
707                                 BT_INFO("Mesh: No Groups created for the network");
708                         }
709
710                         BT_INFO("Mesh: Total groups [%d]", size);
711                         for (i = 0; i < size; i++) {
712                                 bluetooth_mesh_network_group_info_t *grp_info = NULL;
713
714                                 info = &g_array_index(out_param,
715                                         bluetooth_mesh_network_group_info_t, i);
716                                 BT_INFO("Mesh: Group addr [0x%2.2x]", info->group_addr);
717                                 BT_INFO("Mesh: Group is Virtual [%s]", info->is_virtual? "YES":"NO");
718                                 BT_INFO("Mesh: Group net UUID[%s]", info->net_uuid);
719                                 if (info->is_virtual)
720                                         BT_INFO("Mesh: Virual Label UUID [%s]", info->label_uuid);
721                                 grp_info = g_memdup(info,
722                                         sizeof(bluetooth_mesh_network_group_info_t));
723                                 g_ptr_array_add(*groups, (gpointer)grp_info);
724                         }
725                 }
726         }
727
728         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
729
730         return result;
731 }
732
733 BT_EXPORT_API int bluetooth_mesh_network_get_all_netkey(
734                 bluetooth_mesh_network_t *network,
735                         GPtrArray **netkeys)
736 {
737         int result = BLUETOOTH_ERROR_NONE;
738         guint size;
739         int i;
740
741         BT_CHECK_PARAMETER(network, return);
742         BT_CHECK_PARAMETER(netkeys, return);
743
744         BT_INIT_PARAMS();
745         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
746
747         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
748
749         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NETKEYS,
750                         in_param1, in_param2, in_param3, in_param4, &out_param);
751
752         if (result == BLUETOOTH_ERROR_NONE) {
753                 if (out_param == NULL) {
754                         BT_ERR("Mesh: out_param is NULL");
755                         result = BLUETOOTH_ERROR_INTERNAL;
756                 } else {
757                         size = (out_param->len) / sizeof(guint16);
758
759                         if (size == 0) {
760                                 BT_ERR("Mesh: No netkeys created for the network");
761                                 result = BLUETOOTH_ERROR_NOT_FOUND;
762                         }
763
764                         for (i = 0; i < size; i++) {
765                                 uint16_t netkey_index;
766                                 uint16_t *netkey_idx = NULL;
767
768                                 netkey_index = g_array_index(out_param,
769                                                 guint16, i);
770
771                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
772                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
773                         }
774                 }
775         }
776
777         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
778
779         return result;
780 }
781
782 BT_EXPORT_API int bluetooth_mesh_netkey_get_all_appkey(
783                 bluetooth_mesh_network_t *network,
784                         uint16_t netkey_idx,
785                                 GPtrArray **appkeys)
786 {
787         int result = BLUETOOTH_ERROR_NONE;
788         guint size;
789         int i;
790
791         BT_CHECK_PARAMETER(network, return);
792         BT_CHECK_PARAMETER(appkeys, return);
793
794         BT_INIT_PARAMS();
795         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
796
797         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
798         g_array_append_vals(in_param2, &netkey_idx,  sizeof(guint16));
799
800         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_APPKEYS,
801                         in_param1, in_param2, in_param3, in_param4, &out_param);
802
803         if (result == BLUETOOTH_ERROR_NONE) {
804                 if (out_param == NULL) {
805                         BT_ERR("Mesh: out_param is NULL");
806                         result = BLUETOOTH_ERROR_INTERNAL;
807                 } else {
808                         size = (out_param->len) / sizeof(guint16);
809
810                         if (size == 0) {
811                                 BT_ERR("Mesh: No Appkeys created for the NetKey in the network");
812                         }
813
814                         for (i = 0; i < size; i++) {
815                                 uint16_t appkey_index;
816                                 uint16_t *appkey_idx = NULL;
817
818                                 appkey_index = g_array_index(out_param,
819                                                 guint16, i);
820
821                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
822                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
823                         }
824                 }
825         }
826
827         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
828
829         return result;
830 }
831
832 BT_EXPORT_API int bluetooth_mesh_node_get_all_netkeys(
833                 bluetooth_mesh_node_discover_t *node,
834                         GPtrArray **netkeys)
835 {
836         int result = BLUETOOTH_ERROR_NONE;
837         guint size;
838         int i;
839
840         BT_CHECK_PARAMETER(node, return);
841         BT_CHECK_PARAMETER(netkeys, return);
842
843         BT_INIT_PARAMS();
844         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
845
846         g_array_append_vals(in_param1, node,  sizeof(bluetooth_mesh_node_discover_t));
847
848         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_NETKEYS,
849                         in_param1, in_param2, in_param3, in_param4, &out_param);
850
851         if (result == BLUETOOTH_ERROR_NONE) {
852                 if (out_param == NULL) {
853                         BT_ERR("Mesh: out_param is NULL");
854                         result = BLUETOOTH_ERROR_INTERNAL;
855                 } else {
856                         size = (out_param->len) / sizeof(guint16);
857
858                         for (i = 0; i < size; i++) {
859                                 uint16_t netkey_index;
860                                 uint16_t *netkey_idx = NULL;
861
862                                 netkey_index = g_array_index(out_param,
863                                                 guint16, i);
864
865                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
866                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
867                         }
868                 }
869         }
870
871         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
872
873         return result;
874 }
875
876 BT_EXPORT_API int bluetooth_mesh_node_get_all_appkeys(
877         bluetooth_mesh_node_discover_t *req, GPtrArray **appkeys)
878 {
879         int result = BLUETOOTH_ERROR_NONE;
880         guint size;
881         int i;
882
883         BT_CHECK_PARAMETER(req, return);
884         BT_CHECK_PARAMETER(appkeys, return);
885
886         BT_INIT_PARAMS();
887         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
888
889         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_discover_t));
890
891         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_APPKEYS,
892                         in_param1, in_param2, in_param3, in_param4, &out_param);
893
894         if (result == BLUETOOTH_ERROR_NONE) {
895                 if (out_param == NULL) {
896                         BT_ERR("Mesh: out_param is NULL");
897                         result = BLUETOOTH_ERROR_INTERNAL;
898                 } else {
899                         size = (out_param->len) / sizeof(guint16);
900
901                         for (i = 0; i < size; i++) {
902                                 uint16_t appkey_index;
903                                 uint16_t *appkey_idx = NULL;
904
905                                 appkey_index = g_array_index(out_param,
906                                                 guint16, i);
907
908                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
909                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
910                         }
911                 }
912         }
913
914         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
915
916         return result;
917 }
918
919 BT_EXPORT_API int bluetooth_mesh_model_get_all_appkeys(
920                         bluetooth_mesh_model_configure_t *req)
921 {
922         int result = 0;
923         bt_user_info_t *user_info;
924
925         BT_CHECK_PARAMETER(req, return);
926
927         user_info = _bt_get_user_data(BT_MESH);
928         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
929
930         BT_INIT_PARAMS();
931         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
932
933         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
934
935         BT_INFO("Mesh:Node Model Get AppKey List ");
936         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_APPKEY_LIST,
937                         in_param1, in_param2, in_param3, in_param4,
938                         user_info->cb, user_info->user_data);
939
940         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
941         return result;
942 }
943
944 BT_EXPORT_API int bluetooth_mesh_model_set_publication(
945                         bluetooth_mesh_model_configure_t *req)
946 {
947         int result = 0;
948         bt_user_info_t *user_info;
949
950         BT_CHECK_PARAMETER(req, return);
951
952         user_info = _bt_get_user_data(BT_MESH);
953         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
954
955         BT_INIT_PARAMS();
956         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
957
958         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
959
960         BT_INFO("Mesh: Model Set Publication");
961         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_SET_PUBLICATION,
962                         in_param1, in_param2, in_param3, in_param4,
963                         user_info->cb, user_info->user_data);
964
965         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
966         return result;
967 }
968
969 BT_EXPORT_API int bluetooth_mesh_model_get_publication(
970                         bluetooth_mesh_model_configure_t *req)
971 {
972         int result = 0;
973         bt_user_info_t *user_info;
974
975         BT_CHECK_PARAMETER(req, return);
976
977         user_info = _bt_get_user_data(BT_MESH);
978         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
979
980         BT_INIT_PARAMS();
981         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
982
983         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
984
985         BT_INFO("Mesh:BTAPI:  Model Get Publication");
986         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_PUBLICATION,
987                         in_param1, in_param2, in_param3, in_param4,
988                         user_info->cb, user_info->user_data);
989
990         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
991         return result;
992 }
993
994 BT_EXPORT_API int bluetooth_mesh_model_get_subscriptopn_list(
995                         bluetooth_mesh_model_configure_t *req)
996 {
997         int result = 0;
998         bt_user_info_t *user_info;
999
1000         BT_CHECK_PARAMETER(req, return);
1001
1002         user_info = _bt_get_user_data(BT_MESH);
1003         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1004
1005         BT_INIT_PARAMS();
1006         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1007
1008         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1009
1010         BT_INFO("Mesh:BTAPI:  Model Get Subscription List ");
1011         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
1012                         in_param1, in_param2, in_param3, in_param4,
1013                         user_info->cb, user_info->user_data);
1014
1015         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1016         return result;
1017 }
1018
1019 BT_EXPORT_API int bluetooth_mesh_network_remove_group(
1020                 bluetooth_mesh_network_t *network,
1021                         bluetooth_mesh_network_group_info_t *req)
1022 {
1023         int result;
1024
1025         BT_CHECK_PARAMETER(network, return);
1026         BT_CHECK_PARAMETER(req, return);
1027
1028         BT_INIT_PARAMS();
1029         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1030
1031         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
1032         g_array_append_vals(in_param2, req,  sizeof(bluetooth_mesh_network_group_info_t));
1033
1034         BT_INFO("Mesh: Remove Group Request");
1035         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_REMOVE_GROUP,
1036                         in_param1, in_param2, in_param3, in_param4, &out_param);
1037
1038         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1039
1040         return result;
1041 }
1042
1043 BT_EXPORT_API int bluetooth_mesh_network_create_group(
1044                 bluetooth_mesh_network_t *network, bool is_virtual,
1045                         uint16_t grp_addr, bluetooth_mesh_network_group_info_t *info)
1046 {
1047         int result;
1048
1049         BT_CHECK_PARAMETER(network, return);
1050         BT_CHECK_PARAMETER(info, return);
1051
1052         BT_INIT_PARAMS();
1053         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1054
1055         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
1056         g_array_append_vals(in_param2, &is_virtual,  sizeof(gboolean));
1057         g_array_append_vals(in_param3, &grp_addr,  sizeof(guint16));
1058
1059         BT_INFO("Mesh: Create Group Request");
1060         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CREATE_GROUP,
1061                         in_param1, in_param2, in_param3, in_param4, &out_param);
1062
1063         if (result == BLUETOOTH_ERROR_NONE) {
1064                 *info = g_array_index(out_param,
1065                                 bluetooth_mesh_network_group_info_t, 0);
1066         }
1067         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1068
1069         return result;
1070 }
1071
1072 BT_EXPORT_API int bluetooth_mesh_model_configure_group_sub(
1073                         bluetooth_mesh_model_configure_t *req)
1074 {
1075         int result = 0;
1076         bt_user_info_t *user_info;
1077
1078         BT_CHECK_PARAMETER(req, return);
1079
1080         user_info = _bt_get_user_data(BT_MESH);
1081         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1082
1083         BT_INIT_PARAMS();
1084         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1085
1086         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1087
1088         BT_INFO("Mesh:Model Group Subscription Request");
1089         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIG_GROUP_SUB,
1090                         in_param1, in_param2, in_param3, in_param4,
1091                         user_info->cb, user_info->user_data);
1092
1093         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1094         return result;
1095 }
1096
1097 BT_EXPORT_API int bluetooth_mesh_model_configure_virtual_group_sub(
1098                         bluetooth_mesh_model_configure_t *req)
1099 {
1100         int result = 0;
1101         bt_user_info_t *user_info;
1102
1103         BT_CHECK_PARAMETER(req, return);
1104
1105         user_info = _bt_get_user_data(BT_MESH);
1106         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1107
1108         BT_INIT_PARAMS();
1109         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1110
1111         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1112
1113         BT_INFO("Mesh: Model Virtual Group Subscription Request");
1114         result = _bt_send_request_async(BT_BLUEZ_SERVICE,
1115                         BT_MESH_MODEL_CONFIG_VIRTUAL_GROUP_SUB,
1116                         in_param1, in_param2, in_param3, in_param4,
1117                         user_info->cb, user_info->user_data);
1118
1119         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1120         return result;
1121 }