Statistics
| Branch: | Revision:

root / hw / bt.h @ d9f75a4e

History | View | Annotate | Download (58.5 kB)

1
/*
2
 * QEMU Bluetooth HCI helpers.
3
 *
4
 * Copyright (C) 2007 OpenMoko, Inc.
5
 * Written by Andrzej Zaborowski <andrew@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@qualcomm.com>
10
 * Copyright (C) 2002-2006  Marcel Holtmann <marcel@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
};