From c535b0c2be0180701087db29fbc7eb88b27983de Mon Sep 17 00:00:00 2001 From: Kalle Lampila Date: Tue, 13 Jan 2015 13:28:47 +0200 Subject: [PATCH] libpcap: enable bluetooth support Signed-off-by: Kalle Lampila --- libpcap/Buildfile | 4 +- .../libpcap-1.6.2-enable_bluetooth-1.patch | 785 ++++++++++++++++++ 2 files changed, 788 insertions(+), 1 deletion(-) create mode 100644 libpcap/libpcap-1.6.2-enable_bluetooth-1.patch diff --git a/libpcap/Buildfile b/libpcap/Buildfile index 6390ba6..9957be3 100644 --- a/libpcap/Buildfile +++ b/libpcap/Buildfile @@ -6,12 +6,14 @@ name=libpcap version=1.6.2 release=1 source=(http://www.tcpdump.org/release/$name-$version.tar.gz + libpcap-1.6.2-enable_bluetooth-1.patch 0002-pcap-config-add-SYSROOT-support.patch) -depends=(libusb) +depends=(libusb bluez) build () { cd $name-$version + patch -p1 -i $SRC/libpcap-1.6.2-enable_bluetooth-1.patch patch -p1 -i $SRC/0002-pcap-config-add-SYSROOT-support.patch install -d $PKG/usr/bin diff --git a/libpcap/libpcap-1.6.2-enable_bluetooth-1.patch b/libpcap/libpcap-1.6.2-enable_bluetooth-1.patch new file mode 100644 index 0000000..633ad56 --- /dev/null +++ b/libpcap/libpcap-1.6.2-enable_bluetooth-1.patch @@ -0,0 +1,785 @@ +Submitted By: Fernando de Oliveira +Date: 2014-09-07 +Initial Package Version: 1.6.2 (problem started with 1.6.1) +Upstream Status: Unknown +Origin: ArchLinux +URL: https://projects.archlinux.org/svntogit/packages.git/plain/trunk/mgmt.h?h=packages/libpcap +Description: Fix build with bluez-5.21 + + +diff -Naur libpcap-1.6.2.orig/bluetooth/mgmt.h libpcap-1.6.2/bluetooth/mgmt.h +--- libpcap-1.6.2.orig/bluetooth/mgmt.h 1969-12-31 21:00:00.000000000 -0300 ++++ libpcap-1.6.2/bluetooth/mgmt.h 2014-09-07 14:11:36.456414731 -0300 +@@ -0,0 +1,772 @@ ++/* ++ * BlueZ - Bluetooth protocol stack for Linux ++ * ++ * Copyright (C) 2010 Nokia Corporation ++ * Copyright (C) 2010 Marcel Holtmann ++ * ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program 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 General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ++ * ++ */ ++ ++#ifndef __packed ++#define __packed __attribute__((packed)) ++#endif ++ ++#define MGMT_INDEX_NONE 0xFFFF ++ ++#define MGMT_STATUS_SUCCESS 0x00 ++#define MGMT_STATUS_UNKNOWN_COMMAND 0x01 ++#define MGMT_STATUS_NOT_CONNECTED 0x02 ++#define MGMT_STATUS_FAILED 0x03 ++#define MGMT_STATUS_CONNECT_FAILED 0x04 ++#define MGMT_STATUS_AUTH_FAILED 0x05 ++#define MGMT_STATUS_NOT_PAIRED 0x06 ++#define MGMT_STATUS_NO_RESOURCES 0x07 ++#define MGMT_STATUS_TIMEOUT 0x08 ++#define MGMT_STATUS_ALREADY_CONNECTED 0x09 ++#define MGMT_STATUS_BUSY 0x0a ++#define MGMT_STATUS_REJECTED 0x0b ++#define MGMT_STATUS_NOT_SUPPORTED 0x0c ++#define MGMT_STATUS_INVALID_PARAMS 0x0d ++#define MGMT_STATUS_DISCONNECTED 0x0e ++#define MGMT_STATUS_NOT_POWERED 0x0f ++#define MGMT_STATUS_CANCELLED 0x10 ++#define MGMT_STATUS_INVALID_INDEX 0x11 ++#define MGMT_STATUS_RFKILLED 0x12 ++ ++struct mgmt_hdr { ++ uint16_t opcode; ++ uint16_t index; ++ uint16_t len; ++} __packed; ++#define MGMT_HDR_SIZE 6 ++ ++struct mgmt_addr_info { ++ bdaddr_t bdaddr; ++ uint8_t type; ++} __packed; ++ ++#define MGMT_OP_READ_VERSION 0x0001 ++struct mgmt_rp_read_version { ++ uint8_t version; ++ uint16_t revision; ++} __packed; ++ ++#define MGMT_OP_READ_COMMANDS 0x0002 ++struct mgmt_rp_read_commands { ++ uint16_t num_commands; ++ uint16_t num_events; ++ uint16_t opcodes[0]; ++} __packed; ++ ++#define MGMT_OP_READ_INDEX_LIST 0x0003 ++struct mgmt_rp_read_index_list { ++ uint16_t num_controllers; ++ uint16_t index[0]; ++} __packed; ++ ++/* Reserve one extra byte for names in management messages so that they ++ * are always guaranteed to be nul-terminated */ ++#define MGMT_MAX_NAME_LENGTH (248 + 1) ++#define MGMT_MAX_SHORT_NAME_LENGTH (10 + 1) ++ ++#define MGMT_SETTING_POWERED 0x00000001 ++#define MGMT_SETTING_CONNECTABLE 0x00000002 ++#define MGMT_SETTING_FAST_CONNECTABLE 0x00000004 ++#define MGMT_SETTING_DISCOVERABLE 0x00000008 ++#define MGMT_SETTING_BONDABLE 0x00000010 ++#define MGMT_SETTING_LINK_SECURITY 0x00000020 ++#define MGMT_SETTING_SSP 0x00000040 ++#define MGMT_SETTING_BREDR 0x00000080 ++#define MGMT_SETTING_HS 0x00000100 ++#define MGMT_SETTING_LE 0x00000200 ++#define MGMT_SETTING_ADVERTISING 0x00000400 ++#define MGMT_SETTING_SECURE_CONN 0x00000800 ++#define MGMT_SETTING_DEBUG_KEYS 0x00001000 ++#define MGMT_SETTING_PRIVACY 0x00002000 ++#define MGMT_SETTING_CONFIGURATION 0x00004000 ++ ++#define MGMT_OP_READ_INFO 0x0004 ++struct mgmt_rp_read_info { ++ bdaddr_t bdaddr; ++ uint8_t version; ++ uint16_t manufacturer; ++ uint32_t supported_settings; ++ uint32_t current_settings; ++ uint8_t dev_class[3]; ++ uint8_t name[MGMT_MAX_NAME_LENGTH]; ++ uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH]; ++} __packed; ++ ++struct mgmt_mode { ++ uint8_t val; ++} __packed; ++ ++struct mgmt_cod { ++ uint8_t val[3]; ++} __packed; ++ ++#define MGMT_OP_SET_POWERED 0x0005 ++ ++#define MGMT_OP_SET_DISCOVERABLE 0x0006 ++struct mgmt_cp_set_discoverable { ++ uint8_t val; ++ uint16_t timeout; ++} __packed; ++ ++#define MGMT_OP_SET_CONNECTABLE 0x0007 ++ ++#define MGMT_OP_SET_FAST_CONNECTABLE 0x0008 ++ ++#define MGMT_OP_SET_BONDABLE 0x0009 ++ ++#define MGMT_OP_SET_LINK_SECURITY 0x000A ++ ++#define MGMT_OP_SET_SSP 0x000B ++ ++#define MGMT_OP_SET_HS 0x000C ++ ++#define MGMT_OP_SET_LE 0x000D ++ ++#define MGMT_OP_SET_DEV_CLASS 0x000E ++struct mgmt_cp_set_dev_class { ++ uint8_t major; ++ uint8_t minor; ++} __packed; ++ ++#define MGMT_OP_SET_LOCAL_NAME 0x000F ++struct mgmt_cp_set_local_name { ++ uint8_t name[MGMT_MAX_NAME_LENGTH]; ++ uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH]; ++} __packed; ++ ++#define MGMT_OP_ADD_UUID 0x0010 ++struct mgmt_cp_add_uuid { ++ uint8_t uuid[16]; ++ uint8_t svc_hint; ++} __packed; ++ ++#define MGMT_OP_REMOVE_UUID 0x0011 ++struct mgmt_cp_remove_uuid { ++ uint8_t uuid[16]; ++} __packed; ++ ++struct mgmt_link_key_info { ++ struct mgmt_addr_info addr; ++ uint8_t type; ++ uint8_t val[16]; ++ uint8_t pin_len; ++} __packed; ++ ++#define MGMT_OP_LOAD_LINK_KEYS 0x0012 ++struct mgmt_cp_load_link_keys { ++ uint8_t debug_keys; ++ uint16_t key_count; ++ struct mgmt_link_key_info keys[0]; ++} __packed; ++ ++struct mgmt_ltk_info { ++ struct mgmt_addr_info addr; ++ uint8_t type; ++ uint8_t master; ++ uint8_t enc_size; ++ uint16_t ediv; ++ uint64_t rand; ++ uint8_t val[16]; ++} __packed; ++ ++#define MGMT_OP_LOAD_LONG_TERM_KEYS 0x0013 ++struct mgmt_cp_load_long_term_keys { ++ uint16_t key_count; ++ struct mgmt_ltk_info keys[0]; ++} __packed; ++ ++#define MGMT_OP_DISCONNECT 0x0014 ++struct mgmt_cp_disconnect { ++ struct mgmt_addr_info addr; ++} __packed; ++struct mgmt_rp_disconnect { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_GET_CONNECTIONS 0x0015 ++struct mgmt_rp_get_connections { ++ uint16_t conn_count; ++ struct mgmt_addr_info addr[0]; ++} __packed; ++ ++#define MGMT_OP_PIN_CODE_REPLY 0x0016 ++struct mgmt_cp_pin_code_reply { ++ struct mgmt_addr_info addr; ++ uint8_t pin_len; ++ uint8_t pin_code[16]; ++} __packed; ++ ++#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017 ++struct mgmt_cp_pin_code_neg_reply { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_SET_IO_CAPABILITY 0x0018 ++struct mgmt_cp_set_io_capability { ++ uint8_t io_capability; ++} __packed; ++ ++#define MGMT_OP_PAIR_DEVICE 0x0019 ++struct mgmt_cp_pair_device { ++ struct mgmt_addr_info addr; ++ uint8_t io_cap; ++} __packed; ++struct mgmt_rp_pair_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_CANCEL_PAIR_DEVICE 0x001A ++ ++#define MGMT_OP_UNPAIR_DEVICE 0x001B ++struct mgmt_cp_unpair_device { ++ struct mgmt_addr_info addr; ++ uint8_t disconnect; ++} __packed; ++struct mgmt_rp_unpair_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_USER_CONFIRM_REPLY 0x001C ++struct mgmt_cp_user_confirm_reply { ++ struct mgmt_addr_info addr; ++} __packed; ++struct mgmt_rp_user_confirm_reply { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001D ++ ++#define MGMT_OP_USER_PASSKEY_REPLY 0x001E ++struct mgmt_cp_user_passkey_reply { ++ struct mgmt_addr_info addr; ++ uint32_t passkey; ++} __packed; ++struct mgmt_rp_user_passkey_reply { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001F ++struct mgmt_cp_user_passkey_neg_reply { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020 ++struct mgmt_rp_read_local_oob_data { ++ uint8_t hash[16]; ++ uint8_t randomizer[16]; ++} __packed; ++struct mgmt_rp_read_local_oob_ext_data { ++ uint8_t hash192[16]; ++ uint8_t randomizer192[16]; ++ uint8_t hash256[16]; ++ uint8_t randomizer256[16]; ++} __packed; ++ ++#define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0021 ++struct mgmt_cp_add_remote_oob_data { ++ struct mgmt_addr_info addr; ++ uint8_t hash[16]; ++ uint8_t randomizer[16]; ++} __packed; ++ ++#define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0022 ++struct mgmt_cp_remove_remote_oob_data { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_START_DISCOVERY 0x0023 ++struct mgmt_cp_start_discovery { ++ uint8_t type; ++} __packed; ++ ++#define MGMT_OP_STOP_DISCOVERY 0x0024 ++struct mgmt_cp_stop_discovery { ++ uint8_t type; ++} __packed; ++ ++#define MGMT_OP_CONFIRM_NAME 0x0025 ++struct mgmt_cp_confirm_name { ++ struct mgmt_addr_info addr; ++ uint8_t name_known; ++} __packed; ++struct mgmt_rp_confirm_name { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_BLOCK_DEVICE 0x0026 ++struct mgmt_cp_block_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_UNBLOCK_DEVICE 0x0027 ++struct mgmt_cp_unblock_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_SET_DEVICE_ID 0x0028 ++struct mgmt_cp_set_device_id { ++ uint16_t source; ++ uint16_t vendor; ++ uint16_t product; ++ uint16_t version; ++} __packed; ++ ++#define MGMT_OP_SET_ADVERTISING 0x0029 ++ ++#define MGMT_OP_SET_BREDR 0x002A ++ ++#define MGMT_OP_SET_STATIC_ADDRESS 0x002B ++struct mgmt_cp_set_static_address { ++ bdaddr_t bdaddr; ++} __packed; ++ ++#define MGMT_OP_SET_SCAN_PARAMS 0x002C ++struct mgmt_cp_set_scan_params { ++ uint16_t interval; ++ uint16_t window; ++} __packed; ++ ++#define MGMT_OP_SET_SECURE_CONN 0x002D ++ ++#define MGMT_OP_SET_DEBUG_KEYS 0x002E ++ ++struct mgmt_irk_info { ++ struct mgmt_addr_info addr; ++ uint8_t val[16]; ++} __packed; ++ ++#define MGMT_OP_SET_PRIVACY 0x002F ++struct mgmt_cp_set_privacy { ++ uint8_t privacy; ++ uint8_t irk[16]; ++} __packed; ++ ++#define MGMT_OP_LOAD_IRKS 0x0030 ++struct mgmt_cp_load_irks { ++ uint16_t irk_count; ++ struct mgmt_irk_info irks[0]; ++} __packed; ++ ++#define MGMT_OP_GET_CONN_INFO 0x0031 ++struct mgmt_cp_get_conn_info { ++ struct mgmt_addr_info addr; ++} __packed; ++struct mgmt_rp_get_conn_info { ++ struct mgmt_addr_info addr; ++ int8_t rssi; ++ int8_t tx_power; ++ int8_t max_tx_power; ++} __packed; ++ ++#define MGMT_OP_GET_CLOCK_INFO 0x0032 ++struct mgmt_cp_get_clock_info { ++ struct mgmt_addr_info addr; ++} __packed; ++struct mgmt_rp_get_clock_info { ++ struct mgmt_addr_info addr; ++ uint32_t local_clock; ++ uint32_t piconet_clock; ++ uint16_t accuracy; ++} __packed; ++ ++#define MGMT_OP_ADD_DEVICE 0x0033 ++struct mgmt_cp_add_device { ++ struct mgmt_addr_info addr; ++ uint8_t action; ++} __packed; ++struct mgmt_rp_add_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_OP_REMOVE_DEVICE 0x0034 ++struct mgmt_cp_remove_device { ++ struct mgmt_addr_info addr; ++} __packed; ++struct mgmt_rp_remove_device { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++struct mgmt_conn_param { ++ struct mgmt_addr_info addr; ++ uint16_t min_interval; ++ uint16_t max_interval; ++ uint16_t latency; ++ uint16_t timeout; ++} __packed; ++ ++#define MGMT_OP_LOAD_CONN_PARAM 0x0035 ++struct mgmt_cp_load_conn_param { ++ uint16_t param_count; ++ struct mgmt_conn_param params[0]; ++} __packed; ++ ++#define MGMT_OP_READ_UNCONF_INDEX_LIST 0x0036 ++struct mgmt_rp_read_unconf_index_list { ++ uint16_t num_controllers; ++ uint16_t index[0]; ++} __packed; ++ ++#define MGMT_OPTION_EXTERNAL_CONFIG 0x00000001 ++#define MGMT_OPTION_PUBLIC_ADDRESS 0x00000002 ++ ++#define MGMT_OP_READ_CONFIG_INFO 0x0037 ++struct mgmt_rp_read_config_info { ++ uint16_t manufacturer; ++ uint32_t supported_options; ++ uint32_t missing_options; ++} __packed; ++ ++#define MGMT_OP_SET_EXTERNAL_CONFIG 0x0038 ++struct mgmt_cp_set_external_config { ++ uint8_t config; ++} __packed; ++ ++#define MGMT_OP_SET_PUBLIC_ADDRESS 0x0039 ++struct mgmt_cp_set_public_address { ++ bdaddr_t bdaddr; ++} __packed; ++ ++#define MGMT_EV_CMD_COMPLETE 0x0001 ++struct mgmt_ev_cmd_complete { ++ uint16_t opcode; ++ uint8_t status; ++ uint8_t data[0]; ++} __packed; ++ ++#define MGMT_EV_CMD_STATUS 0x0002 ++struct mgmt_ev_cmd_status { ++ uint16_t opcode; ++ uint8_t status; ++} __packed; ++ ++#define MGMT_EV_CONTROLLER_ERROR 0x0003 ++struct mgmt_ev_controller_error { ++ uint8_t error_code; ++} __packed; ++ ++#define MGMT_EV_INDEX_ADDED 0x0004 ++ ++#define MGMT_EV_INDEX_REMOVED 0x0005 ++ ++#define MGMT_EV_NEW_SETTINGS 0x0006 ++ ++#define MGMT_EV_CLASS_OF_DEV_CHANGED 0x0007 ++struct mgmt_ev_class_of_dev_changed { ++ uint8_t class_of_dev[3]; ++} __packed; ++ ++#define MGMT_EV_LOCAL_NAME_CHANGED 0x0008 ++struct mgmt_ev_local_name_changed { ++ uint8_t name[MGMT_MAX_NAME_LENGTH]; ++ uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH]; ++} __packed; ++ ++#define MGMT_EV_NEW_LINK_KEY 0x0009 ++struct mgmt_ev_new_link_key { ++ uint8_t store_hint; ++ struct mgmt_link_key_info key; ++} __packed; ++ ++#define MGMT_EV_NEW_LONG_TERM_KEY 0x000A ++struct mgmt_ev_new_long_term_key { ++ uint8_t store_hint; ++ struct mgmt_ltk_info key; ++} __packed; ++ ++#define MGMT_EV_DEVICE_CONNECTED 0x000B ++struct mgmt_ev_device_connected { ++ struct mgmt_addr_info addr; ++ uint32_t flags; ++ uint16_t eir_len; ++ uint8_t eir[0]; ++} __packed; ++ ++#define MGMT_DEV_DISCONN_UNKNOWN 0x00 ++#define MGMT_DEV_DISCONN_TIMEOUT 0x01 ++#define MGMT_DEV_DISCONN_LOCAL_HOST 0x02 ++#define MGMT_DEV_DISCONN_REMOTE 0x03 ++ ++#define MGMT_EV_DEVICE_DISCONNECTED 0x000C ++struct mgmt_ev_device_disconnected { ++ struct mgmt_addr_info addr; ++ uint8_t reason; ++} __packed; ++ ++#define MGMT_EV_CONNECT_FAILED 0x000D ++struct mgmt_ev_connect_failed { ++ struct mgmt_addr_info addr; ++ uint8_t status; ++} __packed; ++ ++#define MGMT_EV_PIN_CODE_REQUEST 0x000E ++struct mgmt_ev_pin_code_request { ++ struct mgmt_addr_info addr; ++ uint8_t secure; ++} __packed; ++ ++#define MGMT_EV_USER_CONFIRM_REQUEST 0x000F ++struct mgmt_ev_user_confirm_request { ++ struct mgmt_addr_info addr; ++ uint8_t confirm_hint; ++ uint32_t value; ++} __packed; ++ ++#define MGMT_EV_USER_PASSKEY_REQUEST 0x0010 ++struct mgmt_ev_user_passkey_request { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_EV_AUTH_FAILED 0x0011 ++struct mgmt_ev_auth_failed { ++ struct mgmt_addr_info addr; ++ uint8_t status; ++} __packed; ++ ++#define MGMT_DEV_FOUND_CONFIRM_NAME 0x01 ++#define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02 ++#define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04 ++ ++#define MGMT_EV_DEVICE_FOUND 0x0012 ++struct mgmt_ev_device_found { ++ struct mgmt_addr_info addr; ++ int8_t rssi; ++ uint32_t flags; ++ uint16_t eir_len; ++ uint8_t eir[0]; ++} __packed; ++ ++#define MGMT_EV_DISCOVERING 0x0013 ++struct mgmt_ev_discovering { ++ uint8_t type; ++ uint8_t discovering; ++} __packed; ++ ++#define MGMT_EV_DEVICE_BLOCKED 0x0014 ++struct mgmt_ev_device_blocked { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_EV_DEVICE_UNBLOCKED 0x0015 ++struct mgmt_ev_device_unblocked { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_EV_DEVICE_UNPAIRED 0x0016 ++struct mgmt_ev_device_unpaired { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_EV_PASSKEY_NOTIFY 0x0017 ++struct mgmt_ev_passkey_notify { ++ struct mgmt_addr_info addr; ++ uint32_t passkey; ++ uint8_t entered; ++} __packed; ++ ++#define MGMT_EV_NEW_IRK 0x0018 ++struct mgmt_ev_new_irk { ++ uint8_t store_hint; ++ bdaddr_t rpa; ++ struct mgmt_irk_info key; ++} __packed; ++ ++struct mgmt_csrk_info { ++ struct mgmt_addr_info addr; ++ uint8_t master; ++ uint8_t val[16]; ++} __packed; ++ ++#define MGMT_EV_NEW_CSRK 0x0019 ++struct mgmt_ev_new_csrk { ++ uint8_t store_hint; ++ struct mgmt_csrk_info key; ++} __packed; ++ ++#define MGMT_EV_DEVICE_ADDED 0x001a ++struct mgmt_ev_device_added { ++ struct mgmt_addr_info addr; ++ uint8_t action; ++} __packed; ++ ++#define MGMT_EV_DEVICE_REMOVED 0x001b ++struct mgmt_ev_device_removed { ++ struct mgmt_addr_info addr; ++} __packed; ++ ++#define MGMT_EV_NEW_CONN_PARAM 0x001c ++struct mgmt_ev_new_conn_param { ++ struct mgmt_addr_info addr; ++ uint8_t store_hint; ++ uint16_t min_interval; ++ uint16_t max_interval; ++ uint16_t latency; ++ uint16_t timeout; ++} __packed; ++ ++#define MGMT_EV_UNCONF_INDEX_ADDED 0x001d ++ ++#define MGMT_EV_UNCONF_INDEX_REMOVED 0x001e ++ ++#define MGMT_EV_NEW_CONFIG_OPTIONS 0x001f ++ ++static const char *mgmt_op[] = { ++ "<0x0000>", ++ "Read Version", ++ "Read Commands", ++ "Read Index List", ++ "Read Controller Info", ++ "Set Powered", ++ "Set Discoverable", ++ "Set Connectable", ++ "Set Fast Connectable", /* 0x0008 */ ++ "Set Bondable", ++ "Set Link Security", ++ "Set Secure Simple Pairing", ++ "Set High Speed", ++ "Set Low Energy", ++ "Set Dev Class", ++ "Set Local Name", ++ "Add UUID", /* 0x0010 */ ++ "Remove UUID", ++ "Load Link Keys", ++ "Load Long Term Keys", ++ "Disconnect", ++ "Get Connections", ++ "PIN Code Reply", ++ "PIN Code Neg Reply", ++ "Set IO Capability", /* 0x0018 */ ++ "Pair Device", ++ "Cancel Pair Device", ++ "Unpair Device", ++ "User Confirm Reply", ++ "User Confirm Neg Reply", ++ "User Passkey Reply", ++ "User Passkey Neg Reply", ++ "Read Local OOB Data", /* 0x0020 */ ++ "Add Remote OOB Data", ++ "Remove Remove OOB Data", ++ "Start Discovery", ++ "Stop Discovery", ++ "Confirm Name", ++ "Block Device", ++ "Unblock Device", ++ "Set Device ID", ++ "Set Advertising", ++ "Set BR/EDR", ++ "Set Static Address", ++ "Set Scan Parameters", ++ "Set Secure Connections", ++ "Set Debug Keys", ++ "Set Privacy", ++ "Load Identity Resolving Keys", ++ "Get Connection Information", ++ "Get Clock Information", ++ "Add Device", ++ "Remove Device", ++ "Load Connection Parameters", ++ "Read Unconfigured Index List", ++ "Read Controller Configuration Information", ++ "Set External Configuration", ++ "Set Public Address", ++}; ++ ++static const char *mgmt_ev[] = { ++ "<0x0000>", ++ "Command Complete", ++ "Command Status", ++ "Controller Error", ++ "Index Added", ++ "Index Removed", ++ "New Settings", ++ "Class of Device Changed", ++ "Local Name Changed", /* 0x0008 */ ++ "New Link Key", ++ "New Long Term Key", ++ "Device Connected", ++ "Device Disconnected", ++ "Connect Failed", ++ "PIN Code Request", ++ "User Confirm Request", ++ "User Passkey Request", /* 0x0010 */ ++ "Authentication Failed", ++ "Device Found", ++ "Discovering", ++ "Device Blocked", ++ "Device Unblocked", ++ "Device Unpaired", ++ "Passkey Notify", ++ "New Identity Resolving Key", ++ "New Signature Resolving Key", ++ "Device Added", ++ "Device Removed", ++ "New Connection Parameter", ++ "Unconfigured Index Added", ++ "Unconfigured Index Removed", ++ "New Configuration Options", ++}; ++ ++static const char *mgmt_status[] = { ++ "Success", ++ "Unknown Command", ++ "Not Connected", ++ "Failed", ++ "Connect Failed", ++ "Authentication Failed", ++ "Not Paired", ++ "No Resources", ++ "Timeout", ++ "Already Connected", ++ "Busy", ++ "Rejected", ++ "Not Supported", ++ "Invalid Parameters", ++ "Disconnected", ++ "Not Powered", ++ "Cancelled", ++ "Invalid Index", ++ "Blocked through rfkill", ++}; ++ ++#ifndef NELEM ++#define NELEM(x) (sizeof(x) / sizeof((x)[0])) ++#endif ++ ++static inline const char *mgmt_opstr(uint16_t op) ++{ ++ if (op >= NELEM(mgmt_op)) ++ return ""; ++ return mgmt_op[op]; ++} ++ ++static inline const char *mgmt_evstr(uint16_t ev) ++{ ++ if (ev >= NELEM(mgmt_ev)) ++ return ""; ++ return mgmt_ev[ev]; ++} ++ ++static inline const char *mgmt_errstr(uint8_t status) ++{ ++ if (status >= NELEM(mgmt_status)) ++ return ""; ++ return mgmt_status[status]; ++}