4 * Copyright (c) 2015 -2016 Samsung Electronics Co., Ltd All Rights Reserved.
6 * Contact: 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.
29 #include "bt-hal-log.h"
30 #include "bt-hal-msg.h"
31 #include "bt-hal-utils.h"
33 #include <bt-hal-adapter-dbus-handler.h>
34 #include <bt-hal-device-dbus-handler.h>
35 #include <bt-hal-hidhost.h>
36 #include <bt-hal-socket.h>
37 #include <bt-hal-av.h>
38 #include <bt-hal-hf.h>
39 #include <bt-hal-hdp.h>
40 #include <bt-hal-a2dp-sink.h>
41 #include <bt-hal-avrcp-tg.h>
42 #include <bt-hal-avrcp-ctrl.h>
43 #include <bt-hal-gatt.h>
45 #include <bt-hal-adapter-le.h>
46 #include <bt-hal-agent.h>
49 #define enum_prop_to_hal(prop, hal_prop, type) do { \
52 prop.len = sizeof(e); \
53 e = *((uint8_t *) (hal_prop->val)); \
56 static const bt_callbacks_t *bt_hal_cbacks = NULL;
59 /* Forward declarations */
60 static void __bt_adapter_props_to_hal(bt_property_t *send_props, struct hal_property *prop, uint8_t num_props, uint16_t len);
61 static void __bt_device_props_to_hal(bt_property_t *send_props,
62 struct hal_property *prop, uint8_t num_props,
64 static void __bt_hal_handle_adapter_state_changed(void *buf, uint16_t len);
65 static void __bt_hal_handle_adapter_property_changed(void *buf, uint16_t len);
66 static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len);
67 static void __bt_hal_handle_adapter_discovery_state_changed(void *buf, uint16_t len);
68 static void __bt_hal_handle_device_found_event(void *buf, uint16_t len);
69 static void __bt_hal_handle_bond_state_changed_event(void *buf, uint16_t len);
70 static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len);
71 static void __bt_hal_handle_ssp_request_event(void *buf, uint16_t len);
72 static void __bt_hal_handle_pin_request_event(void *buf, uint16_t len);
74 static void __bt_hal_handle_device_trust_state_changed_event(void *buf, uint16_t len);
76 static bool interface_ready(void)
78 return bt_hal_cbacks != NULL;
81 static int init(bt_callbacks_t *callbacks)
84 DBG("HAL library Initialization..");
86 if (interface_ready())
87 return BT_STATUS_DONE;
89 bt_hal_cbacks = callbacks;
90 DBG("Store HAL stack msg handler callback");
91 _bt_hal_dbus_store_stack_msg_cb(__bt_hal_handle_stack_messages);
92 ret = _bt_hal_initialize_event_receiver(__bt_hal_handle_stack_messages);
94 if (ret == BT_STATUS_SUCCESS)
95 return BT_STATUS_SUCCESS;
97 return BT_STATUS_FAIL;
100 return BT_STATUS_SUCCESS;
104 static int enable(void)
106 return _bt_hal_dbus_enable_adapter();
109 /* Disable Adapter */
110 static int disable(void)
112 return _bt_hal_dbus_disable_adapter();
116 /* Tizen Specific Reset Adapter */
117 static int reset(void)
119 return _bt_hal_dbus_reset_adapter();
123 static void cleanup(void)
129 /* Tizen Specific Get Powered state */
130 static int get_adapter_powered_status(uint8_t *state)
133 ERR("Invalid param");
134 return BT_STATUS_PARM_INVALID;
137 return _bt_hal_get_adapter_powered_state(state);
141 static int get_adapter_properties(void)
143 return _bt_hal_dbus_get_adapter_properties();
146 static int get_adapter_property(bt_property_type_t type)
148 return _bt_hal_dbus_get_adapter_property(type);
151 static int set_adapter_property(const bt_property_t *property)
154 ERR("Invalid param");
155 return BT_STATUS_PARM_INVALID;
158 return _bt_hal_dbus_set_adapter_property(property);
161 static int get_remote_device_properties(bt_bdaddr_t *remote_addr)
164 ERR("Invalid param");
165 return BT_STATUS_PARM_INVALID;
168 return _bt_hal_dbus_get_remote_device_properties(remote_addr);
171 static int get_remote_device_property(bt_bdaddr_t *remote_addr,
172 bt_property_type_t type)
174 return BT_STATUS_UNSUPPORTED;
177 static int set_remote_device_property(bt_bdaddr_t *remote_addr,
178 const bt_property_t *property)
180 return _bt_hal_dbus_set_remote_device_property(remote_addr, property);
183 static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
185 return BT_STATUS_UNSUPPORTED;
188 static int get_remote_services(bt_bdaddr_t *remote_addr)
191 ERR("Invalid param");
192 return BT_STATUS_PARM_INVALID;
194 return _bt_hal_dbus_get_remote_device_services(remote_addr);
197 static int start_discovery(void)
199 return _bt_hal_dbus_start_discovery(false, 0x00);
203 static int start_custom_discovery(bt_disc_role_type_t disc_type)
205 return _bt_hal_dbus_start_discovery(true, disc_type);
209 static int cancel_discovery(void)
211 return _bt_hal_dbus_stop_discovery();
214 static int create_bond(const bt_bdaddr_t *bd_addr, int transport)
217 return _bt_hal_device_create_bond(bd_addr, transport);
220 static int cancel_bond(const bt_bdaddr_t *bd_addr)
222 return _bt_hal_device_cancel_bond(bd_addr);
225 static int remove_bond(const bt_bdaddr_t *bd_addr)
228 return _bt_hal_device_remove_bond(bd_addr);
231 static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
232 uint8_t pin_len, bt_pin_code_t *pin_code)
234 return _bt_hal_device_legacy_pin_reply(bd_addr, accept, pin_len, (char*)pin_code);
237 static int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
238 uint8_t accept, uint32_t passkey)
240 return _bt_hal_device_ssp_reply(bd_addr, variant, accept, passkey);
243 static const void *get_profile_interface(const char *profile_id)
245 /*TODO: Profile interfaces to be included later*/
246 DBG("%s", profile_id);
248 if (!interface_ready())
251 if (!strncmp(profile_id, BT_PROFILE_HIDHOST_ID, strlen(profile_id)))
252 return bt_get_hidhost_interface();
254 if (!strcmp(profile_id, BT_PROFILE_SOCKETS_ID))
255 return bt_get_socket_interface();
257 if (!strcmp(profile_id, BT_PROFILE_PAN_ID))
260 if (!strcmp(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
261 return bt_get_av_interface();
263 if (!strcmp(profile_id, BT_PROFILE_AV_RC_ID))
264 return bt_get_avrcp_tg_interface();
266 if (!strcmp(profile_id, BT_PROFILE_HANDSFREE_ID))
267 return bt_get_hf_interface();
269 if (!strcmp(profile_id, BT_PROFILE_GATT_ID))
270 return bt_get_gatt_interface();
272 if (!strcmp(profile_id, BT_PROFILE_HEALTH_ID))
273 return bt_get_hl_interface();
275 if (!strcmp(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
276 return bt_get_avrcp_ctrl_interface();
278 if (!strcmp(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
281 if (!strcmp(profile_id, BT_PROFILE_MAP_CLIENT_ID))
284 if (!strcmp(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
285 return bt_get_a2dp_sink_interface();
290 static int dut_mode_configure(uint8_t enable)
292 return BT_STATUS_UNSUPPORTED;
295 static int dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t buf_len)
297 return BT_STATUS_UNSUPPORTED;
300 static int le_test_mode(uint16_t opcode, uint8_t *buf, uint8_t buf_len)
302 return BT_STATUS_UNSUPPORTED;
305 static int config_hci_snoop_log(uint8_t enable)
307 return BT_STATUS_UNSUPPORTED;
310 static int get_connection_state(const bt_bdaddr_t *bd_addr)
313 return _bt_hal_device_get_connection_state(bd_addr);
316 static int set_os_callouts(bt_os_callouts_t *callouts)
318 DBG("callouts: %p", callouts);
320 /* TODO: implement */
322 return BT_STATUS_UNSUPPORTED;
325 static int read_energy_info(void)
327 return BT_STATUS_UNSUPPORTED;
330 static int authorize_response(const bt_bdaddr_t *bd_addr, bt_service_id_t service_id,
331 uint8_t authorize, uint8_t save_settings)
334 return _bt_hal_device_authorize_response(bd_addr, service_id, authorize, save_settings);
337 int set_authorization(bt_bdaddr_t *bd_addr, uint8_t auth)
340 return _bt_hal_device_set_trust(bd_addr, auth);
344 static int get_service_connection_state(const bt_bdaddr_t *bd_addr, bt_service_id_t rem_svc_id)
347 return _bt_hal_device_get_service_connection_state(bd_addr, rem_svc_id);
350 static int set_agent_osp_server(uint32_t type, uint8_t enable)
353 return _bt_hal_device_set_osp_server(type, enable);
356 static int set_trusted_profile(bt_bdaddr_t *bd_addr, bt_trusted_profile_t profile, uint8_t trust)
359 return _bt_hal_device_set_trusted_profile(bd_addr, profile, trust);
362 static int get_trusted_profile(bt_bdaddr_t *bd_addr, bt_trusted_profile_t profile, uint32_t *trusted)
365 return _bt_hal_device_get_trusted_profile(bd_addr, profile, trusted);
368 static int get_connected_link_rssi_strength(bt_bdaddr_t *bd_addr, uint32_t conn_link_type)
371 return _bt_hal_device_get_connected_link_rssi_strength(bd_addr, conn_link_type);
374 static int enable_rssi_monitoring(bt_bdaddr_t *bd_addr, uint32_t conn_link_type,
375 int low_threshold, int in_range_threshold, int high_threshold)
378 return _bt_hal_device_enable_rssi_monitoring(bd_addr, conn_link_type,
379 low_threshold, in_range_threshold, high_threshold);
382 static int enable_gap_auth_notifications(uint32_t type, uint8_t enable)
385 _bt_hal_enable_gap_auth_notifications(type, ((enable == 0) ? FALSE : TRUE));
386 return BT_STATUS_SUCCESS;
390 static const bt_interface_t bluetooth_if = {
391 .size = sizeof(bt_interface_t),
400 .le_enable = _bt_hal_le_enable,
401 .le_disable = _bt_hal_le_disable,
402 .le_init = _bt_hal_le_init,
403 .le_deinit = _bt_hal_le_deinit,
407 .get_adapter_powered_status = get_adapter_powered_status,
409 .get_adapter_properties = get_adapter_properties,
410 .get_adapter_property = get_adapter_property,
411 .set_adapter_property = set_adapter_property,
412 .get_remote_device_properties = get_remote_device_properties,
413 .get_remote_device_property = get_remote_device_property,
414 .set_remote_device_property = set_remote_device_property,
415 .get_remote_service_record = get_remote_service_record,
416 .get_remote_services = get_remote_services,
417 .start_discovery = start_discovery,
419 .start_custom_discovery = start_custom_discovery,
421 .cancel_discovery = cancel_discovery,
422 .create_bond = create_bond,
423 .remove_bond = remove_bond,
424 .cancel_bond = cancel_bond,
425 .pin_reply = pin_reply,
426 .ssp_reply = ssp_reply,
427 .get_profile_interface = get_profile_interface,
428 .dut_mode_configure = dut_mode_configure,
429 .dut_mode_send = dut_mode_send,
430 .le_test_mode = le_test_mode,
431 .config_hci_snoop_log = config_hci_snoop_log,
432 .get_connection_state = get_connection_state,
433 .set_os_callouts = set_os_callouts,
434 .read_energy_info = read_energy_info,
435 /* Tizen Specific API's*/
436 .authorize_response = authorize_response,
437 .set_authorization = set_authorization,
439 .get_service_connection_state = get_service_connection_state,
440 .set_agent_osp_server = set_agent_osp_server,
441 .set_trusted_profile = set_trusted_profile,
442 .get_trusted_profile = get_trusted_profile,
443 .enable_rssi_monitoring = enable_rssi_monitoring,
444 .get_connected_link_rssi_strength = get_connected_link_rssi_strength,
445 .enable_gap_auth_notifications = enable_gap_auth_notifications,
449 static const bt_interface_t *get_bluetooth_interface(void)
452 return &bluetooth_if;
455 static int close_bluetooth(struct hw_device_t *device)
463 static int open_bluetooth(const struct hw_module_t *module, char const *name,
464 struct hw_device_t **device)
466 bluetooth_device_t *dev = malloc(sizeof(bluetooth_device_t));
470 memset(dev, 0, sizeof(bluetooth_device_t));
471 dev->common.tag = HARDWARE_DEVICE_TAG;
472 dev->common.version = 0;
473 dev->common.module = (struct hw_module_t *) module;
474 dev->common.close = close_bluetooth;
475 dev->get_bluetooth_interface = get_bluetooth_interface;
477 *device = (struct hw_device_t *) dev;
482 static struct hw_module_methods_t bluetooth_module_methods = {
483 .open = open_bluetooth,
486 struct hw_module_t HAL_MODULE_INFO_SYM = {
487 .tag = HARDWARE_MODULE_TAG,
490 .id = BT_HARDWARE_MODULE_ID,
491 .name = "Bluetooth stack",
492 .author = "Intel Corporation",
493 .methods = &bluetooth_module_methods
496 static void __bt_hal_handle_adapter_state_changed(void *buf, uint16_t len)
498 struct hal_ev_adapter_state_changed *ev = buf;
500 DBG("Adapter State: %d", ev->state);
502 if (bt_hal_cbacks->adapter_state_changed_cb)
503 bt_hal_cbacks->adapter_state_changed_cb(ev->state);
507 static void __bt_hal_handle_le_state_changed(void *buf, uint16_t len)
509 struct hal_ev_le_state_changed *ev = buf;
511 DBG("Adapter State: %d", ev->state);
513 if (bt_hal_cbacks->le_state_changed_cb)
514 bt_hal_cbacks->le_state_changed_cb(ev->state);
518 static void __bt_adapter_props_to_hal(bt_property_t *send_props, struct hal_property *prop,
519 uint8_t num_props, uint16_t len)
524 for (i = 0; i < num_props; i++) {
525 if (sizeof(*prop) + prop->len > len) {
526 ERR("invalid adapter properties(%zu > %u), cant process further properties!!!",
527 sizeof(*prop) + prop->len, len);
531 send_props[i].type = prop->type;
533 switch (prop->type) {
534 /* TODO: Add Adapter Properties */
536 send_props[i].len = prop->len;
537 send_props[i].val = prop->val;
541 DBG("prop[%d]: %s", i, btproperty2str(&send_props[i]));
543 len -= sizeof(*prop) + prop->len;
544 buf += sizeof(*prop) + prop->len;
552 static void __bt_device_props_to_hal(bt_property_t *send_props,
553 struct hal_property *prop, uint8_t num_props,
561 for (i = 0; i < num_props; i++) {
563 if (sizeof(*prop) + prop->len > len) {
564 ERR("invalid device properties (%zu > %u), cant process further properties!!!",
565 sizeof(*prop) + prop->len, len);
569 send_props[i].type = prop->type;
571 DBG("HAL prop Type [%d]", prop->type);
573 switch (prop->type) {
574 case HAL_PROP_DEVICE_TYPE:
576 DBG("Device property:HAL_PROP_DEVICE_TYPE:");
577 enum_prop_to_hal(send_props[i], prop,
581 case HAL_PROP_DEVICE_VERSION_INFO:
583 DBG("Device property: HAL_PROP_DEVICE_VERSION_INFO");
584 static bt_remote_version_t e;
585 const struct hal_prop_device_info *p;
586 send_props[i].val = &e;
587 send_props[i].len = sizeof(e);
588 p = (struct hal_prop_device_info *) prop->val;
589 e.manufacturer = p->manufacturer;
590 e.sub_ver = p->sub_version;
591 e.version = p->version;
594 case HAL_PROP_DEVICE_SERVICE_REC:
596 DBG("Device property: HAL_PROP_DEVICE_SERVICE_REC");
597 static bt_service_record_t e;
598 const struct hal_prop_device_service_rec *p;
599 send_props[i].val = &e;
600 send_props[i].len = sizeof(e);
601 p = (struct hal_prop_device_service_rec *) prop->val;
602 memset(&e, 0, sizeof(e));
603 memcpy(&e.channel, &p->channel, sizeof(e.channel));
604 memcpy(e.uuid.uu, p->uuid, sizeof(e.uuid.uu));
605 memcpy(e.name, p->name, p->name_len);
609 send_props[i].len = prop->len;
610 send_props[i].val = prop->val;
614 DBG("prop[%d]: %s, len: %d", i, btproperty2str(&send_props[i]), prop->len);
615 len -= sizeof(*prop) + prop->len;
616 buf += sizeof(*prop) + prop->len;
626 ERR("invalid device properties (%u bytes left), ", len);
629 static void __bt_hal_handle_adapter_property_changed(void *buf, uint16_t len)
631 struct hal_ev_adapter_props_changed *ev = (struct hal_ev_adapter_props_changed *)buf;
632 bt_property_t props[ev->num_props];
635 if (!bt_hal_cbacks->adapter_properties_cb)
639 __bt_adapter_props_to_hal(props, ev->props, ev->num_props, len);
641 if (bt_hal_cbacks->adapter_properties_cb)
642 bt_hal_cbacks->adapter_properties_cb(ev->status, ev->num_props, props);
645 static void __bt_hal_handle_adapter_discovery_state_changed(void *buf, uint16_t len)
647 struct hal_ev_discovery_state_changed *ev = (struct hal_ev_discovery_state_changed *)buf;
651 if (bt_hal_cbacks->discovery_state_changed_cb)
652 bt_hal_cbacks->discovery_state_changed_cb(ev->state);
655 static void __bt_hal_handle_device_found_event(void *buf, uint16_t len)
657 struct hal_ev_device_found *ev = (struct hal_ev_device_found *) buf;
658 bt_property_t props[ev->num_props];
661 if (!bt_hal_cbacks->device_found_cb)
665 __bt_device_props_to_hal(props, ev->props, ev->num_props, len);
667 bt_hal_cbacks->device_found_cb(ev->num_props, props);
670 static void __bt_hal_handle_remote_device_properties_event(void *buf, uint16_t len)
672 struct hal_ev_remote_device_props *ev = (struct hal_ev_remote_device_props *) buf;
674 bt_property_t props[ev->num_props];
678 if (!bt_hal_cbacks->remote_device_properties_cb)
682 __bt_device_props_to_hal(props, ev->props, ev->num_props, len);
683 memcpy(bd_addr.address, ev->bdaddr, 6);
684 bt_hal_cbacks->remote_device_properties_cb(
685 ev->status, &bd_addr, ev->num_props, props);
689 static void __bt_hal_handle_bond_state_changed_event(void *buf, uint16_t len)
692 struct hal_ev_bond_state_changed *ev = (struct hal_ev_bond_state_changed *)buf;
696 memcpy(bd_addr.address, ev->bdaddr, 6);
698 DBG("[0x%x]", bd_addr.address[0]);
699 DBG("[0x%x]", bd_addr.address[1]);
700 DBG("[0x%x]", bd_addr.address[2]);
701 DBG("[0x%x]", bd_addr.address[3]);
702 DBG("[0x%x]", bd_addr.address[4]);
703 DBG("[0x%x]", bd_addr.address[5]);
705 DBG("Bonding State changed Status [0x%x]", ev->status);
706 DBG("Bonding State [0x%x]", ev->state);
708 if (!bt_hal_cbacks->bond_state_changed_cb) {
709 ERR("HAL User bond_state_changed_callback is not set!!");
713 bt_hal_cbacks->bond_state_changed_cb(ev->status, &bd_addr, ev->state);
717 static void __bt_hal_handle_device_acl_state_changed_event(void *buf, uint16_t len)
719 struct hal_ev_acl_state_changed *ev = (struct hal_ev_acl_state_changed*)buf;
723 memcpy(bd_addr.address, ev->bdaddr, 6);
725 DBG("[0x%x]", bd_addr.address[0]);
726 DBG("[0x%x]", bd_addr.address[1]);
727 DBG("[0x%x]", bd_addr.address[2]);
728 DBG("[0x%x]", bd_addr.address[3]);
729 DBG("[0x%x]", bd_addr.address[4]);
730 DBG("[0x%x]", bd_addr.address[5]);
732 DBG("ACL Status [0x%x]", ev->status);
733 DBG("ACL State [0x%x]", ev->state);
735 if (!bt_hal_cbacks->acl_state_changed_cb) {
736 ERR("HAL User acl_state_changed_cb is not set!!");
740 bt_hal_cbacks->acl_state_changed_cb(ev->status, &bd_addr, ev->state);
744 static void __bt_hal_handle_device_le_conn_state_changed_event(void *buf, uint16_t len)
746 struct hal_ev_acl_state_changed *ev = (struct hal_ev_acl_state_changed*)buf;
750 memcpy(bd_addr.address, ev->bdaddr, 6);
752 DBG("Address: [%02X:%02X:%02X:%02X:%02X:%02X]", bd_addr.address[0],
753 bd_addr.address[1], bd_addr.address[2], bd_addr.address[3],
754 bd_addr.address[4], bd_addr.address[5]);
755 DBG("LE conn Status [0x%x]", ev->status);
756 DBG("LE conn State [0x%x]", ev->state);
759 if (!bt_hal_cbacks->le_conn_state_changed_cb) {
760 ERR("HAL User le_conn_state_changed_cb is not set!!");
764 bt_hal_cbacks->le_conn_state_changed_cb(ev->status, &bd_addr, ev->state);
769 static void __bt_hal_handle_authorize_request_event(void *buf, uint16_t len)
771 struct hal_ev_authorize_request *ev = (struct hal_ev_authorize_request *)buf;
776 memcpy(bd_addr.address, ev->bdaddr, 6);
779 DBG("[0x%x]", bd_addr.address[0]);
780 DBG("[0x%x]", bd_addr.address[1]);
781 DBG("[0x%x]", bd_addr.address[2]);
782 DBG("[0x%x]", bd_addr.address[3]);
783 DBG("[0x%x]", bd_addr.address[4]);
784 DBG("[0x%x]", bd_addr.address[5]);
786 DBG("Service Id: [%u]", ev->service_id);
788 if (!bt_hal_cbacks->authorize_request_cb) {
789 ERR("HAL User authorize_request_cb is not set!!");
793 bt_hal_cbacks->authorize_request_cb(&bd_addr, ev->service_id);
798 static void __bt_hal_handle_socket_authorize_request_event(void *buf, uint16_t len)
800 struct hal_ev_sock_conn_auth *ev = buf;
806 memcpy(bd_addr.address, ev->bdaddr, 6);
807 memcpy(uuid.uu, ev->uuid, 16);
809 if (!bt_hal_cbacks->socket_authorize_request_cb) {
810 ERR("HAL User socket_authorize_request_cb is not set!!");
814 bt_hal_cbacks->socket_authorize_request_cb(&bd_addr, &uuid);
819 static void __bt_hal_handle_ssp_request_event(void *buf, uint16_t len)
821 struct hal_ev_ssp_request *ev = (struct hal_ev_ssp_request *)buf;
826 memcpy(bd_addr.address, ev->bdaddr, 6);
827 memcpy(bd_name.name, ev->name, 248);
830 DBG("[0x%x]", bd_addr.address[0]);
831 DBG("[0x%x]", bd_addr.address[1]);
832 DBG("[0x%x]", bd_addr.address[2]);
833 DBG("[0x%x]", bd_addr.address[3]);
834 DBG("[0x%x]", bd_addr.address[4]);
835 DBG("[0x%x]", bd_addr.address[5]);
837 DBG("COD [%d]", ev->class_of_dev);
838 DBG("pairing variant [%d]", ev->pairing_variant);
839 DBG("passkey [%d]", ev->passkey);
841 if (!bt_hal_cbacks->ssp_request_cb) {
842 ERR("HAL User ssp_request_cb is not set!!");
846 bt_hal_cbacks->ssp_request_cb(&bd_addr, &bd_name,
848 ev->pairing_variant, ev->passkey);
852 static void __bt_hal_handle_pin_request_event(void *buf, uint16_t len)
854 struct hal_ev_pin_request *ev = (struct hal_ev_pin_request *)buf;
859 memcpy(bd_addr.address, ev->bdaddr, 6);
860 memcpy(bd_name.name, ev->name, 248);
863 DBG("[0x%x]", bd_addr.address[0]);
864 DBG("[0x%x]", bd_addr.address[1]);
865 DBG("[0x%x]", bd_addr.address[2]);
866 DBG("[0x%x]", bd_addr.address[3]);
867 DBG("[0x%x]", bd_addr.address[4]);
868 DBG("[0x%x]", bd_addr.address[5]);
870 DBG("COD [%u]", ev->class_of_dev);
872 if (!bt_hal_cbacks->pin_request_cb) {
873 ERR("HAL User pin_request_cb is not set!!");
877 bt_hal_cbacks->pin_request_cb(&bd_addr, &bd_name,
882 static void __bt_hal_handle_device_trust_state_changed_event(void *buf, uint16_t len)
884 struct hal_ev_device_trust_state_changed *ev = (struct hal_ev_device_trust_state_changed*)buf;
888 memcpy(bd_addr.address, ev->bdaddr, 6);
890 DBG("[0x%x]", bd_addr.address[0]);
891 DBG("[0x%x]", bd_addr.address[1]);
892 DBG("[0x%x]", bd_addr.address[2]);
893 DBG("[0x%x]", bd_addr.address[3]);
894 DBG("[0x%x]", bd_addr.address[4]);
895 DBG("[0x%x]", bd_addr.address[5]);
897 DBG("Device Trusted? [0x%x]", ev->trust);
899 if (!bt_hal_cbacks->device_trust_state_changed_cb) {
900 ERR("HAL User device_trust_state_changed_cb is not set!!");
904 bt_hal_cbacks->device_trust_state_changed_cb(&bd_addr, ev->trust);
908 static void __bt_hal_handle_device_trusted_profiles_changed_event(void *buf, uint16_t len)
910 struct hal_ev_device_trusted_profiles_changed *ev = buf;
915 memcpy(bd_addr.address, ev->bdaddr, 6);
916 DBG("[0x%02X:%02X:%02X:%02X:%02X:%02X]",
917 bd_addr.address[0], bd_addr.address[1],
918 bd_addr.address[2], bd_addr.address[3],
919 bd_addr.address[4], bd_addr.address[5]);
921 if (!bt_hal_cbacks->device_trusted_profiles_changed_cb) {
922 ERR("device_trusted_profiles_changed_cb is NULL");
926 bt_hal_cbacks->device_trusted_profiles_changed_cb(&bd_addr, ev->trust_val);
931 static void __bt_handle_rssi_monitor_state_changed(void *buf, uint16_t len)
933 struct hal_ev_rssi_monitor_state_changed *ev = buf;
938 memcpy(bd_addr.address, ev->bdaddr, 6);
939 DBG("[0x%02X:%02X:%02X:%02X:%02X:%02X]",
940 bd_addr.address[0], bd_addr.address[1],
941 bd_addr.address[2], bd_addr.address[3],
942 bd_addr.address[4], bd_addr.address[5]);
944 if (bt_hal_cbacks->rssi_monitor_state_changed_cb)
945 bt_hal_cbacks->rssi_monitor_state_changed_cb(
946 &bd_addr, ev->link_type, ev->state);
951 static void __bt_handle_rssi_alert_recieved(void *buf, uint16_t len)
953 struct hal_ev_rssi_alert_recieved *ev = buf;
958 memcpy(bd_addr.address, ev->bdaddr, 6);
959 DBG("[0x%02X:%02X:%02X:%02X:%02X:%02X]",
960 bd_addr.address[0], bd_addr.address[1],
961 bd_addr.address[2], bd_addr.address[3],
962 bd_addr.address[4], bd_addr.address[5]);
964 if (bt_hal_cbacks->rssi_alert_cb)
965 bt_hal_cbacks->rssi_alert_cb(
966 &bd_addr, ev->link_type, ev->alert_type, ev->rssi);
971 static void __bt_handle_raw_rssi_recieved(void *buf, uint16_t len)
973 struct hal_ev_raw_rssi_recieved *ev = buf;
978 memcpy(bd_addr.address, ev->bdaddr, 6);
979 DBG("[0x%02X:%02X:%02X:%02X:%02X:%02X]",
980 bd_addr.address[0], bd_addr.address[1],
981 bd_addr.address[2], bd_addr.address[3],
982 bd_addr.address[4], bd_addr.address[5]);
984 if (bt_hal_cbacks->raw_rssi_received_cb)
985 bt_hal_cbacks->raw_rssi_received_cb(
986 &bd_addr, ev->link_type, ev->rssi);
991 static void __bt_hal_handle_stack_messages(int message, void *buf, uint16_t len)
995 case HAL_EV_ADAPTER_STATE_CHANGED:
996 DBG("Event: HAL_EV_ADAPTER_STATE_CHANGED");
997 __bt_hal_handle_adapter_state_changed(buf, len);
999 case HAL_EV_ADAPTER_PROPS_CHANGED:
1000 DBG("Event: HAL_EV_ADAPTER_PROPS_CHANGED");
1001 __bt_hal_handle_adapter_property_changed(buf, len);
1003 case HAL_EV_DISCOVERY_STATE_CHANGED:
1004 DBG("Event: HAL_EV_DISCOVERY_STATE_CHANGED");
1005 __bt_hal_handle_adapter_discovery_state_changed(buf, len);
1007 case HAL_EV_DEVICE_FOUND:
1008 DBG("Event: HAL_EV_DEVICE_FOUND");
1009 __bt_hal_handle_device_found_event(buf, len);
1011 case HAL_EV_REMOTE_DEVICE_PROPS:
1012 DBG("Event: HAL_EV_REMOTE_DEVICE_PROPS");
1013 __bt_hal_handle_remote_device_properties_event(buf, len);
1015 case HAL_EV_BOND_STATE_CHANGED:
1016 DBG("Event: HAL_EV_BOND_STATE_CHANGED:");
1017 __bt_hal_handle_bond_state_changed_event(buf, len);
1019 case HAL_EV_ACL_STATE_CHANGED:
1020 DBG("Event: HAL_ACL_STATE_CONNECTED or Disconnected");
1021 __bt_hal_handle_device_acl_state_changed_event(buf, len);
1023 case HAL_EV_LE_CONN_STATE_CHANGED:
1024 DBG("Event: HAL_LE_CONN_STATE_CONNECTED or Disconnected");
1025 __bt_hal_handle_device_le_conn_state_changed_event(buf, len);
1027 case HAL_EV_SSP_REQUEST:
1028 DBG("Event: HAL_EV_SSP_REQUEST");
1029 __bt_hal_handle_ssp_request_event(buf, len);
1031 case HAL_EV_PIN_REQUEST:
1032 DBG("Event: HAL_EV_PIN_REQUEST");
1033 __bt_hal_handle_pin_request_event(buf, len);
1035 case HAL_EV_AUTHORIZE_REQUEST:
1036 DBG("Event: HAL_EV_AUTHORIZE_REQUEST");
1037 __bt_hal_handle_authorize_request_event(buf, len);
1039 case HAL_EV_DEVICE_TRUST_CHANGED:
1040 DBG("Event: HAL_EV_DEVICE_TRUST_CHANGED");
1041 __bt_hal_handle_device_trust_state_changed_event(buf, len);
1044 case HAL_EV_SOCK_AUTHORIZE_REQUEST:
1045 DBG("Event: HAL_EV_AUTHORIZE_REQUEST");
1046 __bt_hal_handle_socket_authorize_request_event(buf, len);
1048 case HAL_EV_LE_STATE_CHANGED:
1049 DBG("Event: HAL_EV_LE_STATE_CHANGED");
1050 __bt_hal_handle_le_state_changed(buf, len);
1053 case HAL_EV_DEVICE_TRUSTED_PROFILES_CHANGED:
1054 DBG("Event: HAL_EV_DEVICE_TRUST_CHANGED");
1055 __bt_hal_handle_device_trusted_profiles_changed_event(buf, len);
1057 case HAL_EV_RSSI_MONITOR_STATE_CHANGED:
1058 DBG("Event: HAL_EV_RSSI_MONITOR_STATE_CHANGED");
1059 __bt_handle_rssi_monitor_state_changed(buf, len);
1061 case HAL_EV_RSSI_ALERT_RECIEVED:
1062 DBG("Event: HAL_EV_RSSI_ALERT_RECIEVED");
1063 __bt_handle_rssi_alert_recieved(buf, len);
1065 case HAL_EV_RAW_RSSI_RECIEVED:
1066 DBG("Event: HAL_EV_RAW_RSSI_RECIEVED");
1067 __bt_handle_raw_rssi_recieved(buf, len);
1070 DBG("Event Currently not handled!!");