4 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
6 * @author: Anupam Roy <anupam.r@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
31 #include "bt-hal-log.h"
32 #include "bt-hal-msg.h"
33 #include "bt-hal-utils.h"
35 #include "bt-hal-mesh-dbus-handler.h"
36 #include "bt-hal-event-receiver.h"
38 static const btmesh_callbacks_t *bt_hal_mesh_cbacks = NULL;
40 static bool interface_ready(void)
42 return bt_hal_mesh_cbacks != NULL;
45 static void __bt_hal_mesh_network_attached(void *buf, uint16_t len)
47 struct hal_ev_mesh_network_attached *ev = buf;
48 if (bt_hal_mesh_cbacks->network_attached_cb)
49 bt_hal_mesh_cbacks->network_attached_cb(ev->status,
51 (bt_mesh_token_t*)&ev->token,
52 (bt_uuid_t*)&ev->uuid);
55 static void __bt_hal_mesh_network_destroyed(void *buf, uint16_t len)
57 struct hal_ev_mesh_network_destroyed *ev = buf;
58 if (bt_hal_mesh_cbacks->network_destroyed_cb)
59 bt_hal_mesh_cbacks->network_destroyed_cb(ev->status,
60 (bt_mesh_token_t*)&ev->token,
61 (bt_uuid_t*)&ev->uuid);
64 static void __bt_hal_mesh_network_proxy_added(void *buf, uint16_t len)
66 struct hal_ev_mesh_network_proxy_added *ev = buf;
67 if (bt_hal_mesh_cbacks->network_proxy_added_cb)
68 bt_hal_mesh_cbacks->network_proxy_added_cb(ev->status);
71 static void __bt_hal_handle_network_scan_result(void *buf, uint16_t len)
73 struct hal_ev_mesh_scan_result *ev = buf;
74 bt_mesh_scan_result_t result;
75 memset(&result, 0x00, sizeof(bt_mesh_scan_result_t));
77 memcpy(result.dev_uuid.uu, ev->dev_uuid, 16);
78 memcpy(&result.oob_info, ev->oob_info, 2);
79 memcpy(&result.uri_hash, ev->uri_hash, 4);
80 result.rssi = ev->rssi;
82 if (bt_hal_mesh_cbacks->scan_result_cb)
83 bt_hal_mesh_cbacks->scan_result_cb(ev->status,
84 (bt_uuid_t*)&ev->net_uuid,
85 (bt_mesh_scan_result_t*)&result);
88 static void __bt_hal_handle_network_scan_status(void *buf, uint16_t len)
90 struct hal_ev_mesh_scan_state_changed *ev = buf;
92 if (bt_hal_mesh_cbacks->scan_status_cb)
93 bt_hal_mesh_cbacks->scan_status_cb(ev->state, ev->status,
94 (bt_uuid_t*)&ev->net_uuid);
97 static void __bt_hal_handle_network_provisioning_status(void *buf, uint16_t len)
99 struct hal_ev_mesh_provision_status *ev = buf;
101 INFO("Mesh: Send provstatus callback");
102 if (bt_hal_mesh_cbacks->provisioning_status_cb)
103 bt_hal_mesh_cbacks->provisioning_status_cb(ev->status,
104 (bt_uuid_t*)&ev->net_uuid,
105 (bt_uuid_t*)&ev->dev_uuid);
106 INFO("Mesh: Done Sending provstatus callback");
109 static void __bt_hal_handle_network_provisioning_finished(void *buf, uint16_t len)
111 struct hal_ev_mesh_provision_finished *ev = buf;
113 if (bt_hal_mesh_cbacks->provisioning_finished_cb)
114 bt_hal_mesh_cbacks->provisioning_finished_cb(ev->status, ev->reason,
115 (bt_uuid_t*)&ev->net_uuid, (bt_uuid_t*)&ev->dev_uuid,
116 ev->unicast, ev->count);
119 static void __bt_hal_handle_network_provisioning_data_requested(void *buf,
122 struct hal_ev_mesh_provision_data_request *ev = buf;
124 if (bt_hal_mesh_cbacks->provisioning_data_requested_cb)
125 bt_hal_mesh_cbacks->provisioning_data_requested_cb(
126 (bt_uuid_t*)&ev->net_uuid, ev->count);
129 static void __bt_hal_handle_authentication_requested(void *buf, uint16_t len)
131 struct hal_ev_mesh_authentication_request *ev = buf;
133 if (bt_hal_mesh_cbacks->authentication_requested_cb)
134 bt_hal_mesh_cbacks->authentication_requested_cb(
135 (bt_uuid_t*)&ev->net_uuid, ev->auth_type, ev->auth_value);
138 static void __bt_hal_handle_netkey_execute_event(void *buf, uint16_t len)
140 struct hal_ev_mesh_netkey_execute_event *ev = buf;
142 if (bt_hal_mesh_cbacks->netkey_execute_cb)
143 bt_hal_mesh_cbacks->netkey_execute_cb(ev->status,
144 (bt_uuid_t*)&ev->net_uuid,
145 ev->key_event, ev->key_idx);
148 static void __bt_hal_handle_appkey_execute_event(void *buf, uint16_t len)
150 struct hal_ev_mesh_appkey_execute_event *ev = buf;
152 if (bt_hal_mesh_cbacks->appkey_execute_cb)
153 bt_hal_mesh_cbacks->appkey_execute_cb(ev->status,
154 (bt_uuid_t*)&ev->net_uuid, ev->key_event,
155 ev->net_idx, ev->app_idx);
158 static void __bt_hal_handle_devkey_message_received_event(void *buf, uint16_t len)
160 struct hal_ev_mesh_devkey_message_event *ev = buf;
162 if (bt_hal_mesh_cbacks->devkey_msg_cb)
163 bt_hal_mesh_cbacks->devkey_msg_cb((bt_uuid_t*)&ev->net_uuid,
165 ev->is_remote_devkey, ev->netkey_idx,
166 ev->data_len, ev->data);
169 static void __bt_hal_handle_message_received_event(void *buf, uint16_t len)
171 struct hal_ev_mesh_message_event *ev = buf;
173 if (bt_hal_mesh_cbacks->msg_cb)
174 bt_hal_mesh_cbacks->msg_cb((bt_uuid_t*)&ev->net_uuid,
175 ev->is_prov, ev->source_addr,
176 ev->dest_addr, ev->key_idx,
177 ev->data_len, ev->data);
180 static void __bt_hal_handle_mesh_events(int message, void *buf, uint16_t len)
184 if (!interface_ready())
188 case HAL_EV_MESH_NETWORK_PROXY_ADDED:
189 DBG("Mesh Event: HAL_EV_MESH_NETWORK_PROXY_ADDED");
190 __bt_hal_mesh_network_proxy_added(buf, len);
192 case HAL_EV_MESH_NETWORK_ATTACHED:
193 DBG("Mesh Event: HAL_EV_MESH_NETWORK_ATTACHED");
194 __bt_hal_mesh_network_attached(buf, len);
196 case HAL_EV_MESH_NETWORK_DESTROYED:
197 DBG("Mesh Event: HAL_EV_MESH_NETWORK_DESTROYED");
198 __bt_hal_mesh_network_destroyed(buf, len);
200 case HAL_EV_MESH_SCAN_STATE_CHANGED:
201 DBG("Mesh Event: HAL_EV_MESH_SCAN_STATE_CHANGED");
202 __bt_hal_handle_network_scan_status(buf, len);
204 case HAL_EV_MESH_SCAN_RESULT:
205 DBG("Mesh Event: HAL_EV_MESH_SCAN_RESULT");
206 __bt_hal_handle_network_scan_result(buf, len);
208 case HAL_EV_MESH_PROVISIONING_STATUS:
209 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_STATUS");
210 __bt_hal_handle_network_provisioning_status(buf, len);
212 case HAL_EV_MESH_PROVISIONING_FINISHED:
213 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_FINISHED");
214 __bt_hal_handle_network_provisioning_finished(buf, len);
216 case HAL_EV_MESH_PROVISIONING_DATA_REQUEST:
217 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_DATA_REQUEST");
218 __bt_hal_handle_network_provisioning_data_requested(buf, len);
220 case HAL_EV_MESH_AUTHENTICATION_REQUEST:
221 DBG("Mesh Event: HAL_EV_MESH_AUTHENTICATION_REQUEST");
222 __bt_hal_handle_authentication_requested(buf, len);
224 case HAL_EV_MESH_NETKEY_EXECUTE_EVENT:
225 DBG("Mesh Event: HAL_EV_MESH_NETKEY_EXECUTE_EVENT");
226 __bt_hal_handle_netkey_execute_event(buf, len);
228 case HAL_EV_MESH_APPKEY_EXECUTE_EVENT:
229 DBG("Mesh Event: HAL_EV_MESH_APPKEY_EXECUTE_EVENT");
230 __bt_hal_handle_appkey_execute_event(buf, len);
232 case HAL_EV_MESH_DEVKEY_MESSAGE_EVENT:
233 DBG("Mesh Event: HAL_EV_MESH_DEVKEY_MESSAGE_EVENT");
234 __bt_hal_handle_devkey_message_received_event(buf, len);
236 case HAL_EV_MESH_MESSAGE_EVENT:
237 DBG("Mesh Event: HAL_EV_MESH_MESSAGE_EVENT");
238 __bt_hal_handle_message_received_event(buf, len);
241 DBG("Mesh Event Currently not handled!!");
248 static bt_status_t mesh_create_network(bt_hal_mesh_node_t *node,
249 GSList *models, bool is_prov)
252 return _bt_hal_mesh_create_network(node, models, is_prov);
255 static bt_status_t mesh_release_network(bt_uuid_t *network)
258 return _bt_hal_mesh_network_release(network);
261 static bt_status_t mesh_destroy_network(bt_uuid_t *network)
264 return _bt_hal_mesh_network_destroy(network);
267 static bt_status_t mesh_join_network(bt_hal_mesh_node_t *node,
271 return _bt_hal_mesh_join_network(node, models);
274 static bt_status_t mesh_join_cancel(bt_uuid_t *node_uuid)
277 return _bt_hal_mesh_join_cancel(node_uuid);
280 static bt_status_t mesh_delete_node(bt_uuid_t *network, uint16_t unicast,
281 uint16_t num_elements)
284 return _bt_hal_mesh_node_delete(network, unicast, num_elements);
287 static bt_status_t mesh_scan(bt_uuid_t *network, bt_hal_mesh_scan_param_t *param)
290 return _bt_hal_mesh_network_scan(network, param);
293 static bt_status_t mesh_scan_cancel(bt_uuid_t *network)
296 return _bt_hal_mesh_network_scan_cancel(network);
299 static bt_status_t mesh_set_prov_caps(bt_uuid_t *network,
300 bt_hal_mesh_prov_caps_t *caps)
303 return _bt_hal_mesh_network_set_caps(network, caps);
306 static bt_status_t mesh_provision_device(bt_uuid_t *network,
310 return _bt_hal_mesh_provision_device(network, dev_uuid);
313 static bt_status_t mesh_send_provision_data(bt_uuid_t* network_uuid,
314 uint16_t netkey_idx, uint16_t unicast)
317 return _bt_hal_mesh_send_provision_data(network_uuid,
318 netkey_idx, unicast);
321 static bt_status_t mesh_network_subnet_operation(bt_uuid_t* network_uuid,
322 bt_mesh_key_op_e op, uint16_t netkey_idx)
325 return _bt_hal_mesh_network_subnet_execute(network_uuid,
329 static bt_status_t mesh_network_appkey_operation(bt_uuid_t* network_uuid,
330 bt_mesh_key_op_e op, uint16_t netkey_idx,
334 return _bt_hal_mesh_network_appkey_execute(network_uuid,
335 op, netkey_idx, appkey_idx);
338 static bt_status_t mesh_auth_reply(bt_hal_mesh_auth_variant_e auth_type,
339 const char *auth_value)
342 return _bt_hal_mesh_auth_reply(auth_type, auth_value);
345 /* Remote Node operations */
346 static bt_status_t mesh_send_configuration_message(bt_uuid_t *network,
347 uint16_t dest, bool is_dev_key, uint16_t netkey_idx,
348 uint8_t *buf, int len)
351 return _bt_hal_mesh_send_configuration_message(network, dest,
352 is_dev_key, netkey_idx, buf, len);
355 static bt_status_t mesh_key_configuration_message(bt_uuid_t *network,
356 uint16_t dest, bool is_netkey,
357 bool is_update, uint16_t key_idx,
361 return _bt_hal_mesh_send_key_config_message(network, dest,
362 is_netkey, is_update,
363 key_idx, netkey_idx);
366 static bt_status_t mesh_model_execute_message(bt_uuid_t *network,
367 uint16_t dest, uint16_t appkey_idx, uint8_t *buf,
371 return _bt_hal_mesh_model_execute_message(network, dest,
372 appkey_idx, buf, len);
375 static bt_status_t init(btmesh_callbacks_t *callbacks)
379 if (interface_ready())
380 return BT_STATUS_SUCCESS;
382 bt_hal_mesh_cbacks = callbacks;
383 INFO("Register Mesh events callback function");
385 _bt_hal_mesh_register_dbus_handler_cb(__bt_hal_handle_mesh_events);
386 _bt_hal_register_event_handler_cb(HAL_MESH, __bt_hal_handle_mesh_events);
388 if (!_bt_hal_mesh_stack_init())
389 return BT_STATUS_FAIL;
391 return BT_STATUS_SUCCESS;
394 static void cleanup(void)
398 if (!interface_ready())
401 _bt_hal_mesh_unregister_dbus_handler_cb();
402 _bt_hal_unregister_event_handler_cb(HAL_MESH);
404 _bt_hal_mesh_stack_deinit();
406 bt_hal_mesh_cbacks = NULL;
409 static btmesh_interface_t mesh_if = {
410 .size = sizeof(mesh_if),
412 .create = mesh_create_network,
413 .destroy = mesh_destroy_network,
414 .join = mesh_join_network,
415 .cancel = mesh_join_cancel,
416 .release = mesh_release_network,
417 .delete_node = mesh_delete_node,
419 .scan_cancel = mesh_scan_cancel,
420 .capability = mesh_set_prov_caps,
421 .provision = mesh_provision_device,
422 .provision_data = mesh_send_provision_data,
423 .auth_reply = mesh_auth_reply,
424 .subnet_execute = mesh_network_subnet_operation,
425 .appkey_execute = mesh_network_appkey_operation,
426 .config_send = mesh_send_configuration_message,
427 .key_send = mesh_key_configuration_message,
428 .msg_execute = mesh_model_execute_message,
432 btmesh_interface_t *bt_get_mesh_interface(void)