| /* |
| * |
| * BlueZ - Bluetooth protocol stack for Linux |
| * |
| * Copyright (C) 2012-2017 Intel Corporation. All rights reserved. |
| * |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| * |
| */ |
| |
| #include <stdbool.h> |
| |
| #ifndef __packed |
| #define __packed __attribute__((packed)) |
| #endif |
| |
| #define BTP_INDEX_NON_CONTROLLER 0xff |
| |
| #define BTP_ERROR_FAIL 0x01 |
| #define BTP_ERROR_UNKNOWN_CMD 0x02 |
| #define BTP_ERROR_NOT_READY 0x03 |
| #define BTP_ERROR_INVALID_INDEX 0x04 |
| |
| #define BTP_CORE_SERVICE 0 |
| #define BTP_GAP_SERVICE 1 |
| #define BTP_GATT_SERVICE 2 |
| #define BTP_L2CAP_SERVICE 3 |
| #define BTP_MESH_NODE_SERVICE 4 |
| |
| struct btp_hdr { |
| uint8_t service; |
| uint8_t opcode; |
| uint8_t index; |
| uint16_t data_len; |
| uint8_t data[0]; |
| } __packed; |
| |
| struct btp_error { |
| uint8_t status; |
| } __packed; |
| |
| #define BTP_OP_ERROR 0x00 |
| |
| #define BTP_OP_CORE_READ_SUPPORTED_COMMANDS 0x01 |
| |
| #define BTP_OP_CORE_READ_SUPPORTED_SERVICES 0x02 |
| |
| #define BTP_OP_CORE_REGISTER 0x03 |
| struct btp_core_register_cp { |
| uint8_t service_id; |
| } __packed; |
| |
| #define BTP_OP_CORE_UNREGISTER 0x04 |
| struct btp_core_unregister_cp { |
| uint8_t service_id; |
| } __packed; |
| |
| #define BTP_EV_CORE_READY 0x80 |
| |
| #define BTP_OP_GAP_READ_SUPPORTED_COMMANDS 0x01 |
| |
| #define BTP_OP_GAP_READ_CONTROLLER_INDEX_LIST 0x02 |
| struct btp_gap_read_index_rp { |
| uint8_t num; |
| uint8_t indexes[0]; |
| } __packed; |
| |
| #define BTP_GAP_SETTING_POWERED 0x00000001 |
| #define BTP_GAP_SETTING_CONNECTABLE 0x00000002 |
| #define BTP_GAP_SETTING_FAST_CONNECTABLE 0x00000004 |
| #define BTP_GAP_SETTING_DISCOVERABLE 0x00000008 |
| #define BTP_GAP_SETTING_BONDABLE 0x00000010 |
| #define BTP_GAP_SETTING_LL_SECURITY 0x00000020 |
| #define BTP_GAP_SETTING_SSP 0x00000040 |
| #define BTP_GAP_SETTING_BREDR 0x00000080 |
| #define BTP_GAP_SETTING_HS 0x00000100 |
| #define BTP_GAP_SETTING_LE 0x00000200 |
| #define BTP_GAP_SETTING_ADVERTISING 0x00000400 |
| #define BTP_GAP_SETTING_SC 0x00000800 |
| #define BTP_GAP_SETTING_DEBUG_KEYS 0x00001000 |
| #define BTP_GAP_SETTING_PRIVACY 0x00002000 |
| #define BTP_GAP_SETTING_CONTROLLER_CONF 0x00004000 |
| #define BTP_GAP_SETTING_STATIC_ADDRESS 0x00008000 |
| |
| #define BTP_OP_GAP_READ_COTROLLER_INFO 0x03 |
| struct btp_gap_read_info_rp { |
| bdaddr_t address; |
| uint32_t supported_settings; |
| uint32_t current_settings; |
| uint8_t cod[3]; |
| uint8_t name[249]; |
| uint8_t short_name[11]; |
| } __packed; |
| |
| #define BTP_OP_GAP_RESET 0x04 |
| struct btp_gap_reset_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_SET_POWERED 0x05 |
| struct btp_gap_set_powered_cp { |
| uint8_t powered; |
| } __packed; |
| |
| struct btp_gap_set_powered_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_SET_CONNECTABLE 0x06 |
| struct btp_gap_set_connectable_cp { |
| uint8_t connectable; |
| } __packed; |
| |
| struct btp_gap_set_connectable_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_SET_FAST_CONNECTABLE 0x07 |
| struct btp_gap_set_fast_connectable_cp { |
| uint8_t fast_connectable; |
| } __packed; |
| |
| struct btp_gap_set_fast_connectable_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_SET_DISCOVERABLE 0x08 |
| struct btp_gap_set_discoverable_cp { |
| uint8_t discoverable; |
| } __packed; |
| |
| struct btp_gap_set_discoverable_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_SET_BONDABLE 0x09 |
| struct btp_gap_set_bondable_cp { |
| uint8_t bondable; |
| } __packed; |
| |
| struct btp_gap_set_bondable_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_START_ADVERTISING 0x0a |
| struct btp_gap_start_adv_cp { |
| uint8_t adv_data_len; |
| uint8_t scan_rsp_len; |
| uint8_t data[0]; |
| } __packed; |
| |
| struct btp_gap_start_adv_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_OP_GAP_STOP_ADVERTISING 0x0b |
| struct btp_gap_stop_adv_rp { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_GAP_DISCOVERY_FLAG_LE 0x01 |
| #define BTP_GAP_DISCOVERY_FLAG_BREDR 0x02 |
| #define BTP_GAP_DISCOVERY_FLAG_LIMITED 0x04 |
| #define BTP_GAP_DISCOVERY_FLAG_ACTIVE 0x08 |
| #define BTP_GAP_DISCOVERY_FLAG_OBSERVATION 0x10 |
| |
| #define BTP_OP_GAP_START_DISCOVERY 0x0c |
| struct btp_gap_start_discovery_cp { |
| uint8_t flags; |
| } __packed; |
| |
| #define BTP_OP_GAP_STOP_DISCOVERY 0x0d |
| |
| #define BTP_GAP_ADDR_PUBLIC 0x00 |
| #define BTP_GAP_ADDR_RANDOM 0x01 |
| |
| #define BTP_OP_GAP_CONNECT 0x0e |
| struct btp_gap_connect_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_OP_GAP_DISCONNECT 0x0f |
| struct btp_gap_disconnect_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_GAP_IOCAPA_DISPLAY_ONLY 0x00 |
| #define BTP_GAP_IOCAPA_DISPLAY_YESNO 0x01 |
| #define BTP_GAP_IOCAPA_KEYBOARD_ONLY 0x02 |
| #define BTP_GAP_IOCAPA_NO_INPUT_NO_OUTPUT 0x03 |
| #define BTP_GAP_IOCAPA_KEYBOARD_DISPLAY 0x04 |
| |
| #define BTP_OP_GAP_SET_IO_CAPA 0x10 |
| struct btp_gap_set_io_capa_cp { |
| uint8_t capa; |
| } __packed; |
| |
| #define BTP_OP_GAP_PAIR 0x11 |
| struct btp_gap_pair_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_OP_GAP_UNPAIR 0x12 |
| struct btp_gap_unpair_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_OP_GAP_PASSKEY_ENTRY_RSP 0x13 |
| struct btp_gap_passkey_entry_rsp_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| uint32_t passkey; |
| } __packed; |
| |
| #define BTP_OP_GAP_PASSKEY_CONFIRM_RSP 0x14 |
| struct btp_gap_passkey_confirm_rsp_cp { |
| uint8_t address_type; |
| bdaddr_t address; |
| uint8_t match; |
| } __packed; |
| |
| #define BTP_EV_GAP_NEW_SETTINGS 0x80 |
| struct btp_new_settings_ev { |
| uint32_t current_settings; |
| } __packed; |
| |
| #define BTP_EV_GAP_DEVICE_FOUND_FLAG_RSSI 0x01 |
| #define BTP_EV_GAP_DEVICE_FOUND_FLAG_AD 0x02 |
| #define BTP_EV_GAP_DEVICE_FOUND_FLAG_SR 0x04 |
| |
| #define BTP_EV_GAP_DEVICE_FOUND 0x81 |
| struct btp_device_found_ev { |
| bdaddr_t address; |
| uint8_t address_type; |
| int8_t rssi; |
| uint8_t flags; |
| uint16_t eir_len; |
| uint8_t eir[0]; |
| } __packed; |
| |
| #define BTP_EV_GAP_DEVICE_CONNECTED 0x82 |
| struct btp_gap_device_connected_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_EV_GAP_DEVICE_DISCONNECTED 0x83 |
| struct btp_gap_device_disconnected_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_EV_GAP_PASSKEY_DISPLAY 0x84 |
| struct btp_gap_passkey_display_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| uint32_t passkey; |
| } __packed; |
| |
| #define BTP_EV_GAP_PASSKEY_REQUEST 0x85 |
| struct btp_gap_passkey_req_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| } __packed; |
| |
| #define BTP_EV_GAP_PASSKEY_CONFIRM 0x86 |
| struct btp_gap_passkey_confirm_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| uint32_t passkey; |
| } __packed; |
| |
| #define BTP_EV_GAP_IDENTITY_RESOLVED 0x87 |
| struct btp_gap_identity_resolved_ev { |
| uint8_t address_type; |
| bdaddr_t address; |
| uint8_t identity_address_type; |
| bdaddr_t identity_address; |
| } __packed; |
| |
| struct btp; |
| |
| typedef void (*btp_destroy_func_t)(void *user_data); |
| typedef void (*btp_disconnect_func_t)(struct btp *btp, void *user_data); |
| typedef void (*btp_cmd_func_t)(uint8_t index, const void *param, |
| uint16_t length, void *user_data); |
| |
| struct btp *btp_new(const char *path); |
| void btp_cleanup(struct btp *btp); |
| |
| bool btp_set_disconnect_handler(struct btp *btp, btp_disconnect_func_t callback, |
| void *user_data, btp_destroy_func_t destroy); |
| |
| bool btp_send_error(struct btp *btp, uint8_t service, uint8_t index, |
| uint8_t status); |
| bool btp_send(struct btp *btp, uint8_t service, uint8_t opcode, uint8_t index, |
| uint16_t length, const void *param); |
| |
| unsigned int btp_register(struct btp *btp, uint8_t service, uint8_t opcode, |
| btp_cmd_func_t callback, void *user_data, |
| btp_destroy_func_t destroy); |
| bool btp_unregister(struct btp *btp, unsigned int id); |
| void btp_unregister_service(struct btp *btp, uint8_t service); |