Mesh: Fix & Refactor Mesh Model Subscription codes
[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(guint32);
530                         BT_INFO("Mesh: Total Models found in Element [%d]", size);
531
532                         for (i = 0; i < size; i++) {
533                                 uint32_t model_obj;
534                                 uint32_t *model_ptr = NULL;
535
536                                 model_obj = g_array_index(out_param,
537                                                 guint32, i);
538
539                                 model_ptr = g_memdup(&model_obj, sizeof(guint32));
540                                 g_ptr_array_add(*models, (gpointer)model_ptr);
541                         }
542                 }
543         }
544
545         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
546
547         return result;
548 }
549
550 BT_EXPORT_API int bluetooth_mesh_node_browse_vendor_features(
551                         bluetooth_mesh_node_features_t *req)
552 {
553         int result;
554         bt_user_info_t *user_info;
555
556         BT_CHECK_PARAMETER(req, return);
557
558         user_info = _bt_get_user_data(BT_MESH);
559         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
560
561         BT_INIT_PARAMS();
562         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
563
564         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_features_t));
565
566         BT_INFO("Mesh: Browse Vendor features of Node");
567         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_VENDOR_FEATURES,
568                         in_param1, in_param2, in_param3, in_param4,
569                         user_info->cb, user_info->user_data);
570
571         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
572
573         return result;
574 }
575
576 BT_EXPORT_API int bluetooth_mesh_browse_remote_node(
577                         bluetooth_mesh_node_discover_t *req)
578 {
579         int result;
580         bt_user_info_t *user_info;
581
582         BT_CHECK_PARAMETER(req, return);
583
584         user_info = _bt_get_user_data(BT_MESH);
585         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
586
587         BT_INIT_PARAMS();
588         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
589
590         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_discover_t));
591
592         BT_INFO("Mesh: Browse remote Node");
593         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_BROWSE,
594                         in_param1, in_param2, in_param3, in_param4,
595                         user_info->cb, user_info->user_data);
596
597         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
598
599         return result;
600 }
601
602 BT_EXPORT_API int bluetooth_mesh_node_ttl_execute(
603                         bluetooth_mesh_node_ttl_info_t *req)
604 {
605         int result;
606         bt_user_info_t *user_info;
607
608         BT_CHECK_PARAMETER(req, return);
609
610         user_info = _bt_get_user_data(BT_MESH);
611         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
612
613         BT_INIT_PARAMS();
614         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
615
616         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_ttl_info_t));
617
618         BT_INFO("Mesh: Node TTL Execute");
619         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_TTL_EXECUTE,
620                         in_param1, in_param2, in_param3, in_param4,
621                         user_info->cb, user_info->user_data);
622
623         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
624
625         return result;
626 }
627
628 BT_EXPORT_API int bluetooth_mesh_model_configure_appkey(
629                         bluetooth_mesh_model_configure_t *req)
630 {
631         int result;
632         bt_user_info_t *user_info;
633
634         BT_CHECK_PARAMETER(req, return);
635
636         user_info = _bt_get_user_data(BT_MESH);
637         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
638
639         BT_INIT_PARAMS();
640         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
641
642         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
643
644         BT_INFO("Mesh: Node Model Configure AppKey");
645         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIGURE_APPKEY,
646                         in_param1, in_param2, in_param3, in_param4,
647                         user_info->cb, user_info->user_data);
648
649         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
650
651         return result;
652 }
653
654 BT_EXPORT_API int bluetooth_mesh_node_configure_key(
655                         bluetooth_mesh_key_configure_t *req)
656 {
657         int result;
658         bt_user_info_t *user_info;
659
660         BT_CHECK_PARAMETER(req, return);
661
662         user_info = _bt_get_user_data(BT_MESH);
663         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
664
665         BT_INIT_PARAMS();
666         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
667
668         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_key_configure_t));
669
670         BT_INFO("Mesh:BTAPI: Node Key Configure");
671         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_CONFIGURE_KEY,
672                         in_param1, in_param2, in_param3, in_param4,
673                         user_info->cb, user_info->user_data);
674
675         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
676
677         return result;
678 }
679
680 BT_EXPORT_API int bluetooth_mesh_network_get_all_groups(
681                 bluetooth_mesh_network_t *network,
682                         GPtrArray **groups)
683 {
684         int result = BLUETOOTH_ERROR_NONE;
685         bluetooth_mesh_network_group_info_t *info;
686         guint size;
687         int i;
688
689         BT_CHECK_PARAMETER(network, return);
690         BT_CHECK_PARAMETER(groups, return);
691
692         BT_INIT_PARAMS();
693         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
694
695         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
696
697         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_GROUPS,
698                         in_param1, in_param2, in_param3, in_param4, &out_param);
699
700         if (result == BLUETOOTH_ERROR_NONE) {
701                 if (out_param == NULL) {
702                         BT_ERR("Mesh: out_param is NULL");
703                         result = BLUETOOTH_ERROR_INTERNAL;
704                 } else {
705                         size = (out_param->len) / sizeof(bluetooth_mesh_network_group_info_t);
706
707                         if (size == 0) {
708                                 BT_INFO("Mesh: No Groups created for the network");
709                         }
710
711                         BT_INFO("Mesh: Total groups [%d]", size);
712                         for (i = 0; i < size; i++) {
713                                 bluetooth_mesh_network_group_info_t *grp_info = NULL;
714
715                                 info = &g_array_index(out_param,
716                                         bluetooth_mesh_network_group_info_t, i);
717                                 BT_INFO("Mesh: Group addr [0x%2.2x]", info->group_addr);
718                                 BT_INFO("Mesh: Group is Virtual [%s]", info->is_virtual? "YES":"NO");
719                                 BT_INFO("Mesh: Group net UUID[%s]", info->net_uuid);
720                                 if (info->is_virtual)
721                                         BT_INFO("Mesh: Virual Label UUID [%s]", info->label_uuid);
722                                 grp_info = g_memdup(info,
723                                         sizeof(bluetooth_mesh_network_group_info_t));
724                                 g_ptr_array_add(*groups, (gpointer)grp_info);
725                         }
726                 }
727         }
728
729         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
730
731         return result;
732 }
733
734 BT_EXPORT_API int bluetooth_mesh_network_get_all_netkey(
735                 bluetooth_mesh_network_t *network,
736                         GPtrArray **netkeys)
737 {
738         int result = BLUETOOTH_ERROR_NONE;
739         guint size;
740         int i;
741
742         BT_CHECK_PARAMETER(network, return);
743         BT_CHECK_PARAMETER(netkeys, return);
744
745         BT_INIT_PARAMS();
746         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
747
748         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
749
750         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NETKEYS,
751                         in_param1, in_param2, in_param3, in_param4, &out_param);
752
753         if (result == BLUETOOTH_ERROR_NONE) {
754                 if (out_param == NULL) {
755                         BT_ERR("Mesh: out_param is NULL");
756                         result = BLUETOOTH_ERROR_INTERNAL;
757                 } else {
758                         size = (out_param->len) / sizeof(guint16);
759
760                         if (size == 0) {
761                                 BT_ERR("Mesh: No netkeys created for the network");
762                                 result = BLUETOOTH_ERROR_NOT_FOUND;
763                         }
764
765                         for (i = 0; i < size; i++) {
766                                 uint16_t netkey_index;
767                                 uint16_t *netkey_idx = NULL;
768
769                                 netkey_index = g_array_index(out_param,
770                                                 guint16, i);
771
772                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
773                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
774                         }
775                 }
776         }
777
778         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
779
780         return result;
781 }
782
783 BT_EXPORT_API int bluetooth_mesh_netkey_get_all_appkey(
784                 bluetooth_mesh_network_t *network,
785                         uint16_t netkey_idx,
786                                 GPtrArray **appkeys)
787 {
788         int result = BLUETOOTH_ERROR_NONE;
789         guint size;
790         int i;
791
792         BT_CHECK_PARAMETER(network, return);
793         BT_CHECK_PARAMETER(appkeys, return);
794
795         BT_INIT_PARAMS();
796         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
797
798         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
799         g_array_append_vals(in_param2, &netkey_idx,  sizeof(guint16));
800
801         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_APPKEYS,
802                         in_param1, in_param2, in_param3, in_param4, &out_param);
803
804         if (result == BLUETOOTH_ERROR_NONE) {
805                 if (out_param == NULL) {
806                         BT_ERR("Mesh: out_param is NULL");
807                         result = BLUETOOTH_ERROR_INTERNAL;
808                 } else {
809                         size = (out_param->len) / sizeof(guint16);
810
811                         if (size == 0) {
812                                 BT_ERR("Mesh: No Appkeys created for the NetKey in the network");
813                         }
814
815                         for (i = 0; i < size; i++) {
816                                 uint16_t appkey_index;
817                                 uint16_t *appkey_idx = NULL;
818
819                                 appkey_index = g_array_index(out_param,
820                                                 guint16, i);
821
822                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
823                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
824                         }
825                 }
826         }
827
828         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
829
830         return result;
831 }
832
833 BT_EXPORT_API int bluetooth_mesh_node_get_all_netkeys(
834                 bluetooth_mesh_node_discover_t *node,
835                         GPtrArray **netkeys)
836 {
837         int result = BLUETOOTH_ERROR_NONE;
838         guint size;
839         int i;
840
841         BT_CHECK_PARAMETER(node, return);
842         BT_CHECK_PARAMETER(netkeys, return);
843
844         BT_INIT_PARAMS();
845         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
846
847         g_array_append_vals(in_param1, node,  sizeof(bluetooth_mesh_node_discover_t));
848
849         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_NETKEYS,
850                         in_param1, in_param2, in_param3, in_param4, &out_param);
851
852         if (result == BLUETOOTH_ERROR_NONE) {
853                 if (out_param == NULL) {
854                         BT_ERR("Mesh: out_param is NULL");
855                         result = BLUETOOTH_ERROR_INTERNAL;
856                 } else {
857                         size = (out_param->len) / sizeof(guint16);
858
859                         for (i = 0; i < size; i++) {
860                                 uint16_t netkey_index;
861                                 uint16_t *netkey_idx = NULL;
862
863                                 netkey_index = g_array_index(out_param,
864                                                 guint16, i);
865
866                                 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
867                                 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
868                         }
869                 }
870         }
871
872         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
873
874         return result;
875 }
876
877 BT_EXPORT_API int bluetooth_mesh_node_get_all_appkeys(
878         bluetooth_mesh_node_discover_t *req, GPtrArray **appkeys)
879 {
880         int result = BLUETOOTH_ERROR_NONE;
881         guint size;
882         int i;
883
884         BT_CHECK_PARAMETER(req, return);
885         BT_CHECK_PARAMETER(appkeys, return);
886
887         BT_INIT_PARAMS();
888         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
889
890         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_node_discover_t));
891
892         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_APPKEYS,
893                         in_param1, in_param2, in_param3, in_param4, &out_param);
894
895         if (result == BLUETOOTH_ERROR_NONE) {
896                 if (out_param == NULL) {
897                         BT_ERR("Mesh: out_param is NULL");
898                         result = BLUETOOTH_ERROR_INTERNAL;
899                 } else {
900                         size = (out_param->len) / sizeof(guint16);
901
902                         for (i = 0; i < size; i++) {
903                                 uint16_t appkey_index;
904                                 uint16_t *appkey_idx = NULL;
905
906                                 appkey_index = g_array_index(out_param,
907                                                 guint16, i);
908
909                                 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
910                                 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
911                         }
912                 }
913         }
914
915         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
916
917         return result;
918 }
919
920 BT_EXPORT_API int bluetooth_mesh_model_get_all_appkeys(
921                         bluetooth_mesh_model_configure_t *req)
922 {
923         int result = 0;
924         bt_user_info_t *user_info;
925
926         BT_CHECK_PARAMETER(req, return);
927
928         user_info = _bt_get_user_data(BT_MESH);
929         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
930
931         BT_INIT_PARAMS();
932         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
933
934         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
935
936         BT_INFO("Mesh:Node Model Get AppKey List ");
937         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_APPKEY_LIST,
938                         in_param1, in_param2, in_param3, in_param4,
939                         user_info->cb, user_info->user_data);
940
941         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
942         return result;
943 }
944
945 BT_EXPORT_API int bluetooth_mesh_model_set_publication(
946                         bluetooth_mesh_model_configure_t *req)
947 {
948         int result = 0;
949         bt_user_info_t *user_info;
950
951         BT_CHECK_PARAMETER(req, return);
952
953         user_info = _bt_get_user_data(BT_MESH);
954         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
955
956         BT_INIT_PARAMS();
957         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
958
959         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
960
961         BT_INFO("Mesh: Model Set Publication");
962         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_SET_PUBLICATION,
963                         in_param1, in_param2, in_param3, in_param4,
964                         user_info->cb, user_info->user_data);
965
966         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
967         return result;
968 }
969
970 BT_EXPORT_API int bluetooth_mesh_model_get_publication(
971                         bluetooth_mesh_model_configure_t *req)
972 {
973         int result = 0;
974         bt_user_info_t *user_info;
975
976         BT_CHECK_PARAMETER(req, return);
977
978         user_info = _bt_get_user_data(BT_MESH);
979         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
980
981         BT_INIT_PARAMS();
982         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
983
984         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
985
986         BT_INFO("Mesh:BTAPI:  Model Get Publication");
987         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_PUBLICATION,
988                         in_param1, in_param2, in_param3, in_param4,
989                         user_info->cb, user_info->user_data);
990
991         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
992         return result;
993 }
994
995 BT_EXPORT_API int bluetooth_mesh_model_get_subscriptopn_list(
996                         bluetooth_mesh_model_configure_t *req)
997 {
998         int result = 0;
999         bt_user_info_t *user_info;
1000
1001         BT_CHECK_PARAMETER(req, return);
1002
1003         user_info = _bt_get_user_data(BT_MESH);
1004         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1005
1006         BT_INIT_PARAMS();
1007         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1008
1009         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1010
1011         BT_INFO("Mesh:BTAPI:  Model Get Subscription List ");
1012         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
1013                         in_param1, in_param2, in_param3, in_param4,
1014                         user_info->cb, user_info->user_data);
1015
1016         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1017         return result;
1018 }
1019
1020 BT_EXPORT_API int bluetooth_mesh_network_remove_group(
1021                 bluetooth_mesh_network_t *network,
1022                         bluetooth_mesh_network_group_info_t *req)
1023 {
1024         int result;
1025
1026         BT_CHECK_PARAMETER(network, return);
1027         BT_CHECK_PARAMETER(req, return);
1028
1029         BT_INIT_PARAMS();
1030         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1031
1032         g_array_append_vals(in_param1, network,  sizeof(bluetooth_mesh_network_t));
1033         g_array_append_vals(in_param2, req,  sizeof(bluetooth_mesh_network_group_info_t));
1034
1035         BT_INFO("Mesh: Remove Group Request");
1036         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_REMOVE_GROUP,
1037                         in_param1, in_param2, in_param3, in_param4, &out_param);
1038
1039         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1040
1041         return result;
1042 }
1043
1044 BT_EXPORT_API int bluetooth_mesh_network_create_group(
1045                 bluetooth_mesh_network_t *network, bool is_virtual,
1046                         uint16_t grp_addr, bluetooth_mesh_network_group_info_t *info)
1047 {
1048         int result;
1049
1050         BT_CHECK_PARAMETER(network, return);
1051         BT_CHECK_PARAMETER(info, return);
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, network,  sizeof(bluetooth_mesh_network_t));
1057         g_array_append_vals(in_param2, &is_virtual,  sizeof(gboolean));
1058         g_array_append_vals(in_param3, &grp_addr,  sizeof(guint16));
1059
1060         BT_INFO("Mesh: Create Group Request");
1061         result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CREATE_GROUP,
1062                         in_param1, in_param2, in_param3, in_param4, &out_param);
1063
1064         if (result == BLUETOOTH_ERROR_NONE) {
1065                 *info = g_array_index(out_param,
1066                                 bluetooth_mesh_network_group_info_t, 0);
1067         }
1068         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1069
1070         return result;
1071 }
1072
1073 BT_EXPORT_API int bluetooth_mesh_model_configure_group_sub(
1074                         bluetooth_mesh_model_configure_t *req)
1075 {
1076         int result = 0;
1077         bt_user_info_t *user_info;
1078
1079         BT_CHECK_PARAMETER(req, return);
1080
1081         user_info = _bt_get_user_data(BT_MESH);
1082         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1083
1084         BT_INIT_PARAMS();
1085         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1086
1087         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1088
1089         BT_INFO("Mesh:Model Group Subscription Request");
1090         result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIG_GROUP_SUB,
1091                         in_param1, in_param2, in_param3, in_param4,
1092                         user_info->cb, user_info->user_data);
1093
1094         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1095         return result;
1096 }
1097
1098 BT_EXPORT_API int bluetooth_mesh_model_configure_virtual_group_sub(
1099                         bluetooth_mesh_model_configure_t *req)
1100 {
1101         int result = 0;
1102         bt_user_info_t *user_info;
1103
1104         BT_CHECK_PARAMETER(req, return);
1105
1106         user_info = _bt_get_user_data(BT_MESH);
1107         retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1108
1109         BT_INIT_PARAMS();
1110         BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1111
1112         g_array_append_vals(in_param1, req,  sizeof(bluetooth_mesh_model_configure_t));
1113
1114         BT_INFO("Mesh: Model Virtual Group Subscription Request");
1115         result = _bt_send_request_async(BT_BLUEZ_SERVICE,
1116                         BT_MESH_MODEL_CONFIG_VIRTUAL_GROUP_SUB,
1117                         in_param1, in_param2, in_param3, in_param4,
1118                         user_info->cb, user_info->user_data);
1119
1120         BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1121         return result;
1122 }