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 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
52 BT_ERR("Fail to init the mesh in bt-service");
56 ret = _bt_init_event_handler();
58 if (ret != BLUETOOTH_ERROR_NONE &&
59 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
60 BT_ERR("Fail to init the event handler");
64 _bt_set_user_data(BT_MESH, (void *)cb, user_data);
66 /* Register All events */
67 ret = _bt_register_event(BT_MESH_EVENT, (void *)cb, user_data);
68 if (ret != BLUETOOTH_ERROR_NONE &&
69 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
70 _bt_deinit_event_handler();
74 BT_INFO("Mesh: Event registsred");
75 return BLUETOOTH_ERROR_NONE;
78 BT_EXPORT_API int bluetooth_mesh_deinit(void)
82 _bt_unregister_event(BT_MESH_EVENT);
83 _bt_set_user_data(BT_MESH, NULL, NULL);
86 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
88 ret = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_DEINIT,
89 in_param1, in_param2, in_param3, in_param4, &out_param);
91 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
93 if (ret != BLUETOOTH_ERROR_NONE) {
94 BT_ERR("Fail to init the mesh in bt-service");
98 return BLUETOOTH_ERROR_NONE;
101 BT_EXPORT_API int bluetooth_mesh_network_unload(bluetooth_mesh_network_t *network)
105 BT_CHECK_PARAMETER(network, return);
108 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
110 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
112 BT_INFO("Mesh: Network Unload");
113 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UNLOAD,
114 in_param1, in_param2, in_param3, in_param4, &out_param);
115 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
120 BT_EXPORT_API int bluetooth_mesh_network_destroy(bluetooth_mesh_network_t *network)
124 BT_CHECK_PARAMETER(network, return);
127 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
129 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
131 BT_INFO("Mesh: Network Destroy");
132 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DESTROY,
133 in_param1, in_param2, in_param3, in_param4, &out_param);
134 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
139 BT_EXPORT_API int bluetooth_mesh_node_reset(bluetooth_mesh_node_info_t *node)
143 BT_CHECK_PARAMETER(node, return);
146 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
148 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_info_t));
150 BT_INFO("Mesh: Reset the Node");
151 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_RESET,
152 in_param1, in_param2, in_param3, in_param4, &out_param);
153 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
158 BT_EXPORT_API int bluetooth_mesh_network_create(
159 const char *net_name, bluetooth_mesh_node_t *node,
160 uint16_t total_models, bluetooth_mesh_model_t **models,
161 bluetooth_mesh_network_t *network)
164 char network_name[BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX+1];
166 BT_CHECK_PARAMETER(net_name, return);
167 BT_CHECK_PARAMETER(node, return);
168 BT_CHECK_PARAMETER(models, return);
171 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
173 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_t));
175 g_strlcpy(network_name, net_name, sizeof(network_name));
176 g_array_append_vals(in_param2, network_name,
177 BLUETOOTH_MESH_NETWORK_NAME_STRING_MAX);
179 for (int i = 0; i < total_models; i++)
180 g_array_append_vals(in_param3, models[i],
181 sizeof(bluetooth_mesh_model_t));
183 result = _bt_send_request(BT_BLUEZ_SERVICE,
184 BT_MESH_NETWORK_CREATE,
185 in_param1, in_param2, in_param3,
186 in_param4, &out_param);
188 if (result == BLUETOOTH_ERROR_NONE) {
189 *network = g_array_index(out_param,
190 bluetooth_mesh_network_t, 0);
193 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
198 BT_EXPORT_API int bluetooth_mesh_network_load(
200 bluetooth_mesh_network_t *network)
203 char token_string[BLUETOOTH_MESH_TOKEN_STRING_MAX + 1];
205 BT_CHECK_PARAMETER(token, return);
206 BT_CHECK_PARAMETER(network, return);
209 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
211 g_strlcpy(token_string, token, sizeof(token_string));
212 g_array_append_vals(in_param1, token_string, BLUETOOTH_MESH_TOKEN_STRING_MAX);
214 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_LOAD,
215 in_param1, in_param2, in_param3, in_param4, &out_param);
217 if (result == BLUETOOTH_ERROR_NONE) {
218 *network = g_array_index(out_param,
219 bluetooth_mesh_network_t, 0);
222 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
227 BT_EXPORT_API int bluetooth_mesh_network_join(
228 bluetooth_mesh_node_t *node, uint16_t total_models,
229 bluetooth_mesh_model_t **models)
233 BT_CHECK_PARAMETER(node, return);
234 BT_CHECK_PARAMETER(models, return);
237 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
239 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_t));
241 for (int i = 0; i < total_models; i++)
242 g_array_append_vals(in_param2, models[i],
243 sizeof(bluetooth_mesh_model_t));
245 result = _bt_send_request(BT_BLUEZ_SERVICE,
246 BT_MESH_NETWORK_JOIN,
247 in_param1, in_param2, in_param3,
248 in_param4, &out_param);
249 if (result == BLUETOOTH_ERROR_NONE) {
250 *node = g_array_index(out_param,
251 bluetooth_mesh_node_t, 0);
254 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
259 BT_EXPORT_API int bluetooth_mesh_cancel_join(
260 bluetooth_mesh_node_info_t *node)
264 BT_CHECK_PARAMETER(node, return);
267 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
268 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_info_t));
270 BT_INFO("Mesh: Cancel Ongoing Join");
271 BT_INFO("Mesh: Node UUID [%s]", node->net_uuid);
272 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_CANCEL_JOIN,
273 in_param1, in_param2, in_param3, in_param4, &out_param);
274 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
279 BT_EXPORT_API int bluetooth_mesh_network_scan(
280 bluetooth_mesh_network_t *network,
281 bluetooth_mesh_scan_param_t *scan_param)
285 BT_CHECK_PARAMETER(network, return);
286 BT_CHECK_PARAMETER(scan_param, return);
289 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
291 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
293 g_array_append_vals(in_param2, scan_param, sizeof(bluetooth_mesh_scan_param_t));
295 BT_INFO("Mesh:Start Scan, time [%u]", scan_param->scan_time);
296 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SCAN,
297 in_param1, in_param2, in_param3, in_param4, &out_param);
298 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
303 BT_EXPORT_API int bluetooth_mesh_network_cancel_scan(
304 bluetooth_mesh_network_t *network)
308 BT_CHECK_PARAMETER(network, return);
311 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
315 BT_INFO("Mesh: Cancel Scan");
316 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CANCEL_SCAN,
317 in_param1, in_param2, in_param3, in_param4, &out_param);
318 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
323 BT_EXPORT_API int bluetooth_mesh_network_set_capabilities(
324 bluetooth_mesh_network_t *network,
325 bluetooth_mesh_provisioner_caps_t *caps)
329 BT_CHECK_PARAMETER(network, return);
330 BT_CHECK_PARAMETER(caps, return);
333 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
335 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
337 g_array_append_vals(in_param2, caps, sizeof(bluetooth_mesh_provisioner_caps_t));
339 BT_INFO("Mesh: Set Provisioner capabilities");
340 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_CAPABILITIES,
341 in_param1, in_param2, in_param3, in_param4, &out_param);
342 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
347 BT_EXPORT_API int bluetooth_mesh_network_provision_device(
348 bluetooth_mesh_provisioning_request_t *req)
351 bt_user_info_t *user_info;
353 BT_CHECK_PARAMETER(req, return);
355 user_info = _bt_get_user_data(BT_MESH);
356 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
359 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
361 g_array_append_vals(in_param1, req,
362 sizeof(bluetooth_mesh_provisioning_request_t));
364 BT_INFO("Mesh: Set Provision Device");
365 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
366 BT_MESH_NETWORK_PROVISION_DEVICE,
367 in_param1, in_param2, in_param3, in_param4,
368 user_info->cb, user_info->user_data);
370 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
375 BT_EXPORT_API int bluetooth_mesh_authentication_reply(int auth_type,
376 const char *auth_val, gboolean reply)
380 char auth_string[BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX];
382 BT_CHECK_PARAMETER(auth_val, return);
385 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
387 g_strlcpy(auth_string, auth_val,
388 sizeof(auth_string));
389 g_array_append_vals(in_param1,
390 &auth_type, sizeof(int));
391 g_array_append_vals(in_param2, auth_string,
392 BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX);
393 g_array_append_vals(in_param3, &reply, sizeof(gboolean));
395 BT_INFO("Mesh: Set Provisioner Authentication Reply");
396 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_AUTHENTICATION_REPLY,
397 in_param1, in_param2, in_param3, in_param4, &out_param);
399 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
404 BT_EXPORT_API int bluetooth_mesh_network_set_name(
405 bluetooth_mesh_network_t *network)
409 BT_CHECK_PARAMETER(network, 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));
416 BT_INFO("Mesh:Set Network Name");
417 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_SET_NAME,
418 in_param1, in_param2, in_param3, in_param4, &out_param);
419 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
424 BT_EXPORT_API int bluetooth_mesh_network_add_netkey(
425 bluetooth_mesh_network_t *network,
426 uint16_t *netkey_idx)
430 BT_CHECK_PARAMETER(network, return);
431 BT_CHECK_PARAMETER(netkey_idx, return);
434 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
436 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
438 BT_INFO("Mesh:Set Create Subnetwork key");
439 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_NETKEY,
440 in_param1, in_param2, in_param3, in_param4, &out_param);
441 if (result == BLUETOOTH_ERROR_NONE)
442 *netkey_idx = g_array_index(out_param, guint16, 0);
443 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
448 BT_EXPORT_API int bluetooth_mesh_network_delete_netkey(
449 bluetooth_mesh_network_t *network,
454 BT_CHECK_PARAMETER(network, return);
457 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
459 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
460 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
462 BT_INFO("Mesh: Delete Subnetwork key");
463 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_NETKEY,
464 in_param1, in_param2, in_param3, in_param4, &out_param);
465 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
470 BT_EXPORT_API int bluetooth_mesh_network_update_netkey(
471 bluetooth_mesh_network_t *network,
476 BT_CHECK_PARAMETER(network, return);
479 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
481 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
482 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
484 BT_INFO("Mesh: Update Subnetwork key");
485 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_NETKEY,
486 in_param1, in_param2, in_param3, in_param4, &out_param);
487 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
492 BT_EXPORT_API int bluetooth_mesh_network_add_appkey(
493 bluetooth_mesh_network_t *network,
494 uint16_t netkey_index,
495 uint16_t *appkey_index)
499 BT_CHECK_PARAMETER(network, return);
500 BT_CHECK_PARAMETER(appkey_index, return);
503 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
505 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
506 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
508 BT_INFO("Mesh: Create AppKey");
509 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_ADD_APPKEY,
510 in_param1, in_param2, in_param3, in_param4, &out_param);
512 if (result == BLUETOOTH_ERROR_NONE)
513 *appkey_index = g_array_index(out_param, guint16, 0);
514 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
519 BT_EXPORT_API int bluetooth_mesh_network_update_appkey(
520 bluetooth_mesh_network_t *network,
521 uint16_t netkey_index, uint16_t appkey_index)
525 BT_CHECK_PARAMETER(network, return);
528 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
530 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
531 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
532 g_array_append_vals(in_param3, &appkey_index, sizeof(guint16));
534 BT_INFO("Mesh:BTAPI: Update AppKey");
535 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_UPDATE_APPKEY,
536 in_param1, in_param2, in_param3, in_param4, &out_param);
538 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
543 BT_EXPORT_API int bluetooth_mesh_network_delete_appkey(bluetooth_mesh_network_t *network,
544 uint16_t netkey_index, uint16_t appkey_index)
548 BT_CHECK_PARAMETER(network, return);
551 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
553 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
554 g_array_append_vals(in_param2, &netkey_index, sizeof(guint16));
555 g_array_append_vals(in_param3, &appkey_index, sizeof(guint16));
557 BT_INFO("Mesh: Delete AppKey");
558 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_DELETE_APPKEY,
559 in_param1, in_param2, in_param3, in_param4, &out_param);
561 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
566 BT_EXPORT_API int bluetooth_mesh_network_get_all_nodes(
567 bluetooth_mesh_network_t *network,
570 int result = BLUETOOTH_ERROR_NONE;
573 bluetooth_mesh_node_info_t *info;
575 BT_CHECK_PARAMETER(network, return);
576 BT_CHECK_PARAMETER(nodes, return);
579 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
581 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
583 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NODES,
584 in_param1, in_param2, in_param3, in_param4, &out_param);
586 if (result == BLUETOOTH_ERROR_NONE) {
587 if (out_param == NULL) {
588 BT_ERR("Mesh: out_param is NULL");
589 result = BLUETOOTH_ERROR_INTERNAL;
591 size = (out_param->len) / sizeof(bluetooth_mesh_node_info_t);
593 for (i = 0; i < size; i++) {
594 bluetooth_mesh_node_info_t *data;
596 info = &g_array_index(out_param,
597 bluetooth_mesh_node_info_t, i);
599 data = g_memdup2(info, sizeof(bluetooth_mesh_node_info_t));
600 g_ptr_array_add(*nodes, (gpointer)data);
605 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
610 BT_EXPORT_API int bluetooth_mesh_element_get_all_models(
611 bluetooth_mesh_network_t *network,
612 uint16_t node_addr, int elem_idx,
615 int result = BLUETOOTH_ERROR_NONE;
619 BT_CHECK_PARAMETER(network, return);
620 BT_CHECK_PARAMETER(models, return);
623 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
625 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
626 g_array_append_vals(in_param2, &node_addr, sizeof(guint16));
627 g_array_append_vals(in_param3, &elem_idx, sizeof(int));
629 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_ELEMENT_GET_MODELS,
630 in_param1, in_param2, in_param3, in_param4, &out_param);
632 if (result == BLUETOOTH_ERROR_NONE) {
633 if (out_param == NULL) {
634 BT_ERR("Mesh: out_param is NULL");
635 result = BLUETOOTH_ERROR_INTERNAL;
637 size = (out_param->len) / sizeof(guint32);
638 BT_INFO("Mesh: Total Models found in Element [%d]", size);
640 for (i = 0; i < size; i++) {
642 uint32_t *model_ptr = NULL;
644 model_obj = g_array_index(out_param,
647 model_ptr = g_memdup2(&model_obj, sizeof(guint32));
648 g_ptr_array_add(*models, (gpointer)model_ptr);
653 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
658 BT_EXPORT_API int bluetooth_mesh_node_browse_vendor_features(
659 bluetooth_mesh_node_features_t *req)
662 bt_user_info_t *user_info;
664 BT_CHECK_PARAMETER(req, return);
666 user_info = _bt_get_user_data(BT_MESH);
667 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
670 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
672 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_features_t));
674 BT_INFO("Mesh: Browse Vendor features of Node");
675 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_VENDOR_FEATURES,
676 in_param1, in_param2, in_param3, in_param4,
677 user_info->cb, user_info->user_data);
679 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
684 BT_EXPORT_API int bluetooth_mesh_browse_remote_node(
685 bluetooth_mesh_node_discover_t *req)
688 bt_user_info_t *user_info;
690 BT_CHECK_PARAMETER(req, return);
692 user_info = _bt_get_user_data(BT_MESH);
693 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
696 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
698 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_discover_t));
700 BT_INFO("Mesh: Browse remote Node");
701 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_BROWSE,
702 in_param1, in_param2, in_param3, in_param4,
703 user_info->cb, user_info->user_data);
705 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
710 BT_EXPORT_API int bluetooth_mesh_node_ttl_execute(
711 bluetooth_mesh_node_ttl_info_t *req)
714 bt_user_info_t *user_info;
716 BT_CHECK_PARAMETER(req, return);
718 user_info = _bt_get_user_data(BT_MESH);
719 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
722 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
724 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_ttl_info_t));
726 BT_INFO("Mesh: Node TTL Execute");
727 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_TTL_EXECUTE,
728 in_param1, in_param2, in_param3, in_param4,
729 user_info->cb, user_info->user_data);
731 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
736 BT_EXPORT_API int bluetooth_mesh_model_configure_appkey(
737 bluetooth_mesh_model_configure_t *req)
740 bt_user_info_t *user_info;
742 BT_CHECK_PARAMETER(req, return);
744 user_info = _bt_get_user_data(BT_MESH);
745 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
748 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
750 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
752 BT_INFO("Mesh: Node Model Configure AppKey");
753 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIGURE_APPKEY,
754 in_param1, in_param2, in_param3, in_param4,
755 user_info->cb, user_info->user_data);
757 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
762 BT_EXPORT_API int bluetooth_mesh_model_send_msg(
763 bluetooth_mesh_model_msg_t *req)
766 bt_user_info_t *user_info;
768 BT_CHECK_PARAMETER(req, return);
770 user_info = _bt_get_user_data(BT_MESH);
771 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
774 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
776 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_msg_t));
778 BT_INFO("Mesh: Node Model Send Msg");
779 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_EXECUTE_MSG,
780 in_param1, in_param2, in_param3, in_param4,
781 user_info->cb, user_info->user_data);
783 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
788 BT_EXPORT_API int bluetooth_mesh_model_send_response(
789 bluetooth_mesh_model_msg_t *req)
792 bt_user_info_t *user_info;
794 BT_CHECK_PARAMETER(req, return);
796 user_info = _bt_get_user_data(BT_MESH);
797 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
800 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
801 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_msg_t));
803 BT_INFO("Mesh: Node Model Send Response");
804 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_MODEL_RESPONSE_MSG,
805 in_param1, in_param2, in_param3, in_param4,
808 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
812 BT_EXPORT_API int bluetooth_mesh_node_configure_key(
813 bluetooth_mesh_key_configure_t *req)
816 bt_user_info_t *user_info;
818 BT_CHECK_PARAMETER(req, return);
820 user_info = _bt_get_user_data(BT_MESH);
821 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
824 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
826 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_key_configure_t));
828 BT_INFO("Mesh:BTAPI: Node Key Configure");
829 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_NODE_CONFIGURE_KEY,
830 in_param1, in_param2, in_param3, in_param4,
831 user_info->cb, user_info->user_data);
833 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
838 BT_EXPORT_API int bluetooth_mesh_network_get_all_groups(
839 bluetooth_mesh_network_t *network,
842 int result = BLUETOOTH_ERROR_NONE;
843 bluetooth_mesh_network_group_info_t *info;
847 BT_CHECK_PARAMETER(network, return);
848 BT_CHECK_PARAMETER(groups, return);
851 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
853 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
855 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_GROUPS,
856 in_param1, in_param2, in_param3, in_param4, &out_param);
858 if (result == BLUETOOTH_ERROR_NONE) {
859 if (out_param == NULL) {
860 BT_ERR("Mesh: out_param is NULL");
861 result = BLUETOOTH_ERROR_INTERNAL;
863 size = (out_param->len) / sizeof(bluetooth_mesh_network_group_info_t);
866 BT_INFO("Mesh: No Groups created for the network");
868 BT_INFO("Mesh: Total groups [%d]", size);
869 for (i = 0; i < size; i++) {
870 bluetooth_mesh_network_group_info_t *grp_info = NULL;
872 info = &g_array_index(out_param,
873 bluetooth_mesh_network_group_info_t, i);
874 BT_INFO("Mesh: Group addr [0x%2.2x]", info->group_addr);
875 BT_INFO("Mesh: Group is Virtual [%s]", info->is_virtual ? "YES" : "NO");
876 BT_INFO("Mesh: Group net UUID[%s]", info->net_uuid);
877 if (info->is_virtual)
878 BT_INFO("Mesh: Virual Label UUID [%s]", info->label_uuid);
879 grp_info = g_memdup2(info,
880 sizeof(bluetooth_mesh_network_group_info_t));
881 g_ptr_array_add(*groups, (gpointer)grp_info);
886 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
891 BT_EXPORT_API int bluetooth_mesh_network_get_all_netkey(
892 bluetooth_mesh_network_t *network,
895 int result = BLUETOOTH_ERROR_NONE;
899 BT_CHECK_PARAMETER(network, return);
900 BT_CHECK_PARAMETER(netkeys, return);
903 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
905 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
907 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_NETKEYS,
908 in_param1, in_param2, in_param3, in_param4, &out_param);
910 if (result == BLUETOOTH_ERROR_NONE) {
911 if (out_param == NULL) {
912 BT_ERR("Mesh: out_param is NULL");
913 result = BLUETOOTH_ERROR_INTERNAL;
915 size = (out_param->len) / sizeof(guint16);
918 BT_ERR("Mesh: No netkeys created for the network");
919 result = BLUETOOTH_ERROR_NOT_FOUND;
922 for (i = 0; i < size; i++) {
923 uint16_t netkey_index;
924 uint16_t *netkey_idx = NULL;
926 netkey_index = g_array_index(out_param,
929 netkey_idx = g_memdup2(&netkey_index, sizeof(guint16));
930 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
935 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
940 BT_EXPORT_API int bluetooth_mesh_netkey_get_all_appkey(
941 bluetooth_mesh_network_t *network,
945 int result = BLUETOOTH_ERROR_NONE;
949 BT_CHECK_PARAMETER(network, return);
950 BT_CHECK_PARAMETER(appkeys, return);
953 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
955 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
956 g_array_append_vals(in_param2, &netkey_idx, sizeof(guint16));
958 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_GET_APPKEYS,
959 in_param1, in_param2, in_param3, in_param4, &out_param);
961 if (result == BLUETOOTH_ERROR_NONE) {
962 if (out_param == NULL) {
963 BT_ERR("Mesh: out_param is NULL");
964 result = BLUETOOTH_ERROR_INTERNAL;
966 size = (out_param->len) / sizeof(guint16);
969 BT_ERR("Mesh: No Appkeys created for the NetKey in the network");
971 for (i = 0; i < size; i++) {
972 uint16_t appkey_index;
973 uint16_t *appkey_idx = NULL;
975 appkey_index = g_array_index(out_param,
978 appkey_idx = g_memdup2(&appkey_index, sizeof(guint16));
979 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
984 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
989 BT_EXPORT_API int bluetooth_mesh_node_get_all_netkeys(
990 bluetooth_mesh_node_discover_t *node,
993 int result = BLUETOOTH_ERROR_NONE;
997 BT_CHECK_PARAMETER(node, return);
998 BT_CHECK_PARAMETER(netkeys, return);
1001 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1003 g_array_append_vals(in_param1, node, sizeof(bluetooth_mesh_node_discover_t));
1005 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_NETKEYS,
1006 in_param1, in_param2, in_param3, in_param4, &out_param);
1008 if (result == BLUETOOTH_ERROR_NONE) {
1009 if (out_param == NULL) {
1010 BT_ERR("Mesh: out_param is NULL");
1011 result = BLUETOOTH_ERROR_INTERNAL;
1013 size = (out_param->len) / sizeof(guint16);
1015 for (i = 0; i < size; i++) {
1016 uint16_t netkey_index;
1017 uint16_t *netkey_idx = NULL;
1019 netkey_index = g_array_index(out_param,
1022 netkey_idx = g_memdup2(&netkey_index, sizeof(guint16));
1023 g_ptr_array_add(*netkeys, (gpointer)netkey_idx);
1028 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1033 BT_EXPORT_API int bluetooth_mesh_node_get_all_appkeys(
1034 bluetooth_mesh_node_discover_t *req, GPtrArray **appkeys)
1036 int result = BLUETOOTH_ERROR_NONE;
1040 BT_CHECK_PARAMETER(req, return);
1041 BT_CHECK_PARAMETER(appkeys, return);
1044 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1046 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_node_discover_t));
1048 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NODE_GET_APPKEYS,
1049 in_param1, in_param2, in_param3, in_param4, &out_param);
1051 if (result == BLUETOOTH_ERROR_NONE) {
1052 if (out_param == NULL) {
1053 BT_ERR("Mesh: out_param is NULL");
1054 result = BLUETOOTH_ERROR_INTERNAL;
1056 size = (out_param->len) / sizeof(guint16);
1058 for (i = 0; i < size; i++) {
1059 uint16_t appkey_index;
1060 uint16_t *appkey_idx = NULL;
1062 appkey_index = g_array_index(out_param,
1065 appkey_idx = g_memdup2(&appkey_index, sizeof(guint16));
1066 g_ptr_array_add(*appkeys, (gpointer)appkey_idx);
1071 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1076 BT_EXPORT_API int bluetooth_mesh_model_get_all_appkeys(
1077 bluetooth_mesh_model_configure_t *req)
1080 bt_user_info_t *user_info;
1082 BT_CHECK_PARAMETER(req, return);
1084 user_info = _bt_get_user_data(BT_MESH);
1085 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1088 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1090 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1092 BT_INFO("Mesh:Node Model Get AppKey List ");
1093 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_APPKEY_LIST,
1094 in_param1, in_param2, in_param3, in_param4,
1095 user_info->cb, user_info->user_data);
1097 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1101 BT_EXPORT_API int bluetooth_mesh_model_set_publication(
1102 bluetooth_mesh_model_configure_t *req)
1105 bt_user_info_t *user_info;
1107 BT_CHECK_PARAMETER(req, return);
1109 user_info = _bt_get_user_data(BT_MESH);
1110 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1113 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1115 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1117 BT_INFO("Mesh: Model Set Publication");
1118 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_SET_PUBLICATION,
1119 in_param1, in_param2, in_param3, in_param4,
1120 user_info->cb, user_info->user_data);
1122 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1126 BT_EXPORT_API int bluetooth_mesh_model_get_publication(
1127 bluetooth_mesh_model_configure_t *req)
1130 bt_user_info_t *user_info;
1132 BT_CHECK_PARAMETER(req, return);
1134 user_info = _bt_get_user_data(BT_MESH);
1135 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1138 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1140 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1142 BT_INFO("Mesh:BTAPI: Model Get Publication");
1143 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_PUBLICATION,
1144 in_param1, in_param2, in_param3, in_param4,
1145 user_info->cb, user_info->user_data);
1147 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1151 BT_EXPORT_API int bluetooth_mesh_model_get_subscriptopn_list(
1152 bluetooth_mesh_model_configure_t *req)
1155 bt_user_info_t *user_info;
1157 BT_CHECK_PARAMETER(req, return);
1159 user_info = _bt_get_user_data(BT_MESH);
1160 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1163 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1165 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1167 BT_INFO("Mesh:BTAPI: Model Get Subscription List ");
1168 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
1169 in_param1, in_param2, in_param3, in_param4,
1170 user_info->cb, user_info->user_data);
1172 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1176 BT_EXPORT_API int bluetooth_mesh_network_remove_group(
1177 bluetooth_mesh_network_t *network,
1178 bluetooth_mesh_network_group_info_t *req)
1182 BT_CHECK_PARAMETER(network, return);
1183 BT_CHECK_PARAMETER(req, return);
1186 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1188 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
1189 g_array_append_vals(in_param2, req, sizeof(bluetooth_mesh_network_group_info_t));
1191 BT_INFO("Mesh: Remove Group Request");
1192 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_REMOVE_GROUP,
1193 in_param1, in_param2, in_param3, in_param4, &out_param);
1195 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1200 BT_EXPORT_API int bluetooth_mesh_network_create_group(
1201 bluetooth_mesh_network_t *network, bool is_virtual,
1202 uint16_t grp_addr, bluetooth_mesh_network_group_info_t *info)
1206 BT_CHECK_PARAMETER(network, return);
1207 BT_CHECK_PARAMETER(info, return);
1210 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1212 g_array_append_vals(in_param1, network, sizeof(bluetooth_mesh_network_t));
1213 g_array_append_vals(in_param2, &is_virtual, sizeof(gboolean));
1214 g_array_append_vals(in_param3, &grp_addr, sizeof(guint16));
1216 BT_INFO("Mesh: Create Group Request");
1217 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_NETWORK_CREATE_GROUP,
1218 in_param1, in_param2, in_param3, in_param4, &out_param);
1220 if (result == BLUETOOTH_ERROR_NONE) {
1221 *info = g_array_index(out_param,
1222 bluetooth_mesh_network_group_info_t, 0);
1224 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1229 BT_EXPORT_API int bluetooth_mesh_model_configure_group_sub(
1230 bluetooth_mesh_model_configure_t *req)
1233 bt_user_info_t *user_info;
1235 BT_CHECK_PARAMETER(req, return);
1237 user_info = _bt_get_user_data(BT_MESH);
1238 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1241 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1243 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1245 BT_INFO("Mesh:Model Group Subscription Request");
1246 result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_CONFIG_GROUP_SUB,
1247 in_param1, in_param2, in_param3, in_param4,
1248 user_info->cb, user_info->user_data);
1250 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1254 BT_EXPORT_API int bluetooth_mesh_model_configure_virtual_group_sub(
1255 bluetooth_mesh_model_configure_t *req)
1258 bt_user_info_t *user_info;
1260 BT_CHECK_PARAMETER(req, return);
1262 user_info = _bt_get_user_data(BT_MESH);
1263 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
1266 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
1268 g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_configure_t));
1270 BT_INFO("Mesh: Model Virtual Group Subscription Request");
1271 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
1272 BT_MESH_MODEL_CONFIG_VIRTUAL_GROUP_SUB,
1273 in_param1, in_param2, in_param3, in_param4,
1274 user_info->cb, user_info->user_data);
1276 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);