From f60a1b5fee8e539637596adb29b8add6651dd836 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 14 Dec 2011 14:20:14 +0200 Subject: [PATCH] mgmt: Update implementation to match latest API spec --- lib/mgmt.h | 138 +++++++++++++++++++++++++++------------------- plugins/mgmtops.c | 15 ++--- 2 files changed, 87 insertions(+), 66 deletions(-) diff --git a/lib/mgmt.h b/lib/mgmt.h index ca082140b..5f653c03e 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -93,28 +93,33 @@ struct mgmt_cp_set_discoverable { #define MGMT_OP_SET_CONNECTABLE 0x0007 -#define MGMT_OP_SET_PAIRABLE 0x0008 +#define MGMT_OP_SET_FAST_CONNECTABLE 0x0008 -#define MGMT_OP_ADD_UUID 0x0009 -struct mgmt_cp_add_uuid { - uint8_t uuid[16]; - uint8_t svc_hint; -} __packed; +#define MGMT_OP_SET_PAIRABLE 0x0009 -#define MGMT_OP_REMOVE_UUID 0x000A -struct mgmt_cp_remove_uuid { - uint8_t uuid[16]; -} __packed; +#define MGMT_OP_SET_LINK_SECURITY 0x000A + +#define MGMT_OP_SET_SSP 0x000B + +#define MGMT_OP_SET_HS 0x000C -#define MGMT_OP_SET_DEV_CLASS 0x000B +#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_SERVICE_CACHE 0x000C -struct mgmt_cp_set_service_cache { - uint8_t enable; +#define MGMT_OP_ADD_UUID 0x000F +struct mgmt_cp_add_uuid { + uint8_t uuid[16]; + uint8_t svc_hint; +} __packed; + +#define MGMT_OP_REMOVE_UUID 0x0010 +struct mgmt_cp_remove_uuid { + uint8_t uuid[16]; } __packed; struct mgmt_link_key_info { @@ -124,14 +129,14 @@ struct mgmt_link_key_info { uint8_t pin_len; } __packed; -#define MGMT_OP_LOAD_LINK_KEYS 0x000D +#define MGMT_OP_LOAD_LINK_KEYS 0x0011 struct mgmt_cp_load_link_keys { uint8_t debug_keys; uint16_t key_count; struct mgmt_link_key_info keys[0]; } __packed; -#define MGMT_OP_REMOVE_KEYS 0x000E +#define MGMT_OP_REMOVE_KEYS 0x0012 struct mgmt_cp_remove_keys { bdaddr_t bdaddr; uint8_t disconnect; @@ -141,7 +146,7 @@ struct mgmt_rp_remove_keys { uint8_t status; } __packed; -#define MGMT_OP_DISCONNECT 0x000F +#define MGMT_OP_DISCONNECT 0x0013 struct mgmt_cp_disconnect { bdaddr_t bdaddr; } __packed; @@ -160,30 +165,30 @@ struct mgmt_addr_info { uint8_t type; } __packed; -#define MGMT_OP_GET_CONNECTIONS 0x0010 +#define MGMT_OP_GET_CONNECTIONS 0x0014 struct mgmt_rp_get_connections { uint16_t conn_count; struct mgmt_addr_info addr[0]; } __packed; -#define MGMT_OP_PIN_CODE_REPLY 0x0011 +#define MGMT_OP_PIN_CODE_REPLY 0x0015 struct mgmt_cp_pin_code_reply { bdaddr_t bdaddr; uint8_t pin_len; uint8_t pin_code[16]; } __packed; -#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0012 +#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0016 struct mgmt_cp_pin_code_neg_reply { bdaddr_t bdaddr; } __packed; -#define MGMT_OP_SET_IO_CAPABILITY 0x0013 +#define MGMT_OP_SET_IO_CAPABILITY 0x0017 struct mgmt_cp_set_io_capability { uint8_t io_capability; } __packed; -#define MGMT_OP_PAIR_DEVICE 0x0014 +#define MGMT_OP_PAIR_DEVICE 0x0018 struct mgmt_cp_pair_device { struct mgmt_addr_info addr; uint8_t io_cap; @@ -193,7 +198,7 @@ struct mgmt_rp_pair_device { uint8_t status; } __packed; -#define MGMT_OP_USER_CONFIRM_REPLY 0x0015 +#define MGMT_OP_USER_CONFIRM_REPLY 0x0019 struct mgmt_cp_user_confirm_reply { bdaddr_t bdaddr; } __packed; @@ -202,53 +207,67 @@ struct mgmt_rp_user_confirm_reply { uint8_t status; } __packed; -#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x0016 +#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001A + +#define MGMT_OP_USER_PASSKEY_REPLY 0x001B +struct mgmt_cp_user_passkey_reply { + bdaddr_t bdaddr; + uint32_t passkey; +} __packed; +struct mgmt_rp_user_passkey_reply { + bdaddr_t bdaddr; + uint8_t status; +} __packed; + +#define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001C -#define MGMT_OP_SET_LOCAL_NAME 0x0017 +#define MGMT_OP_SET_LOCAL_NAME 0x001D 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_READ_LOCAL_OOB_DATA 0x0018 +#define MGMT_OP_READ_LOCAL_OOB_DATA 0x001E struct mgmt_rp_read_local_oob_data { uint8_t hash[16]; uint8_t randomizer[16]; } __packed; -#define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0019 +#define MGMT_OP_ADD_REMOTE_OOB_DATA 0x001F struct mgmt_cp_add_remote_oob_data { bdaddr_t bdaddr; uint8_t hash[16]; uint8_t randomizer[16]; } __packed; -#define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x001A +#define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0020 struct mgmt_cp_remove_remote_oob_data { bdaddr_t bdaddr; } __packed; -#define MGMT_OP_START_DISCOVERY 0x001B +#define MGMT_OP_START_DISCOVERY 0x0021 struct mgmt_cp_start_discovery { uint8_t type; } __packed; -#define MGMT_OP_STOP_DISCOVERY 0x001C +#define MGMT_OP_STOP_DISCOVERY 0x0022 + +#define MGMT_OP_CONFIRM_NAME 0x0023 +struct mgmt_cp_confirm_name { + bdaddr_t bdaddr; + uint8_t name_known; +}; -#define MGMT_OP_BLOCK_DEVICE 0x001D +#define MGMT_OP_BLOCK_DEVICE 0x0024 struct mgmt_cp_block_device { bdaddr_t bdaddr; } __packed; -#define MGMT_OP_UNBLOCK_DEVICE 0x001E +#define MGMT_OP_UNBLOCK_DEVICE 0x0025 struct mgmt_cp_unblock_device { bdaddr_t bdaddr; } __packed; -#define MGMT_OP_SET_FAST_CONNECTABLE 0x001F -struct mgmt_cp_set_fast_connectable { - uint8_t enable; -} __packed; - #define MGMT_EV_CMD_COMPLETE 0x0001 struct mgmt_ev_cmd_complete { uint16_t opcode; @@ -272,53 +291,58 @@ struct mgmt_ev_controller_error { #define MGMT_EV_NEW_SETTINGS 0x0006 -#define MGMT_EV_DISCOVERABLE 0x0007 - -#define MGMT_EV_CONNECTABLE 0x0008 +#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_PAIRABLE 0x0009 +#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 0x000A +#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_DEVICE_CONNECTED 0x000B +#define MGMT_EV_DEVICE_CONNECTED 0x000A -#define MGMT_EV_DEVICE_DISCONNECTED 0x000C +#define MGMT_EV_DEVICE_DISCONNECTED 0x000B -#define MGMT_EV_CONNECT_FAILED 0x000D +#define MGMT_EV_CONNECT_FAILED 0x000C struct mgmt_ev_connect_failed { struct mgmt_addr_info addr; uint8_t status; } __packed; -#define MGMT_EV_PIN_CODE_REQUEST 0x000E +#define MGMT_EV_PIN_CODE_REQUEST 0x000D struct mgmt_ev_pin_code_request { bdaddr_t bdaddr; uint8_t secure; } __packed; -#define MGMT_EV_USER_CONFIRM_REQUEST 0x000F +#define MGMT_EV_USER_CONFIRM_REQUEST 0x000E struct mgmt_ev_user_confirm_request { bdaddr_t bdaddr; uint8_t confirm_hint; uint32_t value; } __packed; +#define MGMT_EV_USER_PASSKEY_REQUEST 0x000F +struct mgmt_ev_user_passkey_request { + bdaddr_t bdaddr; +} __packed; + #define MGMT_EV_AUTH_FAILED 0x0010 struct mgmt_ev_auth_failed { bdaddr_t bdaddr; uint8_t status; } __packed; -#define MGMT_EV_LOCAL_NAME_CHANGED 0x0011 -struct mgmt_ev_local_name_changed { - uint8_t name[MGMT_MAX_NAME_LENGTH]; -} __packed; - -#define MGMT_EV_DEVICE_FOUND 0x0012 +#define MGMT_EV_DEVICE_FOUND 0x0011 struct mgmt_ev_device_found { struct mgmt_addr_info addr; uint8_t dev_class[3]; @@ -326,20 +350,20 @@ struct mgmt_ev_device_found { uint8_t eir[HCI_MAX_EIR_LENGTH]; } __packed; -#define MGMT_EV_REMOTE_NAME 0x0013 +#define MGMT_EV_REMOTE_NAME 0x0012 struct mgmt_ev_remote_name { bdaddr_t bdaddr; uint8_t name[MGMT_MAX_NAME_LENGTH]; } __packed; -#define MGMT_EV_DISCOVERING 0x0014 +#define MGMT_EV_DISCOVERING 0x0013 -#define MGMT_EV_DEVICE_BLOCKED 0x0015 +#define MGMT_EV_DEVICE_BLOCKED 0x0014 struct mgmt_ev_device_blocked { bdaddr_t bdaddr; } __packed; -#define MGMT_EV_DEVICE_UNBLOCKED 0x0016 +#define MGMT_EV_DEVICE_UNBLOCKED 0x0015 struct mgmt_ev_device_unblocked { bdaddr_t bdaddr; } __packed; diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c index ff208223d..8e6eb4d1f 100644 --- a/plugins/mgmtops.c +++ b/plugins/mgmtops.c @@ -764,8 +764,6 @@ static void read_info_complete(int sk, uint16_t index, void *buf, size_t len) return; } - mgmt_set_mode(index, MGMT_OP_SET_SERVICE_CACHE, 1); - info = &controllers[index]; bacpy(&info->bdaddr, &rp->bdaddr); @@ -1022,9 +1020,6 @@ static void mgmt_cmd_complete(int sk, uint16_t index, void *buf, size_t len) case MGMT_OP_SET_DEV_CLASS: DBG("set_dev_class complete"); break; - case MGMT_OP_SET_SERVICE_CACHE: - DBG("set_service_cache complete"); - break; case MGMT_OP_LOAD_LINK_KEYS: DBG("load_link_keys complete"); break; @@ -1592,9 +1587,9 @@ static int mgmt_cancel_resolve_name(int index, bdaddr_t *bdaddr) static int mgmt_set_fast_connectable(int index, gboolean enable) { - char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_set_fast_connectable)]; + char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_mode)]; struct mgmt_hdr *hdr = (void *) buf; - struct mgmt_cp_set_fast_connectable *cp = (void *) &buf[sizeof(*hdr)]; + struct mgmt_mode *cp = (void *) &buf[sizeof(*hdr)]; DBG("index %d enable %d", index, enable); @@ -1603,7 +1598,7 @@ static int mgmt_set_fast_connectable(int index, gboolean enable) hdr->len = htobs(sizeof(*cp)); hdr->index = htobs(index); - cp->enable = enable; + cp->val = enable; if (write(mgmt_sock, buf, sizeof(buf)) < 0) return -errno; @@ -1786,7 +1781,9 @@ static int mgmt_set_did(int index, uint16_t vendor, uint16_t product, static int mgmt_disable_cod_cache(int index) { DBG("index %d", index); - return mgmt_set_mode(index, MGMT_OP_SET_SERVICE_CACHE, 0); + + /* The cache control is handled automatically for mgmt */ + return 0; } static int mgmt_restore_powered(int index) -- 2.47.3