2 * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
4 * @author: Anupam Roy <anupam.r@samsung.com>
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include "bluetooth-api.h"
21 #include "bt-internal-types.h"
23 #include "bt-common.h"
24 #include "bt-request-sender.h"
25 #include "bt-event-handler.h"
27 #include "bluetooth-mesh-api.h"
29 #define BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX 100
30 #define BLUETOOTH_MESH_TOKEN_STRING_MAX 100
32 BT_EXPORT_API int bluetooth_mesh_init(mesh_cb_func_ptr cb,
38 BT_ERR("callback is NULL");
39 return BLUETOOTH_ERROR_INVALID_PARAM;
43 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
45 ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_INIT,
46 in_param1, in_param2, in_param3, in_param4, &out_param);
48 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
50 if (ret != BLUETOOTH_ERROR_NONE) {
51 BT_ERR("Fail to init the mesh in bt-service");
55 ret = _bt_init_event_handler();
57 if (ret != BLUETOOTH_ERROR_NONE &&
58 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
59 BT_ERR("Fail to init the event handler");
63 _bt_set_user_data(BT_MESH, (void *)cb, user_data);
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();
73 BT_INFO("Mesh: Event registsred");
74 return BLUETOOTH_ERROR_NONE;
77 BT_EXPORT_API int bluetooth_mesh_deinit(void)
81 _bt_unregister_event(BT_MESH_EVENT);
82 _bt_set_user_data(BT_MESH, NULL, NULL);
85 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
87 ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_DEINIT,
88 in_param1, in_param2, in_param3, in_param4, &out_param);
90 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
92 if (ret != BLUETOOTH_ERROR_NONE) {
93 BT_ERR("Fail to init the mesh in bt-service");
97 return BLUETOOTH_ERROR_NONE;
100 BT_EXPORT_API int bluetooth_mesh_network_destroy(bluetooth_mesh_network_t *network)
104 BT_CHECK_PARAMETER(network, return);
107 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
109 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
111 BT_INFO("Mesh: Network Destroy");
112 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DESTROY,
113 in_param1, in_param2, in_param3, in_param4, &out_param);
114 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
119 BT_EXPORT_API int bluetooth_mesh_network_create(
120 const char *net_name, bluetooth_mesh_node_t *node,
121 uint16_t total_models, bluetooth_mesh_model_t **models,
122 bluetooth_mesh_network_t *network)
125 char network_name[BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX+1];
127 BT_CHECK_PARAMETER(net_name, return);
128 BT_CHECK_PARAMETER(node, return);
129 BT_CHECK_PARAMETER(models, return);
132 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
134 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_t));
136 g_strlcpy(network_name, net_name, sizeof(network_name));
137 g_array_append_vals(in_param2, network_name,
138 BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX);
140 for (int i = 0; i < total_models; i++)
141 g_array_append_vals(in_param3, models[i],
142 sizeof(bluetooth_mesh_model_t));
144 result = _bt_send_request(BT_BLUEZ_SERVICE,
145 BT_MESH_NETWORK_CREATE,
146 in_param1, in_param2, in_param3,
147 in_param4, &out_param);
149 if (result == BLUETOOTH_ERROR_NONE) {
150 *network = g_array_index(out_param,
151 bluetooth_mesh_network_t, 0);
154 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
159 BT_EXPORT_API int bluetooth_mesh_network_load(
161 bluetooth_mesh_network_t *network)
164 char token_string[BLUETOOTH_MESH_TOKEN_STRING_MAX + 1];
166 BT_CHECK_PARAMETER(token, return);
167 BT_CHECK_PARAMETER(network, return);
170 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
172 g_strlcpy(token_string, token, sizeof(token_string));
173 g_array_append_vals(in_param1, token_string, BLUETOOTH_MESH_TOKEN_STRING_MAX);
175 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_LOAD,
176 in_param1, in_param2, in_param3, in_param4, &out_param);
178 if (result == BLUETOOTH_ERROR_NONE) {
179 *network = g_array_index(out_param,
180 bluetooth_mesh_network_t, 0);
183 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
188 BT_EXPORT_API int bluetooth_mesh_network_scan(
189 bluetooth_mesh_network_t *network,
190 bluetooth_mesh_scan_param_t *scan_param)
194 BT_CHECK_PARAMETER(network, return);
195 BT_CHECK_PARAMETER(scan_param, return);
198 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
200 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
202 g_array_append_vals(in_param2, scan_param, sizeof(bluetooth_mesh_scan_param_t));
204 BT_INFO("Mesh:Start Scan, time [%u]", scan_param->scan_time);
205 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SCAN,
206 in_param1, in_param2, in_param3, in_param4, &out_param);
207 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
212 BT_EXPORT_API int bluetooth_mesh_network_cancel_scan(
213 bluetooth_mesh_network_t *network)
217 BT_CHECK_PARAMETER(network, return);
220 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
222 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
224 BT_INFO("Mesh: Cancel Scan");
225 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CANCEL_SCAN,
226 in_param1, in_param2, in_param3, in_param4, &out_param);
227 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
232 BT_EXPORT_API int bluetooth_mesh_network_set_capabilities(
233 bluetooth_mesh_network_t *network,
234 bluetooth_mesh_provisioner_caps_t *caps)
238 BT_CHECK_PARAMETER(network, return);
239 BT_CHECK_PARAMETER(caps, return);
242 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
244 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
246 g_array_append_vals(in_param2, caps, sizeof(bluetooth_mesh_provisioner_caps_t));
248 BT_INFO("Mesh: Set Provisioner capabilities");
249 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_CAPABILITIES,
250 in_param1, in_param2, in_param3, in_param4, &out_param);
251 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
256 BT_EXPORT_API int bluetooth_mesh_network_provision_device(
257 bluetooth_mesh_provisioning_request_t *req)
260 bt_user_info_t *user_info;
262 BT_CHECK_PARAMETER(req, return);
264 user_info = _bt_get_user_data(BT_MESH);
265 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
268 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
270 g_array_append_vals(in_param1, req,
271 sizeof(bluetooth_mesh_provisioning_request_t));
273 BT_INFO("Mesh: Set Provision Device");
274 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
275 BT_MESH_NETWORK_PROVISION_DEVICE,
276 in_param1, in_param2, in_param3, in_param4,
277 user_info->cb, user_info->user_data);
279 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
284 BT_EXPORT_API int bluetooth_mesh_authentication_reply(int auth_type,
285 const char *auth_val, gboolean reply)
289 char auth_string[BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX];
291 BT_CHECK_PARAMETER(auth_val, return);
294 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
296 g_strlcpy(auth_string, auth_val,
297 sizeof(auth_string));
298 g_array_append_vals(in_param1,
299 &auth_type, sizeof(int));
300 g_array_append_vals(in_param2, auth_string,
301 BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX);
302 g_array_append_vals(in_param3, &reply, sizeof(gboolean));
304 BT_INFO("Mesh: Set Provisioner Authentication Reply");
305 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_AUTHENTICATION_REPLY,
306 in_param1, in_param2, in_param3, in_param4, &out_param);
308 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 BT_EXPORT_API int bluetooth_mesh_network_set_name(
314 bluetooth_mesh_network_t *network)
318 BT_CHECK_PARAMETER(network, return);
321 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
323 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
325 BT_INFO("Mesh:Set Network Name");
326 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_NAME,
327 in_param1, in_param2, in_param3, in_param4, &out_param);
328 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
333 BT_EXPORT_API int bluetooth_mesh_network_add_netkey(
334 bluetooth_mesh_network_t *network,
335 uint16_t *netkey_idx)
339 BT_CHECK_PARAMETER(network, return);
340 BT_CHECK_PARAMETER(netkey_idx, return);
343 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
345 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
347 BT_INFO("Mesh:Set Create Subnetwork key");
348 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_NETKEY,
349 in_param1, in_param2, in_param3, in_param4, &out_param);
350 if (result == BLUETOOTH_ERROR_NONE)
351 *netkey_idx = g_array_index(out_param, guint16, 0);
352 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
357 BT_EXPORT_API int bluetooth_mesh_network_delete_netkey(
358 bluetooth_mesh_network_t *network,
363 BT_CHECK_PARAMETER(network, return);
366 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
368 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
369 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
371 BT_INFO("Mesh: Delete Subnetwork key");
372 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_NETKEY,
373 in_param1, in_param2, in_param3, in_param4, &out_param);
374 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
379 BT_EXPORT_API int bluetooth_mesh_network_update_netkey(
380 bluetooth_mesh_network_t *network,
385 BT_CHECK_PARAMETER(network, return);
388 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
390 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
391 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
393 BT_INFO("Mesh: Update Subnetwork key");
394 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_NETKEY,
395 in_param1, in_param2, in_param3, in_param4, &out_param);
396 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
401 BT_EXPORT_API int bluetooth_mesh_network_add_appkey(
402 bluetooth_mesh_network_t *network,
403 uint16_t netkey_index,
404 uint16_t *appkey_index)
408 BT_CHECK_PARAMETER(network, return);
409 BT_CHECK_PARAMETER(appkey_index, return);
412 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
414 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
415 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
417 BT_INFO("Mesh: Create AppKey");
418 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_APPKEY,
419 in_param1, in_param2, in_param3, in_param4, &out_param);
421 if (result == BLUETOOTH_ERROR_NONE)
422 *appkey_index = g_array_index(out_param, guint16, 0);
423 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
428 BT_EXPORT_API int bluetooth_mesh_network_update_appkey(
429 bluetooth_mesh_network_t *network,
430 uint16_t netkey_index, uint16_t appkey_index)
434 BT_CHECK_PARAMETER(network, return);
437 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
439 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
440 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
441 g_array_append_vals(in_param3, &appkey_index, sizeof(guint16));
443 BT_INFO("Mesh:BTAPI: Update AppKey");
444 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_APPKEY,
445 in_param1, in_param2, in_param3, in_param4, &out_param);
447 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
452 BT_EXPORT_API int bluetooth_mesh_network_delete_appkey(bluetooth_mesh_network_t *network,
453 uint16_t netkey_index, uint16_t appkey_index)
457 BT_CHECK_PARAMETER(network, return);
460 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
462 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
463 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
464 g_array_append_vals(in_param3, &appkey_index, sizeof(guint16));
466 BT_INFO("Mesh: Delete AppKey");
467 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_APPKEY,
468 in_param1, in_param2, in_param3, in_param4, &out_param);
470 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
475 BT_EXPORT_API int bluetooth_mesh_network_get_all_nodes(
476 bluetooth_mesh_network_t *network,
479 int result = BLUETOOTH_ERROR_NONE;
482 bluetooth_mesh_node_info_t *info;
484 BT_CHECK_PARAMETER(network, return);
485 BT_CHECK_PARAMETER(nodes, return);
488 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
490 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
492 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NODES,
493 in_param1, in_param2, in_param3, in_param4, &out_param);
495 if (result == BLUETOOTH_ERROR_NONE) {
496 if (out_param == NULL) {
497 BT_ERR("Mesh: out_param is NULL");
498 result = BLUETOOTH_ERROR_INTERNAL;
500 size = (out_param->len) / sizeof(bluetooth_mesh_node_info_t);
502 for (i = 0; i < size; i++) {
503 bluetooth_mesh_node_info_t *data;
505 info = &g_array_index(out_param,
506 bluetooth_mesh_node_info_t, i);
508 data = g_memdup(info, sizeof(bluetooth_mesh_node_info_t));
509 g_ptr_array_add(*nodes, (gpointer)data);
514 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
519 BT_EXPORT_API int bluetooth_mesh_element_get_all_models(
520 bluetooth_mesh_network_t *network,
521 uint16_t node_addr, int elem_idx,
524 int result = BLUETOOTH_ERROR_NONE;
528 BT_CHECK_PARAMETER(network, return);
529 BT_CHECK_PARAMETER(models, return);
532 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
534 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
535 g_array_append_vals(in_param2, &node_addr, sizeof(guint16));
536 g_array_append_vals(in_param3, &elem_idx, sizeof(int));
538 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_ELEMENT_GET_MODELS,
539 in_param1, in_param2, in_param3, in_param4, &out_param);
541 if (result == BLUETOOTH_ERROR_NONE) {
542 if (out_param == NULL) {
543 BT_ERR("Mesh: out_param is NULL");
544 result = BLUETOOTH_ERROR_INTERNAL;
546 size = (out_param->len) / sizeof(guint32);
547 BT_INFO("Mesh: Total Models found in Element [%d]", size);
549 for (i = 0; i < size; i++) {
551 uint32_t *model_ptr = NULL;
553 model_obj = g_array_index(out_param,
556 model_ptr = g_memdup(&model_obj, sizeof(guint32));
557 g_ptr_array_add(*models, (gpointer)model_ptr);
562 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
567 BT_EXPORT_API int bluetooth_mesh_node_browse_vendor_features(
568 bluetooth_mesh_node_features_t *req)
571 bt_user_info_t *user_info;
573 BT_CHECK_PARAMETER(req, return);
575 user_info = _bt_get_user_data(BT_MESH);
576 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
579 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
581 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_features_t));
583 BT_INFO("Mesh: Browse Vendor features of Node");
584 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_VENDOR_FEATURES,
585 in_param1, in_param2, in_param3, in_param4,
586 user_info->cb, user_info->user_data);
588 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
593 BT_EXPORT_API int bluetooth_mesh_browse_remote_node(
594 bluetooth_mesh_node_discover_t *req)
597 bt_user_info_t *user_info;
599 BT_CHECK_PARAMETER(req, return);
601 user_info = _bt_get_user_data(BT_MESH);
602 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
605 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
607 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_discover_t));
609 BT_INFO("Mesh: Browse remote Node");
610 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_BROWSE,
611 in_param1, in_param2, in_param3, in_param4,
612 user_info->cb, user_info->user_data);
614 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
619 BT_EXPORT_API int bluetooth_mesh_node_ttl_execute(
620 bluetooth_mesh_node_ttl_info_t *req)
623 bt_user_info_t *user_info;
625 BT_CHECK_PARAMETER(req, return);
627 user_info = _bt_get_user_data(BT_MESH);
628 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
631 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
633 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_ttl_info_t));
635 BT_INFO("Mesh: Node TTL Execute");
636 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_TTL_EXECUTE,
637 in_param1, in_param2, in_param3, in_param4,
638 user_info->cb, user_info->user_data);
640 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
645 BT_EXPORT_API int bluetooth_mesh_model_configure_appkey(
646 bluetooth_mesh_model_configure_t *req)
649 bt_user_info_t *user_info;
651 BT_CHECK_PARAMETER(req, return);
653 user_info = _bt_get_user_data(BT_MESH);
654 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
657 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
659 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
661 BT_INFO("Mesh: Node Model Configure AppKey");
662 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIGURE_APPKEY,
663 in_param1, in_param2, in_param3, in_param4,
664 user_info->cb, user_info->user_data);
666 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
671 BT_EXPORT_API int bluetooth_mesh_model_send_msg(
672 bluetooth_mesh_model_msg_t *req)
675 bt_user_info_t *user_info;
677 BT_CHECK_PARAMETER(req, return);
679 user_info = _bt_get_user_data(BT_MESH);
680 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
683 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
685 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_msg_t));
687 BT_INFO("Mesh: Node Model Send Msg");
688 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_EXECUTE_MSG,
689 in_param1, in_param2, in_param3, in_param4,
690 user_info->cb, user_info->user_data);
692 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
697 BT_EXPORT_API int bluetooth_mesh_node_configure_key(
698 bluetooth_mesh_key_configure_t *req)
701 bt_user_info_t *user_info;
703 BT_CHECK_PARAMETER(req, return);
705 user_info = _bt_get_user_data(BT_MESH);
706 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
709 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
711 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_key_configure_t));
713 BT_INFO("Mesh:BTAPI: Node Key Configure");
714 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_CONFIGURE_KEY,
715 in_param1, in_param2, in_param3, in_param4,
716 user_info->cb, user_info->user_data);
718 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
723 BT_EXPORT_API int bluetooth_mesh_network_get_all_groups(
724 bluetooth_mesh_network_t *network,
727 int result = BLUETOOTH_ERROR_NONE;
728 bluetooth_mesh_network_group_info_t *info;
732 BT_CHECK_PARAMETER(network, return);
733 BT_CHECK_PARAMETER(groups, return);
736 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
738 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
740 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_GROUPS,
741 in_param1, in_param2, in_param3, in_param4, &out_param);
743 if (result == BLUETOOTH_ERROR_NONE) {
744 if (out_param == NULL) {
745 BT_ERR("Mesh: out_param is NULL");
746 result = BLUETOOTH_ERROR_INTERNAL;
748 size = (out_param->len) / sizeof(bluetooth_mesh_network_group_info_t);
751 BT_INFO("Mesh: No Groups created for the network");
753 BT_INFO("Mesh: Total groups [%d]", size);
754 for (i = 0; i < size; i++) {
755 bluetooth_mesh_network_group_info_t *grp_info = NULL;
757 info = &g_array_index(out_param,
758 bluetooth_mesh_network_group_info_t, i);
759 BT_INFO("Mesh: Group addr [0x%2.2x]", info->group_addr);
760 BT_INFO("Mesh: Group is Virtual [%s]", info->is_virtual ? "YES" : "NO");
761 BT_INFO("Mesh: Group net UUID[%s]", info->net_uuid);
762 if (info->is_virtual)
763 BT_INFO("Mesh: Virual Label UUID [%s]", info->label_uuid);
764 grp_info = g_memdup(info,
765 sizeof(bluetooth_mesh_network_group_info_t));
766 g_ptr_array_add(*groups, (gpointer)grp_info);
771 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
776 BT_EXPORT_API int bluetooth_mesh_network_get_all_netkey(
777 bluetooth_mesh_network_t *network,
780 int result = BLUETOOTH_ERROR_NONE;
784 BT_CHECK_PARAMETER(network, return);
785 BT_CHECK_PARAMETER(netkeys, return);
788 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
790 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
792 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NETKEYS,
793 in_param1, in_param2, in_param3, in_param4, &out_param);
795 if (result == BLUETOOTH_ERROR_NONE) {
796 if (out_param == NULL) {
797 BT_ERR("Mesh: out_param is NULL");
798 result = BLUETOOTH_ERROR_INTERNAL;
800 size = (out_param->len) / sizeof(guint16);
803 BT_ERR("Mesh: No netkeys created for the network");
804 result = BLUETOOTH_ERROR_NOT_FOUND;
807 for (i = 0; i < size; i++) {
808 uint16_t netkey_index;
809 uint16_t *netkey_idx = NULL;
811 netkey_index = g_array_index(out_param,
814 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
815 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
820 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
825 BT_EXPORT_API int bluetooth_mesh_netkey_get_all_appkey(
826 bluetooth_mesh_network_t *network,
830 int result = BLUETOOTH_ERROR_NONE;
834 BT_CHECK_PARAMETER(network, return);
835 BT_CHECK_PARAMETER(appkeys, return);
838 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
840 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
841 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
843 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_APPKEYS,
844 in_param1, in_param2, in_param3, in_param4, &out_param);
846 if (result == BLUETOOTH_ERROR_NONE) {
847 if (out_param == NULL) {
848 BT_ERR("Mesh: out_param is NULL");
849 result = BLUETOOTH_ERROR_INTERNAL;
851 size = (out_param->len) / sizeof(guint16);
854 BT_ERR("Mesh: No Appkeys created for the NetKey in the network");
856 for (i = 0; i < size; i++) {
857 uint16_t appkey_index;
858 uint16_t *appkey_idx = NULL;
860 appkey_index = g_array_index(out_param,
863 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
864 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
869 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
874 BT_EXPORT_API int bluetooth_mesh_node_get_all_netkeys(
875 bluetooth_mesh_node_discover_t *node,
878 int result = BLUETOOTH_ERROR_NONE;
882 BT_CHECK_PARAMETER(node, return);
883 BT_CHECK_PARAMETER(netkeys, return);
886 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
888 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_discover_t));
890 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_NETKEYS,
891 in_param1, in_param2, in_param3, in_param4, &out_param);
893 if (result == BLUETOOTH_ERROR_NONE) {
894 if (out_param == NULL) {
895 BT_ERR("Mesh: out_param is NULL");
896 result = BLUETOOTH_ERROR_INTERNAL;
898 size = (out_param->len) / sizeof(guint16);
900 for (i = 0; i < size; i++) {
901 uint16_t netkey_index;
902 uint16_t *netkey_idx = NULL;
904 netkey_index = g_array_index(out_param,
907 netkey_idx = g_memdup(&netkey_index, sizeof(guint16));
908 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
913 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
918 BT_EXPORT_API int bluetooth_mesh_node_get_all_appkeys(
919 bluetooth_mesh_node_discover_t *req, GPtrArray **appkeys)
921 int result = BLUETOOTH_ERROR_NONE;
925 BT_CHECK_PARAMETER(req, return);
926 BT_CHECK_PARAMETER(appkeys, return);
929 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
931 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_discover_t));
933 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_APPKEYS,
934 in_param1, in_param2, in_param3, in_param4, &out_param);
936 if (result == BLUETOOTH_ERROR_NONE) {
937 if (out_param == NULL) {
938 BT_ERR("Mesh: out_param is NULL");
939 result = BLUETOOTH_ERROR_INTERNAL;
941 size = (out_param->len) / sizeof(guint16);
943 for (i = 0; i < size; i++) {
944 uint16_t appkey_index;
945 uint16_t *appkey_idx = NULL;
947 appkey_index = g_array_index(out_param,
950 appkey_idx = g_memdup(&appkey_index, sizeof(guint16));
951 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
956 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
961 BT_EXPORT_API int bluetooth_mesh_model_get_all_appkeys(
962 bluetooth_mesh_model_configure_t *req)
965 bt_user_info_t *user_info;
967 BT_CHECK_PARAMETER(req, return);
969 user_info = _bt_get_user_data(BT_MESH);
970 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
973 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
975 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
977 BT_INFO("Mesh:Node Model Get AppKey List ");
978 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_APPKEY_LIST,
979 in_param1, in_param2, in_param3, in_param4,
980 user_info->cb, user_info->user_data);
982 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
986 BT_EXPORT_API int bluetooth_mesh_model_set_publication(
987 bluetooth_mesh_model_configure_t *req)
990 bt_user_info_t *user_info;
992 BT_CHECK_PARAMETER(req, return);
994 user_info = _bt_get_user_data(BT_MESH);
995 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
998 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1000 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1002 BT_INFO("Mesh: Model Set Publication");
1003 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_SET_PUBLICATION,
1004 in_param1, in_param2, in_param3, in_param4,
1005 user_info->cb, user_info->user_data);
1007 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1011 BT_EXPORT_API int bluetooth_mesh_model_get_publication(
1012 bluetooth_mesh_model_configure_t *req)
1015 bt_user_info_t *user_info;
1017 BT_CHECK_PARAMETER(req, return);
1019 user_info = _bt_get_user_data(BT_MESH);
1020 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1023 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1025 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1027 BT_INFO("Mesh:BTAPI: Model Get Publication");
1028 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_PUBLICATION,
1029 in_param1, in_param2, in_param3, in_param4,
1030 user_info->cb, user_info->user_data);
1032 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1036 BT_EXPORT_API int bluetooth_mesh_model_get_subscriptopn_list(
1037 bluetooth_mesh_model_configure_t *req)
1040 bt_user_info_t *user_info;
1042 BT_CHECK_PARAMETER(req, return);
1044 user_info = _bt_get_user_data(BT_MESH);
1045 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1048 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1050 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1052 BT_INFO("Mesh:BTAPI: Model Get Subscription List ");
1053 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
1054 in_param1, in_param2, in_param3, in_param4,
1055 user_info->cb, user_info->user_data);
1057 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1061 BT_EXPORT_API int bluetooth_mesh_network_remove_group(
1062 bluetooth_mesh_network_t *network,
1063 bluetooth_mesh_network_group_info_t *req)
1067 BT_CHECK_PARAMETER(network, return);
1068 BT_CHECK_PARAMETER(req, return);
1071 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1073 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
1074 g_array_append_vals(in_param2, req, sizeof(bluetooth_mesh_network_group_info_t));
1076 BT_INFO("Mesh: Remove Group Request");
1077 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_REMOVE_GROUP,
1078 in_param1, in_param2, in_param3, in_param4, &out_param);
1080 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1085 BT_EXPORT_API int bluetooth_mesh_network_create_group(
1086 bluetooth_mesh_network_t *network, bool is_virtual,
1087 uint16_t grp_addr, bluetooth_mesh_network_group_info_t *info)
1091 BT_CHECK_PARAMETER(network, return);
1092 BT_CHECK_PARAMETER(info, return);
1095 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1097 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
1098 g_array_append_vals(in_param2, &is_virtual, sizeof(gboolean));
1099 g_array_append_vals(in_param3, &grp_addr, sizeof(guint16));
1101 BT_INFO("Mesh: Create Group Request");
1102 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CREATE_GROUP,
1103 in_param1, in_param2, in_param3, in_param4, &out_param);
1105 if (result == BLUETOOTH_ERROR_NONE) {
1106 *info = g_array_index(out_param,
1107 bluetooth_mesh_network_group_info_t, 0);
1109 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1114 BT_EXPORT_API int bluetooth_mesh_model_configure_group_sub(
1115 bluetooth_mesh_model_configure_t *req)
1118 bt_user_info_t *user_info;
1120 BT_CHECK_PARAMETER(req, return);
1122 user_info = _bt_get_user_data(BT_MESH);
1123 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1126 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1128 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1130 BT_INFO("Mesh:Model Group Subscription Request");
1131 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIG_GROUP_SUB,
1132 in_param1, in_param2, in_param3, in_param4,
1133 user_info->cb, user_info->user_data);
1135 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1139 BT_EXPORT_API int bluetooth_mesh_model_configure_virtual_group_sub(
1140 bluetooth_mesh_model_configure_t *req)
1143 bt_user_info_t *user_info;
1145 BT_CHECK_PARAMETER(req, return);
1147 user_info = _bt_get_user_data(BT_MESH);
1148 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1151 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1153 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1155 BT_INFO("Mesh: Model Virtual Group Subscription Request");
1156 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
1157 BT_MESH_MODEL_CONFIG_VIRTUAL_GROUP_SUB,
1158 in_param1, in_param2, in_param3, in_param4,
1159 user_info->cb, user_info->user_data);
1161 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);