1 /* 2 * QEMU Bluetooth HCI helpers. 3 * 4 * Copyright (C) 2007 OpenMoko, Inc. 5 * Written by Andrzej Zaborowski <andrew (at) openedhand.com> 6 * 7 * Useful definitions taken from BlueZ project's headers. 8 * Copyright (C) 2000-2001 Qualcomm Incorporated 9 * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk (at) qualcomm.com> 10 * Copyright (C) 2002-2006 Marcel Holtmann <marcel (at) holtmann.org> 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License as 14 * published by the Free Software Foundation; either version 2 of 15 * the License, or (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 * 22 * You should have received a copy of the GNU General Public License 23 * along with this program; if not, write to the Free Software 24 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 25 * MA 02110-1301 USA 26 */ 27 28 /* BD Address */ 29 typedef struct { 30 uint8_t b[6]; 31 } __attribute__((packed)) bdaddr_t; 32 33 #define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}}) 34 #define BDADDR_ALL (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}) 35 #define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}}) 36 37 /* Copy, swap, convert BD Address */ 38 static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2) 39 { 40 return memcmp(ba1, ba2, sizeof(bdaddr_t)); 41 } 42 static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src) 43 { 44 memcpy(dst, src, sizeof(bdaddr_t)); 45 } 46 47 #define BAINIT(orig) { .b = { \ 48 (orig)->b[0], (orig)->b[1], (orig)->b[2], \ 49 (orig)->b[3], (orig)->b[4], (orig)->b[5], \ 50 }, } 51 52 /* The twisted structures of a bluetooth environment */ 53 struct bt_device_s; 54 struct bt_scatternet_s; 55 struct bt_piconet_s; 56 struct bt_link_s; 57 58 struct bt_scatternet_s { 59 struct bt_device_s *slave; 60 }; 61 62 struct bt_link_s { 63 struct bt_device_s *slave, *host; 64 uint16_t handle; /* Master (host) side handle */ 65 uint16_t acl_interval; 66 enum { 67 acl_active, 68 acl_hold, 69 acl_sniff, 70 acl_parked, 71 } acl_mode; 72 }; 73 74 struct bt_device_s { 75 int lt_addr; 76 bdaddr_t bd_addr; 77 int mtu; 78 int setup; 79 struct bt_scatternet_s *net; 80 81 uint8_t key[16]; 82 int key_present; 83 uint8_t class[3]; 84 85 uint8_t reject_reason; 86 87 uint64_t lmp_caps; 88 const char *lmp_name; 89 void (*lmp_connection_request)(struct bt_link_s *link); 90 void (*lmp_connection_complete)(struct bt_link_s *link); 91 void (*lmp_disconnect_master)(struct bt_link_s *link); 92 void (*lmp_disconnect_slave)(struct bt_link_s *link); 93 void (*lmp_acl_data)(struct bt_link_s *link, const uint8_t *data, 94 int start, int len); 95 void (*lmp_acl_resp)(struct bt_link_s *link, const uint8_t *data, 96 int start, int len); 97 void (*lmp_mode_change)(struct bt_link_s *link); 98 99 void (*handle_destroy)(struct bt_device_s *device); 100 struct bt_device_s *next; /* Next in the piconet/scatternet */ 101 102 int inquiry_scan; 103 int page_scan; 104 105 uint16_t clkoff; /* Note: Always little-endian */ 106 }; 107 108 /* bt.c */ 109 void bt_device_init(struct bt_device_s *dev, struct bt_scatternet_s *net); 110 void bt_device_done(struct bt_device_s *dev); 111 112 /* bt-hci.c */ 113 struct HCIInfo *bt_new_hci(struct bt_scatternet_s *net); 114 115 /* bt-vhci.c */ 116 void bt_vhci_init(struct HCIInfo *info); 117 118 /* bt-hci-csr.c */ 119 enum { 120 csrhci_pin_reset, 121 csrhci_pin_wakeup, 122 __csrhci_pins, 123 }; 124 qemu_irq *csrhci_pins_get(CharDriverState *chr); 125 CharDriverState *uart_hci_init(qemu_irq wakeup); 126 127 /* bt-l2cap.c */ 128 struct bt_l2cap_device_s; 129 struct bt_l2cap_conn_params_s; 130 struct bt_l2cap_psm_s; 131 void bt_l2cap_device_init(struct bt_l2cap_device_s *dev, 132 struct bt_scatternet_s *net); 133 void bt_l2cap_device_done(struct bt_l2cap_device_s *dev); 134 void bt_l2cap_psm_register(struct bt_l2cap_device_s *dev, int psm, 135 int min_mtu, int (*new_channel)(struct bt_l2cap_device_s *dev, 136 struct bt_l2cap_conn_params_s *params)); 137 138 struct bt_l2cap_device_s { 139 struct bt_device_s device; 140 struct bt_l2cap_psm_s *first_psm; 141 }; 142 143 struct bt_l2cap_conn_params_s { 144 /* Input */ 145 uint8_t *(*sdu_out)(struct bt_l2cap_conn_params_s *chan, int len); 146 void (*sdu_submit)(struct bt_l2cap_conn_params_s *chan); 147 int remote_mtu; 148 /* Output */ 149 void *opaque; 150 void (*sdu_in)(void *opaque, const uint8_t *data, int len); 151 void (*close)(void *opaque); 152 }; 153 154 enum bt_l2cap_psm_predef { 155 BT_PSM_SDP = 0x0001, 156 BT_PSM_RFCOMM = 0x0003, 157 BT_PSM_TELEPHONY = 0x0005, 158 BT_PSM_TCS = 0x0007, 159 BT_PSM_BNEP = 0x000f, 160 BT_PSM_HID_CTRL = 0x0011, 161 BT_PSM_HID_INTR = 0x0013, 162 BT_PSM_UPNP = 0x0015, 163 BT_PSM_AVCTP = 0x0017, 164 BT_PSM_AVDTP = 0x0019, 165 }; 166 167 /* bt-sdp.c */ 168 void bt_l2cap_sdp_init(struct bt_l2cap_device_s *dev); 169 170 /* bt-hid.c */ 171 struct bt_device_s *bt_mouse_init(struct bt_scatternet_s *net); 172 struct bt_device_s *bt_tablet_init(struct bt_scatternet_s *net); 173 struct bt_device_s *bt_keyboard_init(struct bt_scatternet_s *net); 174 175 /* Link Management Protocol layer defines */ 176 177 #define LLID_ACLU_CONT 0x1 178 #define LLID_ACLU_START 0x2 179 #define LLID_ACLC 0x3 180 181 enum lmp_pdu_type { 182 LMP_NAME_REQ = 0x0001, 183 LMP_NAME_RES = 0x0002, 184 LMP_ACCEPTED = 0x0003, 185 LMP_NOT_ACCEPTED = 0x0004, 186 LMP_CLKOFFSET_REQ = 0x0005, 187 LMP_CLKOFFSET_RES = 0x0006, 188 LMP_DETACH = 0x0007, 189 LMP_IN_RAND = 0x0008, 190 LMP_COMB_KEY = 0x0009, 191 LMP_UNIT_KEY = 0x000a, 192 LMP_AU_RAND = 0x000b, 193 LMP_SRES = 0x000c, 194 LMP_TEMP_RAND = 0x000d, 195 LMP_TEMP_KEY = 0x000e, 196 LMP_CRYPT_MODE_REQ = 0x000f, 197 LMP_CRYPT_KEY_SIZE_REQ = 0x0010, 198 LMP_START_ENCRYPT_REQ = 0x0011, 199 LMP_STOP_ENCRYPT_REQ = 0x0012, 200 LMP_SWITCH_REQ = 0x0013, 201 LMP_HOLD = 0x0014, 202 LMP_HOLD_REQ = 0x0015, 203 LMP_SNIFF_REQ = 0x0017, 204 LMP_UNSNIFF_REQ = 0x0018, 205 LMP_LMP_PARK_REQ = 0x0019, 206 LMP_SET_BCAST_SCAN_WND = 0x001b, 207 LMP_MODIFY_BEACON = 0x001c, 208 LMP_UNPARK_BD_ADDR_REQ = 0x001d, 209 LMP_UNPARK_PM_ADDR_REQ = 0x001e, 210 LMP_INCR_POWER_REQ = 0x001f, 211 LMP_DECR_POWER_REQ = 0x0020, 212 LMP_MAX_POWER = 0x0021, 213 LMP_MIN_POWER = 0x0022, 214 LMP_AUTO_RATE = 0x0023, 215 LMP_PREFERRED_RATE = 0x0024, 216 LMP_VERSION_REQ = 0x0025, 217 LMP_VERSION_RES = 0x0026, 218 LMP_FEATURES_REQ = 0x0027, 219 LMP_FEATURES_RES = 0x0028, 220 LMP_QUALITY_OF_SERVICE = 0x0029, 221 LMP_QOS_REQ = 0x002a, 222 LMP_RM_SCO_LINK_REQ = 0x002b, 223 LMP_SCO_LINK_REQ = 0x002c, 224 LMP_MAX_SLOT = 0x002d, 225 LMP_MAX_SLOT_REQ = 0x002e, 226 LMP_TIMING_ACCURACY_REQ = 0x002f, 227 LMP_TIMING_ACCURACY_RES = 0x0030, 228 LMP_SETUP_COMPLETE = 0x0031, 229 LMP_USE_SEMIPERM_KEY = 0x0032, 230 LMP_HOST_CONNECTION_REQ = 0x0033, 231 LMP_SLOT_OFFSET = 0x0034, 232 LMP_PAGE_MODE_REQ = 0x0035, 233 LMP_PAGE_SCAN_MODE_REQ = 0x0036, 234 LMP_SUPERVISION_TIMEOUT = 0x0037, 235 LMP_TEST_ACTIVATE = 0x0038, 236 LMP_TEST_CONTROL = 0x0039, 237 LMP_CRYPT_KEY_MASK_REQ = 0x003a, 238 LMP_CRYPT_KEY_MASK_RES = 0x003b, 239 LMP_SET_AFH = 0x003c, 240 LMP_ACCEPTED_EXT = 0x7f01, 241 LMP_NOT_ACCEPTED_EXT = 0x7f02, 242 LMP_FEATURES_REQ_EXT = 0x7f03, 243 LMP_FEATURES_RES_EXT = 0x7f04, 244 LMP_PACKET_TYPE_TBL_REQ = 0x7f0b, 245 LMP_ESCO_LINK_REQ = 0x7f0c, 246 LMP_RM_ESCO_LINK_REQ = 0x7f0d, 247 LMP_CHANNEL_CLASS_REQ = 0x7f10, 248 LMP_CHANNEL_CLASS = 0x7f11, 249 }; 250 251 /* Host Controller Interface layer defines */ 252 253 enum hci_packet_type { 254 HCI_COMMAND_PKT = 0x01, 255 HCI_ACLDATA_PKT = 0x02, 256 HCI_SCODATA_PKT = 0x03, 257 HCI_EVENT_PKT = 0x04, 258 HCI_VENDOR_PKT = 0xff, 259 }; 260 261 enum bt_packet_type { 262 HCI_2DH1 = 1 << 1, 263 HCI_3DH1 = 1 << 2, 264 HCI_DM1 = 1 << 3, 265 HCI_DH1 = 1 << 4, 266 HCI_2DH3 = 1 << 8, 267 HCI_3DH3 = 1 << 9, 268 HCI_DM3 = 1 << 10, 269 HCI_DH3 = 1 << 11, 270 HCI_2DH5 = 1 << 12, 271 HCI_3DH5 = 1 << 13, 272 HCI_DM5 = 1 << 14, 273 HCI_DH5 = 1 << 15, 274 }; 275 276 enum sco_packet_type { 277 HCI_HV1 = 1 << 5, 278 HCI_HV2 = 1 << 6, 279 HCI_HV3 = 1 << 7, 280 }; 281 282 enum ev_packet_type { 283 HCI_EV3 = 1 << 3, 284 HCI_EV4 = 1 << 4, 285 HCI_EV5 = 1 << 5, 286 HCI_2EV3 = 1 << 6, 287 HCI_3EV3 = 1 << 7, 288 HCI_2EV5 = 1 << 8, 289 HCI_3EV5 = 1 << 9, 290 }; 291 292 enum hci_error_code { 293 HCI_SUCCESS = 0x00, 294 HCI_UNKNOWN_COMMAND = 0x01, 295 HCI_NO_CONNECTION = 0x02, 296 HCI_HARDWARE_FAILURE = 0x03, 297 HCI_PAGE_TIMEOUT = 0x04, 298 HCI_AUTHENTICATION_FAILURE = 0x05, 299 HCI_PIN_OR_KEY_MISSING = 0x06, 300 HCI_MEMORY_FULL = 0x07, 301 HCI_CONNECTION_TIMEOUT = 0x08, 302 HCI_MAX_NUMBER_OF_CONNECTIONS = 0x09, 303 HCI_MAX_NUMBER_OF_SCO_CONNECTIONS = 0x0a, 304 HCI_ACL_CONNECTION_EXISTS = 0x0b, 305 HCI_COMMAND_DISALLOWED = 0x0c, 306 HCI_REJECTED_LIMITED_RESOURCES = 0x0d, 307 HCI_REJECTED_SECURITY = 0x0e, 308 HCI_REJECTED_PERSONAL = 0x0f, 309 HCI_HOST_TIMEOUT = 0x10, 310 HCI_UNSUPPORTED_FEATURE = 0x11, 311 HCI_INVALID_PARAMETERS = 0x12, 312 HCI_OE_USER_ENDED_CONNECTION = 0x13, 313 HCI_OE_LOW_RESOURCES = 0x14, 314 HCI_OE_POWER_OFF = 0x15, 315 HCI_CONNECTION_TERMINATED = 0x16, 316 HCI_REPEATED_ATTEMPTS = 0x17, 317 HCI_PAIRING_NOT_ALLOWED = 0x18, 318 HCI_UNKNOWN_LMP_PDU = 0x19, 319 HCI_UNSUPPORTED_REMOTE_FEATURE = 0x1a, 320 HCI_SCO_OFFSET_REJECTED = 0x1b, 321 HCI_SCO_INTERVAL_REJECTED = 0x1c, 322 HCI_AIR_MODE_REJECTED = 0x1d, 323 HCI_INVALID_LMP_PARAMETERS = 0x1e, 324 HCI_UNSPECIFIED_ERROR = 0x1f, 325 HCI_UNSUPPORTED_LMP_PARAMETER_VALUE = 0x20, 326 HCI_ROLE_CHANGE_NOT_ALLOWED = 0x21, 327 HCI_LMP_RESPONSE_TIMEOUT = 0x22, 328 HCI_LMP_ERROR_TRANSACTION_COLLISION = 0x23, 329 HCI_LMP_PDU_NOT_ALLOWED = 0x24, 330 HCI_ENCRYPTION_MODE_NOT_ACCEPTED = 0x25, 331 HCI_UNIT_LINK_KEY_USED = 0x26, 332 HCI_QOS_NOT_SUPPORTED = 0x27, 333 HCI_INSTANT_PASSED = 0x28, 334 HCI_PAIRING_NOT_SUPPORTED = 0x29, 335 HCI_TRANSACTION_COLLISION = 0x2a, 336 HCI_QOS_UNACCEPTABLE_PARAMETER = 0x2c, 337 HCI_QOS_REJECTED = 0x2d, 338 HCI_CLASSIFICATION_NOT_SUPPORTED = 0x2e, 339 HCI_INSUFFICIENT_SECURITY = 0x2f, 340 HCI_PARAMETER_OUT_OF_RANGE = 0x30, 341 HCI_ROLE_SWITCH_PENDING = 0x32, 342 HCI_SLOT_VIOLATION = 0x34, 343 HCI_ROLE_SWITCH_FAILED = 0x35, 344 }; 345 346 enum acl_flag_bits { 347 ACL_CONT = 1 << 0, 348 ACL_START = 1 << 1, 349 ACL_ACTIVE_BCAST = 1 << 2, 350 ACL_PICO_BCAST = 1 << 3, 351 }; 352 353 enum baseband_link_type { 354 SCO_LINK = 0x00, 355 ACL_LINK = 0x01, 356 }; 357 358 enum lmp_feature_bits0 { 359 LMP_3SLOT = 1 << 0, 360 LMP_5SLOT = 1 << 1, 361 LMP_ENCRYPT = 1 << 2, 362 LMP_SOFFSET = 1 << 3, 363 LMP_TACCURACY = 1 << 4, 364 LMP_RSWITCH = 1 << 5, 365 LMP_HOLD_MODE = 1 << 6, 366 LMP_SNIFF_MODE = 1 << 7, 367 }; 368 369 enum lmp_feature_bits1 { 370 LMP_PARK = 1 << 0, 371 LMP_RSSI = 1 << 1, 372 LMP_QUALITY = 1 << 2, 373 LMP_SCO = 1 << 3, 374 LMP_HV2 = 1 << 4, 375 LMP_HV3 = 1 << 5, 376 LMP_ULAW = 1 << 6, 377 LMP_ALAW = 1 << 7, 378 }; 379 380 enum lmp_feature_bits2 { 381 LMP_CVSD = 1 << 0, 382 LMP_PSCHEME = 1 << 1, 383 LMP_PCONTROL = 1 << 2, 384 LMP_TRSP_SCO = 1 << 3, 385 LMP_BCAST_ENC = 1 << 7, 386 }; 387 388 enum lmp_feature_bits3 { 389 LMP_EDR_ACL_2M = 1 << 1, 390 LMP_EDR_ACL_3M = 1 << 2, 391 LMP_ENH_ISCAN = 1 << 3, 392 LMP_ILACE_ISCAN = 1 << 4, 393 LMP_ILACE_PSCAN = 1 << 5, 394 LMP_RSSI_INQ = 1 << 6, 395 LMP_ESCO = 1 << 7, 396 }; 397 398 enum lmp_feature_bits4 { 399 LMP_EV4 = 1 << 0, 400 LMP_EV5 = 1 << 1, 401 LMP_AFH_CAP_SLV = 1 << 3, 402 LMP_AFH_CLS_SLV = 1 << 4, 403 LMP_EDR_3SLOT = 1 << 7, 404 }; 405 406 enum lmp_feature_bits5 { 407 LMP_EDR_5SLOT = 1 << 0, 408 LMP_SNIFF_SUBR = 1 << 1, 409 LMP_AFH_CAP_MST = 1 << 3, 410 LMP_AFH_CLS_MST = 1 << 4, 411 LMP_EDR_ESCO_2M = 1 << 5, 412 LMP_EDR_ESCO_3M = 1 << 6, 413 LMP_EDR_3S_ESCO = 1 << 7, 414 }; 415 416 enum lmp_feature_bits6 { 417 LMP_EXT_INQ = 1 << 0, 418 }; 419 420 enum lmp_feature_bits7 { 421 LMP_EXT_FEAT = 1 << 7, 422 }; 423 424 enum hci_link_policy { 425 HCI_LP_RSWITCH = 1 << 0, 426 HCI_LP_HOLD = 1 << 1, 427 HCI_LP_SNIFF = 1 << 2, 428 HCI_LP_PARK = 1 << 3, 429 }; 430 431 enum hci_link_mode { 432 HCI_LM_ACCEPT = 1 << 15, 433 HCI_LM_MASTER = 1 << 0, 434 HCI_LM_AUTH = 1 << 1, 435 HCI_LM_ENCRYPT = 1 << 2, 436 HCI_LM_TRUSTED = 1 << 3, 437 HCI_LM_RELIABLE = 1 << 4, 438 HCI_LM_SECURE = 1 << 5, 439 }; 440 441 /* HCI Commands */ 442 443 /* Link Control */ 444 #define OGF_LINK_CTL 0x01 445 446 #define OCF_INQUIRY 0x0001 447 typedef struct { 448 uint8_t lap[3]; 449 uint8_t length; /* 1.28s units */ 450 uint8_t num_rsp; 451 } __attribute__ ((packed)) inquiry_cp; 452 #define INQUIRY_CP_SIZE 5 453 454 typedef struct { 455 uint8_t status; 456 bdaddr_t bdaddr; 457 } __attribute__ ((packed)) status_bdaddr_rp; 458 #define STATUS_BDADDR_RP_SIZE 7 459 460 #define OCF_INQUIRY_CANCEL 0x0002 461 462 #define OCF_PERIODIC_INQUIRY 0x0003 463 typedef struct { 464 uint16_t max_period; /* 1.28s units */ 465 uint16_t min_period; /* 1.28s units */ 466 uint8_t lap[3]; 467 uint8_t length; /* 1.28s units */ 468 uint8_t num_rsp; 469 } __attribute__ ((packed)) periodic_inquiry_cp; 470 #define PERIODIC_INQUIRY_CP_SIZE 9 471 472 #define OCF_EXIT_PERIODIC_INQUIRY 0x0004 473 474 #define OCF_CREATE_CONN 0x0005 475 typedef struct { 476 bdaddr_t bdaddr; 477 uint16_t pkt_type; 478 uint8_t pscan_rep_mode; 479 uint8_t pscan_mode; 480 uint16_t clock_offset; 481 uint8_t role_switch; 482 } __attribute__ ((packed)) create_conn_cp; 483 #define CREATE_CONN_CP_SIZE 13 484 485 #define OCF_DISCONNECT 0x0006 486 typedef struct { 487 uint16_t handle; 488 uint8_t reason; 489 } __attribute__ ((packed)) disconnect_cp; 490 #define DISCONNECT_CP_SIZE 3 491 492 #define OCF_ADD_SCO 0x0007 493 typedef struct { 494 uint16_t handle; 495 uint16_t pkt_type; 496 } __attribute__ ((packed)) add_sco_cp; 497 #define ADD_SCO_CP_SIZE 4 498 499 #define OCF_CREATE_CONN_CANCEL 0x0008 500 typedef struct { 501 uint8_t status; 502 bdaddr_t bdaddr; 503 } __attribute__ ((packed)) create_conn_cancel_cp; 504 #define CREATE_CONN_CANCEL_CP_SIZE 6 505 506 typedef struct { 507 uint8_t status; 508 bdaddr_t bdaddr; 509 } __attribute__ ((packed)) create_conn_cancel_rp; 510 #define CREATE_CONN_CANCEL_RP_SIZE 7 511 512 #define OCF_ACCEPT_CONN_REQ 0x0009 513 typedef struct { 514 bdaddr_t bdaddr; 515 uint8_t role; 516 } __attribute__ ((packed)) accept_conn_req_cp; 517 #define ACCEPT_CONN_REQ_CP_SIZE 7 518 519 #define OCF_REJECT_CONN_REQ 0x000A 520 typedef struct { 521 bdaddr_t bdaddr; 522 uint8_t reason; 523 } __attribute__ ((packed)) reject_conn_req_cp; 524 #define REJECT_CONN_REQ_CP_SIZE 7 525 526 #define OCF_LINK_KEY_REPLY 0x000B 527 typedef struct { 528 bdaddr_t bdaddr; 529 uint8_t link_key[16]; 530 } __attribute__ ((packed)) link_key_reply_cp; 531 #define LINK_KEY_REPLY_CP_SIZE 22 532 533 #define OCF_LINK_KEY_NEG_REPLY 0x000C 534 535 #define OCF_PIN_CODE_REPLY 0x000D 536 typedef struct { 537 bdaddr_t bdaddr; 538 uint8_t pin_len; 539 uint8_t pin_code[16]; 540 } __attribute__ ((packed)) pin_code_reply_cp; 541 #define PIN_CODE_REPLY_CP_SIZE 23 542 543 #define OCF_PIN_CODE_NEG_REPLY 0x000E 544 545 #define OCF_SET_CONN_PTYPE 0x000F 546 typedef struct { 547 uint16_t handle; 548 uint16_t pkt_type; 549 } __attribute__ ((packed)) set_conn_ptype_cp; 550 #define SET_CONN_PTYPE_CP_SIZE 4 551 552 #define OCF_AUTH_REQUESTED 0x0011 553 typedef struct { 554 uint16_t handle; 555 } __attribute__ ((packed)) auth_requested_cp; 556 #define AUTH_REQUESTED_CP_SIZE 2 557 558 #define OCF_SET_CONN_ENCRYPT 0x0013 559 typedef struct { 560 uint16_t handle; 561 uint8_t encrypt; 562 } __attribute__ ((packed)) set_conn_encrypt_cp; 563 #define SET_CONN_ENCRYPT_CP_SIZE 3 564 565 #define OCF_CHANGE_CONN_LINK_KEY 0x0015 566 typedef struct { 567 uint16_t handle; 568 } __attribute__ ((packed)) change_conn_link_key_cp; 569 #define CHANGE_CONN_LINK_KEY_CP_SIZE 2 570 571 #define OCF_MASTER_LINK_KEY 0x0017 572 typedef struct { 573 uint8_t key_flag; 574 } __attribute__ ((packed)) master_link_key_cp; 575 #define MASTER_LINK_KEY_CP_SIZE 1 576 577 #define OCF_REMOTE_NAME_REQ 0x0019 578 typedef struct { 579 bdaddr_t bdaddr; 580 uint8_t pscan_rep_mode; 581 uint8_t pscan_mode; 582 uint16_t clock_offset; 583 } __attribute__ ((packed)) remote_name_req_cp; 584 #define REMOTE_NAME_REQ_CP_SIZE 10 585 586 #define OCF_REMOTE_NAME_REQ_CANCEL 0x001A 587 typedef struct { 588 bdaddr_t bdaddr; 589 } __attribute__ ((packed)) remote_name_req_cancel_cp; 590 #define REMOTE_NAME_REQ_CANCEL_CP_SIZE 6 591 592 typedef struct { 593 uint8_t status; 594 bdaddr_t bdaddr; 595 } __attribute__ ((packed)) remote_name_req_cancel_rp; 596 #define REMOTE_NAME_REQ_CANCEL_RP_SIZE 7 597 598 #define OCF_READ_REMOTE_FEATURES 0x001B 599 typedef struct { 600 uint16_t handle; 601 } __attribute__ ((packed)) read_remote_features_cp; 602 #define READ_REMOTE_FEATURES_CP_SIZE 2 603 604 #define OCF_READ_REMOTE_EXT_FEATURES 0x001C 605 typedef struct { 606 uint16_t handle; 607 uint8_t page_num; 608 } __attribute__ ((packed)) read_remote_ext_features_cp; 609 #define READ_REMOTE_EXT_FEATURES_CP_SIZE 3 610 611 #define OCF_READ_REMOTE_VERSION 0x001D 612 typedef struct { 613 uint16_t handle; 614 } __attribute__ ((packed)) read_remote_version_cp; 615 #define READ_REMOTE_VERSION_CP_SIZE 2 616 617 #define OCF_READ_CLOCK_OFFSET 0x001F 618 typedef struct { 619 uint16_t handle; 620 } __attribute__ ((packed)) read_clock_offset_cp; 621 #define READ_CLOCK_OFFSET_CP_SIZE 2 622 623 #define OCF_READ_LMP_HANDLE 0x0020 624 typedef struct { 625 uint16_t handle; 626 } __attribute__ ((packed)) read_lmp_handle_cp; 627 #define READ_LMP_HANDLE_CP_SIZE 2 628 629 typedef struct { 630 uint8_t status; 631 uint16_t handle; 632 uint8_t lmp_handle; 633 uint32_t reserved; 634 } __attribute__ ((packed)) read_lmp_handle_rp; 635 #define READ_LMP_HANDLE_RP_SIZE 8 636 637 #define OCF_SETUP_SYNC_CONN 0x0028 638 typedef struct { 639 uint16_t handle; 640 uint32_t tx_bandwith; 641 uint32_t rx_bandwith; 642 uint16_t max_latency; 643 uint16_t voice_setting; 644 uint8_t retrans_effort; 645 uint16_t pkt_type; 646 } __attribute__ ((packed)) setup_sync_conn_cp; 647 #define SETUP_SYNC_CONN_CP_SIZE 17 648 649 #define OCF_ACCEPT_SYNC_CONN_REQ 0x0029 650 typedef struct { 651 bdaddr_t bdaddr; 652 uint32_t tx_bandwith; 653 uint32_t rx_bandwith; 654 uint16_t max_latency; 655 uint16_t voice_setting; 656 uint8_t retrans_effort; 657 uint16_t pkt_type; 658 } __attribute__ ((packed)) accept_sync_conn_req_cp; 659 #define ACCEPT_SYNC_CONN_REQ_CP_SIZE 21 660 661 #define OCF_REJECT_SYNC_CONN_REQ 0x002A 662 typedef struct { 663 bdaddr_t bdaddr; 664 uint8_t reason; 665 } __attribute__ ((packed)) reject_sync_conn_req_cp; 666 #define REJECT_SYNC_CONN_REQ_CP_SIZE 7 667 668 /* Link Policy */ 669 #define OGF_LINK_POLICY 0x02 670 671 #define OCF_HOLD_MODE 0x0001 672 typedef struct { 673 uint16_t handle; 674 uint16_t max_interval; 675 uint16_t min_interval; 676 } __attribute__ ((packed)) hold_mode_cp; 677 #define HOLD_MODE_CP_SIZE 6 678 679 #define OCF_SNIFF_MODE 0x0003 680 typedef struct { 681 uint16_t handle; 682 uint16_t max_interval; 683 uint16_t min_interval; 684 uint16_t attempt; 685 uint16_t timeout; 686 } __attribute__ ((packed)) sniff_mode_cp; 687 #define SNIFF_MODE_CP_SIZE 10 688 689 #define OCF_EXIT_SNIFF_MODE 0x0004 690 typedef struct { 691 uint16_t handle; 692 } __attribute__ ((packed)) exit_sniff_mode_cp; 693 #define EXIT_SNIFF_MODE_CP_SIZE 2 694 695 #define OCF_PARK_MODE 0x0005 696 typedef struct { 697 uint16_t handle; 698 uint16_t max_interval; 699 uint16_t min_interval; 700 } __attribute__ ((packed)) park_mode_cp; 701 #define PARK_MODE_CP_SIZE 6 702 703 #define OCF_EXIT_PARK_MODE 0x0006 704 typedef struct { 705 uint16_t handle; 706 } __attribute__ ((packed)) exit_park_mode_cp; 707 #define EXIT_PARK_MODE_CP_SIZE 2 708 709 #define OCF_QOS_SETUP 0x0007 710 typedef struct { 711 uint8_t service_type; /* 1 = best effort */ 712 uint32_t token_rate; /* Byte per seconds */ 713 uint32_t peak_bandwidth; /* Byte per seconds */ 714 uint32_t latency; /* Microseconds */ 715 uint32_t delay_variation; /* Microseconds */ 716 } __attribute__ ((packed)) hci_qos; 717 #define HCI_QOS_CP_SIZE 17 718 typedef struct { 719 uint16_t handle; 720 uint8_t flags; /* Reserved */ 721 hci_qos qos; 722 } __attribute__ ((packed)) qos_setup_cp; 723 #define QOS_SETUP_CP_SIZE (3 + HCI_QOS_CP_SIZE) 724 725 #define OCF_ROLE_DISCOVERY 0x0009 726 typedef struct { 727 uint16_t handle; 728 } __attribute__ ((packed)) role_discovery_cp; 729 #define ROLE_DISCOVERY_CP_SIZE 2 730 typedef struct { 731 uint8_t status; 732 uint16_t handle; 733 uint8_t role; 734 } __attribute__ ((packed)) role_discovery_rp; 735 #define ROLE_DISCOVERY_RP_SIZE 4 736 737 #define OCF_SWITCH_ROLE 0x000B 738 typedef struct { 739 bdaddr_t bdaddr; 740 uint8_t role; 741 } __attribute__ ((packed)) switch_role_cp; 742 #define SWITCH_ROLE_CP_SIZE 7 743 744 #define OCF_READ_LINK_POLICY 0x000C 745 typedef struct { 746 uint16_t handle; 747 } __attribute__ ((packed)) read_link_policy_cp; 748 #define READ_LINK_POLICY_CP_SIZE 2 749 typedef struct { 750 uint8_t status; 751 uint16_t handle; 752 uint16_t policy; 753 } __attribute__ ((packed)) read_link_policy_rp; 754 #define READ_LINK_POLICY_RP_SIZE 5 755 756 #define OCF_WRITE_LINK_POLICY 0x000D 757 typedef struct { 758 uint16_t handle; 759 uint16_t policy; 760 } __attribute__ ((packed)) write_link_policy_cp; 761 #define WRITE_LINK_POLICY_CP_SIZE 4 762 typedef struct { 763 uint8_t status; 764 uint16_t handle; 765 } __attribute__ ((packed)) write_link_policy_rp; 766 #define WRITE_LINK_POLICY_RP_SIZE 3 767 768 #define OCF_READ_DEFAULT_LINK_POLICY 0x000E 769 770 #define OCF_WRITE_DEFAULT_LINK_POLICY 0x000F 771 772 #define OCF_FLOW_SPECIFICATION 0x0010 773 774 #define OCF_SNIFF_SUBRATE 0x0011 775 typedef struct { 776 uint16_t handle; 777 uint16_t max_remote_latency; 778 uint16_t max_local_latency; 779 uint16_t min_remote_timeout; 780 uint16_t min_local_timeout; 781 } __attribute__ ((packed)) sniff_subrate_cp; 782 #define SNIFF_SUBRATE_CP_SIZE 10 783 784 /* Host Controller and Baseband */ 785 #define OGF_HOST_CTL 0x03 786 787 #define OCF_SET_EVENT_MASK 0x0001 788 typedef struct { 789 uint8_t mask[8]; 790 } __attribute__ ((packed)) set_event_mask_cp; 791 #define SET_EVENT_MASK_CP_SIZE 8 792 793 #define OCF_RESET 0x0003 794 795 #define OCF_SET_EVENT_FLT 0x0005 796 typedef struct { 797 uint8_t flt_type; 798 uint8_t cond_type; 799 uint8_t condition[0]; 800 } __attribute__ ((packed)) set_event_flt_cp; 801 #define SET_EVENT_FLT_CP_SIZE 2 802 803 enum bt_filter_type { 804 FLT_CLEAR_ALL = 0x00, 805 FLT_INQ_RESULT = 0x01, 806 FLT_CONN_SETUP = 0x02, 807 }; 808 enum inq_result_cond_type { 809 INQ_RESULT_RETURN_ALL = 0x00, 810 INQ_RESULT_RETURN_CLASS = 0x01, 811 INQ_RESULT_RETURN_BDADDR = 0x02, 812 }; 813 enum conn_setup_cond_type { 814 CONN_SETUP_ALLOW_ALL = 0x00, 815 CONN_SETUP_ALLOW_CLASS = 0x01, 816 CONN_SETUP_ALLOW_BDADDR = 0x02, 817 }; 818 enum conn_setup_cond { 819 CONN_SETUP_AUTO_OFF = 0x01, 820 CONN_SETUP_AUTO_ON = 0x02, 821 }; 822 823 #define OCF_FLUSH 0x0008 824 typedef struct { 825 uint16_t handle; 826 } __attribute__ ((packed)) flush_cp; 827 #define FLUSH_CP_SIZE 2 828 829 typedef struct { 830 uint8_t status; 831 uint16_t handle; 832 } __attribute__ ((packed)) flush_rp; 833 #define FLUSH_RP_SIZE 3 834 835 #define OCF_READ_PIN_TYPE 0x0009 836 typedef struct { 837 uint8_t status; 838 uint8_t pin_type; 839 } __attribute__ ((packed)) read_pin_type_rp; 840 #define READ_PIN_TYPE_RP_SIZE 2 841 842 #define OCF_WRITE_PIN_TYPE 0x000A 843 typedef struct { 844 uint8_t pin_type; 845 } __attribute__ ((packed)) write_pin_type_cp; 846 #define WRITE_PIN_TYPE_CP_SIZE 1 847 848 #define OCF_CREATE_NEW_UNIT_KEY 0x000B 849 850 #define OCF_READ_STORED_LINK_KEY 0x000D 851 typedef struct { 852 bdaddr_t bdaddr; 853 uint8_t read_all; 854 } __attribute__ ((packed)) read_stored_link_key_cp; 855 #define READ_STORED_LINK_KEY_CP_SIZE 7 856 typedef struct { 857 uint8_t status; 858 uint16_t max_keys; 859 uint16_t num_keys; 860 } __attribute__ ((packed)) read_stored_link_key_rp; 861 #define READ_STORED_LINK_KEY_RP_SIZE 5 862 863 #define OCF_WRITE_STORED_LINK_KEY 0x0011 864 typedef struct { 865 uint8_t num_keys; 866 /* variable length part */ 867 } __attribute__ ((packed)) write_stored_link_key_cp; 868 #define WRITE_STORED_LINK_KEY_CP_SIZE 1 869 typedef struct { 870 uint8_t status; 871 uint8_t num_keys; 872 } __attribute__ ((packed)) write_stored_link_key_rp; 873 #define READ_WRITE_LINK_KEY_RP_SIZE 2 874 875 #define OCF_DELETE_STORED_LINK_KEY 0x0012 876 typedef struct { 877 bdaddr_t bdaddr; 878 uint8_t delete_all; 879 } __attribute__ ((packed)) delete_stored_link_key_cp; 880 #define DELETE_STORED_LINK_KEY_CP_SIZE 7 881 typedef struct { 882 uint8_t status; 883 uint16_t num_keys; 884 } __attribute__ ((packed)) delete_stored_link_key_rp; 885 #define DELETE_STORED_LINK_KEY_RP_SIZE 3 886 887 #define OCF_CHANGE_LOCAL_NAME 0x0013 888 typedef struct { 889 char name[248]; 890 } __attribute__ ((packed)) change_local_name_cp; 891 #define CHANGE_LOCAL_NAME_CP_SIZE 248 892 893 #define OCF_READ_LOCAL_NAME 0x0014 894 typedef struct { 895 uint8_t status; 896 char name[248]; 897 } __attribute__ ((packed)) read_local_name_rp; 898 #define READ_LOCAL_NAME_RP_SIZE 249 899 900 #define OCF_READ_CONN_ACCEPT_TIMEOUT 0x0015 901 typedef struct { 902 uint8_t status; 903 uint16_t timeout; 904 } __attribute__ ((packed)) read_conn_accept_timeout_rp; 905 #define READ_CONN_ACCEPT_TIMEOUT_RP_SIZE 3 906 907 #define OCF_WRITE_CONN_ACCEPT_TIMEOUT 0x0016 908 typedef struct { 909 uint16_t timeout; 910 } __attribute__ ((packed)) write_conn_accept_timeout_cp; 911 #define WRITE_CONN_ACCEPT_TIMEOUT_CP_SIZE 2 912 913 #define OCF_READ_PAGE_TIMEOUT 0x0017 914 typedef struct { 915 uint8_t status; 916 uint16_t timeout; 917 } __attribute__ ((packed)) read_page_timeout_rp; 918 #define READ_PAGE_TIMEOUT_RP_SIZE 3 919 920 #define OCF_WRITE_PAGE_TIMEOUT 0x0018 921 typedef struct { 922 uint16_t timeout; 923 } __attribute__ ((packed)) write_page_timeout_cp; 924 #define WRITE_PAGE_TIMEOUT_CP_SIZE 2 925 926 #define OCF_READ_SCAN_ENABLE 0x0019 927 typedef struct { 928 uint8_t status; 929 uint8_t enable; 930 } __attribute__ ((packed)) read_scan_enable_rp; 931 #define READ_SCAN_ENABLE_RP_SIZE 2 932 933 #define OCF_WRITE_SCAN_ENABLE 0x001A 934 typedef struct { 935 uint8_t scan_enable; 936 } __attribute__ ((packed)) write_scan_enable_cp; 937 #define WRITE_SCAN_ENABLE_CP_SIZE 1 938 939 enum scan_enable_bits { 940 SCAN_DISABLED = 0, 941 SCAN_INQUIRY = 1 << 0, 942 SCAN_PAGE = 1 << 1, 943 }; 944 945 #define OCF_READ_PAGE_ACTIVITY 0x001B 946 typedef struct { 947 uint8_t status; 948 uint16_t interval; 949 uint16_t window; 950 } __attribute__ ((packed)) read_page_activity_rp; 951 #define READ_PAGE_ACTIVITY_RP_SIZE 5 952 953 #define OCF_WRITE_PAGE_ACTIVITY 0x001C 954 typedef struct { 955 uint16_t interval; 956 uint16_t window; 957 } __attribute__ ((packed)) write_page_activity_cp; 958 #define WRITE_PAGE_ACTIVITY_CP_SIZE 4 959 960 #define OCF_READ_INQ_ACTIVITY 0x001D 961 typedef struct { 962 uint8_t status; 963 uint16_t interval; 964 uint16_t window; 965 } __attribute__ ((packed)) read_inq_activity_rp; 966 #define READ_INQ_ACTIVITY_RP_SIZE 5 967 968 #define OCF_WRITE_INQ_ACTIVITY 0x001E 969 typedef struct { 970 uint16_t interval; 971 uint16_t window; 972 } __attribute__ ((packed)) write_inq_activity_cp; 973 #define WRITE_INQ_ACTIVITY_CP_SIZE 4 974 975 #define OCF_READ_AUTH_ENABLE 0x001F 976 977 #define OCF_WRITE_AUTH_ENABLE 0x0020 978 979 #define AUTH_DISABLED 0x00 980 #define AUTH_ENABLED 0x01 981 982 #define OCF_READ_ENCRYPT_MODE 0x0021 983 984 #define OCF_WRITE_ENCRYPT_MODE 0x0022 985 986 #define ENCRYPT_DISABLED 0x00 987 #define ENCRYPT_P2P 0x01 988 #define ENCRYPT_BOTH 0x02 989 990 #define OCF_READ_CLASS_OF_DEV 0x0023 991 typedef struct { 992 uint8_t status; 993 uint8_t dev_class[3]; 994 } __attribute__ ((packed)) read_class_of_dev_rp; 995 #define READ_CLASS_OF_DEV_RP_SIZE 4 996 997 #define OCF_WRITE_CLASS_OF_DEV 0x0024 998 typedef struct { 999 uint8_t dev_class[3]; 1000 } __attribute__ ((packed)) write_class_of_dev_cp; 1001 #define WRITE_CLASS_OF_DEV_CP_SIZE 3 1002 1003 #define OCF_READ_VOICE_SETTING 0x0025 1004 typedef struct { 1005 uint8_t status; 1006 uint16_t voice_setting; 1007 } __attribute__ ((packed)) read_voice_setting_rp; 1008 #define READ_VOICE_SETTING_RP_SIZE 3 1009 1010 #define OCF_WRITE_VOICE_SETTING 0x0026 1011 typedef struct { 1012 uint16_t voice_setting; 1013 } __attribute__ ((packed)) write_voice_setting_cp; 1014 #define WRITE_VOICE_SETTING_CP_SIZE 2 1015 1016 #define OCF_READ_AUTOMATIC_FLUSH_TIMEOUT 0x0027 1017 1018 #define OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT 0x0028 1019 1020 #define OCF_READ_NUM_BROADCAST_RETRANS 0x0029 1021 1022 #define OCF_WRITE_NUM_BROADCAST_RETRANS 0x002A 1023 1024 #define OCF_READ_HOLD_MODE_ACTIVITY 0x002B 1025 1026 #define OCF_WRITE_HOLD_MODE_ACTIVITY 0x002C 1027 1028 #define OCF_READ_TRANSMIT_POWER_LEVEL 0x002D 1029 typedef struct { 1030 uint16_t handle; 1031 uint8_t type; 1032 } __attribute__ ((packed)) read_transmit_power_level_cp; 1033 #define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3 1034 typedef struct { 1035 uint8_t status; 1036 uint16_t handle; 1037 int8_t level; 1038 } __attribute__ ((packed)) read_transmit_power_level_rp; 1039 #define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4 1040 1041 #define OCF_HOST_BUFFER_SIZE 0x0033 1042 typedef struct { 1043 uint16_t acl_mtu; 1044 uint8_t sco_mtu; 1045 uint16_t acl_max_pkt; 1046 uint16_t sco_max_pkt; 1047 } __attribute__ ((packed)) host_buffer_size_cp; 1048 #define HOST_BUFFER_SIZE_CP_SIZE 7 1049 1050 #define OCF_HOST_NUMBER_OF_COMPLETED_PACKETS 0x0035 1051 1052 #define OCF_READ_LINK_SUPERVISION_TIMEOUT 0x0036 1053 typedef struct { 1054 uint8_t status; 1055 uint16_t handle; 1056 uint16_t link_sup_to; 1057 } __attribute__ ((packed)) read_link_supervision_timeout_rp; 1058 #define READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE 5 1059 1060 #define OCF_WRITE_LINK_SUPERVISION_TIMEOUT 0x0037 1061 typedef struct { 1062 uint16_t handle; 1063 uint16_t link_sup_to; 1064 } __attribute__ ((packed)) write_link_supervision_timeout_cp; 1065 #define WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE 4 1066 typedef struct { 1067 uint8_t status; 1068 uint16_t handle; 1069 } __attribute__ ((packed)) write_link_supervision_timeout_rp; 1070 #define WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE 3 1071 1072 #define OCF_READ_NUM_SUPPORTED_IAC 0x0038 1073 1074 #define MAX_IAC_LAP 0x40 1075 #define OCF_READ_CURRENT_IAC_LAP 0x0039 1076 typedef struct { 1077 uint8_t status; 1078 uint8_t num_current_iac; 1079 uint8_t lap[MAX_IAC_LAP][3]; 1080 } __attribute__ ((packed)) read_current_iac_lap_rp; 1081 #define READ_CURRENT_IAC_LAP_RP_SIZE 2+3*MAX_IAC_LAP 1082 1083 #define OCF_WRITE_CURRENT_IAC_LAP 0x003A 1084 typedef struct { 1085 uint8_t num_current_iac; 1086 uint8_t lap[MAX_IAC_LAP][3]; 1087 } __attribute__ ((packed)) write_current_iac_lap_cp; 1088 #define WRITE_CURRENT_IAC_LAP_CP_SIZE 1+3*MAX_IAC_LAP 1089 1090 #define OCF_READ_PAGE_SCAN_PERIOD_MODE 0x003B 1091 1092 #define OCF_WRITE_PAGE_SCAN_PERIOD_MODE 0x003C 1093 1094 #define OCF_READ_PAGE_SCAN_MODE 0x003D 1095 1096 #define OCF_WRITE_PAGE_SCAN_MODE 0x003E 1097 1098 #define OCF_SET_AFH_CLASSIFICATION 0x003F 1099 typedef struct { 1100 uint8_t map[10]; 1101 } __attribute__ ((packed)) set_afh_classification_cp; 1102 #define SET_AFH_CLASSIFICATION_CP_SIZE 10 1103 typedef struct { 1104 uint8_t status; 1105 } __attribute__ ((packed)) set_afh_classification_rp; 1106 #define SET_AFH_CLASSIFICATION_RP_SIZE 1 1107 1108 #define OCF_READ_INQUIRY_SCAN_TYPE 0x0042 1109 typedef struct { 1110 uint8_t status; 1111 uint8_t type; 1112 } __attribute__ ((packed)) read_inquiry_scan_type_rp; 1113 #define READ_INQUIRY_SCAN_TYPE_RP_SIZE 2 1114 1115 #define OCF_WRITE_INQUIRY_SCAN_TYPE 0x0043 1116 typedef struct { 1117 uint8_t type; 1118 } __attribute__ ((packed)) write_inquiry_scan_type_cp; 1119 #define WRITE_INQUIRY_SCAN_TYPE_CP_SIZE 1 1120 typedef struct { 1121 uint8_t status; 1122 } __attribute__ ((packed)) write_inquiry_scan_type_rp; 1123 #define WRITE_INQUIRY_SCAN_TYPE_RP_SIZE 1 1124 1125 #define OCF_READ_INQUIRY_MODE 0x0044 1126 typedef struct { 1127 uint8_t status; 1128 uint8_t mode; 1129 } __attribute__ ((packed)) read_inquiry_mode_rp; 1130 #define READ_INQUIRY_MODE_RP_SIZE 2 1131 1132 #define OCF_WRITE_INQUIRY_MODE 0x0045 1133 typedef struct { 1134 uint8_t mode; 1135 } __attribute__ ((packed)) write_inquiry_mode_cp; 1136 #define WRITE_INQUIRY_MODE_CP_SIZE 1 1137 typedef struct { 1138 uint8_t status; 1139 } __attribute__ ((packed)) write_inquiry_mode_rp; 1140 #define WRITE_INQUIRY_MODE_RP_SIZE 1 1141 1142 #define OCF_READ_PAGE_SCAN_TYPE 0x0046 1143 1144 #define OCF_WRITE_PAGE_SCAN_TYPE 0x0047 1145 1146 #define OCF_READ_AFH_MODE 0x0048 1147 typedef struct { 1148 uint8_t status; 1149 uint8_t mode; 1150 } __attribute__ ((packed)) read_afh_mode_rp; 1151 #define READ_AFH_MODE_RP_SIZE 2 1152 1153 #define OCF_WRITE_AFH_MODE 0x0049 1154 typedef struct { 1155 uint8_t mode; 1156 } __attribute__ ((packed)) write_afh_mode_cp; 1157 #define WRITE_AFH_MODE_CP_SIZE 1 1158 typedef struct { 1159 uint8_t status; 1160 } __attribute__ ((packed)) write_afh_mode_rp; 1161 #define WRITE_AFH_MODE_RP_SIZE 1 1162 1163 #define OCF_READ_EXT_INQUIRY_RESPONSE 0x0051 1164 typedef struct { 1165 uint8_t status; 1166 uint8_t fec; 1167 uint8_t data[240]; 1168 } __attribute__ ((packed)) read_ext_inquiry_response_rp; 1169 #define READ_EXT_INQUIRY_RESPONSE_RP_SIZE 242 1170 1171 #define OCF_WRITE_EXT_INQUIRY_RESPONSE 0x0052 1172 typedef struct { 1173 uint8_t fec; 1174 uint8_t data[240]; 1175 } __attribute__ ((packed)) write_ext_inquiry_response_cp; 1176 #define WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE 241 1177 typedef struct { 1178 uint8_t status; 1179 } __attribute__ ((packed)) write_ext_inquiry_response_rp; 1180 #define WRITE_EXT_INQUIRY_RESPONSE_RP_SIZE 1 1181 1182 /* Informational Parameters */ 1183 #define OGF_INFO_PARAM 0x04 1184 1185 #define OCF_READ_LOCAL_VERSION 0x0001 1186 typedef struct { 1187 uint8_t status; 1188 uint8_t hci_ver; 1189 uint16_t hci_rev; 1190 uint8_t lmp_ver; 1191 uint16_t manufacturer; 1192 uint16_t lmp_subver; 1193 } __attribute__ ((packed)) read_local_version_rp; 1194 #define READ_LOCAL_VERSION_RP_SIZE 9 1195 1196 #define OCF_READ_LOCAL_COMMANDS 0x0002 1197 typedef struct { 1198 uint8_t status; 1199 uint8_t commands[64]; 1200 } __attribute__ ((packed)) read_local_commands_rp; 1201 #define READ_LOCAL_COMMANDS_RP_SIZE 65 1202 1203 #define OCF_READ_LOCAL_FEATURES 0x0003 1204 typedef struct { 1205 uint8_t status; 1206 uint8_t features[8]; 1207 } __attribute__ ((packed)) read_local_features_rp; 1208 #define READ_LOCAL_FEATURES_RP_SIZE 9 1209 1210 #define OCF_READ_LOCAL_EXT_FEATURES 0x0004 1211 typedef struct { 1212 uint8_t page_num; 1213 } __attribute__ ((packed)) read_local_ext_features_cp; 1214 #define READ_LOCAL_EXT_FEATURES_CP_SIZE 1 1215 typedef struct { 1216 uint8_t status; 1217 uint8_t page_num; 1218 uint8_t max_page_num; 1219 uint8_t features[8]; 1220 } __attribute__ ((packed)) read_local_ext_features_rp; 1221 #define READ_LOCAL_EXT_FEATURES_RP_SIZE 11 1222 1223 #define OCF_READ_BUFFER_SIZE 0x0005 1224 typedef struct { 1225 uint8_t status; 1226 uint16_t acl_mtu; 1227 uint8_t sco_mtu; 1228 uint16_t acl_max_pkt; 1229 uint16_t sco_max_pkt; 1230 } __attribute__ ((packed)) read_buffer_size_rp; 1231 #define READ_BUFFER_SIZE_RP_SIZE 8 1232 1233 #define OCF_READ_COUNTRY_CODE 0x0007 1234 typedef struct { 1235 uint8_t status; 1236 uint8_t country_code; 1237 } __attribute__ ((packed)) read_country_code_rp; 1238 #define READ_COUNTRY_CODE_RP_SIZE 2 1239 1240 #define OCF_READ_BD_ADDR 0x0009 1241 typedef struct { 1242 uint8_t status; 1243 bdaddr_t bdaddr; 1244 } __attribute__ ((packed)) read_bd_addr_rp; 1245 #define READ_BD_ADDR_RP_SIZE 7 1246 1247 /* Status params */ 1248 #define OGF_STATUS_PARAM 0x05 1249 1250 #define OCF_READ_FAILED_CONTACT_COUNTER 0x0001 1251 typedef struct { 1252 uint8_t status; 1253 uint16_t handle; 1254 uint8_t counter; 1255 } __attribute__ ((packed)) read_failed_contact_counter_rp; 1256 #define READ_FAILED_CONTACT_COUNTER_RP_SIZE 4 1257 1258 #define OCF_RESET_FAILED_CONTACT_COUNTER 0x0002 1259 typedef struct { 1260 uint8_t status; 1261 uint16_t handle; 1262 } __attribute__ ((packed)) reset_failed_contact_counter_rp; 1263 #define RESET_FAILED_CONTACT_COUNTER_RP_SIZE 4 1264 1265 #define OCF_READ_LINK_QUALITY 0x0003 1266 typedef struct { 1267 uint16_t handle; 1268 } __attribute__ ((packed)) read_link_quality_cp; 1269 #define READ_LINK_QUALITY_CP_SIZE 4 1270 1271 typedef struct { 1272 uint8_t status; 1273 uint16_t handle; 1274 uint8_t link_quality; 1275 } __attribute__ ((packed)) read_link_quality_rp; 1276 #define READ_LINK_QUALITY_RP_SIZE 4 1277 1278 #define OCF_READ_RSSI 0x0005 1279 typedef struct { 1280 uint8_t status; 1281 uint16_t handle; 1282 int8_t rssi; 1283 } __attribute__ ((packed)) read_rssi_rp; 1284 #define READ_RSSI_RP_SIZE 4 1285 1286 #define OCF_READ_AFH_MAP 0x0006 1287 typedef struct { 1288 uint8_t status; 1289 uint16_t handle; 1290 uint8_t mode; 1291 uint8_t map[10]; 1292 } __attribute__ ((packed)) read_afh_map_rp; 1293 #define READ_AFH_MAP_RP_SIZE 14 1294 1295 #define OCF_READ_CLOCK 0x0007 1296 typedef struct { 1297 uint16_t handle; 1298 uint8_t which_clock; 1299 } __attribute__ ((packed)) read_clock_cp; 1300 #define READ_CLOCK_CP_SIZE 3 1301 typedef struct { 1302 uint8_t status; 1303 uint16_t handle; 1304 uint32_t clock; 1305 uint16_t accuracy; 1306 } __attribute__ ((packed)) read_clock_rp; 1307 #define READ_CLOCK_RP_SIZE 9 1308 1309 /* Testing commands */ 1310 #define OGF_TESTING_CMD 0x3e 1311 1312 /* Vendor specific commands */ 1313 #define OGF_VENDOR_CMD 0x3f 1314 1315 /* HCI Events */ 1316 1317 #define EVT_INQUIRY_COMPLETE 0x01 1318 1319 #define EVT_INQUIRY_RESULT 0x02 1320 typedef struct { 1321 uint8_t num_responses; 1322 bdaddr_t bdaddr; 1323 uint8_t pscan_rep_mode; 1324 uint8_t pscan_period_mode; 1325 uint8_t pscan_mode; 1326 uint8_t dev_class[3]; 1327 uint16_t clock_offset; 1328 } __attribute__ ((packed)) inquiry_info; 1329 #define INQUIRY_INFO_SIZE 14 1330 1331 #define EVT_CONN_COMPLETE 0x03 1332 typedef struct { 1333 uint8_t status; 1334 uint16_t handle; 1335 bdaddr_t bdaddr; 1336 uint8_t link_type; 1337 uint8_t encr_mode; 1338 } __attribute__ ((packed)) evt_conn_complete; 1339 #define EVT_CONN_COMPLETE_SIZE 11 1340 1341 #define EVT_CONN_REQUEST 0x04 1342 typedef struct { 1343 bdaddr_t bdaddr; 1344 uint8_t dev_class[3]; 1345 uint8_t link_type; 1346 } __attribute__ ((packed)) evt_conn_request; 1347 #define EVT_CONN_REQUEST_SIZE 10 1348 1349 #define EVT_DISCONN_COMPLETE 0x05 1350 typedef struct { 1351 uint8_t status; 1352 uint16_t handle; 1353 uint8_t reason; 1354 } __attribute__ ((packed)) evt_disconn_complete; 1355 #define EVT_DISCONN_COMPLETE_SIZE 4 1356 1357 #define EVT_AUTH_COMPLETE 0x06 1358 typedef struct { 1359 uint8_t status; 1360 uint16_t handle; 1361 } __attribute__ ((packed)) evt_auth_complete; 1362 #define EVT_AUTH_COMPLETE_SIZE 3 1363 1364 #define EVT_REMOTE_NAME_REQ_COMPLETE 0x07 1365 typedef struct { 1366 uint8_t status; 1367 bdaddr_t bdaddr; 1368 char name[248]; 1369 } __attribute__ ((packed)) evt_remote_name_req_complete; 1370 #define EVT_REMOTE_NAME_REQ_COMPLETE_SIZE 255 1371 1372 #define EVT_ENCRYPT_CHANGE 0x08 1373 typedef struct { 1374 uint8_t status; 1375 uint16_t handle; 1376 uint8_t encrypt; 1377 } __attribute__ ((packed)) evt_encrypt_change; 1378 #define EVT_ENCRYPT_CHANGE_SIZE 5 1379 1380 #define EVT_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 1381 typedef struct { 1382 uint8_t status; 1383 uint16_t handle; 1384 } __attribute__ ((packed)) evt_change_conn_link_key_complete; 1385 #define EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE 3 1386 1387 #define EVT_MASTER_LINK_KEY_COMPLETE 0x0A 1388 typedef struct { 1389 uint8_t status; 1390 uint16_t handle; 1391 uint8_t key_flag; 1392 } __attribute__ ((packed)) evt_master_link_key_complete; 1393 #define EVT_MASTER_LINK_KEY_COMPLETE_SIZE 4 1394 1395 #define EVT_READ_REMOTE_FEATURES_COMPLETE 0x0B 1396 typedef struct { 1397 uint8_t status; 1398 uint16_t handle; 1399 uint8_t features[8]; 1400 } __attribute__ ((packed)) evt_read_remote_features_complete; 1401 #define EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE 11 1402 1403 #define EVT_READ_REMOTE_VERSION_COMPLETE 0x0C 1404 typedef struct { 1405 uint8_t status; 1406 uint16_t handle; 1407 uint8_t lmp_ver; 1408 uint16_t manufacturer; 1409 uint16_t lmp_subver; 1410 } __attribute__ ((packed)) evt_read_remote_version_complete; 1411 #define EVT_READ_REMOTE_VERSION_COMPLETE_SIZE 8 1412 1413 #define EVT_QOS_SETUP_COMPLETE 0x0D 1414 typedef struct { 1415 uint8_t status; 1416 uint16_t handle; 1417 uint8_t flags; /* Reserved */ 1418 hci_qos qos; 1419 } __attribute__ ((packed)) evt_qos_setup_complete; 1420 #define EVT_QOS_SETUP_COMPLETE_SIZE (4 + HCI_QOS_CP_SIZE) 1421 1422 #define EVT_CMD_COMPLETE 0x0E 1423 typedef struct { 1424 uint8_t ncmd; 1425 uint16_t opcode; 1426 } __attribute__ ((packed)) evt_cmd_complete; 1427 #define EVT_CMD_COMPLETE_SIZE 3 1428 1429 #define EVT_CMD_STATUS 0x0F 1430 typedef struct { 1431 uint8_t status; 1432 uint8_t ncmd; 1433 uint16_t opcode; 1434 } __attribute__ ((packed)) evt_cmd_status; 1435 #define EVT_CMD_STATUS_SIZE 4 1436 1437 #define EVT_HARDWARE_ERROR 0x10 1438 typedef struct { 1439 uint8_t code; 1440 } __attribute__ ((packed)) evt_hardware_error; 1441 #define EVT_HARDWARE_ERROR_SIZE 1 1442 1443 #define EVT_FLUSH_OCCURRED 0x11 1444 typedef struct { 1445 uint16_t handle; 1446 } __attribute__ ((packed)) evt_flush_occured; 1447 #define EVT_FLUSH_OCCURRED_SIZE 2 1448 1449 #define EVT_ROLE_CHANGE 0x12 1450 typedef struct { 1451 uint8_t status; 1452 bdaddr_t bdaddr; 1453 uint8_t role; 1454 } __attribute__ ((packed)) evt_role_change; 1455 #define EVT_ROLE_CHANGE_SIZE 8 1456 1457 #define EVT_NUM_COMP_PKTS 0x13 1458 typedef struct { 1459 uint8_t num_hndl; 1460 struct { 1461 uint16_t handle; 1462 uint16_t num_packets; 1463 } connection[0]; 1464 } __attribute__ ((packed)) evt_num_comp_pkts; 1465 #define EVT_NUM_COMP_PKTS_SIZE(num_hndl) (1 + 4 * (num_hndl)) 1466 1467 #define EVT_MODE_CHANGE 0x14 1468 typedef struct { 1469 uint8_t status; 1470 uint16_t handle; 1471 uint8_t mode; 1472 uint16_t interval; 1473 } __attribute__ ((packed)) evt_mode_change; 1474 #define EVT_MODE_CHANGE_SIZE 6 1475 1476 #define EVT_RETURN_LINK_KEYS 0x15 1477 typedef struct { 1478 uint8_t num_keys; 1479 /* variable length part */ 1480 } __attribute__ ((packed)) evt_return_link_keys; 1481 #define EVT_RETURN_LINK_KEYS_SIZE 1 1482 1483 #define EVT_PIN_CODE_REQ 0x16 1484 typedef struct { 1485 bdaddr_t bdaddr; 1486 } __attribute__ ((packed)) evt_pin_code_req; 1487 #define EVT_PIN_CODE_REQ_SIZE 6 1488 1489 #define EVT_LINK_KEY_REQ 0x17 1490 typedef struct { 1491 bdaddr_t bdaddr; 1492 } __attribute__ ((packed)) evt_link_key_req; 1493 #define EVT_LINK_KEY_REQ_SIZE 6 1494 1495 #define EVT_LINK_KEY_NOTIFY 0x18 1496 typedef struct { 1497 bdaddr_t bdaddr; 1498 uint8_t link_key[16]; 1499 uint8_t key_type; 1500 } __attribute__ ((packed)) evt_link_key_notify; 1501 #define EVT_LINK_KEY_NOTIFY_SIZE 23 1502 1503 #define EVT_LOOPBACK_COMMAND 0x19 1504 1505 #define EVT_DATA_BUFFER_OVERFLOW 0x1A 1506 typedef struct { 1507 uint8_t link_type; 1508 } __attribute__ ((packed)) evt_data_buffer_overflow; 1509 #define EVT_DATA_BUFFER_OVERFLOW_SIZE 1 1510 1511 #define EVT_MAX_SLOTS_CHANGE 0x1B 1512 typedef struct { 1513 uint16_t handle; 1514 uint8_t max_slots; 1515 } __attribute__ ((packed)) evt_max_slots_change; 1516 #define EVT_MAX_SLOTS_CHANGE_SIZE 3 1517 1518 #define EVT_READ_CLOCK_OFFSET_COMPLETE 0x1C 1519 typedef struct { 1520 uint8_t status; 1521 uint16_t handle; 1522 uint16_t clock_offset; 1523 } __attribute__ ((packed)) evt_read_clock_offset_complete; 1524 #define EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE 5 1525 1526 #define EVT_CONN_PTYPE_CHANGED 0x1D 1527 typedef struct { 1528 uint8_t status; 1529 uint16_t handle; 1530 uint16_t ptype; 1531 } __attribute__ ((packed)) evt_conn_ptype_changed; 1532 #define EVT_CONN_PTYPE_CHANGED_SIZE 5 1533 1534 #define EVT_QOS_VIOLATION 0x1E 1535 typedef struct { 1536 uint16_t handle; 1537 } __attribute__ ((packed)) evt_qos_violation; 1538 #define EVT_QOS_VIOLATION_SIZE 2 1539 1540 #define EVT_PSCAN_REP_MODE_CHANGE 0x20 1541 typedef struct { 1542 bdaddr_t bdaddr; 1543 uint8_t pscan_rep_mode; 1544 } __attribute__ ((packed)) evt_pscan_rep_mode_change; 1545 #define EVT_PSCAN_REP_MODE_CHANGE_SIZE 7 1546 1547 #define EVT_FLOW_SPEC_COMPLETE 0x21 1548 typedef struct { 1549 uint8_t status; 1550 uint16_t handle; 1551 uint8_t flags; 1552 uint8_t direction; 1553 hci_qos qos; 1554 } __attribute__ ((packed)) evt_flow_spec_complete; 1555 #define EVT_FLOW_SPEC_COMPLETE_SIZE (5 + HCI_QOS_CP_SIZE) 1556 1557 #define EVT_INQUIRY_RESULT_WITH_RSSI 0x22 1558 typedef struct { 1559 uint8_t num_responses; 1560 bdaddr_t bdaddr; 1561 uint8_t pscan_rep_mode; 1562 uint8_t pscan_period_mode; 1563 uint8_t dev_class[3]; 1564 uint16_t clock_offset; 1565 int8_t rssi; 1566 } __attribute__ ((packed)) inquiry_info_with_rssi; 1567 #define INQUIRY_INFO_WITH_RSSI_SIZE 15 1568 typedef struct { 1569 uint8_t num_responses; 1570 bdaddr_t bdaddr; 1571 uint8_t pscan_rep_mode; 1572 uint8_t pscan_period_mode; 1573 uint8_t pscan_mode; 1574 uint8_t dev_class[3]; 1575 uint16_t clock_offset; 1576 int8_t rssi; 1577 } __attribute__ ((packed)) inquiry_info_with_rssi_and_pscan_mode; 1578 #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE 16 1579 1580 #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23 1581 typedef struct { 1582 uint8_t status; 1583 uint16_t handle; 1584 uint8_t page_num; 1585 uint8_t max_page_num; 1586 uint8_t features[8]; 1587 } __attribute__ ((packed)) evt_read_remote_ext_features_complete; 1588 #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE 13 1589 1590 #define EVT_SYNC_CONN_COMPLETE 0x2C 1591 typedef struct { 1592 uint8_t status; 1593 uint16_t handle; 1594 bdaddr_t bdaddr; 1595 uint8_t link_type; 1596 uint8_t trans_interval; 1597 uint8_t retrans_window; 1598 uint16_t rx_pkt_len; 1599 uint16_t tx_pkt_len; 1600 uint8_t air_mode; 1601 } __attribute__ ((packed)) evt_sync_conn_complete; 1602 #define EVT_SYNC_CONN_COMPLETE_SIZE 17 1603 1604 #define EVT_SYNC_CONN_CHANGED 0x2D 1605 typedef struct { 1606 uint8_t status; 1607 uint16_t handle; 1608 uint8_t trans_interval; 1609 uint8_t retrans_window; 1610 uint16_t rx_pkt_len; 1611 uint16_t tx_pkt_len; 1612 } __attribute__ ((packed)) evt_sync_conn_changed; 1613 #define EVT_SYNC_CONN_CHANGED_SIZE 9 1614 1615 #define EVT_SNIFF_SUBRATE 0x2E 1616 typedef struct { 1617 uint8_t status; 1618 uint16_t handle; 1619 uint16_t max_remote_latency; 1620 uint16_t max_local_latency; 1621 uint16_t min_remote_timeout; 1622 uint16_t min_local_timeout; 1623 } __attribute__ ((packed)) evt_sniff_subrate; 1624 #define EVT_SNIFF_SUBRATE_SIZE 11 1625 1626 #define EVT_EXTENDED_INQUIRY_RESULT 0x2F 1627 typedef struct { 1628 bdaddr_t bdaddr; 1629 uint8_t pscan_rep_mode; 1630 uint8_t pscan_period_mode; 1631 uint8_t dev_class[3]; 1632 uint16_t clock_offset; 1633 int8_t rssi; 1634 uint8_t data[240]; 1635 } __attribute__ ((packed)) extended_inquiry_info; 1636 #define EXTENDED_INQUIRY_INFO_SIZE 254 1637 1638 #define EVT_TESTING 0xFE 1639 1640 #define EVT_VENDOR 0xFF 1641 1642 /* Command opcode pack/unpack */ 1643 #define cmd_opcode_pack(ogf, ocf) (uint16_t)((ocf & 0x03ff)|(ogf << 10)) 1644 #define cmd_opcode_ogf(op) (op >> 10) 1645 #define cmd_opcode_ocf(op) (op & 0x03ff) 1646 1647 /* ACL handle and flags pack/unpack */ 1648 #define acl_handle_pack(h, f) (uint16_t)(((h) & 0x0fff)|((f) << 12)) 1649 #define acl_handle(h) ((h) & 0x0fff) 1650 #define acl_flags(h) ((h) >> 12) 1651 1652 /* HCI Packet structures */ 1653 #define HCI_COMMAND_HDR_SIZE 3 1654 #define HCI_EVENT_HDR_SIZE 2 1655 #define HCI_ACL_HDR_SIZE 4 1656 #define HCI_SCO_HDR_SIZE 3 1657 1658 struct hci_command_hdr { 1659 uint16_t opcode; /* OCF & OGF */ 1660 uint8_t plen; 1661 } __attribute__ ((packed)); 1662 1663 struct hci_event_hdr { 1664 uint8_t evt; 1665 uint8_t plen; 1666 } __attribute__ ((packed)); 1667 1668 struct hci_acl_hdr { 1669 uint16_t handle; /* Handle & Flags(PB, BC) */ 1670 uint16_t dlen; 1671 } __attribute__ ((packed)); 1672 1673 struct hci_sco_hdr { 1674 uint16_t handle; 1675 uint8_t dlen; 1676 } __attribute__ ((packed)); 1677 1678 /* L2CAP layer defines */ 1679 1680 enum bt_l2cap_lm_bits { 1681 L2CAP_LM_MASTER = 1 << 0, 1682 L2CAP_LM_AUTH = 1 << 1, 1683 L2CAP_LM_ENCRYPT = 1 << 2, 1684 L2CAP_LM_TRUSTED = 1 << 3, 1685 L2CAP_LM_RELIABLE = 1 << 4, 1686 L2CAP_LM_SECURE = 1 << 5, 1687 }; 1688 1689 enum bt_l2cap_cid_predef { 1690 L2CAP_CID_INVALID = 0x0000, 1691 L2CAP_CID_SIGNALLING= 0x0001, 1692 L2CAP_CID_GROUP = 0x0002, 1693 L2CAP_CID_ALLOC = 0x0040, 1694 }; 1695 1696 /* L2CAP command codes */ 1697 enum bt_l2cap_cmd { 1698 L2CAP_COMMAND_REJ = 1, 1699 L2CAP_CONN_REQ, 1700 L2CAP_CONN_RSP, 1701 L2CAP_CONF_REQ, 1702 L2CAP_CONF_RSP, 1703 L2CAP_DISCONN_REQ, 1704 L2CAP_DISCONN_RSP, 1705 L2CAP_ECHO_REQ, 1706 L2CAP_ECHO_RSP, 1707 L2CAP_INFO_REQ, 1708 L2CAP_INFO_RSP, 1709 }; 1710 1711 enum bt_l2cap_sar_bits { 1712 L2CAP_SAR_NO_SEG = 0, 1713 L2CAP_SAR_START, 1714 L2CAP_SAR_END, 1715 L2CAP_SAR_CONT, 1716 }; 1717 1718 /* L2CAP structures */ 1719 typedef struct { 1720 uint16_t len; 1721 uint16_t cid; 1722 uint8_t data[0]; 1723 } __attribute__ ((packed)) l2cap_hdr; 1724 #define L2CAP_HDR_SIZE 4 1725 1726 typedef struct { 1727 uint8_t code; 1728 uint8_t ident; 1729 uint16_t len; 1730 } __attribute__ ((packed)) l2cap_cmd_hdr; 1731 #define L2CAP_CMD_HDR_SIZE 4 1732 1733 typedef struct { 1734 uint16_t reason; 1735 } __attribute__ ((packed)) l2cap_cmd_rej; 1736 #define L2CAP_CMD_REJ_SIZE 2 1737 1738 typedef struct { 1739 uint16_t dcid; 1740 uint16_t scid; 1741 } __attribute__ ((packed)) l2cap_cmd_rej_cid; 1742 #define L2CAP_CMD_REJ_CID_SIZE 4 1743 1744 /* reject reason */ 1745 enum bt_l2cap_rej_reason { 1746 L2CAP_REJ_CMD_NOT_UNDERSTOOD = 0, 1747 L2CAP_REJ_SIG_TOOBIG, 1748 L2CAP_REJ_CID_INVAL, 1749 }; 1750 1751 typedef struct { 1752 uint16_t psm; 1753 uint16_t scid; 1754 } __attribute__ ((packed)) l2cap_conn_req; 1755 #define L2CAP_CONN_REQ_SIZE 4 1756 1757 typedef struct { 1758 uint16_t dcid; 1759 uint16_t scid; 1760 uint16_t result; 1761 uint16_t status; 1762 } __attribute__ ((packed)) l2cap_conn_rsp; 1763 #define L2CAP_CONN_RSP_SIZE 8 1764 1765 /* connect result */ 1766 enum bt_l2cap_conn_res { 1767 L2CAP_CR_SUCCESS = 0, 1768 L2CAP_CR_PEND, 1769 L2CAP_CR_BAD_PSM, 1770 L2CAP_CR_SEC_BLOCK, 1771 L2CAP_CR_NO_MEM, 1772 }; 1773 1774 /* connect status */ 1775 enum bt_l2cap_conn_stat { 1776 L2CAP_CS_NO_INFO = 0, 1777 L2CAP_CS_AUTHEN_PEND, 1778 L2CAP_CS_AUTHOR_PEND, 1779 }; 1780 1781 typedef struct { 1782 uint16_t dcid; 1783 uint16_t flags; 1784 uint8_t data[0]; 1785 } __attribute__ ((packed)) l2cap_conf_req; 1786 #define L2CAP_CONF_REQ_SIZE(datalen) (4 + (datalen)) 1787 1788 typedef struct { 1789 uint16_t scid; 1790 uint16_t flags; 1791 uint16_t result; 1792 uint8_t data[0]; 1793 } __attribute__ ((packed)) l2cap_conf_rsp; 1794 #define L2CAP_CONF_RSP_SIZE(datalen) (6 + datalen) 1795 1796 enum bt_l2cap_conf_res { 1797 L2CAP_CONF_SUCCESS = 0, 1798 L2CAP_CONF_UNACCEPT, 1799 L2CAP_CONF_REJECT, 1800 L2CAP_CONF_UNKNOWN, 1801 }; 1802 1803 typedef struct { 1804 uint8_t type; 1805 uint8_t len; 1806 uint8_t val[0]; 1807 } __attribute__ ((packed)) l2cap_conf_opt; 1808 #define L2CAP_CONF_OPT_SIZE 2 1809 1810 enum bt_l2cap_conf_val { 1811 L2CAP_CONF_MTU = 1, 1812 L2CAP_CONF_FLUSH_TO, 1813 L2CAP_CONF_QOS, 1814 L2CAP_CONF_RFC, 1815 L2CAP_CONF_RFC_MODE = L2CAP_CONF_RFC, 1816 }; 1817 1818 typedef struct { 1819 uint8_t flags; 1820 uint8_t service_type; 1821 uint32_t token_rate; 1822 uint32_t token_bucket_size; 1823 uint32_t peak_bandwidth; 1824 uint32_t latency; 1825 uint32_t delay_variation; 1826 } __attribute__ ((packed)) l2cap_conf_opt_qos; 1827 #define L2CAP_CONF_OPT_QOS_SIZE 22 1828 1829 enum bt_l2cap_conf_opt_qos_st { 1830 L2CAP_CONF_QOS_NO_TRAFFIC = 0x00, 1831 L2CAP_CONF_QOS_BEST_EFFORT, 1832 L2CAP_CONF_QOS_GUARANTEED, 1833 }; 1834 1835 #define L2CAP_CONF_QOS_WILDCARD 0xffffffff 1836 1837 enum bt_l2cap_mode { 1838 L2CAP_MODE_BASIC = 0, 1839 L2CAP_MODE_RETRANS = 1, 1840 L2CAP_MODE_FLOWCTL = 2, 1841 }; 1842 1843 typedef struct { 1844 uint16_t dcid; 1845 uint16_t scid; 1846 } __attribute__ ((packed)) l2cap_disconn_req; 1847 #define L2CAP_DISCONN_REQ_SIZE 4 1848 1849 typedef struct { 1850 uint16_t dcid; 1851 uint16_t scid; 1852 } __attribute__ ((packed)) l2cap_disconn_rsp; 1853 #define L2CAP_DISCONN_RSP_SIZE 4 1854 1855 typedef struct { 1856 uint16_t type; 1857 } __attribute__ ((packed)) l2cap_info_req; 1858 #define L2CAP_INFO_REQ_SIZE 2 1859 1860 typedef struct { 1861 uint16_t type; 1862 uint16_t result; 1863 uint8_t data[0]; 1864 } __attribute__ ((packed)) l2cap_info_rsp; 1865 #define L2CAP_INFO_RSP_SIZE 4 1866 1867 /* info type */ 1868 enum bt_l2cap_info_type { 1869 L2CAP_IT_CL_MTU = 1, 1870 L2CAP_IT_FEAT_MASK, 1871 }; 1872 1873 /* info result */ 1874 enum bt_l2cap_info_result { 1875 L2CAP_IR_SUCCESS = 0, 1876 L2CAP_IR_NOTSUPP, 1877 }; 1878 1879 /* Service Discovery Protocol defines */ 1880 /* Note that all multibyte values in lower layer protocols (above in this file) 1881 * are little-endian while SDP is big-endian. */ 1882 1883 /* Protocol UUIDs */ 1884 enum sdp_proto_uuid { 1885 SDP_UUID = 0x0001, 1886 UDP_UUID = 0x0002, 1887 RFCOMM_UUID = 0x0003, 1888 TCP_UUID = 0x0004, 1889 TCS_BIN_UUID = 0x0005, 1890 TCS_AT_UUID = 0x0006, 1891 OBEX_UUID = 0x0008, 1892 IP_UUID = 0x0009, 1893 FTP_UUID = 0x000a, 1894 HTTP_UUID = 0x000c, 1895 WSP_UUID = 0x000e, 1896 BNEP_UUID = 0x000f, 1897 UPNP_UUID = 0x0010, 1898 HIDP_UUID = 0x0011, 1899 HCRP_CTRL_UUID = 0x0012, 1900 HCRP_DATA_UUID = 0x0014, 1901 HCRP_NOTE_UUID = 0x0016, 1902 AVCTP_UUID = 0x0017, 1903 AVDTP_UUID = 0x0019, 1904 CMTP_UUID = 0x001b, 1905 UDI_UUID = 0x001d, 1906 MCAP_CTRL_UUID = 0x001e, 1907 MCAP_DATA_UUID = 0x001f, 1908 L2CAP_UUID = 0x0100, 1909 }; 1910 1911 /* 1912 * Service class identifiers of standard services and service groups 1913 */ 1914 enum service_class_id { 1915 SDP_SERVER_SVCLASS_ID = 0x1000, 1916 BROWSE_GRP_DESC_SVCLASS_ID = 0x1001, 1917 PUBLIC_BROWSE_GROUP = 0x1002, 1918 SERIAL_PORT_SVCLASS_ID = 0x1101, 1919 LAN_ACCESS_SVCLASS_ID = 0x1102, 1920 DIALUP_NET_SVCLASS_ID = 0x1103, 1921 IRMC_SYNC_SVCLASS_ID = 0x1104, 1922 OBEX_OBJPUSH_SVCLASS_ID = 0x1105, 1923 OBEX_FILETRANS_SVCLASS_ID = 0x1106, 1924 IRMC_SYNC_CMD_SVCLASS_ID = 0x1107, 1925 HEADSET_SVCLASS_ID = 0x1108, 1926 CORDLESS_TELEPHONY_SVCLASS_ID = 0x1109, 1927 AUDIO_SOURCE_SVCLASS_ID = 0x110a, 1928 AUDIO_SINK_SVCLASS_ID = 0x110b, 1929 AV_REMOTE_TARGET_SVCLASS_ID = 0x110c, 1930 ADVANCED_AUDIO_SVCLASS_ID = 0x110d, 1931 AV_REMOTE_SVCLASS_ID = 0x110e, 1932 VIDEO_CONF_SVCLASS_ID = 0x110f, 1933 INTERCOM_SVCLASS_ID = 0x1110, 1934 FAX_SVCLASS_ID = 0x1111, 1935 HEADSET_AGW_SVCLASS_ID = 0x1112, 1936 WAP_SVCLASS_ID = 0x1113, 1937 WAP_CLIENT_SVCLASS_ID = 0x1114, 1938 PANU_SVCLASS_ID = 0x1115, 1939 NAP_SVCLASS_ID = 0x1116, 1940 GN_SVCLASS_ID = 0x1117, 1941 DIRECT_PRINTING_SVCLASS_ID = 0x1118, 1942 REFERENCE_PRINTING_SVCLASS_ID = 0x1119, 1943 IMAGING_SVCLASS_ID = 0x111a, 1944 IMAGING_RESPONDER_SVCLASS_ID = 0x111b, 1945 IMAGING_ARCHIVE_SVCLASS_ID = 0x111c, 1946 IMAGING_REFOBJS_SVCLASS_ID = 0x111d, 1947 HANDSFREE_SVCLASS_ID = 0x111e, 1948 HANDSFREE_AGW_SVCLASS_ID = 0x111f, 1949 DIRECT_PRT_REFOBJS_SVCLASS_ID = 0x1120, 1950 REFLECTED_UI_SVCLASS_ID = 0x1121, 1951 BASIC_PRINTING_SVCLASS_ID = 0x1122, 1952 PRINTING_STATUS_SVCLASS_ID = 0x1123, 1953 HID_SVCLASS_ID = 0x1124, 1954 HCR_SVCLASS_ID = 0x1125, 1955 HCR_PRINT_SVCLASS_ID = 0x1126, 1956 HCR_SCAN_SVCLASS_ID = 0x1127, 1957 CIP_SVCLASS_ID = 0x1128, 1958 VIDEO_CONF_GW_SVCLASS_ID = 0x1129, 1959 UDI_MT_SVCLASS_ID = 0x112a, 1960 UDI_TA_SVCLASS_ID = 0x112b, 1961 AV_SVCLASS_ID = 0x112c, 1962 SAP_SVCLASS_ID = 0x112d, 1963 PBAP_PCE_SVCLASS_ID = 0x112e, 1964 PBAP_PSE_SVCLASS_ID = 0x112f, 1965 PBAP_SVCLASS_ID = 0x1130, 1966 PNP_INFO_SVCLASS_ID = 0x1200, 1967 GENERIC_NETWORKING_SVCLASS_ID = 0x1201, 1968 GENERIC_FILETRANS_SVCLASS_ID = 0x1202, 1969 GENERIC_AUDIO_SVCLASS_ID = 0x1203, 1970 GENERIC_TELEPHONY_SVCLASS_ID = 0x1204, 1971 UPNP_SVCLASS_ID = 0x1205, 1972 UPNP_IP_SVCLASS_ID = 0x1206, 1973 UPNP_PAN_SVCLASS_ID = 0x1300, 1974 UPNP_LAP_SVCLASS_ID = 0x1301, 1975 UPNP_L2CAP_SVCLASS_ID = 0x1302, 1976 VIDEO_SOURCE_SVCLASS_ID = 0x1303, 1977 VIDEO_SINK_SVCLASS_ID = 0x1304, 1978 VIDEO_DISTRIBUTION_SVCLASS_ID = 0x1305, 1979 MDP_SVCLASS_ID = 0x1400, 1980 MDP_SOURCE_SVCLASS_ID = 0x1401, 1981 MDP_SINK_SVCLASS_ID = 0x1402, 1982 APPLE_AGENT_SVCLASS_ID = 0x2112, 1983 }; 1984 1985 /* 1986 * Standard profile descriptor identifiers; note these 1987 * may be identical to some of the service classes defined above 1988 */ 1989 #define SDP_SERVER_PROFILE_ID SDP_SERVER_SVCLASS_ID 1990 #define BROWSE_GRP_DESC_PROFILE_ID BROWSE_GRP_DESC_SVCLASS_ID 1991 #define SERIAL_PORT_PROFILE_ID SERIAL_PORT_SVCLASS_ID 1992 #define LAN_ACCESS_PROFILE_ID LAN_ACCESS_SVCLASS_ID 1993 #define DIALUP_NET_PROFILE_ID DIALUP_NET_SVCLASS_ID 1994 #define IRMC_SYNC_PROFILE_ID IRMC_SYNC_SVCLASS_ID 1995 #define OBEX_OBJPUSH_PROFILE_ID OBEX_OBJPUSH_SVCLASS_ID 1996 #define OBEX_FILETRANS_PROFILE_ID OBEX_FILETRANS_SVCLASS_ID 1997 #define IRMC_SYNC_CMD_PROFILE_ID IRMC_SYNC_CMD_SVCLASS_ID 1998 #define HEADSET_PROFILE_ID HEADSET_SVCLASS_ID 1999 #define CORDLESS_TELEPHONY_PROFILE_ID CORDLESS_TELEPHONY_SVCLASS_ID 2000 #define AUDIO_SOURCE_PROFILE_ID AUDIO_SOURCE_SVCLASS_ID 2001 #define AUDIO_SINK_PROFILE_ID AUDIO_SINK_SVCLASS_ID 2002 #define AV_REMOTE_TARGET_PROFILE_ID AV_REMOTE_TARGET_SVCLASS_ID 2003 #define ADVANCED_AUDIO_PROFILE_ID ADVANCED_AUDIO_SVCLASS_ID 2004 #define AV_REMOTE_PROFILE_ID AV_REMOTE_SVCLASS_ID 2005 #define VIDEO_CONF_PROFILE_ID VIDEO_CONF_SVCLASS_ID 2006 #define INTERCOM_PROFILE_ID INTERCOM_SVCLASS_ID 2007 #define FAX_PROFILE_ID FAX_SVCLASS_ID 2008 #define HEADSET_AGW_PROFILE_ID HEADSET_AGW_SVCLASS_ID 2009 #define WAP_PROFILE_ID WAP_SVCLASS_ID 2010 #define WAP_CLIENT_PROFILE_ID WAP_CLIENT_SVCLASS_ID 2011 #define PANU_PROFILE_ID PANU_SVCLASS_ID 2012 #define NAP_PROFILE_ID NAP_SVCLASS_ID 2013 #define GN_PROFILE_ID GN_SVCLASS_ID 2014 #define DIRECT_PRINTING_PROFILE_ID DIRECT_PRINTING_SVCLASS_ID 2015 #define REFERENCE_PRINTING_PROFILE_ID REFERENCE_PRINTING_SVCLASS_ID 2016 #define IMAGING_PROFILE_ID IMAGING_SVCLASS_ID 2017 #define IMAGING_RESPONDER_PROFILE_ID IMAGING_RESPONDER_SVCLASS_ID 2018 #define IMAGING_ARCHIVE_PROFILE_ID IMAGING_ARCHIVE_SVCLASS_ID 2019 #define IMAGING_REFOBJS_PROFILE_ID IMAGING_REFOBJS_SVCLASS_ID 2020 #define HANDSFREE_PROFILE_ID HANDSFREE_SVCLASS_ID 2021 #define HANDSFREE_AGW_PROFILE_ID HANDSFREE_AGW_SVCLASS_ID 2022 #define DIRECT_PRT_REFOBJS_PROFILE_ID DIRECT_PRT_REFOBJS_SVCLASS_ID 2023 #define REFLECTED_UI_PROFILE_ID REFLECTED_UI_SVCLASS_ID 2024 #define BASIC_PRINTING_PROFILE_ID BASIC_PRINTING_SVCLASS_ID 2025 #define PRINTING_STATUS_PROFILE_ID PRINTING_STATUS_SVCLASS_ID 2026 #define HID_PROFILE_ID HID_SVCLASS_ID 2027 #define HCR_PROFILE_ID HCR_SCAN_SVCLASS_ID 2028 #define HCR_PRINT_PROFILE_ID HCR_PRINT_SVCLASS_ID 2029 #define HCR_SCAN_PROFILE_ID HCR_SCAN_SVCLASS_ID 2030 #define CIP_PROFILE_ID CIP_SVCLASS_ID 2031 #define VIDEO_CONF_GW_PROFILE_ID VIDEO_CONF_GW_SVCLASS_ID 2032 #define UDI_MT_PROFILE_ID UDI_MT_SVCLASS_ID 2033 #define UDI_TA_PROFILE_ID UDI_TA_SVCLASS_ID 2034 #define AV_PROFILE_ID AV_SVCLASS_ID 2035 #define SAP_PROFILE_ID SAP_SVCLASS_ID 2036 #define PBAP_PCE_PROFILE_ID PBAP_PCE_SVCLASS_ID 2037 #define PBAP_PSE_PROFILE_ID PBAP_PSE_SVCLASS_ID 2038 #define PBAP_PROFILE_ID PBAP_SVCLASS_ID 2039 #define PNP_INFO_PROFILE_ID PNP_INFO_SVCLASS_ID 2040 #define GENERIC_NETWORKING_PROFILE_ID GENERIC_NETWORKING_SVCLASS_ID 2041 #define GENERIC_FILETRANS_PROFILE_ID GENERIC_FILETRANS_SVCLASS_ID 2042 #define GENERIC_AUDIO_PROFILE_ID GENERIC_AUDIO_SVCLASS_ID 2043 #define GENERIC_TELEPHONY_PROFILE_ID GENERIC_TELEPHONY_SVCLASS_ID 2044 #define UPNP_PROFILE_ID UPNP_SVCLASS_ID 2045 #define UPNP_IP_PROFILE_ID UPNP_IP_SVCLASS_ID 2046 #define UPNP_PAN_PROFILE_ID UPNP_PAN_SVCLASS_ID 2047 #define UPNP_LAP_PROFILE_ID UPNP_LAP_SVCLASS_ID 2048 #define UPNP_L2CAP_PROFILE_ID UPNP_L2CAP_SVCLASS_ID 2049 #define VIDEO_SOURCE_PROFILE_ID VIDEO_SOURCE_SVCLASS_ID 2050 #define VIDEO_SINK_PROFILE_ID VIDEO_SINK_SVCLASS_ID 2051 #define VIDEO_DISTRIBUTION_PROFILE_ID VIDEO_DISTRIBUTION_SVCLASS_ID 2052 #define MDP_PROFILE_ID MDP_SVCLASS_ID 2053 #define MDP_SOURCE_PROFILE_ID MDP_SROUCE_SVCLASS_ID 2054 #define MDP_SINK_PROFILE_ID MDP_SINK_SVCLASS_ID 2055 #define APPLE_AGENT_PROFILE_ID APPLE_AGENT_SVCLASS_ID 2056 2057 /* Data Representation */ 2058 enum bt_sdp_data_type { 2059 SDP_DTYPE_NIL = 0 << 3, 2060 SDP_DTYPE_UINT = 1 << 3, 2061 SDP_DTYPE_SINT = 2 << 3, 2062 SDP_DTYPE_UUID = 3 << 3, 2063 SDP_DTYPE_STRING = 4 << 3, 2064 SDP_DTYPE_BOOL = 5 << 3, 2065 SDP_DTYPE_SEQ = 6 << 3, 2066 SDP_DTYPE_ALT = 7 << 3, 2067 SDP_DTYPE_URL = 8 << 3, 2068 }; 2069 2070 enum bt_sdp_data_size { 2071 SDP_DSIZE_1 = 0, 2072 SDP_DSIZE_2, 2073 SDP_DSIZE_4, 2074 SDP_DSIZE_8, 2075 SDP_DSIZE_16, 2076 SDP_DSIZE_NEXT1, 2077 SDP_DSIZE_NEXT2, 2078 SDP_DSIZE_NEXT4, 2079 SDP_DSIZE_MASK = SDP_DSIZE_NEXT4, 2080 }; 2081 2082 enum bt_sdp_cmd { 2083 SDP_ERROR_RSP = 0x01, 2084 SDP_SVC_SEARCH_REQ = 0x02, 2085 SDP_SVC_SEARCH_RSP = 0x03, 2086 SDP_SVC_ATTR_REQ = 0x04, 2087 SDP_SVC_ATTR_RSP = 0x05, 2088 SDP_SVC_SEARCH_ATTR_REQ = 0x06, 2089 SDP_SVC_SEARCH_ATTR_RSP = 0x07, 2090 }; 2091 2092 enum bt_sdp_errorcode { 2093 SDP_INVALID_VERSION = 0x0001, 2094 SDP_INVALID_RECORD_HANDLE = 0x0002, 2095 SDP_INVALID_SYNTAX = 0x0003, 2096 SDP_INVALID_PDU_SIZE = 0x0004, 2097 SDP_INVALID_CSTATE = 0x0005, 2098 }; 2099 2100 /* 2101 * String identifiers are based on the SDP spec stating that 2102 * "base attribute id of the primary (universal) language must be 0x0100" 2103 * 2104 * Other languages should have their own offset; e.g.: 2105 * #define XXXLangBase yyyy 2106 * #define AttrServiceName_XXX 0x0000+XXXLangBase 2107 */ 2108 #define SDP_PRIMARY_LANG_BASE 0x0100 2109 2110 enum bt_sdp_attribute_id { 2111 SDP_ATTR_RECORD_HANDLE = 0x0000, 2112 SDP_ATTR_SVCLASS_ID_LIST = 0x0001, 2113 SDP_ATTR_RECORD_STATE = 0x0002, 2114 SDP_ATTR_SERVICE_ID = 0x0003, 2115 SDP_ATTR_PROTO_DESC_LIST = 0x0004, 2116 SDP_ATTR_BROWSE_GRP_LIST = 0x0005, 2117 SDP_ATTR_LANG_BASE_ATTR_ID_LIST = 0x0006, 2118 SDP_ATTR_SVCINFO_TTL = 0x0007, 2119 SDP_ATTR_SERVICE_AVAILABILITY = 0x0008, 2120 SDP_ATTR_PFILE_DESC_LIST = 0x0009, 2121 SDP_ATTR_DOC_URL = 0x000a, 2122 SDP_ATTR_CLNT_EXEC_URL = 0x000b, 2123 SDP_ATTR_ICON_URL = 0x000c, 2124 SDP_ATTR_ADD_PROTO_DESC_LIST = 0x000d, 2125 2126 SDP_ATTR_SVCNAME_PRIMARY = SDP_PRIMARY_LANG_BASE + 0, 2127 SDP_ATTR_SVCDESC_PRIMARY = SDP_PRIMARY_LANG_BASE + 1, 2128 SDP_ATTR_SVCPROV_PRIMARY = SDP_PRIMARY_LANG_BASE + 2, 2129 2130 SDP_ATTR_GROUP_ID = 0x0200, 2131 SDP_ATTR_IP_SUBNET = 0x0200, 2132 2133 /* SDP */ 2134 SDP_ATTR_VERSION_NUM_LIST = 0x0200, 2135 SDP_ATTR_SVCDB_STATE = 0x0201, 2136 2137 SDP_ATTR_SERVICE_VERSION = 0x0300, 2138 SDP_ATTR_EXTERNAL_NETWORK = 0x0301, 2139 SDP_ATTR_SUPPORTED_DATA_STORES_LIST = 0x0301, 2140 SDP_ATTR_FAX_CLASS1_SUPPORT = 0x0302, 2141 SDP_ATTR_REMOTE_AUDIO_VOLUME_CONTROL = 0x0302, 2142 SDP_ATTR_FAX_CLASS20_SUPPORT = 0x0303, 2143 SDP_ATTR_SUPPORTED_FORMATS_LIST = 0x0303, 2144 SDP_ATTR_FAX_CLASS2_SUPPORT = 0x0304, 2145 SDP_ATTR_AUDIO_FEEDBACK_SUPPORT = 0x0305, 2146 SDP_ATTR_NETWORK_ADDRESS = 0x0306, 2147 SDP_ATTR_WAP_GATEWAY = 0x0307, 2148 SDP_ATTR_HOMEPAGE_URL = 0x0308, 2149 SDP_ATTR_WAP_STACK_TYPE = 0x0309, 2150 SDP_ATTR_SECURITY_DESC = 0x030a, 2151 SDP_ATTR_NET_ACCESS_TYPE = 0x030b, 2152 SDP_ATTR_MAX_NET_ACCESSRATE = 0x030c, 2153 SDP_ATTR_IP4_SUBNET = 0x030d, 2154 SDP_ATTR_IP6_SUBNET = 0x030e, 2155 SDP_ATTR_SUPPORTED_CAPABILITIES = 0x0310, 2156 SDP_ATTR_SUPPORTED_FEATURES = 0x0311, 2157 SDP_ATTR_SUPPORTED_FUNCTIONS = 0x0312, 2158 SDP_ATTR_TOTAL_IMAGING_DATA_CAPACITY = 0x0313, 2159 SDP_ATTR_SUPPORTED_REPOSITORIES = 0x0314, 2160 2161 /* PnP Information */ 2162 SDP_ATTR_SPECIFICATION_ID = 0x0200, 2163 SDP_ATTR_VENDOR_ID = 0x0201, 2164 SDP_ATTR_PRODUCT_ID = 0x0202, 2165 SDP_ATTR_VERSION = 0x0203, 2166 SDP_ATTR_PRIMARY_RECORD = 0x0204, 2167 SDP_ATTR_VENDOR_ID_SOURCE = 0x0205, 2168 2169 /* BT HID */ 2170 SDP_ATTR_DEVICE_RELEASE_NUMBER = 0x0200, 2171 SDP_ATTR_PARSER_VERSION = 0x0201, 2172 SDP_ATTR_DEVICE_SUBCLASS = 0x0202, 2173 SDP_ATTR_COUNTRY_CODE = 0x0203, 2174 SDP_ATTR_VIRTUAL_CABLE = 0x0204, 2175 SDP_ATTR_RECONNECT_INITIATE = 0x0205, 2176 SDP_ATTR_DESCRIPTOR_LIST = 0x0206, 2177 SDP_ATTR_LANG_ID_BASE_LIST = 0x0207, 2178 SDP_ATTR_SDP_DISABLE = 0x0208, 2179 SDP_ATTR_BATTERY_POWER = 0x0209, 2180 SDP_ATTR_REMOTE_WAKEUP = 0x020a, 2181 SDP_ATTR_PROFILE_VERSION = 0x020b, 2182 SDP_ATTR_SUPERVISION_TIMEOUT = 0x020c, 2183 SDP_ATTR_NORMALLY_CONNECTABLE = 0x020d, 2184 SDP_ATTR_BOOT_DEVICE = 0x020e, 2185 }; 2186