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,
50 (bt_mesh_token_t*)&ev->token,
51 (bt_uuid_t*)&ev->uuid);
54 static void __bt_hal_handle_network_scan_result(void *buf, uint16_t len)
56 struct hal_ev_mesh_scan_result *ev = buf;
57 bt_mesh_scan_result_t result;
58 memset(&result, 0x00, sizeof(bt_mesh_scan_result_t));
60 memcpy(result.dev_uuid.uu, ev->dev_uuid, 16);
61 memcpy(&result.oob_info, ev->oob_info, 2);
62 memcpy(&result.uri_hash, ev->uri_hash, 4);
63 result.rssi = ev->rssi;
65 if (bt_hal_mesh_cbacks->scan_result_cb)
66 bt_hal_mesh_cbacks->scan_result_cb(ev->status,
67 (bt_uuid_t*)&ev->net_uuid,
68 (bt_mesh_scan_result_t*)&result);
71 static void __bt_hal_handle_network_scan_status(void *buf, uint16_t len)
73 struct hal_ev_mesh_scan_state_changed *ev = buf;
75 if (bt_hal_mesh_cbacks->scan_status_cb)
76 bt_hal_mesh_cbacks->scan_status_cb(ev->state, ev->status,
77 (bt_uuid_t*)&ev->net_uuid);
80 static void __bt_hal_handle_network_provisioning_status(void *buf, uint16_t len)
82 struct hal_ev_mesh_provision_status *ev = buf;
84 INFO("Mesh: Send provstatus callback");
85 if (bt_hal_mesh_cbacks->provisioning_status_cb)
86 bt_hal_mesh_cbacks->provisioning_status_cb(ev->status,
87 (bt_uuid_t*)&ev->net_uuid,
88 (bt_uuid_t*)&ev->dev_uuid);
89 INFO("Mesh: Done Sending provstatus callback");
92 static void __bt_hal_handle_network_provisioning_finished(void *buf, uint16_t len)
94 struct hal_ev_mesh_provision_finished *ev = buf;
96 if (bt_hal_mesh_cbacks->provisioning_finished_cb)
97 bt_hal_mesh_cbacks->provisioning_finished_cb(ev->status, ev->reason,
98 (bt_uuid_t*)&ev->net_uuid, (bt_uuid_t*)&ev->dev_uuid,
99 ev->unicast, ev->count);
102 static void __bt_hal_handle_network_provisioning_data_requested(void *buf,
105 struct hal_ev_mesh_provision_data_request *ev = buf;
107 if (bt_hal_mesh_cbacks->provisioning_data_requested_cb)
108 bt_hal_mesh_cbacks->provisioning_data_requested_cb(
109 (bt_uuid_t*)&ev->net_uuid, ev->count);
112 static void __bt_hal_handle_authentication_requested(void *buf, uint16_t len)
114 struct hal_ev_mesh_authentication_request *ev = buf;
116 if (bt_hal_mesh_cbacks->authentication_requested_cb)
117 bt_hal_mesh_cbacks->authentication_requested_cb(
118 (bt_uuid_t*)&ev->net_uuid, ev->auth_type, ev->auth_value);
121 static void __bt_hal_handle_netkey_execute_event(void *buf, uint16_t len)
123 struct hal_ev_mesh_netkey_execute_event *ev = buf;
125 if (bt_hal_mesh_cbacks->netkey_execute_cb)
126 bt_hal_mesh_cbacks->netkey_execute_cb(ev->status,
127 (bt_uuid_t*)&ev->net_uuid,
128 ev->key_event, ev->key_idx);
131 static void __bt_hal_handle_appkey_execute_event(void *buf, uint16_t len)
133 struct hal_ev_mesh_appkey_execute_event *ev = buf;
135 if (bt_hal_mesh_cbacks->appkey_execute_cb)
136 bt_hal_mesh_cbacks->appkey_execute_cb(ev->status,
137 (bt_uuid_t*)&ev->net_uuid, ev->key_event,
138 ev->net_idx, ev->app_idx);
141 static void __bt_hal_handle_devkey_message_received_event(void *buf, uint16_t len)
143 struct hal_ev_mesh_devkey_message_event *ev = buf;
145 if (bt_hal_mesh_cbacks->devkey_msg_cb)
146 bt_hal_mesh_cbacks->devkey_msg_cb((bt_uuid_t*)&ev->net_uuid,
148 ev->is_remote_devkey, ev->netkey_idx,
149 ev->data_len, ev->data);
152 static void __bt_hal_handle_message_received_event(void *buf, uint16_t len)
154 struct hal_ev_mesh_message_event *ev = buf;
156 if (bt_hal_mesh_cbacks->msg_cb)
157 bt_hal_mesh_cbacks->msg_cb((bt_uuid_t*)&ev->net_uuid,
159 ev->dest_addr, ev->key_idx,
160 ev->data_len, ev->data);
163 static void __bt_hal_handle_mesh_events(int message, void *buf, uint16_t len)
167 if (!interface_ready())
171 case HAL_EV_MESH_NETWORK_ATTACHED:
172 DBG("Mesh Event: HAL_EV_MESH_NETWORK_ATTACHED");
173 __bt_hal_mesh_network_attached(buf, len);
175 case HAL_EV_MESH_SCAN_STATE_CHANGED:
176 DBG("Mesh Event: HAL_EV_MESH_SCAN_STATE_CHANGED");
177 __bt_hal_handle_network_scan_status(buf, len);
179 case HAL_EV_MESH_SCAN_RESULT:
180 DBG("Mesh Event: HAL_EV_MESH_SCAN_RESULT");
181 __bt_hal_handle_network_scan_result(buf, len);
183 case HAL_EV_MESH_PROVISIONING_STATUS:
184 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_STATUS");
185 __bt_hal_handle_network_provisioning_status(buf, len);
187 case HAL_EV_MESH_PROVISIONING_FINISHED:
188 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_FINISHED");
189 __bt_hal_handle_network_provisioning_finished(buf, len);
191 case HAL_EV_MESH_PROVISIONING_DATA_REQUEST:
192 DBG("Mesh Event: HAL_EV_MESH_PROVISIONING_DATA_REQUEST");
193 __bt_hal_handle_network_provisioning_data_requested(buf, len);
195 case HAL_EV_MESH_AUTHENTICATION_REQUEST:
196 DBG("Mesh Event: HAL_EV_MESH_AUTHENTICATION_REQUEST");
197 __bt_hal_handle_authentication_requested(buf, len);
199 case HAL_EV_MESH_NETKEY_EXECUTE_EVENT:
200 DBG("Mesh Event: HAL_EV_MESH_NETKEY_EXECUTE_EVENT");
201 __bt_hal_handle_netkey_execute_event(buf, len);
203 case HAL_EV_MESH_APPKEY_EXECUTE_EVENT:
204 DBG("Mesh Event: HAL_EV_MESH_APPKEY_EXECUTE_EVENT");
205 __bt_hal_handle_appkey_execute_event(buf, len);
207 case HAL_EV_MESH_DEVKEY_MESSAGE_EVENT:
208 DBG("Mesh Event: HAL_EV_MESH_DEVKEY_MESSAGE_EVENT");
209 __bt_hal_handle_devkey_message_received_event(buf, len);
211 case HAL_EV_MESH_MESSAGE_EVENT:
212 DBG("Mesh Event: HAL_EV_MESH_MESSAGE_EVENT");
213 __bt_hal_handle_message_received_event(buf, len);
216 DBG("Mesh Event Currently not handled!!");
223 static bt_status_t mesh_create_network(bt_hal_mesh_node_t *node,
224 GSList *models, bool is_prov)
227 return _bt_hal_mesh_create_network(node, models, is_prov);
230 static bt_status_t mesh_scan(bt_uuid_t *network, bt_hal_mesh_scan_param_t *param)
233 return _bt_hal_mesh_network_scan(network, param);
236 static bt_status_t mesh_scan_cancel(bt_uuid_t *network)
239 return _bt_hal_mesh_network_scan_cancel(network);
242 static bt_status_t mesh_set_prov_caps(bt_uuid_t *network,
243 bt_hal_mesh_prov_caps_t *caps)
246 return _bt_hal_mesh_network_set_caps(network, caps);
249 static bt_status_t mesh_provision_device(bt_uuid_t *network,
253 return _bt_hal_mesh_provision_device(network, dev_uuid);
256 static bt_status_t mesh_send_provision_data(bt_uuid_t* network_uuid,
257 uint16_t netkey_idx, uint16_t unicast)
260 return _bt_hal_mesh_send_provision_data(network_uuid,
261 netkey_idx, unicast);
264 static bt_status_t mesh_network_subnet_operation(bt_uuid_t* network_uuid,
265 bt_mesh_key_op_e op, uint16_t netkey_idx)
268 return _bt_hal_mesh_network_subnet_execute(network_uuid,
272 static bt_status_t mesh_network_appkey_operation(bt_uuid_t* network_uuid,
273 bt_mesh_key_op_e op, uint16_t netkey_idx,
277 return _bt_hal_mesh_network_appkey_execute(network_uuid,
278 op, netkey_idx, appkey_idx);
281 static bt_status_t mesh_auth_reply(bt_hal_mesh_auth_variant_e auth_type,
282 const char *auth_value)
285 return _bt_hal_mesh_auth_reply(auth_type, auth_value);
288 /* Remote Node operations */
289 static bt_status_t mesh_send_configuration_message(bt_uuid_t *network,
290 uint16_t dest, bool is_dev_key, uint16_t netkey_idx,
291 uint8_t *buf, int len)
294 return _bt_hal_mesh_send_configuration_message(network, dest,
295 is_dev_key, netkey_idx, buf, len);
298 static bt_status_t mesh_key_configuration_message(bt_uuid_t *network,
299 uint16_t dest, bool is_netkey,
300 bool is_update, uint16_t key_idx,
304 return _bt_hal_mesh_send_key_config_message(network, dest,
305 is_netkey, is_update,
306 key_idx, netkey_idx);
309 static bt_status_t mesh_model_execute_message(bt_uuid_t *network,
310 uint16_t dest, uint16_t appkey_idx, uint8_t *buf,
314 return _bt_hal_mesh_model_execute_message(network, dest,
315 appkey_idx, buf, len);
318 static bt_status_t init(btmesh_callbacks_t *callbacks)
322 if (interface_ready())
323 return BT_STATUS_SUCCESS;
325 bt_hal_mesh_cbacks = callbacks;
326 INFO("Register Mesh events callback function");
328 _bt_hal_mesh_register_dbus_handler_cb(__bt_hal_handle_mesh_events);
329 _bt_hal_register_event_handler_cb(HAL_MESH, __bt_hal_handle_mesh_events);
331 if (!_bt_hal_mesh_stack_init())
332 return BT_STATUS_FAIL;
334 return BT_STATUS_SUCCESS;
337 static void cleanup(void)
341 if (!interface_ready())
344 _bt_hal_mesh_unregister_dbus_handler_cb();
345 _bt_hal_unregister_event_handler_cb(HAL_MESH);
347 bt_hal_mesh_cbacks = NULL;
350 static btmesh_interface_t mesh_if = {
351 .size = sizeof(mesh_if),
353 .create = mesh_create_network,
355 .scan_cancel = mesh_scan_cancel,
356 .capability = mesh_set_prov_caps,
357 .provision = mesh_provision_device,
358 .provision_data = mesh_send_provision_data,
359 .auth_reply = mesh_auth_reply,
360 .subnet_execute = mesh_network_subnet_operation,
361 .appkey_execute = mesh_network_appkey_operation,
362 .config_send = mesh_send_configuration_message,
363 .key_send = mesh_key_configuration_message,
364 .msg_execute = mesh_model_execute_message,
368 btmesh_interface_t *bt_get_mesh_interface(void)