Merge lp:~timchen119/ubuntu/utopic/bluez/lp1035431 into lp:ubuntu/utopic/bluez

Proposed by Tim Chen
Status: Merged
Approved by: Mathieu Trudel-Lapierre
Approved revision: 116
Merge reported by: Mathieu Trudel-Lapierre
Merged at revision: not available
Proposed branch: lp:~timchen119/ubuntu/utopic/bluez/lp1035431
Merge into: lp:ubuntu/utopic/bluez
Diff against target: 15522 lines (+15164/-63)
28 files modified
.pc/applied-patches (+1/-0)
.pc/ssp_parameter.patch/doc/agent-api.txt (+123/-0)
.pc/ssp_parameter.patch/lib/hci.h (+2391/-0)
.pc/ssp_parameter.patch/lib/mgmt.h (+554/-0)
.pc/ssp_parameter.patch/plugins/hciops.c (+3943/-0)
.pc/ssp_parameter.patch/plugins/mgmtops.c (+2523/-0)
.pc/ssp_parameter.patch/src/agent.c (+844/-0)
.pc/ssp_parameter.patch/src/agent.h (+80/-0)
.pc/ssp_parameter.patch/src/device.c (+3164/-0)
.pc/ssp_parameter.patch/src/device.h (+128/-0)
.pc/ssp_parameter.patch/src/event.c (+571/-0)
.pc/ssp_parameter.patch/src/event.h (+49/-0)
.pc/ssp_parameter.patch/test/simple-agent (+144/-0)
debian/changelog (+19/-0)
debian/patches/series (+1/-0)
debian/patches/ssp_parameter.patch (+439/-0)
doc/agent-api.txt (+2/-1)
lib/hci.h (+2/-1)
lib/mgmt.h (+7/-0)
plugins/hciops.c (+1/-1)
plugins/mgmtops.c (+37/-0)
src/agent.c (+4/-1)
src/agent.h (+1/-1)
src/device.c (+116/-40)
src/device.h (+9/-2)
src/event.c (+7/-12)
src/event.h (+1/-1)
test/simple-agent (+3/-3)
To merge this branch: bzr merge lp:~timchen119/ubuntu/utopic/bluez/lp1035431
Reviewer Review Type Date Requested Status
Mathieu Trudel-Lapierre Approve
Review via email: mp+219626@code.launchpad.net

Description of the change

This fixed the issue for the paring issue on Logitech K810 and HP bluetooth keyboard K4000 and should also fixed any ssp paired bluetooth keyboard.

The root problem here is that in bluez4, the doc (agent-api.txt), specific that the
function

void DisplayPasskey(object device, uint32 passkey, uint8 entered)

however in bluez4's src/agent.c agent_display_passkey()
didn't pass the entered correct "enter" parameter,
and most of client implementation in linux (at least gnome-bluetooth, bluedevil, blueman) follows the specification in the api document so they never receive correct parameter.

This is already fixed in bluez5,
however due to the compatibility issue between bluez4 and bluez5
this never being backported in bluez4.

Another related merge is at https://code.launchpad.net/~timchen119/ubuntu/utopic/gnome-bluetooth/lp1035431

gnome-bluetooth do follow the doc and, but still have issues when display the number,
the number will not correctly display in current implementation,
however gnome-bluetooth is being removed in recent gnome upstream, so we need to maintain a ubuntu distro patch here.

This request is from our OEM so please help to review these patch and see if there's things I can improve this patch. If the patch is accepted I'll send SRUs to trusty (OEM shipping image is LTS based, so it will be trusty right now).

To post a comment you must log in.
Revision history for this message
Mathieu Trudel-Lapierre (cyphermox) wrote :

Seems to me like the entered property is not consistently either an uint8 or an uint16, I think you'll want to keep it an uint16 everywhere maybe?

review: Needs Fixing
Revision history for this message
Tim Chen (timchen119) wrote :

@Mathieu
Thanks for the review and bring this up,
the reason behind this inconsistency is because it's how bluez5 doing it and I don't plan to modify too much upstream code when porting, upstream commit 6a394b2c7f19b53b630bef2e865f9bc289d4b75c says it's because D-Bus doesn't have a uint8 type, so they use uint16 instead and upstream still use uint8 internally.

==============================================================

commit 6a394b2c7f19b53b630bef2e865f9bc289d4b75c
Author: Johan Hedberg <email address hidden>
Date: Tue Sep 4 13:49:58 2012 +0300

    agent-api: DisplayPasskey: D-Bus doesn't have a uint8 type

#git-upstream/bluez/src$ grep -C2 -Iir "_t entered" *
agent.c-
agent.c-int agent_display_passkey(struct agent *agent, struct btd_device *device,
agent.c: uint32_t passkey, uint16_t entered)
agent.c-{
agent.c- DBusMessage *message;
--
agent.h-
agent.h-int agent_display_passkey(struct agent *agent, struct btd_device *device,
agent.h: uint32_t passkey, uint16_t entered);
agent.h-
agent.h-int agent_display_pincode(struct agent *agent, struct btd_device *device,
--
device.c-
device.c-int device_notify_passkey(struct btd_device *device, uint32_t passkey,
device.c: uint8_t entered)
device.c-{
device.c- struct authentication_req *auth;
--
device.h- uint8_t confirm_hint);
device.h-int device_notify_passkey(struct btd_device *device, uint32_t passkey,
device.h: uint8_t entered);
device.h-int device_notify_pincode(struct btd_device *device, gboolean secure,
device.h- const char *pincode);

Revision history for this message
Mathieu Trudel-Lapierre (cyphermox) wrote :

Alright, let's land this.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.pc/applied-patches'
--- .pc/applied-patches 2014-04-08 10:54:11 +0000
+++ .pc/applied-patches 2014-05-15 03:26:22 +0000
@@ -14,3 +14,4 @@
14telephony_ofono_add_watch.patch14telephony_ofono_add_watch.patch
1512_check_device_before_removing_from_devices.patch1512_check_device_before_removing_from_devices.patch
1613_reset_default_adapter_id.patch1613_reset_default_adapter_id.patch
17ssp_parameter.patch
1718
=== added directory '.pc/ssp_parameter.patch'
=== added directory '.pc/ssp_parameter.patch/doc'
=== added file '.pc/ssp_parameter.patch/doc/agent-api.txt'
--- .pc/ssp_parameter.patch/doc/agent-api.txt 1970-01-01 00:00:00 +0000
+++ .pc/ssp_parameter.patch/doc/agent-api.txt 2014-05-15 03:26:22 +0000
@@ -0,0 +1,123 @@
1BlueZ D-Bus Agent API description
2**********************************
3
4Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
5Copyright (C) 2005-2006 Johan Hedberg <johan.hedberg@nokia.com>
6
7
8Agent hierarchy
9===============
10
11Service unique name
12Interface org.bluez.Agent
13Object path freely definable
14
15Methods void Release()
16
17 This method gets called when the service daemon
18 unregisters the agent. An agent can use it to do
19 cleanup tasks. There is no need to unregister the
20 agent, because when this method gets called it has
21 already been unregistered.
22
23 string RequestPinCode(object device)
24
25 This method gets called when the service daemon
26 needs to get the passkey for an authentication.
27
28 The return value should be a string of 1-16 characters
29 length. The string can be alphanumeric.
30
31 Possible errors: org.bluez.Error.Rejected
32 org.bluez.Error.Canceled
33
34 uint32 RequestPasskey(object device)
35
36 This method gets called when the service daemon
37 needs to get the passkey for an authentication.
38
39 The return value should be a numeric value
40 between 0-999999.
41
42 Possible errors: org.bluez.Error.Rejected
43 org.bluez.Error.Canceled
44
45 void DisplayPasskey(object device, uint32 passkey, uint8 entered)
46
47 This method gets called when the service daemon
48 needs to display a passkey for an authentication.
49
50 The entered parameter indicates the number of already
51 typed keys on the remote side.
52
53 An empty reply should be returned. When the passkey
54 needs no longer to be displayed, the Cancel method
55 of the agent will be called.
56
57 During the pairing process this method might be
58 called multiple times to update the entered value.
59
60 Note that the passkey will always be a 6-digit number,
61 so the display should be zero-padded at the start if
62 the value contains less than 6 digits.
63
64 void DisplayPinCode(object device, string pincode)
65
66 This method gets called when the service daemon
67 needs to display a pincode for an authentication.
68
69 An empty reply should be returned. When the pincode
70 needs no longer to be displayed, the Cancel method
71 of the agent will be called.
72
73 If this method is not implemented the RequestPinCode
74 method will be used instead.
75
76 This is used during the pairing process of keyboards
77 that don't support Bluetooth 2.1 Secure Simple Pairing,
78 in contrast to DisplayPasskey which is used for those
79 that do.
80
81 This method will only ever be called once since
82 older keyboards do not support typing notification.
83
84 Note that the PIN will always be a 6-digit number,
85 zero-padded to 6 digits. This is for harmony with
86 the later specification.
87
88 void RequestConfirmation(object device, uint32 passkey)
89
90 This method gets called when the service daemon
91 needs to confirm a passkey for an authentication.
92
93 To confirm the value it should return an empty reply
94 or an error in case the passkey is invalid.
95
96 Note that the passkey will always be a 6-digit number,
97 so the display should be zero-padded at the start if
98 the value contains less than 6 digits.
99
100 Possible errors: org.bluez.Error.Rejected
101 org.bluez.Error.Canceled
102
103 void Authorize(object device, string uuid)
104
105 This method gets called when the service daemon
106 needs to authorize a connection/service request.
107
108 Possible errors: org.bluez.Error.Rejected
109 org.bluez.Error.Canceled
110
111 void ConfirmModeChange(string mode)
112
113 This method gets called if a mode change is requested
114 that needs to be confirmed by the user. An example
115 would be leaving flight mode.
116
117 Possible errors: org.bluez.Error.Rejected
118 org.bluez.Error.Canceled
119
120 void Cancel()
121
122 This method gets called to indicate that the agent
123 request failed before a reply was returned.
0124
=== added directory '.pc/ssp_parameter.patch/lib'
=== added file '.pc/ssp_parameter.patch/lib/hci.h'
--- .pc/ssp_parameter.patch/lib/hci.h 1970-01-01 00:00:00 +0000
+++ .pc/ssp_parameter.patch/lib/hci.h 2014-05-15 03:26:22 +0000
@@ -0,0 +1,2391 @@
1/*
2 *
3 * BlueZ - Bluetooth protocol stack for Linux
4 *
5 * Copyright (C) 2000-2001 Qualcomm Incorporated
6 * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
7 * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
8 *
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 *
24 */
25
26#ifndef __HCI_H
27#define __HCI_H
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33#include <sys/socket.h>
34
35#define HCI_MAX_DEV 16
36
37#define HCI_MAX_ACL_SIZE 1024
38#define HCI_MAX_SCO_SIZE 255
39#define HCI_MAX_EVENT_SIZE 260
40#define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4)
41
42/* HCI dev events */
43#define HCI_DEV_REG 1
44#define HCI_DEV_UNREG 2
45#define HCI_DEV_UP 3
46#define HCI_DEV_DOWN 4
47#define HCI_DEV_SUSPEND 5
48#define HCI_DEV_RESUME 6
49
50/* HCI bus types */
51#define HCI_VIRTUAL 0
52#define HCI_USB 1
53#define HCI_PCCARD 2
54#define HCI_UART 3
55#define HCI_RS232 4
56#define HCI_PCI 5
57#define HCI_SDIO 6
58
59/* HCI controller types */
60#define HCI_BREDR 0x00
61#define HCI_AMP 0x01
62
63/* HCI device flags */
64enum {
65 HCI_UP,
66 HCI_INIT,
67 HCI_RUNNING,
68
69 HCI_PSCAN,
70 HCI_ISCAN,
71 HCI_AUTH,
72 HCI_ENCRYPT,
73 HCI_INQUIRY,
74
75 HCI_RAW,
76};
77
78/* LE address type */
79enum {
80 LE_PUBLIC_ADDRESS = 0x00,
81 LE_RANDOM_ADDRESS = 0x01
82};
83
84/* HCI ioctl defines */
85#define HCIDEVUP _IOW('H', 201, int)
86#define HCIDEVDOWN _IOW('H', 202, int)
87#define HCIDEVRESET _IOW('H', 203, int)
88#define HCIDEVRESTAT _IOW('H', 204, int)
89
90#define HCIGETDEVLIST _IOR('H', 210, int)
91#define HCIGETDEVINFO _IOR('H', 211, int)
92#define HCIGETCONNLIST _IOR('H', 212, int)
93#define HCIGETCONNINFO _IOR('H', 213, int)
94#define HCIGETAUTHINFO _IOR('H', 215, int)
95
96#define HCISETRAW _IOW('H', 220, int)
97#define HCISETSCAN _IOW('H', 221, int)
98#define HCISETAUTH _IOW('H', 222, int)
99#define HCISETENCRYPT _IOW('H', 223, int)
100#define HCISETPTYPE _IOW('H', 224, int)
101#define HCISETLINKPOL _IOW('H', 225, int)
102#define HCISETLINKMODE _IOW('H', 226, int)
103#define HCISETACLMTU _IOW('H', 227, int)
104#define HCISETSCOMTU _IOW('H', 228, int)
105
106#define HCIBLOCKADDR _IOW('H', 230, int)
107#define HCIUNBLOCKADDR _IOW('H', 231, int)
108
109#define HCIINQUIRY _IOR('H', 240, int)
110
111#ifndef __NO_HCI_DEFS
112
113/* HCI Packet types */
114#define HCI_COMMAND_PKT 0x01
115#define HCI_ACLDATA_PKT 0x02
116#define HCI_SCODATA_PKT 0x03
117#define HCI_EVENT_PKT 0x04
118#define HCI_VENDOR_PKT 0xff
119
120/* HCI Packet types */
121#define HCI_2DH1 0x0002
122#define HCI_3DH1 0x0004
123#define HCI_DM1 0x0008
124#define HCI_DH1 0x0010
125#define HCI_2DH3 0x0100
126#define HCI_3DH3 0x0200
127#define HCI_DM3 0x0400
128#define HCI_DH3 0x0800
129#define HCI_2DH5 0x1000
130#define HCI_3DH5 0x2000
131#define HCI_DM5 0x4000
132#define HCI_DH5 0x8000
133
134#define HCI_HV1 0x0020
135#define HCI_HV2 0x0040
136#define HCI_HV3 0x0080
137
138#define HCI_EV3 0x0008
139#define HCI_EV4 0x0010
140#define HCI_EV5 0x0020
141#define HCI_2EV3 0x0040
142#define HCI_3EV3 0x0080
143#define HCI_2EV5 0x0100
144#define HCI_3EV5 0x0200
145
146#define SCO_PTYPE_MASK (HCI_HV1 | HCI_HV2 | HCI_HV3)
147#define ACL_PTYPE_MASK (HCI_DM1 | HCI_DH1 | HCI_DM3 | HCI_DH3 | HCI_DM5 | HCI_DH5)
148
149/* HCI Error codes */
150#define HCI_UNKNOWN_COMMAND 0x01
151#define HCI_NO_CONNECTION 0x02
152#define HCI_HARDWARE_FAILURE 0x03
153#define HCI_PAGE_TIMEOUT 0x04
154#define HCI_AUTHENTICATION_FAILURE 0x05
155#define HCI_PIN_OR_KEY_MISSING 0x06
156#define HCI_MEMORY_FULL 0x07
157#define HCI_CONNECTION_TIMEOUT 0x08
158#define HCI_MAX_NUMBER_OF_CONNECTIONS 0x09
159#define HCI_MAX_NUMBER_OF_SCO_CONNECTIONS 0x0a
160#define HCI_ACL_CONNECTION_EXISTS 0x0b
161#define HCI_COMMAND_DISALLOWED 0x0c
162#define HCI_REJECTED_LIMITED_RESOURCES 0x0d
163#define HCI_REJECTED_SECURITY 0x0e
164#define HCI_REJECTED_PERSONAL 0x0f
165#define HCI_HOST_TIMEOUT 0x10
166#define HCI_UNSUPPORTED_FEATURE 0x11
167#define HCI_INVALID_PARAMETERS 0x12
168#define HCI_OE_USER_ENDED_CONNECTION 0x13
169#define HCI_OE_LOW_RESOURCES 0x14
170#define HCI_OE_POWER_OFF 0x15
171#define HCI_CONNECTION_TERMINATED 0x16
172#define HCI_REPEATED_ATTEMPTS 0x17
173#define HCI_PAIRING_NOT_ALLOWED 0x18
174#define HCI_UNKNOWN_LMP_PDU 0x19
175#define HCI_UNSUPPORTED_REMOTE_FEATURE 0x1a
176#define HCI_SCO_OFFSET_REJECTED 0x1b
177#define HCI_SCO_INTERVAL_REJECTED 0x1c
178#define HCI_AIR_MODE_REJECTED 0x1d
179#define HCI_INVALID_LMP_PARAMETERS 0x1e
180#define HCI_UNSPECIFIED_ERROR 0x1f
181#define HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20
182#define HCI_ROLE_CHANGE_NOT_ALLOWED 0x21
183#define HCI_LMP_RESPONSE_TIMEOUT 0x22
184#define HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
185#define HCI_LMP_PDU_NOT_ALLOWED 0x24
186#define HCI_ENCRYPTION_MODE_NOT_ACCEPTED 0x25
187#define HCI_UNIT_LINK_KEY_USED 0x26
188#define HCI_QOS_NOT_SUPPORTED 0x27
189#define HCI_INSTANT_PASSED 0x28
190#define HCI_PAIRING_NOT_SUPPORTED 0x29
191#define HCI_TRANSACTION_COLLISION 0x2a
192#define HCI_QOS_UNACCEPTABLE_PARAMETER 0x2c
193#define HCI_QOS_REJECTED 0x2d
194#define HCI_CLASSIFICATION_NOT_SUPPORTED 0x2e
195#define HCI_INSUFFICIENT_SECURITY 0x2f
196#define HCI_PARAMETER_OUT_OF_RANGE 0x30
197#define HCI_ROLE_SWITCH_PENDING 0x32
198#define HCI_SLOT_VIOLATION 0x34
199#define HCI_ROLE_SWITCH_FAILED 0x35
200#define HCI_EIR_TOO_LARGE 0x36
201#define HCI_SIMPLE_PAIRING_NOT_SUPPORTED 0x37
202#define HCI_HOST_BUSY_PAIRING 0x38
203
204/* ACL flags */
205#define ACL_START_NO_FLUSH 0x00
206#define ACL_CONT 0x01
207#define ACL_START 0x02
208#define ACL_ACTIVE_BCAST 0x04
209#define ACL_PICO_BCAST 0x08
210
211/* Baseband links */
212#define SCO_LINK 0x00
213#define ACL_LINK 0x01
214#define ESCO_LINK 0x02
215
216/* LMP features */
217#define LMP_3SLOT 0x01
218#define LMP_5SLOT 0x02
219#define LMP_ENCRYPT 0x04
220#define LMP_SOFFSET 0x08
221#define LMP_TACCURACY 0x10
222#define LMP_RSWITCH 0x20
223#define LMP_HOLD 0x40
224#define LMP_SNIFF 0x80
225
226#define LMP_PARK 0x01
227#define LMP_RSSI 0x02
228#define LMP_QUALITY 0x04
229#define LMP_SCO 0x08
230#define LMP_HV2 0x10
231#define LMP_HV3 0x20
232#define LMP_ULAW 0x40
233#define LMP_ALAW 0x80
234
235#define LMP_CVSD 0x01
236#define LMP_PSCHEME 0x02
237#define LMP_PCONTROL 0x04
238#define LMP_TRSP_SCO 0x08
239#define LMP_BCAST_ENC 0x80
240
241#define LMP_EDR_ACL_2M 0x02
242#define LMP_EDR_ACL_3M 0x04
243#define LMP_ENH_ISCAN 0x08
244#define LMP_ILACE_ISCAN 0x10
245#define LMP_ILACE_PSCAN 0x20
246#define LMP_RSSI_INQ 0x40
247#define LMP_ESCO 0x80
248
249#define LMP_EV4 0x01
250#define LMP_EV5 0x02
251#define LMP_AFH_CAP_SLV 0x08
252#define LMP_AFH_CLS_SLV 0x10
253#define LMP_NO_BREDR 0x20
254#define LMP_LE 0x40
255#define LMP_EDR_3SLOT 0x80
256
257#define LMP_EDR_5SLOT 0x01
258#define LMP_SNIFF_SUBR 0x02
259#define LMP_PAUSE_ENC 0x04
260#define LMP_AFH_CAP_MST 0x08
261#define LMP_AFH_CLS_MST 0x10
262#define LMP_EDR_ESCO_2M 0x20
263#define LMP_EDR_ESCO_3M 0x40
264#define LMP_EDR_3S_ESCO 0x80
265
266#define LMP_EXT_INQ 0x01
267#define LMP_LE_BREDR 0x02
268#define LMP_SIMPLE_PAIR 0x08
269#define LMP_ENCAPS_PDU 0x10
270#define LMP_ERR_DAT_REP 0x20
271#define LMP_NFLUSH_PKTS 0x40
272
273#define LMP_LSTO 0x01
274#define LMP_INQ_TX_PWR 0x02
275#define LMP_EPC 0x04
276#define LMP_EXT_FEAT 0x80
277
278/* Extended LMP features */
279#define LMP_HOST_SSP 0x01
280#define LMP_HOST_LE 0x02
281#define LMP_HOST_LE_BREDR 0x04
282
283/* Link policies */
284#define HCI_LP_RSWITCH 0x0001
285#define HCI_LP_HOLD 0x0002
286#define HCI_LP_SNIFF 0x0004
287#define HCI_LP_PARK 0x0008
288
289/* Link mode */
290#define HCI_LM_ACCEPT 0x8000
291#define HCI_LM_MASTER 0x0001
292#define HCI_LM_AUTH 0x0002
293#define HCI_LM_ENCRYPT 0x0004
294#define HCI_LM_TRUSTED 0x0008
295#define HCI_LM_RELIABLE 0x0010
296#define HCI_LM_SECURE 0x0020
297
298/* Link Key types */
299#define HCI_LK_COMBINATION 0x00
300#define HCI_LK_LOCAL_UNIT 0x01
301#define HCI_LK_REMOTE_UNIT 0x02
302#define HCI_LK_DEBUG_COMBINATION 0x03
303#define HCI_LK_UNAUTH_COMBINATION 0x04
304#define HCI_LK_AUTH_COMBINATION 0x05
305#define HCI_LK_CHANGED_COMBINATION 0x06
306#define HCI_LK_INVALID 0xFF
307
308/* ----- HCI Commands ----- */
309
310/* Link Control */
311#define OGF_LINK_CTL 0x01
312
313#define OCF_INQUIRY 0x0001
314typedef struct {
315 uint8_t lap[3];
316 uint8_t length; /* 1.28s units */
317 uint8_t num_rsp;
318} __attribute__ ((packed)) inquiry_cp;
319#define INQUIRY_CP_SIZE 5
320
321typedef struct {
322 uint8_t status;
323 bdaddr_t bdaddr;
324} __attribute__ ((packed)) status_bdaddr_rp;
325#define STATUS_BDADDR_RP_SIZE 7
326
327#define OCF_INQUIRY_CANCEL 0x0002
328
329#define OCF_PERIODIC_INQUIRY 0x0003
330typedef struct {
331 uint16_t max_period; /* 1.28s units */
332 uint16_t min_period; /* 1.28s units */
333 uint8_t lap[3];
334 uint8_t length; /* 1.28s units */
335 uint8_t num_rsp;
336} __attribute__ ((packed)) periodic_inquiry_cp;
337#define PERIODIC_INQUIRY_CP_SIZE 9
338
339#define OCF_EXIT_PERIODIC_INQUIRY 0x0004
340
341#define OCF_CREATE_CONN 0x0005
342typedef struct {
343 bdaddr_t bdaddr;
344 uint16_t pkt_type;
345 uint8_t pscan_rep_mode;
346 uint8_t pscan_mode;
347 uint16_t clock_offset;
348 uint8_t role_switch;
349} __attribute__ ((packed)) create_conn_cp;
350#define CREATE_CONN_CP_SIZE 13
351
352#define OCF_DISCONNECT 0x0006
353typedef struct {
354 uint16_t handle;
355 uint8_t reason;
356} __attribute__ ((packed)) disconnect_cp;
357#define DISCONNECT_CP_SIZE 3
358
359#define OCF_ADD_SCO 0x0007
360typedef struct {
361 uint16_t handle;
362 uint16_t pkt_type;
363} __attribute__ ((packed)) add_sco_cp;
364#define ADD_SCO_CP_SIZE 4
365
366#define OCF_CREATE_CONN_CANCEL 0x0008
367typedef struct {
368 bdaddr_t bdaddr;
369} __attribute__ ((packed)) create_conn_cancel_cp;
370#define CREATE_CONN_CANCEL_CP_SIZE 6
371
372#define OCF_ACCEPT_CONN_REQ 0x0009
373typedef struct {
374 bdaddr_t bdaddr;
375 uint8_t role;
376} __attribute__ ((packed)) accept_conn_req_cp;
377#define ACCEPT_CONN_REQ_CP_SIZE 7
378
379#define OCF_REJECT_CONN_REQ 0x000A
380typedef struct {
381 bdaddr_t bdaddr;
382 uint8_t reason;
383} __attribute__ ((packed)) reject_conn_req_cp;
384#define REJECT_CONN_REQ_CP_SIZE 7
385
386#define OCF_LINK_KEY_REPLY 0x000B
387typedef struct {
388 bdaddr_t bdaddr;
389 uint8_t link_key[16];
390} __attribute__ ((packed)) link_key_reply_cp;
391#define LINK_KEY_REPLY_CP_SIZE 22
392
393#define OCF_LINK_KEY_NEG_REPLY 0x000C
394
395#define OCF_PIN_CODE_REPLY 0x000D
396typedef struct {
397 bdaddr_t bdaddr;
398 uint8_t pin_len;
399 uint8_t pin_code[16];
400} __attribute__ ((packed)) pin_code_reply_cp;
401#define PIN_CODE_REPLY_CP_SIZE 23
402
403#define OCF_PIN_CODE_NEG_REPLY 0x000E
404
405#define OCF_SET_CONN_PTYPE 0x000F
406typedef struct {
407 uint16_t handle;
408 uint16_t pkt_type;
409} __attribute__ ((packed)) set_conn_ptype_cp;
410#define SET_CONN_PTYPE_CP_SIZE 4
411
412#define OCF_AUTH_REQUESTED 0x0011
413typedef struct {
414 uint16_t handle;
415} __attribute__ ((packed)) auth_requested_cp;
416#define AUTH_REQUESTED_CP_SIZE 2
417
418#define OCF_SET_CONN_ENCRYPT 0x0013
419typedef struct {
420 uint16_t handle;
421 uint8_t encrypt;
422} __attribute__ ((packed)) set_conn_encrypt_cp;
423#define SET_CONN_ENCRYPT_CP_SIZE 3
424
425#define OCF_CHANGE_CONN_LINK_KEY 0x0015
426typedef struct {
427 uint16_t handle;
428} __attribute__ ((packed)) change_conn_link_key_cp;
429#define CHANGE_CONN_LINK_KEY_CP_SIZE 2
430
431#define OCF_MASTER_LINK_KEY 0x0017
432typedef struct {
433 uint8_t key_flag;
434} __attribute__ ((packed)) master_link_key_cp;
435#define MASTER_LINK_KEY_CP_SIZE 1
436
437#define OCF_REMOTE_NAME_REQ 0x0019
438typedef struct {
439 bdaddr_t bdaddr;
440 uint8_t pscan_rep_mode;
441 uint8_t pscan_mode;
442 uint16_t clock_offset;
443} __attribute__ ((packed)) remote_name_req_cp;
444#define REMOTE_NAME_REQ_CP_SIZE 10
445
446#define OCF_REMOTE_NAME_REQ_CANCEL 0x001A
447typedef struct {
448 bdaddr_t bdaddr;
449} __attribute__ ((packed)) remote_name_req_cancel_cp;
450#define REMOTE_NAME_REQ_CANCEL_CP_SIZE 6
451
452#define OCF_READ_REMOTE_FEATURES 0x001B
453typedef struct {
454 uint16_t handle;
455} __attribute__ ((packed)) read_remote_features_cp;
456#define READ_REMOTE_FEATURES_CP_SIZE 2
457
458#define OCF_READ_REMOTE_EXT_FEATURES 0x001C
459typedef struct {
460 uint16_t handle;
461 uint8_t page_num;
462} __attribute__ ((packed)) read_remote_ext_features_cp;
463#define READ_REMOTE_EXT_FEATURES_CP_SIZE 3
464
465#define OCF_READ_REMOTE_VERSION 0x001D
466typedef struct {
467 uint16_t handle;
468} __attribute__ ((packed)) read_remote_version_cp;
469#define READ_REMOTE_VERSION_CP_SIZE 2
470
471#define OCF_READ_CLOCK_OFFSET 0x001F
472typedef struct {
473 uint16_t handle;
474} __attribute__ ((packed)) read_clock_offset_cp;
475#define READ_CLOCK_OFFSET_CP_SIZE 2
476
477#define OCF_READ_LMP_HANDLE 0x0020
478
479#define OCF_SETUP_SYNC_CONN 0x0028
480typedef struct {
481 uint16_t handle;
482 uint32_t tx_bandwith;
483 uint32_t rx_bandwith;
484 uint16_t max_latency;
485 uint16_t voice_setting;
486 uint8_t retrans_effort;
487 uint16_t pkt_type;
488} __attribute__ ((packed)) setup_sync_conn_cp;
489#define SETUP_SYNC_CONN_CP_SIZE 17
490
491#define OCF_ACCEPT_SYNC_CONN_REQ 0x0029
492typedef struct {
493 bdaddr_t bdaddr;
494 uint32_t tx_bandwith;
495 uint32_t rx_bandwith;
496 uint16_t max_latency;
497 uint16_t voice_setting;
498 uint8_t retrans_effort;
499 uint16_t pkt_type;
500} __attribute__ ((packed)) accept_sync_conn_req_cp;
501#define ACCEPT_SYNC_CONN_REQ_CP_SIZE 21
502
503#define OCF_REJECT_SYNC_CONN_REQ 0x002A
504typedef struct {
505 bdaddr_t bdaddr;
506 uint8_t reason;
507} __attribute__ ((packed)) reject_sync_conn_req_cp;
508#define REJECT_SYNC_CONN_REQ_CP_SIZE 7
509
510#define OCF_IO_CAPABILITY_REPLY 0x002B
511typedef struct {
512 bdaddr_t bdaddr;
513 uint8_t capability;
514 uint8_t oob_data;
515 uint8_t authentication;
516} __attribute__ ((packed)) io_capability_reply_cp;
517#define IO_CAPABILITY_REPLY_CP_SIZE 9
518
519#define OCF_USER_CONFIRM_REPLY 0x002C
520typedef struct {
521 bdaddr_t bdaddr;
522} __attribute__ ((packed)) user_confirm_reply_cp;
523#define USER_CONFIRM_REPLY_CP_SIZE 6
524
525#define OCF_USER_CONFIRM_NEG_REPLY 0x002D
526
527#define OCF_USER_PASSKEY_REPLY 0x002E
528typedef struct {
529 bdaddr_t bdaddr;
530 uint32_t passkey;
531} __attribute__ ((packed)) user_passkey_reply_cp;
532#define USER_PASSKEY_REPLY_CP_SIZE 10
533
534#define OCF_USER_PASSKEY_NEG_REPLY 0x002F
535
536#define OCF_REMOTE_OOB_DATA_REPLY 0x0030
537typedef struct {
538 bdaddr_t bdaddr;
539 uint8_t hash[16];
540 uint8_t randomizer[16];
541} __attribute__ ((packed)) remote_oob_data_reply_cp;
542#define REMOTE_OOB_DATA_REPLY_CP_SIZE 38
543
544#define OCF_REMOTE_OOB_DATA_NEG_REPLY 0x0033
545
546#define OCF_IO_CAPABILITY_NEG_REPLY 0x0034
547typedef struct {
548 bdaddr_t bdaddr;
549 uint8_t reason;
550} __attribute__ ((packed)) io_capability_neg_reply_cp;
551#define IO_CAPABILITY_NEG_REPLY_CP_SIZE 7
552
553#define OCF_CREATE_PHYSICAL_LINK 0x0035
554typedef struct {
555 uint8_t handle;
556 uint8_t key_length;
557 uint8_t key_type;
558 uint8_t key[32];
559} __attribute__ ((packed)) create_physical_link_cp;
560#define CREATE_PHYSICAL_LINK_CP_SIZE 35
561
562#define OCF_ACCEPT_PHYSICAL_LINK 0x0036
563
564#define OCF_DISCONNECT_PHYSICAL_LINK 0x0037
565typedef struct {
566 uint8_t handle;
567 uint8_t reason;
568} __attribute__ ((packed)) disconnect_physical_link_cp;
569#define DISCONNECT_PHYSICAL_LINK_CP_SIZE 2
570
571#define OCF_CREATE_LOGICAL_LINK 0x0038
572typedef struct {
573 uint8_t handle;
574 uint8_t tx_flow[16];
575 uint8_t rx_flow[16];
576} __attribute__ ((packed)) create_logical_link_cp;
577#define CREATE_LOGICAL_LINK_CP_SIZE 33
578
579#define OCF_ACCEPT_LOGICAL_LINK 0x0039
580
581#define OCF_DISCONNECT_LOGICAL_LINK 0x003A
582typedef struct {
583 uint16_t handle;
584} __attribute__ ((packed)) disconnect_logical_link_cp;
585#define DISCONNECT_LOGICAL_LINK_CP_SIZE 2
586
587#define OCF_LOGICAL_LINK_CANCEL 0x003B
588typedef struct {
589 uint8_t handle;
590 uint8_t tx_flow_id;
591} __attribute__ ((packed)) cancel_logical_link_cp;
592#define LOGICAL_LINK_CANCEL_CP_SIZE 2
593typedef struct {
594 uint8_t status;
595 uint8_t handle;
596 uint8_t tx_flow_id;
597} __attribute__ ((packed)) cancel_logical_link_rp;
598#define LOGICAL_LINK_CANCEL_RP_SIZE 3
599
600#define OCF_FLOW_SPEC_MODIFY 0x003C
601
602/* Link Policy */
603#define OGF_LINK_POLICY 0x02
604
605#define OCF_HOLD_MODE 0x0001
606typedef struct {
607 uint16_t handle;
608 uint16_t max_interval;
609 uint16_t min_interval;
610} __attribute__ ((packed)) hold_mode_cp;
611#define HOLD_MODE_CP_SIZE 6
612
613#define OCF_SNIFF_MODE 0x0003
614typedef struct {
615 uint16_t handle;
616 uint16_t max_interval;
617 uint16_t min_interval;
618 uint16_t attempt;
619 uint16_t timeout;
620} __attribute__ ((packed)) sniff_mode_cp;
621#define SNIFF_MODE_CP_SIZE 10
622
623#define OCF_EXIT_SNIFF_MODE 0x0004
624typedef struct {
625 uint16_t handle;
626} __attribute__ ((packed)) exit_sniff_mode_cp;
627#define EXIT_SNIFF_MODE_CP_SIZE 2
628
629#define OCF_PARK_MODE 0x0005
630typedef struct {
631 uint16_t handle;
632 uint16_t max_interval;
633 uint16_t min_interval;
634} __attribute__ ((packed)) park_mode_cp;
635#define PARK_MODE_CP_SIZE 6
636
637#define OCF_EXIT_PARK_MODE 0x0006
638typedef struct {
639 uint16_t handle;
640} __attribute__ ((packed)) exit_park_mode_cp;
641#define EXIT_PARK_MODE_CP_SIZE 2
642
643#define OCF_QOS_SETUP 0x0007
644typedef struct {
645 uint8_t service_type; /* 1 = best effort */
646 uint32_t token_rate; /* Byte per seconds */
647 uint32_t peak_bandwidth; /* Byte per seconds */
648 uint32_t latency; /* Microseconds */
649 uint32_t delay_variation; /* Microseconds */
650} __attribute__ ((packed)) hci_qos;
651#define HCI_QOS_CP_SIZE 17
652typedef struct {
653 uint16_t handle;
654 uint8_t flags; /* Reserved */
655 hci_qos qos;
656} __attribute__ ((packed)) qos_setup_cp;
657#define QOS_SETUP_CP_SIZE (3 + HCI_QOS_CP_SIZE)
658
659#define OCF_ROLE_DISCOVERY 0x0009
660typedef struct {
661 uint16_t handle;
662} __attribute__ ((packed)) role_discovery_cp;
663#define ROLE_DISCOVERY_CP_SIZE 2
664typedef struct {
665 uint8_t status;
666 uint16_t handle;
667 uint8_t role;
668} __attribute__ ((packed)) role_discovery_rp;
669#define ROLE_DISCOVERY_RP_SIZE 4
670
671#define OCF_SWITCH_ROLE 0x000B
672typedef struct {
673 bdaddr_t bdaddr;
674 uint8_t role;
675} __attribute__ ((packed)) switch_role_cp;
676#define SWITCH_ROLE_CP_SIZE 7
677
678#define OCF_READ_LINK_POLICY 0x000C
679typedef struct {
680 uint16_t handle;
681} __attribute__ ((packed)) read_link_policy_cp;
682#define READ_LINK_POLICY_CP_SIZE 2
683typedef struct {
684 uint8_t status;
685 uint16_t handle;
686 uint16_t policy;
687} __attribute__ ((packed)) read_link_policy_rp;
688#define READ_LINK_POLICY_RP_SIZE 5
689
690#define OCF_WRITE_LINK_POLICY 0x000D
691typedef struct {
692 uint16_t handle;
693 uint16_t policy;
694} __attribute__ ((packed)) write_link_policy_cp;
695#define WRITE_LINK_POLICY_CP_SIZE 4
696typedef struct {
697 uint8_t status;
698 uint16_t handle;
699} __attribute__ ((packed)) write_link_policy_rp;
700#define WRITE_LINK_POLICY_RP_SIZE 3
701
702#define OCF_READ_DEFAULT_LINK_POLICY 0x000E
703
704#define OCF_WRITE_DEFAULT_LINK_POLICY 0x000F
705
706#define OCF_FLOW_SPECIFICATION 0x0010
707
708#define OCF_SNIFF_SUBRATING 0x0011
709typedef struct {
710 uint16_t handle;
711 uint16_t max_latency;
712 uint16_t min_remote_timeout;
713 uint16_t min_local_timeout;
714} __attribute__ ((packed)) sniff_subrating_cp;
715#define SNIFF_SUBRATING_CP_SIZE 8
716
717/* Host Controller and Baseband */
718#define OGF_HOST_CTL 0x03
719
720#define OCF_SET_EVENT_MASK 0x0001
721typedef struct {
722 uint8_t mask[8];
723} __attribute__ ((packed)) set_event_mask_cp;
724#define SET_EVENT_MASK_CP_SIZE 8
725
726#define OCF_RESET 0x0003
727
728#define OCF_SET_EVENT_FLT 0x0005
729typedef struct {
730 uint8_t flt_type;
731 uint8_t cond_type;
732 uint8_t condition[0];
733} __attribute__ ((packed)) set_event_flt_cp;
734#define SET_EVENT_FLT_CP_SIZE 2
735
736/* Filter types */
737#define FLT_CLEAR_ALL 0x00
738#define FLT_INQ_RESULT 0x01
739#define FLT_CONN_SETUP 0x02
740/* INQ_RESULT Condition types */
741#define INQ_RESULT_RETURN_ALL 0x00
742#define INQ_RESULT_RETURN_CLASS 0x01
743#define INQ_RESULT_RETURN_BDADDR 0x02
744/* CONN_SETUP Condition types */
745#define CONN_SETUP_ALLOW_ALL 0x00
746#define CONN_SETUP_ALLOW_CLASS 0x01
747#define CONN_SETUP_ALLOW_BDADDR 0x02
748/* CONN_SETUP Conditions */
749#define CONN_SETUP_AUTO_OFF 0x01
750#define CONN_SETUP_AUTO_ON 0x02
751
752#define OCF_FLUSH 0x0008
753
754#define OCF_READ_PIN_TYPE 0x0009
755typedef struct {
756 uint8_t status;
757 uint8_t pin_type;
758} __attribute__ ((packed)) read_pin_type_rp;
759#define READ_PIN_TYPE_RP_SIZE 2
760
761#define OCF_WRITE_PIN_TYPE 0x000A
762typedef struct {
763 uint8_t pin_type;
764} __attribute__ ((packed)) write_pin_type_cp;
765#define WRITE_PIN_TYPE_CP_SIZE 1
766
767#define OCF_CREATE_NEW_UNIT_KEY 0x000B
768
769#define OCF_READ_STORED_LINK_KEY 0x000D
770typedef struct {
771 bdaddr_t bdaddr;
772 uint8_t read_all;
773} __attribute__ ((packed)) read_stored_link_key_cp;
774#define READ_STORED_LINK_KEY_CP_SIZE 7
775typedef struct {
776 uint8_t status;
777 uint16_t max_keys;
778 uint16_t num_keys;
779} __attribute__ ((packed)) read_stored_link_key_rp;
780#define READ_STORED_LINK_KEY_RP_SIZE 5
781
782#define OCF_WRITE_STORED_LINK_KEY 0x0011
783typedef struct {
784 uint8_t num_keys;
785 /* variable length part */
786} __attribute__ ((packed)) write_stored_link_key_cp;
787#define WRITE_STORED_LINK_KEY_CP_SIZE 1
788typedef struct {
789 uint8_t status;
790 uint8_t num_keys;
791} __attribute__ ((packed)) write_stored_link_key_rp;
792#define READ_WRITE_LINK_KEY_RP_SIZE 2
793
794#define OCF_DELETE_STORED_LINK_KEY 0x0012
795typedef struct {
796 bdaddr_t bdaddr;
797 uint8_t delete_all;
798} __attribute__ ((packed)) delete_stored_link_key_cp;
799#define DELETE_STORED_LINK_KEY_CP_SIZE 7
800typedef struct {
801 uint8_t status;
802 uint16_t num_keys;
803} __attribute__ ((packed)) delete_stored_link_key_rp;
804#define DELETE_STORED_LINK_KEY_RP_SIZE 3
805
806#define HCI_MAX_NAME_LENGTH 248
807
808#define OCF_CHANGE_LOCAL_NAME 0x0013
809typedef struct {
810 uint8_t name[HCI_MAX_NAME_LENGTH];
811} __attribute__ ((packed)) change_local_name_cp;
812#define CHANGE_LOCAL_NAME_CP_SIZE 248
813
814#define OCF_READ_LOCAL_NAME 0x0014
815typedef struct {
816 uint8_t status;
817 uint8_t name[HCI_MAX_NAME_LENGTH];
818} __attribute__ ((packed)) read_local_name_rp;
819#define READ_LOCAL_NAME_RP_SIZE 249
820
821#define OCF_READ_CONN_ACCEPT_TIMEOUT 0x0015
822typedef struct {
823 uint8_t status;
824 uint16_t timeout;
825} __attribute__ ((packed)) read_conn_accept_timeout_rp;
826#define READ_CONN_ACCEPT_TIMEOUT_RP_SIZE 3
827
828#define OCF_WRITE_CONN_ACCEPT_TIMEOUT 0x0016
829typedef struct {
830 uint16_t timeout;
831} __attribute__ ((packed)) write_conn_accept_timeout_cp;
832#define WRITE_CONN_ACCEPT_TIMEOUT_CP_SIZE 2
833
834#define OCF_READ_PAGE_TIMEOUT 0x0017
835typedef struct {
836 uint8_t status;
837 uint16_t timeout;
838} __attribute__ ((packed)) read_page_timeout_rp;
839#define READ_PAGE_TIMEOUT_RP_SIZE 3
840
841#define OCF_WRITE_PAGE_TIMEOUT 0x0018
842typedef struct {
843 uint16_t timeout;
844} __attribute__ ((packed)) write_page_timeout_cp;
845#define WRITE_PAGE_TIMEOUT_CP_SIZE 2
846
847#define OCF_READ_SCAN_ENABLE 0x0019
848typedef struct {
849 uint8_t status;
850 uint8_t enable;
851} __attribute__ ((packed)) read_scan_enable_rp;
852#define READ_SCAN_ENABLE_RP_SIZE 2
853
854#define OCF_WRITE_SCAN_ENABLE 0x001A
855 #define SCAN_DISABLED 0x00
856 #define SCAN_INQUIRY 0x01
857 #define SCAN_PAGE 0x02
858
859#define OCF_READ_PAGE_ACTIVITY 0x001B
860typedef struct {
861 uint8_t status;
862 uint16_t interval;
863 uint16_t window;
864} __attribute__ ((packed)) read_page_activity_rp;
865#define READ_PAGE_ACTIVITY_RP_SIZE 5
866
867#define OCF_WRITE_PAGE_ACTIVITY 0x001C
868typedef struct {
869 uint16_t interval;
870 uint16_t window;
871} __attribute__ ((packed)) write_page_activity_cp;
872#define WRITE_PAGE_ACTIVITY_CP_SIZE 4
873
874#define OCF_READ_INQ_ACTIVITY 0x001D
875typedef struct {
876 uint8_t status;
877 uint16_t interval;
878 uint16_t window;
879} __attribute__ ((packed)) read_inq_activity_rp;
880#define READ_INQ_ACTIVITY_RP_SIZE 5
881
882#define OCF_WRITE_INQ_ACTIVITY 0x001E
883typedef struct {
884 uint16_t interval;
885 uint16_t window;
886} __attribute__ ((packed)) write_inq_activity_cp;
887#define WRITE_INQ_ACTIVITY_CP_SIZE 4
888
889#define OCF_READ_AUTH_ENABLE 0x001F
890
891#define OCF_WRITE_AUTH_ENABLE 0x0020
892 #define AUTH_DISABLED 0x00
893 #define AUTH_ENABLED 0x01
894
895#define OCF_READ_ENCRYPT_MODE 0x0021
896
897#define OCF_WRITE_ENCRYPT_MODE 0x0022
898 #define ENCRYPT_DISABLED 0x00
899 #define ENCRYPT_P2P 0x01
900 #define ENCRYPT_BOTH 0x02
901
902#define OCF_READ_CLASS_OF_DEV 0x0023
903typedef struct {
904 uint8_t status;
905 uint8_t dev_class[3];
906} __attribute__ ((packed)) read_class_of_dev_rp;
907#define READ_CLASS_OF_DEV_RP_SIZE 4
908
909#define OCF_WRITE_CLASS_OF_DEV 0x0024
910typedef struct {
911 uint8_t dev_class[3];
912} __attribute__ ((packed)) write_class_of_dev_cp;
913#define WRITE_CLASS_OF_DEV_CP_SIZE 3
914
915#define OCF_READ_VOICE_SETTING 0x0025
916typedef struct {
917 uint8_t status;
918 uint16_t voice_setting;
919} __attribute__ ((packed)) read_voice_setting_rp;
920#define READ_VOICE_SETTING_RP_SIZE 3
921
922#define OCF_WRITE_VOICE_SETTING 0x0026
923typedef struct {
924 uint16_t voice_setting;
925} __attribute__ ((packed)) write_voice_setting_cp;
926#define WRITE_VOICE_SETTING_CP_SIZE 2
927
928#define OCF_READ_AUTOMATIC_FLUSH_TIMEOUT 0x0027
929
930#define OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT 0x0028
931
932#define OCF_READ_NUM_BROADCAST_RETRANS 0x0029
933
934#define OCF_WRITE_NUM_BROADCAST_RETRANS 0x002A
935
936#define OCF_READ_HOLD_MODE_ACTIVITY 0x002B
937
938#define OCF_WRITE_HOLD_MODE_ACTIVITY 0x002C
939
940#define OCF_READ_TRANSMIT_POWER_LEVEL 0x002D
941typedef struct {
942 uint16_t handle;
943 uint8_t type;
944} __attribute__ ((packed)) read_transmit_power_level_cp;
945#define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3
946typedef struct {
947 uint8_t status;
948 uint16_t handle;
949 int8_t level;
950} __attribute__ ((packed)) read_transmit_power_level_rp;
951#define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4
952
953#define OCF_READ_SYNC_FLOW_ENABLE 0x002E
954
955#define OCF_WRITE_SYNC_FLOW_ENABLE 0x002F
956
957#define OCF_SET_CONTROLLER_TO_HOST_FC 0x0031
958
959#define OCF_HOST_BUFFER_SIZE 0x0033
960typedef struct {
961 uint16_t acl_mtu;
962 uint8_t sco_mtu;
963 uint16_t acl_max_pkt;
964 uint16_t sco_max_pkt;
965} __attribute__ ((packed)) host_buffer_size_cp;
966#define HOST_BUFFER_SIZE_CP_SIZE 7
967
968#define OCF_HOST_NUM_COMP_PKTS 0x0035
969typedef struct {
970 uint8_t num_hndl;
971 /* variable length part */
972} __attribute__ ((packed)) host_num_comp_pkts_cp;
973#define HOST_NUM_COMP_PKTS_CP_SIZE 1
974
975#define OCF_READ_LINK_SUPERVISION_TIMEOUT 0x0036
976typedef struct {
977 uint8_t status;
978 uint16_t handle;
979 uint16_t timeout;
980} __attribute__ ((packed)) read_link_supervision_timeout_rp;
981#define READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE 5
982
983#define OCF_WRITE_LINK_SUPERVISION_TIMEOUT 0x0037
984typedef struct {
985 uint16_t handle;
986 uint16_t timeout;
987} __attribute__ ((packed)) write_link_supervision_timeout_cp;
988#define WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE 4
989typedef struct {
990 uint8_t status;
991 uint16_t handle;
992} __attribute__ ((packed)) write_link_supervision_timeout_rp;
993#define WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE 3
994
995#define OCF_READ_NUM_SUPPORTED_IAC 0x0038
996
997#define MAX_IAC_LAP 0x40
998#define OCF_READ_CURRENT_IAC_LAP 0x0039
999typedef struct {
1000 uint8_t status;
1001 uint8_t num_current_iac;
1002 uint8_t lap[MAX_IAC_LAP][3];
1003} __attribute__ ((packed)) read_current_iac_lap_rp;
1004#define READ_CURRENT_IAC_LAP_RP_SIZE 2+3*MAX_IAC_LAP
1005
1006#define OCF_WRITE_CURRENT_IAC_LAP 0x003A
1007typedef struct {
1008 uint8_t num_current_iac;
1009 uint8_t lap[MAX_IAC_LAP][3];
1010} __attribute__ ((packed)) write_current_iac_lap_cp;
1011#define WRITE_CURRENT_IAC_LAP_CP_SIZE 1+3*MAX_IAC_LAP
1012
1013#define OCF_READ_PAGE_SCAN_PERIOD_MODE 0x003B
1014
1015#define OCF_WRITE_PAGE_SCAN_PERIOD_MODE 0x003C
1016
1017#define OCF_READ_PAGE_SCAN_MODE 0x003D
1018
1019#define OCF_WRITE_PAGE_SCAN_MODE 0x003E
1020
1021#define OCF_SET_AFH_CLASSIFICATION 0x003F
1022typedef struct {
1023 uint8_t map[10];
1024} __attribute__ ((packed)) set_afh_classification_cp;
1025#define SET_AFH_CLASSIFICATION_CP_SIZE 10
1026typedef struct {
1027 uint8_t status;
1028} __attribute__ ((packed)) set_afh_classification_rp;
1029#define SET_AFH_CLASSIFICATION_RP_SIZE 1
1030
1031#define OCF_READ_INQUIRY_SCAN_TYPE 0x0042
1032typedef struct {
1033 uint8_t status;
1034 uint8_t type;
1035} __attribute__ ((packed)) read_inquiry_scan_type_rp;
1036#define READ_INQUIRY_SCAN_TYPE_RP_SIZE 2
1037
1038#define OCF_WRITE_INQUIRY_SCAN_TYPE 0x0043
1039typedef struct {
1040 uint8_t type;
1041} __attribute__ ((packed)) write_inquiry_scan_type_cp;
1042#define WRITE_INQUIRY_SCAN_TYPE_CP_SIZE 1
1043typedef struct {
1044 uint8_t status;
1045} __attribute__ ((packed)) write_inquiry_scan_type_rp;
1046#define WRITE_INQUIRY_SCAN_TYPE_RP_SIZE 1
1047
1048#define OCF_READ_INQUIRY_MODE 0x0044
1049typedef struct {
1050 uint8_t status;
1051 uint8_t mode;
1052} __attribute__ ((packed)) read_inquiry_mode_rp;
1053#define READ_INQUIRY_MODE_RP_SIZE 2
1054
1055#define OCF_WRITE_INQUIRY_MODE 0x0045
1056typedef struct {
1057 uint8_t mode;
1058} __attribute__ ((packed)) write_inquiry_mode_cp;
1059#define WRITE_INQUIRY_MODE_CP_SIZE 1
1060typedef struct {
1061 uint8_t status;
1062} __attribute__ ((packed)) write_inquiry_mode_rp;
1063#define WRITE_INQUIRY_MODE_RP_SIZE 1
1064
1065#define OCF_READ_PAGE_SCAN_TYPE 0x0046
1066
1067#define OCF_WRITE_PAGE_SCAN_TYPE 0x0047
1068 #define PAGE_SCAN_TYPE_STANDARD 0x00
1069 #define PAGE_SCAN_TYPE_INTERLACED 0x01
1070
1071#define OCF_READ_AFH_MODE 0x0048
1072typedef struct {
1073 uint8_t status;
1074 uint8_t mode;
1075} __attribute__ ((packed)) read_afh_mode_rp;
1076#define READ_AFH_MODE_RP_SIZE 2
1077
1078#define OCF_WRITE_AFH_MODE 0x0049
1079typedef struct {
1080 uint8_t mode;
1081} __attribute__ ((packed)) write_afh_mode_cp;
1082#define WRITE_AFH_MODE_CP_SIZE 1
1083typedef struct {
1084 uint8_t status;
1085} __attribute__ ((packed)) write_afh_mode_rp;
1086#define WRITE_AFH_MODE_RP_SIZE 1
1087
1088#define HCI_MAX_EIR_LENGTH 240
1089
1090#define OCF_READ_EXT_INQUIRY_RESPONSE 0x0051
1091typedef struct {
1092 uint8_t status;
1093 uint8_t fec;
1094 uint8_t data[HCI_MAX_EIR_LENGTH];
1095} __attribute__ ((packed)) read_ext_inquiry_response_rp;
1096#define READ_EXT_INQUIRY_RESPONSE_RP_SIZE 242
1097
1098#define OCF_WRITE_EXT_INQUIRY_RESPONSE 0x0052
1099typedef struct {
1100 uint8_t fec;
1101 uint8_t data[HCI_MAX_EIR_LENGTH];
1102} __attribute__ ((packed)) write_ext_inquiry_response_cp;
1103#define WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE 241
1104typedef struct {
1105 uint8_t status;
1106} __attribute__ ((packed)) write_ext_inquiry_response_rp;
1107#define WRITE_EXT_INQUIRY_RESPONSE_RP_SIZE 1
1108
1109#define OCF_REFRESH_ENCRYPTION_KEY 0x0053
1110typedef struct {
1111 uint16_t handle;
1112} __attribute__ ((packed)) refresh_encryption_key_cp;
1113#define REFRESH_ENCRYPTION_KEY_CP_SIZE 2
1114typedef struct {
1115 uint8_t status;
1116} __attribute__ ((packed)) refresh_encryption_key_rp;
1117#define REFRESH_ENCRYPTION_KEY_RP_SIZE 1
1118
1119#define OCF_READ_SIMPLE_PAIRING_MODE 0x0055
1120typedef struct {
1121 uint8_t status;
1122 uint8_t mode;
1123} __attribute__ ((packed)) read_simple_pairing_mode_rp;
1124#define READ_SIMPLE_PAIRING_MODE_RP_SIZE 2
1125
1126#define OCF_WRITE_SIMPLE_PAIRING_MODE 0x0056
1127typedef struct {
1128 uint8_t mode;
1129} __attribute__ ((packed)) write_simple_pairing_mode_cp;
1130#define WRITE_SIMPLE_PAIRING_MODE_CP_SIZE 1
1131typedef struct {
1132 uint8_t status;
1133} __attribute__ ((packed)) write_simple_pairing_mode_rp;
1134#define WRITE_SIMPLE_PAIRING_MODE_RP_SIZE 1
1135
1136#define OCF_READ_LOCAL_OOB_DATA 0x0057
1137typedef struct {
1138 uint8_t status;
1139 uint8_t hash[16];
1140 uint8_t randomizer[16];
1141} __attribute__ ((packed)) read_local_oob_data_rp;
1142#define READ_LOCAL_OOB_DATA_RP_SIZE 33
1143
1144#define OCF_READ_INQ_RESPONSE_TX_POWER_LEVEL 0x0058
1145typedef struct {
1146 uint8_t status;
1147 int8_t level;
1148} __attribute__ ((packed)) read_inq_response_tx_power_level_rp;
1149#define READ_INQ_RESPONSE_TX_POWER_LEVEL_RP_SIZE 2
1150
1151#define OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL 0x0058
1152typedef struct {
1153 uint8_t status;
1154 int8_t level;
1155} __attribute__ ((packed)) read_inquiry_transmit_power_level_rp;
1156#define READ_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE 2
1157
1158#define OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL 0x0059
1159typedef struct {
1160 int8_t level;
1161} __attribute__ ((packed)) write_inquiry_transmit_power_level_cp;
1162#define WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_CP_SIZE 1
1163typedef struct {
1164 uint8_t status;
1165} __attribute__ ((packed)) write_inquiry_transmit_power_level_rp;
1166#define WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE 1
1167
1168#define OCF_READ_DEFAULT_ERROR_DATA_REPORTING 0x005A
1169typedef struct {
1170 uint8_t status;
1171 uint8_t reporting;
1172} __attribute__ ((packed)) read_default_error_data_reporting_rp;
1173#define READ_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE 2
1174
1175#define OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING 0x005B
1176typedef struct {
1177 uint8_t reporting;
1178} __attribute__ ((packed)) write_default_error_data_reporting_cp;
1179#define WRITE_DEFAULT_ERROR_DATA_REPORTING_CP_SIZE 1
1180typedef struct {
1181 uint8_t status;
1182} __attribute__ ((packed)) write_default_error_data_reporting_rp;
1183#define WRITE_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE 1
1184
1185#define OCF_ENHANCED_FLUSH 0x005F
1186typedef struct {
1187 uint16_t handle;
1188 uint8_t type;
1189} __attribute__ ((packed)) enhanced_flush_cp;
1190#define ENHANCED_FLUSH_CP_SIZE 3
1191
1192#define OCF_SEND_KEYPRESS_NOTIFY 0x0060
1193typedef struct {
1194 bdaddr_t bdaddr;
1195 uint8_t type;
1196} __attribute__ ((packed)) send_keypress_notify_cp;
1197#define SEND_KEYPRESS_NOTIFY_CP_SIZE 7
1198typedef struct {
1199 uint8_t status;
1200} __attribute__ ((packed)) send_keypress_notify_rp;
1201#define SEND_KEYPRESS_NOTIFY_RP_SIZE 1
1202
1203#define OCF_READ_LOGICAL_LINK_ACCEPT_TIMEOUT 0x0061
1204typedef struct {
1205 uint8_t status;
1206 uint16_t timeout;
1207} __attribute__ ((packed)) read_log_link_accept_timeout_rp;
1208#define READ_LOGICAL_LINK_ACCEPT_TIMEOUT_RP_SIZE 3
1209
1210#define OCF_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT 0x0062
1211typedef struct {
1212 uint16_t timeout;
1213} __attribute__ ((packed)) write_log_link_accept_timeout_cp;
1214#define WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT_CP_SIZE 2
1215
1216#define OCF_SET_EVENT_MASK_PAGE_2 0x0063
1217
1218#define OCF_READ_LOCATION_DATA 0x0064
1219
1220#define OCF_WRITE_LOCATION_DATA 0x0065
1221
1222#define OCF_READ_FLOW_CONTROL_MODE 0x0066
1223
1224#define OCF_WRITE_FLOW_CONTROL_MODE 0x0067
1225
1226#define OCF_READ_ENHANCED_TRANSMIT_POWER_LEVEL 0x0068
1227typedef struct {
1228 uint8_t status;
1229 uint16_t handle;
1230 int8_t level_gfsk;
1231 int8_t level_dqpsk;
1232 int8_t level_8dpsk;
1233} __attribute__ ((packed)) read_enhanced_transmit_power_level_rp;
1234#define READ_ENHANCED_TRANSMIT_POWER_LEVEL_RP_SIZE 6
1235
1236#define OCF_READ_BEST_EFFORT_FLUSH_TIMEOUT 0x0069
1237typedef struct {
1238 uint8_t status;
1239 uint32_t timeout;
1240} __attribute__ ((packed)) read_best_effort_flush_timeout_rp;
1241#define READ_BEST_EFFORT_FLUSH_TIMEOUT_RP_SIZE 5
1242
1243#define OCF_WRITE_BEST_EFFORT_FLUSH_TIMEOUT 0x006A
1244typedef struct {
1245 uint16_t handle;
1246 uint32_t timeout;
1247} __attribute__ ((packed)) write_best_effort_flush_timeout_cp;
1248#define WRITE_BEST_EFFORT_FLUSH_TIMEOUT_CP_SIZE 6
1249typedef struct {
1250 uint8_t status;
1251} __attribute__ ((packed)) write_best_effort_flush_timeout_rp;
1252#define WRITE_BEST_EFFORT_FLUSH_TIMEOUT_RP_SIZE 1
1253
1254#define OCF_READ_LE_HOST_SUPPORTED 0x006C
1255typedef struct {
1256 uint8_t status;
1257 uint8_t le;
1258 uint8_t simul;
1259} __attribute__ ((packed)) read_le_host_supported_rp;
1260#define READ_LE_HOST_SUPPORTED_RP_SIZE 3
1261
1262#define OCF_WRITE_LE_HOST_SUPPORTED 0x006D
1263typedef struct {
1264 uint8_t le;
1265 uint8_t simul;
1266} __attribute__ ((packed)) write_le_host_supported_cp;
1267#define WRITE_LE_HOST_SUPPORTED_CP_SIZE 2
1268
1269/* Informational Parameters */
1270#define OGF_INFO_PARAM 0x04
1271
1272#define OCF_READ_LOCAL_VERSION 0x0001
1273typedef struct {
1274 uint8_t status;
1275 uint8_t hci_ver;
1276 uint16_t hci_rev;
1277 uint8_t lmp_ver;
1278 uint16_t manufacturer;
1279 uint16_t lmp_subver;
1280} __attribute__ ((packed)) read_local_version_rp;
1281#define READ_LOCAL_VERSION_RP_SIZE 9
1282
1283#define OCF_READ_LOCAL_COMMANDS 0x0002
1284typedef struct {
1285 uint8_t status;
1286 uint8_t commands[64];
1287} __attribute__ ((packed)) read_local_commands_rp;
1288#define READ_LOCAL_COMMANDS_RP_SIZE 65
1289
1290#define OCF_READ_LOCAL_FEATURES 0x0003
1291typedef struct {
1292 uint8_t status;
1293 uint8_t features[8];
1294} __attribute__ ((packed)) read_local_features_rp;
1295#define READ_LOCAL_FEATURES_RP_SIZE 9
1296
1297#define OCF_READ_LOCAL_EXT_FEATURES 0x0004
1298typedef struct {
1299 uint8_t page_num;
1300} __attribute__ ((packed)) read_local_ext_features_cp;
1301#define READ_LOCAL_EXT_FEATURES_CP_SIZE 1
1302typedef struct {
1303 uint8_t status;
1304 uint8_t page_num;
1305 uint8_t max_page_num;
1306 uint8_t features[8];
1307} __attribute__ ((packed)) read_local_ext_features_rp;
1308#define READ_LOCAL_EXT_FEATURES_RP_SIZE 11
1309
1310#define OCF_READ_BUFFER_SIZE 0x0005
1311typedef struct {
1312 uint8_t status;
1313 uint16_t acl_mtu;
1314 uint8_t sco_mtu;
1315 uint16_t acl_max_pkt;
1316 uint16_t sco_max_pkt;
1317} __attribute__ ((packed)) read_buffer_size_rp;
1318#define READ_BUFFER_SIZE_RP_SIZE 8
1319
1320#define OCF_READ_COUNTRY_CODE 0x0007
1321
1322#define OCF_READ_BD_ADDR 0x0009
1323typedef struct {
1324 uint8_t status;
1325 bdaddr_t bdaddr;
1326} __attribute__ ((packed)) read_bd_addr_rp;
1327#define READ_BD_ADDR_RP_SIZE 7
1328
1329/* Status params */
1330#define OGF_STATUS_PARAM 0x05
1331
1332#define OCF_READ_FAILED_CONTACT_COUNTER 0x0001
1333typedef struct {
1334 uint8_t status;
1335 uint16_t handle;
1336 uint8_t counter;
1337} __attribute__ ((packed)) read_failed_contact_counter_rp;
1338#define READ_FAILED_CONTACT_COUNTER_RP_SIZE 4
1339
1340#define OCF_RESET_FAILED_CONTACT_COUNTER 0x0002
1341typedef struct {
1342 uint8_t status;
1343 uint16_t handle;
1344} __attribute__ ((packed)) reset_failed_contact_counter_rp;
1345#define RESET_FAILED_CONTACT_COUNTER_RP_SIZE 4
1346
1347#define OCF_READ_LINK_QUALITY 0x0003
1348typedef struct {
1349 uint8_t status;
1350 uint16_t handle;
1351 uint8_t link_quality;
1352} __attribute__ ((packed)) read_link_quality_rp;
1353#define READ_LINK_QUALITY_RP_SIZE 4
1354
1355#define OCF_READ_RSSI 0x0005
1356typedef struct {
1357 uint8_t status;
1358 uint16_t handle;
1359 int8_t rssi;
1360} __attribute__ ((packed)) read_rssi_rp;
1361#define READ_RSSI_RP_SIZE 4
1362
1363#define OCF_READ_AFH_MAP 0x0006
1364typedef struct {
1365 uint8_t status;
1366 uint16_t handle;
1367 uint8_t mode;
1368 uint8_t map[10];
1369} __attribute__ ((packed)) read_afh_map_rp;
1370#define READ_AFH_MAP_RP_SIZE 14
1371
1372#define OCF_READ_CLOCK 0x0007
1373typedef struct {
1374 uint16_t handle;
1375 uint8_t which_clock;
1376} __attribute__ ((packed)) read_clock_cp;
1377#define READ_CLOCK_CP_SIZE 3
1378typedef struct {
1379 uint8_t status;
1380 uint16_t handle;
1381 uint32_t clock;
1382 uint16_t accuracy;
1383} __attribute__ ((packed)) read_clock_rp;
1384#define READ_CLOCK_RP_SIZE 9
1385
1386#define OCF_READ_LOCAL_AMP_INFO 0x0009
1387typedef struct {
1388 uint8_t status;
1389 uint8_t amp_status;
1390 uint32_t total_bandwidth;
1391 uint32_t max_guaranteed_bandwidth;
1392 uint32_t min_latency;
1393 uint32_t max_pdu_size;
1394 uint8_t controller_type;
1395 uint16_t pal_caps;
1396 uint16_t max_amp_assoc_length;
1397 uint32_t max_flush_timeout;
1398 uint32_t best_effort_flush_timeout;
1399} __attribute__ ((packed)) read_local_amp_info_rp;
1400#define READ_LOCAL_AMP_INFO_RP_SIZE 31
1401
1402#define OCF_READ_LOCAL_AMP_ASSOC 0x000A
1403typedef struct {
1404 uint8_t handle;
1405 uint16_t len_so_far;
1406 uint16_t max_len;
1407} __attribute__ ((packed)) read_local_amp_assoc_cp;
1408
1409typedef struct {
1410 uint8_t status;
1411 uint8_t handle;
1412 uint16_t rem_len;
1413 uint8_t frag[0];
1414} __attribute__ ((packed)) read_local_amp_assoc_rp;
1415
1416#define OCF_WRITE_REMOTE_AMP_ASSOC 0x000B
1417typedef struct {
1418 uint8_t handle;
1419 uint16_t length_so_far;
1420 uint16_t assoc_length;
1421 uint8_t fragment[HCI_MAX_NAME_LENGTH];
1422} __attribute__ ((packed)) write_remote_amp_assoc_cp;
1423#define WRITE_REMOTE_AMP_ASSOC_CP_SIZE 253
1424typedef struct {
1425 uint8_t status;
1426 uint8_t handle;
1427} __attribute__ ((packed)) write_remote_amp_assoc_rp;
1428#define WRITE_REMOTE_AMP_ASSOC_RP_SIZE 2
1429
1430/* Testing commands */
1431#define OGF_TESTING_CMD 0x3e
1432
1433#define OCF_READ_LOOPBACK_MODE 0x0001
1434
1435#define OCF_WRITE_LOOPBACK_MODE 0x0002
1436
1437#define OCF_ENABLE_DEVICE_UNDER_TEST_MODE 0x0003
1438
1439#define OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE 0x0004
1440typedef struct {
1441 uint8_t mode;
1442} __attribute__ ((packed)) write_simple_pairing_debug_mode_cp;
1443#define WRITE_SIMPLE_PAIRING_DEBUG_MODE_CP_SIZE 1
1444typedef struct {
1445 uint8_t status;
1446} __attribute__ ((packed)) write_simple_pairing_debug_mode_rp;
1447#define WRITE_SIMPLE_PAIRING_DEBUG_MODE_RP_SIZE 1
1448
1449/* LE commands */
1450#define OGF_LE_CTL 0x08
1451
1452#define OCF_LE_SET_EVENT_MASK 0x0001
1453typedef struct {
1454 uint8_t mask[8];
1455} __attribute__ ((packed)) le_set_event_mask_cp;
1456#define LE_SET_EVENT_MASK_CP_SIZE 8
1457
1458#define OCF_LE_READ_BUFFER_SIZE 0x0002
1459typedef struct {
1460 uint8_t status;
1461 uint16_t pkt_len;
1462 uint8_t max_pkt;
1463} __attribute__ ((packed)) le_read_buffer_size_rp;
1464#define LE_READ_BUFFER_SIZE_RP_SIZE 4
1465
1466#define OCF_LE_READ_LOCAL_SUPPORTED_FEATURES 0x0003
1467typedef struct {
1468 uint8_t status;
1469 uint8_t features[8];
1470} __attribute__ ((packed)) le_read_local_supported_features_rp;
1471#define LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE 9
1472
1473#define OCF_LE_SET_RANDOM_ADDRESS 0x0005
1474typedef struct {
1475 bdaddr_t bdaddr;
1476} __attribute__ ((packed)) le_set_random_address_cp;
1477#define LE_SET_RANDOM_ADDRESS_CP_SIZE 6
1478
1479#define OCF_LE_SET_ADVERTISING_PARAMETERS 0x0006
1480typedef struct {
1481 uint16_t min_interval;
1482 uint16_t max_interval;
1483 uint8_t advtype;
1484 uint8_t own_bdaddr_type;
1485 uint8_t direct_bdaddr_type;
1486 bdaddr_t direct_bdaddr;
1487 uint8_t chan_map;
1488 uint8_t filter;
1489} __attribute__ ((packed)) le_set_advertising_parameters_cp;
1490#define LE_SET_ADVERTISING_PARAMETERS_CP_SIZE 15
1491
1492#define OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER 0x0007
1493typedef struct {
1494 uint8_t status;
1495 uint8_t level;
1496} __attribute__ ((packed)) le_read_advertising_channel_tx_power_rp;
1497#define LE_READ_ADVERTISING_CHANNEL_TX_POWER_RP_SIZE 2
1498
1499#define OCF_LE_SET_ADVERTISING_DATA 0x0008
1500typedef struct {
1501 uint8_t length;
1502 uint8_t data[31];
1503} __attribute__ ((packed)) le_set_advertising_data_cp;
1504#define LE_SET_ADVERTISING_DATA_CP_SIZE 32
1505
1506#define OCF_LE_SET_SCAN_RESPONSE_DATA 0x0009
1507typedef struct {
1508 uint8_t length;
1509 uint8_t data[31];
1510} __attribute__ ((packed)) le_set_scan_response_data_cp;
1511#define LE_SET_SCAN_RESPONSE_DATA_CP_SIZE 32
1512
1513#define OCF_LE_SET_ADVERTISE_ENABLE 0x000A
1514typedef struct {
1515 uint8_t enable;
1516} __attribute__ ((packed)) le_set_advertise_enable_cp;
1517#define LE_SET_ADVERTISE_ENABLE_CP_SIZE 1
1518
1519#define OCF_LE_SET_SCAN_PARAMETERS 0x000B
1520typedef struct {
1521 uint8_t type;
1522 uint16_t interval;
1523 uint16_t window;
1524 uint8_t own_bdaddr_type;
1525 uint8_t filter;
1526} __attribute__ ((packed)) le_set_scan_parameters_cp;
1527#define LE_SET_SCAN_PARAMETERS_CP_SIZE 7
1528
1529#define OCF_LE_SET_SCAN_ENABLE 0x000C
1530typedef struct {
1531 uint8_t enable;
1532 uint8_t filter_dup;
1533} __attribute__ ((packed)) le_set_scan_enable_cp;
1534#define LE_SET_SCAN_ENABLE_CP_SIZE 2
1535
1536#define OCF_LE_CREATE_CONN 0x000D
1537typedef struct {
1538 uint16_t interval;
1539 uint16_t window;
1540 uint8_t initiator_filter;
1541 uint8_t peer_bdaddr_type;
1542 bdaddr_t peer_bdaddr;
1543 uint8_t own_bdaddr_type;
1544 uint16_t min_interval;
1545 uint16_t max_interval;
1546 uint16_t latency;
1547 uint16_t supervision_timeout;
1548 uint16_t min_ce_length;
1549 uint16_t max_ce_length;
1550} __attribute__ ((packed)) le_create_connection_cp;
1551#define LE_CREATE_CONN_CP_SIZE 25
1552
1553#define OCF_LE_CREATE_CONN_CANCEL 0x000E
1554
1555#define OCF_LE_READ_WHITE_LIST_SIZE 0x000F
1556typedef struct {
1557 uint8_t status;
1558 uint8_t size;
1559} __attribute__ ((packed)) le_read_white_list_size_rp;
1560#define LE_READ_WHITE_LIST_SIZE_RP_SIZE 2
1561
1562#define OCF_LE_CLEAR_WHITE_LIST 0x0010
1563
1564#define OCF_LE_ADD_DEVICE_TO_WHITE_LIST 0x0011
1565typedef struct {
1566 uint8_t bdaddr_type;
1567 bdaddr_t bdaddr;
1568} __attribute__ ((packed)) le_add_device_to_white_list_cp;
1569#define LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE 7
1570
1571#define OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST 0x0012
1572typedef struct {
1573 uint8_t bdaddr_type;
1574 bdaddr_t bdaddr;
1575} __attribute__ ((packed)) le_remove_device_from_white_list_cp;
1576#define LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE 7
1577
1578#define OCF_LE_CONN_UPDATE 0x0013
1579typedef struct {
1580 uint16_t handle;
1581 uint16_t min_interval;
1582 uint16_t max_interval;
1583 uint16_t latency;
1584 uint16_t supervision_timeout;
1585 uint16_t min_ce_length;
1586 uint16_t max_ce_length;
1587} __attribute__ ((packed)) le_connection_update_cp;
1588#define LE_CONN_UPDATE_CP_SIZE 14
1589
1590#define OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x0014
1591typedef struct {
1592 uint8_t map[5];
1593} __attribute__ ((packed)) le_set_host_channel_classification_cp;
1594#define LE_SET_HOST_CHANNEL_CLASSIFICATION_CP_SIZE 5
1595
1596#define OCF_LE_READ_CHANNEL_MAP 0x0015
1597typedef struct {
1598 uint16_t handle;
1599} __attribute__ ((packed)) le_read_channel_map_cp;
1600#define LE_READ_CHANNEL_MAP_CP_SIZE 2
1601typedef struct {
1602 uint8_t status;
1603 uint16_t handle;
1604 uint8_t map[5];
1605} __attribute__ ((packed)) le_read_channel_map_rp;
1606#define LE_READ_CHANNEL_MAP_RP_SIZE 8
1607
1608#define OCF_LE_READ_REMOTE_USED_FEATURES 0x0016
1609typedef struct {
1610 uint16_t handle;
1611} __attribute__ ((packed)) le_read_remote_used_features_cp;
1612#define LE_READ_REMOTE_USED_FEATURES_CP_SIZE 2
1613
1614#define OCF_LE_ENCRYPT 0x0017
1615typedef struct {
1616 uint8_t key[16];
1617 uint8_t plaintext[16];
1618} __attribute__ ((packed)) le_encrypt_cp;
1619#define LE_ENCRYPT_CP_SIZE 32
1620typedef struct {
1621 uint8_t status;
1622 uint8_t data[16];
1623} __attribute__ ((packed)) le_encrypt_rp;
1624#define LE_ENCRYPT_RP_SIZE 17
1625
1626#define OCF_LE_RAND 0x0018
1627typedef struct {
1628 uint8_t status;
1629 uint64_t random;
1630} __attribute__ ((packed)) le_rand_rp;
1631#define LE_RAND_RP_SIZE 9
1632
1633#define OCF_LE_START_ENCRYPTION 0x0019
1634typedef struct {
1635 uint16_t handle;
1636 uint64_t random;
1637 uint16_t diversifier;
1638 uint8_t key[16];
1639} __attribute__ ((packed)) le_start_encryption_cp;
1640#define LE_START_ENCRYPTION_CP_SIZE 28
1641
1642#define OCF_LE_LTK_REPLY 0x001A
1643typedef struct {
1644 uint16_t handle;
1645 uint8_t key[16];
1646} __attribute__ ((packed)) le_ltk_reply_cp;
1647#define LE_LTK_REPLY_CP_SIZE 18
1648typedef struct {
1649 uint8_t status;
1650 uint16_t handle;
1651} __attribute__ ((packed)) le_ltk_reply_rp;
1652#define LE_LTK_REPLY_RP_SIZE 3
1653
1654#define OCF_LE_LTK_NEG_REPLY 0x001B
1655typedef struct {
1656 uint16_t handle;
1657} __attribute__ ((packed)) le_ltk_neg_reply_cp;
1658#define LE_LTK_NEG_REPLY_CP_SIZE 2
1659typedef struct {
1660 uint8_t status;
1661 uint16_t handle;
1662} __attribute__ ((packed)) le_ltk_neg_reply_rp;
1663#define LE_LTK_NEG_REPLY_RP_SIZE 3
1664
1665#define OCF_LE_READ_SUPPORTED_STATES 0x001C
1666typedef struct {
1667 uint8_t status;
1668 uint64_t states;
1669} __attribute__ ((packed)) le_read_supported_states_rp;
1670#define LE_READ_SUPPORTED_STATES_RP_SIZE 9
1671
1672#define OCF_LE_RECEIVER_TEST 0x001D
1673typedef struct {
1674 uint8_t frequency;
1675} __attribute__ ((packed)) le_receiver_test_cp;
1676#define LE_RECEIVER_TEST_CP_SIZE 1
1677
1678#define OCF_LE_TRANSMITTER_TEST 0x001E
1679typedef struct {
1680 uint8_t frequency;
1681 uint8_t length;
1682 uint8_t payload;
1683} __attribute__ ((packed)) le_transmitter_test_cp;
1684#define LE_TRANSMITTER_TEST_CP_SIZE 3
1685
1686#define OCF_LE_TEST_END 0x001F
1687typedef struct {
1688 uint8_t status;
1689 uint16_t num_pkts;
1690} __attribute__ ((packed)) le_test_end_rp;
1691#define LE_TEST_END_RP_SIZE 3
1692
1693/* Vendor specific commands */
1694#define OGF_VENDOR_CMD 0x3f
1695
1696/* ---- HCI Events ---- */
1697
1698#define EVT_INQUIRY_COMPLETE 0x01
1699
1700#define EVT_INQUIRY_RESULT 0x02
1701typedef struct {
1702 bdaddr_t bdaddr;
1703 uint8_t pscan_rep_mode;
1704 uint8_t pscan_period_mode;
1705 uint8_t pscan_mode;
1706 uint8_t dev_class[3];
1707 uint16_t clock_offset;
1708} __attribute__ ((packed)) inquiry_info;
1709#define INQUIRY_INFO_SIZE 14
1710
1711#define EVT_CONN_COMPLETE 0x03
1712typedef struct {
1713 uint8_t status;
1714 uint16_t handle;
1715 bdaddr_t bdaddr;
1716 uint8_t link_type;
1717 uint8_t encr_mode;
1718} __attribute__ ((packed)) evt_conn_complete;
1719#define EVT_CONN_COMPLETE_SIZE 13
1720
1721#define EVT_CONN_REQUEST 0x04
1722typedef struct {
1723 bdaddr_t bdaddr;
1724 uint8_t dev_class[3];
1725 uint8_t link_type;
1726} __attribute__ ((packed)) evt_conn_request;
1727#define EVT_CONN_REQUEST_SIZE 10
1728
1729#define EVT_DISCONN_COMPLETE 0x05
1730typedef struct {
1731 uint8_t status;
1732 uint16_t handle;
1733 uint8_t reason;
1734} __attribute__ ((packed)) evt_disconn_complete;
1735#define EVT_DISCONN_COMPLETE_SIZE 4
1736
1737#define EVT_AUTH_COMPLETE 0x06
1738typedef struct {
1739 uint8_t status;
1740 uint16_t handle;
1741} __attribute__ ((packed)) evt_auth_complete;
1742#define EVT_AUTH_COMPLETE_SIZE 3
1743
1744#define EVT_REMOTE_NAME_REQ_COMPLETE 0x07
1745typedef struct {
1746 uint8_t status;
1747 bdaddr_t bdaddr;
1748 uint8_t name[HCI_MAX_NAME_LENGTH];
1749} __attribute__ ((packed)) evt_remote_name_req_complete;
1750#define EVT_REMOTE_NAME_REQ_COMPLETE_SIZE 255
1751
1752#define EVT_ENCRYPT_CHANGE 0x08
1753typedef struct {
1754 uint8_t status;
1755 uint16_t handle;
1756 uint8_t encrypt;
1757} __attribute__ ((packed)) evt_encrypt_change;
1758#define EVT_ENCRYPT_CHANGE_SIZE 5
1759
1760#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE 0x09
1761typedef struct {
1762 uint8_t status;
1763 uint16_t handle;
1764} __attribute__ ((packed)) evt_change_conn_link_key_complete;
1765#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE 3
1766
1767#define EVT_MASTER_LINK_KEY_COMPLETE 0x0A
1768typedef struct {
1769 uint8_t status;
1770 uint16_t handle;
1771 uint8_t key_flag;
1772} __attribute__ ((packed)) evt_master_link_key_complete;
1773#define EVT_MASTER_LINK_KEY_COMPLETE_SIZE 4
1774
1775#define EVT_READ_REMOTE_FEATURES_COMPLETE 0x0B
1776typedef struct {
1777 uint8_t status;
1778 uint16_t handle;
1779 uint8_t features[8];
1780} __attribute__ ((packed)) evt_read_remote_features_complete;
1781#define EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE 11
1782
1783#define EVT_READ_REMOTE_VERSION_COMPLETE 0x0C
1784typedef struct {
1785 uint8_t status;
1786 uint16_t handle;
1787 uint8_t lmp_ver;
1788 uint16_t manufacturer;
1789 uint16_t lmp_subver;
1790} __attribute__ ((packed)) evt_read_remote_version_complete;
1791#define EVT_READ_REMOTE_VERSION_COMPLETE_SIZE 8
1792
1793#define EVT_QOS_SETUP_COMPLETE 0x0D
1794typedef struct {
1795 uint8_t status;
1796 uint16_t handle;
1797 uint8_t flags; /* Reserved */
1798 hci_qos qos;
1799} __attribute__ ((packed)) evt_qos_setup_complete;
1800#define EVT_QOS_SETUP_COMPLETE_SIZE (4 + HCI_QOS_CP_SIZE)
1801
1802#define EVT_CMD_COMPLETE 0x0E
1803typedef struct {
1804 uint8_t ncmd;
1805 uint16_t opcode;
1806} __attribute__ ((packed)) evt_cmd_complete;
1807#define EVT_CMD_COMPLETE_SIZE 3
1808
1809#define EVT_CMD_STATUS 0x0F
1810typedef struct {
1811 uint8_t status;
1812 uint8_t ncmd;
1813 uint16_t opcode;
1814} __attribute__ ((packed)) evt_cmd_status;
1815#define EVT_CMD_STATUS_SIZE 4
1816
1817#define EVT_HARDWARE_ERROR 0x10
1818typedef struct {
1819 uint8_t code;
1820} __attribute__ ((packed)) evt_hardware_error;
1821#define EVT_HARDWARE_ERROR_SIZE 1
1822
1823#define EVT_FLUSH_OCCURRED 0x11
1824typedef struct {
1825 uint16_t handle;
1826} __attribute__ ((packed)) evt_flush_occured;
1827#define EVT_FLUSH_OCCURRED_SIZE 2
1828
1829#define EVT_ROLE_CHANGE 0x12
1830typedef struct {
1831 uint8_t status;
1832 bdaddr_t bdaddr;
1833 uint8_t role;
1834} __attribute__ ((packed)) evt_role_change;
1835#define EVT_ROLE_CHANGE_SIZE 8
1836
1837#define EVT_NUM_COMP_PKTS 0x13
1838typedef struct {
1839 uint8_t num_hndl;
1840 /* variable length part */
1841} __attribute__ ((packed)) evt_num_comp_pkts;
1842#define EVT_NUM_COMP_PKTS_SIZE 1
1843
1844#define EVT_MODE_CHANGE 0x14
1845typedef struct {
1846 uint8_t status;
1847 uint16_t handle;
1848 uint8_t mode;
1849 uint16_t interval;
1850} __attribute__ ((packed)) evt_mode_change;
1851#define EVT_MODE_CHANGE_SIZE 6
1852
1853#define EVT_RETURN_LINK_KEYS 0x15
1854typedef struct {
1855 uint8_t num_keys;
1856 /* variable length part */
1857} __attribute__ ((packed)) evt_return_link_keys;
1858#define EVT_RETURN_LINK_KEYS_SIZE 1
1859
1860#define EVT_PIN_CODE_REQ 0x16
1861typedef struct {
1862 bdaddr_t bdaddr;
1863} __attribute__ ((packed)) evt_pin_code_req;
1864#define EVT_PIN_CODE_REQ_SIZE 6
1865
1866#define EVT_LINK_KEY_REQ 0x17
1867typedef struct {
1868 bdaddr_t bdaddr;
1869} __attribute__ ((packed)) evt_link_key_req;
1870#define EVT_LINK_KEY_REQ_SIZE 6
1871
1872#define EVT_LINK_KEY_NOTIFY 0x18
1873typedef struct {
1874 bdaddr_t bdaddr;
1875 uint8_t link_key[16];
1876 uint8_t key_type;
1877} __attribute__ ((packed)) evt_link_key_notify;
1878#define EVT_LINK_KEY_NOTIFY_SIZE 23
1879
1880#define EVT_LOOPBACK_COMMAND 0x19
1881
1882#define EVT_DATA_BUFFER_OVERFLOW 0x1A
1883typedef struct {
1884 uint8_t link_type;
1885} __attribute__ ((packed)) evt_data_buffer_overflow;
1886#define EVT_DATA_BUFFER_OVERFLOW_SIZE 1
1887
1888#define EVT_MAX_SLOTS_CHANGE 0x1B
1889typedef struct {
1890 uint16_t handle;
1891 uint8_t max_slots;
1892} __attribute__ ((packed)) evt_max_slots_change;
1893#define EVT_MAX_SLOTS_CHANGE_SIZE 3
1894
1895#define EVT_READ_CLOCK_OFFSET_COMPLETE 0x1C
1896typedef struct {
1897 uint8_t status;
1898 uint16_t handle;
1899 uint16_t clock_offset;
1900} __attribute__ ((packed)) evt_read_clock_offset_complete;
1901#define EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE 5
1902
1903#define EVT_CONN_PTYPE_CHANGED 0x1D
1904typedef struct {
1905 uint8_t status;
1906 uint16_t handle;
1907 uint16_t ptype;
1908} __attribute__ ((packed)) evt_conn_ptype_changed;
1909#define EVT_CONN_PTYPE_CHANGED_SIZE 5
1910
1911#define EVT_QOS_VIOLATION 0x1E
1912typedef struct {
1913 uint16_t handle;
1914} __attribute__ ((packed)) evt_qos_violation;
1915#define EVT_QOS_VIOLATION_SIZE 2
1916
1917#define EVT_PSCAN_REP_MODE_CHANGE 0x20
1918typedef struct {
1919 bdaddr_t bdaddr;
1920 uint8_t pscan_rep_mode;
1921} __attribute__ ((packed)) evt_pscan_rep_mode_change;
1922#define EVT_PSCAN_REP_MODE_CHANGE_SIZE 7
1923
1924#define EVT_FLOW_SPEC_COMPLETE 0x21
1925typedef struct {
1926 uint8_t status;
1927 uint16_t handle;
1928 uint8_t flags;
1929 uint8_t direction;
1930 hci_qos qos;
1931} __attribute__ ((packed)) evt_flow_spec_complete;
1932#define EVT_FLOW_SPEC_COMPLETE_SIZE (5 + HCI_QOS_CP_SIZE)
1933
1934#define EVT_INQUIRY_RESULT_WITH_RSSI 0x22
1935typedef struct {
1936 bdaddr_t bdaddr;
1937 uint8_t pscan_rep_mode;
1938 uint8_t pscan_period_mode;
1939 uint8_t dev_class[3];
1940 uint16_t clock_offset;
1941 int8_t rssi;
1942} __attribute__ ((packed)) inquiry_info_with_rssi;
1943#define INQUIRY_INFO_WITH_RSSI_SIZE 14
1944typedef struct {
1945 bdaddr_t bdaddr;
1946 uint8_t pscan_rep_mode;
1947 uint8_t pscan_period_mode;
1948 uint8_t pscan_mode;
1949 uint8_t dev_class[3];
1950 uint16_t clock_offset;
1951 int8_t rssi;
1952} __attribute__ ((packed)) inquiry_info_with_rssi_and_pscan_mode;
1953#define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE 15
1954
1955#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23
1956typedef struct {
1957 uint8_t status;
1958 uint16_t handle;
1959 uint8_t page_num;
1960 uint8_t max_page_num;
1961 uint8_t features[8];
1962} __attribute__ ((packed)) evt_read_remote_ext_features_complete;
1963#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE 13
1964
1965#define EVT_SYNC_CONN_COMPLETE 0x2C
1966typedef struct {
1967 uint8_t status;
1968 uint16_t handle;
1969 bdaddr_t bdaddr;
1970 uint8_t link_type;
1971 uint8_t trans_interval;
1972 uint8_t retrans_window;
1973 uint16_t rx_pkt_len;
1974 uint16_t tx_pkt_len;
1975 uint8_t air_mode;
1976} __attribute__ ((packed)) evt_sync_conn_complete;
1977#define EVT_SYNC_CONN_COMPLETE_SIZE 17
1978
1979#define EVT_SYNC_CONN_CHANGED 0x2D
1980typedef struct {
1981 uint8_t status;
1982 uint16_t handle;
1983 uint8_t trans_interval;
1984 uint8_t retrans_window;
1985 uint16_t rx_pkt_len;
1986 uint16_t tx_pkt_len;
1987} __attribute__ ((packed)) evt_sync_conn_changed;
1988#define EVT_SYNC_CONN_CHANGED_SIZE 9
1989
1990#define EVT_SNIFF_SUBRATING 0x2E
1991typedef struct {
1992 uint8_t status;
1993 uint16_t handle;
1994 uint16_t max_tx_latency;
1995 uint16_t max_rx_latency;
1996 uint16_t min_remote_timeout;
1997 uint16_t min_local_timeout;
1998} __attribute__ ((packed)) evt_sniff_subrating;
1999#define EVT_SNIFF_SUBRATING_SIZE 11
2000
2001#define EVT_EXTENDED_INQUIRY_RESULT 0x2F
2002typedef struct {
2003 bdaddr_t bdaddr;
2004 uint8_t pscan_rep_mode;
2005 uint8_t pscan_period_mode;
2006 uint8_t dev_class[3];
2007 uint16_t clock_offset;
2008 int8_t rssi;
2009 uint8_t data[HCI_MAX_EIR_LENGTH];
2010} __attribute__ ((packed)) extended_inquiry_info;
2011#define EXTENDED_INQUIRY_INFO_SIZE 254
2012
2013#define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30
2014typedef struct {
2015 uint8_t status;
2016 uint16_t handle;
2017} __attribute__ ((packed)) evt_encryption_key_refresh_complete;
2018#define EVT_ENCRYPTION_KEY_REFRESH_COMPLETE_SIZE 3
2019
2020#define EVT_IO_CAPABILITY_REQUEST 0x31
2021typedef struct {
2022 bdaddr_t bdaddr;
2023} __attribute__ ((packed)) evt_io_capability_request;
2024#define EVT_IO_CAPABILITY_REQUEST_SIZE 6
2025
2026#define EVT_IO_CAPABILITY_RESPONSE 0x32
2027typedef struct {
2028 bdaddr_t bdaddr;
2029 uint8_t capability;
2030 uint8_t oob_data;
2031 uint8_t authentication;
2032} __attribute__ ((packed)) evt_io_capability_response;
2033#define EVT_IO_CAPABILITY_RESPONSE_SIZE 9
2034
2035#define EVT_USER_CONFIRM_REQUEST 0x33
2036typedef struct {
2037 bdaddr_t bdaddr;
2038 uint32_t passkey;
2039} __attribute__ ((packed)) evt_user_confirm_request;
2040#define EVT_USER_CONFIRM_REQUEST_SIZE 10
2041
2042#define EVT_USER_PASSKEY_REQUEST 0x34
2043typedef struct {
2044 bdaddr_t bdaddr;
2045} __attribute__ ((packed)) evt_user_passkey_request;
2046#define EVT_USER_PASSKEY_REQUEST_SIZE 6
2047
2048#define EVT_REMOTE_OOB_DATA_REQUEST 0x35
2049typedef struct {
2050 bdaddr_t bdaddr;
2051} __attribute__ ((packed)) evt_remote_oob_data_request;
2052#define EVT_REMOTE_OOB_DATA_REQUEST_SIZE 6
2053
2054#define EVT_SIMPLE_PAIRING_COMPLETE 0x36
2055typedef struct {
2056 uint8_t status;
2057 bdaddr_t bdaddr;
2058} __attribute__ ((packed)) evt_simple_pairing_complete;
2059#define EVT_SIMPLE_PAIRING_COMPLETE_SIZE 7
2060
2061#define EVT_LINK_SUPERVISION_TIMEOUT_CHANGED 0x38
2062typedef struct {
2063 uint16_t handle;
2064 uint16_t timeout;
2065} __attribute__ ((packed)) evt_link_supervision_timeout_changed;
2066#define EVT_LINK_SUPERVISION_TIMEOUT_CHANGED_SIZE 4
2067
2068#define EVT_ENHANCED_FLUSH_COMPLETE 0x39
2069typedef struct {
2070 uint16_t handle;
2071} __attribute__ ((packed)) evt_enhanced_flush_complete;
2072#define EVT_ENHANCED_FLUSH_COMPLETE_SIZE 2
2073
2074#define EVT_USER_PASSKEY_NOTIFY 0x3B
2075typedef struct {
2076 bdaddr_t bdaddr;
2077 uint32_t passkey;
2078} __attribute__ ((packed)) evt_user_passkey_notify;
2079#define EVT_USER_PASSKEY_NOTIFY_SIZE 10
2080
2081#define EVT_KEYPRESS_NOTIFY 0x3C
2082typedef struct {
2083 bdaddr_t bdaddr;
2084 uint8_t type;
2085} __attribute__ ((packed)) evt_keypress_notify;
2086#define EVT_KEYPRESS_NOTIFY_SIZE 7
2087
2088#define EVT_REMOTE_HOST_FEATURES_NOTIFY 0x3D
2089typedef struct {
2090 bdaddr_t bdaddr;
2091 uint8_t features[8];
2092} __attribute__ ((packed)) evt_remote_host_features_notify;
2093#define EVT_REMOTE_HOST_FEATURES_NOTIFY_SIZE 14
2094
2095#define EVT_LE_META_EVENT 0x3E
2096typedef struct {
2097 uint8_t subevent;
2098 uint8_t data[0];
2099} __attribute__ ((packed)) evt_le_meta_event;
2100#define EVT_LE_META_EVENT_SIZE 1
2101
2102#define EVT_LE_CONN_COMPLETE 0x01
2103typedef struct {
2104 uint8_t status;
2105 uint16_t handle;
2106 uint8_t role;
2107 uint8_t peer_bdaddr_type;
2108 bdaddr_t peer_bdaddr;
2109 uint16_t interval;
2110 uint16_t latency;
2111 uint16_t supervision_timeout;
2112 uint8_t master_clock_accuracy;
2113} __attribute__ ((packed)) evt_le_connection_complete;
2114#define EVT_LE_CONN_COMPLETE_SIZE 18
2115
2116#define EVT_LE_ADVERTISING_REPORT 0x02
2117typedef struct {
2118 uint8_t evt_type;
2119 uint8_t bdaddr_type;
2120 bdaddr_t bdaddr;
2121 uint8_t length;
2122 uint8_t data[0];
2123} __attribute__ ((packed)) le_advertising_info;
2124#define LE_ADVERTISING_INFO_SIZE 9
2125
2126#define EVT_LE_CONN_UPDATE_COMPLETE 0x03
2127typedef struct {
2128 uint8_t status;
2129 uint16_t handle;
2130 uint16_t interval;
2131 uint16_t latency;
2132 uint16_t supervision_timeout;
2133} __attribute__ ((packed)) evt_le_connection_update_complete;
2134#define EVT_LE_CONN_UPDATE_COMPLETE_SIZE 9
2135
2136#define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04
2137typedef struct {
2138 uint8_t status;
2139 uint16_t handle;
2140 uint8_t features[8];
2141} __attribute__ ((packed)) evt_le_read_remote_used_features_complete;
2142#define EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE_SIZE 11
2143
2144#define EVT_LE_LTK_REQUEST 0x05
2145typedef struct {
2146 uint16_t handle;
2147 uint64_t random;
2148 uint16_t diversifier;
2149} __attribute__ ((packed)) evt_le_long_term_key_request;
2150#define EVT_LE_LTK_REQUEST_SIZE 12
2151
2152#define EVT_PHYSICAL_LINK_COMPLETE 0x40
2153typedef struct {
2154 uint8_t status;
2155 uint8_t handle;
2156} __attribute__ ((packed)) evt_physical_link_complete;
2157#define EVT_PHYSICAL_LINK_COMPLETE_SIZE 2
2158
2159#define EVT_CHANNEL_SELECTED 0x41
2160
2161#define EVT_DISCONNECT_PHYSICAL_LINK_COMPLETE 0x42
2162typedef struct {
2163 uint8_t status;
2164 uint8_t handle;
2165 uint8_t reason;
2166} __attribute__ ((packed)) evt_disconn_physical_link_complete;
2167#define EVT_DISCONNECT_PHYSICAL_LINK_COMPLETE_SIZE 3
2168
2169#define EVT_PHYSICAL_LINK_LOSS_EARLY_WARNING 0x43
2170typedef struct {
2171 uint8_t handle;
2172 uint8_t reason;
2173} __attribute__ ((packed)) evt_physical_link_loss_warning;
2174#define EVT_PHYSICAL_LINK_LOSS_WARNING_SIZE 2
2175
2176#define EVT_PHYSICAL_LINK_RECOVERY 0x44
2177typedef struct {
2178 uint8_t handle;
2179} __attribute__ ((packed)) evt_physical_link_recovery;
2180#define EVT_PHYSICAL_LINK_RECOVERY_SIZE 1
2181
2182#define EVT_LOGICAL_LINK_COMPLETE 0x45
2183typedef struct {
2184 uint8_t status;
2185 uint16_t log_handle;
2186 uint8_t handle;
2187 uint8_t tx_flow_id;
2188} __attribute__ ((packed)) evt_logical_link_complete;
2189#define EVT_LOGICAL_LINK_COMPLETE_SIZE 5
2190
2191#define EVT_DISCONNECT_LOGICAL_LINK_COMPLETE 0x46
2192
2193#define EVT_FLOW_SPEC_MODIFY_COMPLETE 0x47
2194typedef struct {
2195 uint8_t status;
2196 uint16_t handle;
2197} __attribute__ ((packed)) evt_flow_spec_modify_complete;
2198#define EVT_FLOW_SPEC_MODIFY_COMPLETE_SIZE 3
2199
2200#define EVT_NUMBER_COMPLETED_BLOCKS 0x48
2201
2202#define EVT_AMP_STATUS_CHANGE 0x4D
2203typedef struct {
2204 uint8_t status;
2205 uint8_t amp_status;
2206} __attribute__ ((packed)) evt_amp_status_change;
2207#define EVT_AMP_STATUS_CHANGE_SIZE 2
2208
2209#define EVT_TESTING 0xFE
2210
2211#define EVT_VENDOR 0xFF
2212
2213/* Internal events generated by BlueZ stack */
2214#define EVT_STACK_INTERNAL 0xFD
2215typedef struct {
2216 uint16_t type;
2217 uint8_t data[0];
2218} __attribute__ ((packed)) evt_stack_internal;
2219#define EVT_STACK_INTERNAL_SIZE 2
2220
2221#define EVT_SI_DEVICE 0x01
2222typedef struct {
2223 uint16_t event;
2224 uint16_t dev_id;
2225} __attribute__ ((packed)) evt_si_device;
2226#define EVT_SI_DEVICE_SIZE 4
2227
2228/* -------- HCI Packet structures -------- */
2229#define HCI_TYPE_LEN 1
2230
2231typedef struct {
2232 uint16_t opcode; /* OCF & OGF */
2233 uint8_t plen;
2234} __attribute__ ((packed)) hci_command_hdr;
2235#define HCI_COMMAND_HDR_SIZE 3
2236
2237typedef struct {
2238 uint8_t evt;
2239 uint8_t plen;
2240} __attribute__ ((packed)) hci_event_hdr;
2241#define HCI_EVENT_HDR_SIZE 2
2242
2243typedef struct {
2244 uint16_t handle; /* Handle & Flags(PB, BC) */
2245 uint16_t dlen;
2246} __attribute__ ((packed)) hci_acl_hdr;
2247#define HCI_ACL_HDR_SIZE 4
2248
2249typedef struct {
2250 uint16_t handle;
2251 uint8_t dlen;
2252} __attribute__ ((packed)) hci_sco_hdr;
2253#define HCI_SCO_HDR_SIZE 3
2254
2255typedef struct {
2256 uint16_t device;
2257 uint16_t type;
2258 uint16_t plen;
2259} __attribute__ ((packed)) hci_msg_hdr;
2260#define HCI_MSG_HDR_SIZE 6
2261
2262/* Command opcode pack/unpack */
2263#define cmd_opcode_pack(ogf, ocf) (uint16_t)((ocf & 0x03ff)|(ogf << 10))
2264#define cmd_opcode_ogf(op) (op >> 10)
2265#define cmd_opcode_ocf(op) (op & 0x03ff)
2266
2267/* ACL handle and flags pack/unpack */
2268#define acl_handle_pack(h, f) (uint16_t)((h & 0x0fff)|(f << 12))
2269#define acl_handle(h) (h & 0x0fff)
2270#define acl_flags(h) (h >> 12)
2271
2272#endif /* _NO_HCI_DEFS */
2273
2274/* HCI Socket options */
2275#define HCI_DATA_DIR 1
2276#define HCI_FILTER 2
2277#define HCI_TIME_STAMP 3
2278
2279/* HCI CMSG flags */
2280#define HCI_CMSG_DIR 0x0001
2281#define HCI_CMSG_TSTAMP 0x0002
2282
2283struct sockaddr_hci {
2284 sa_family_t hci_family;
2285 unsigned short hci_dev;
2286 unsigned short hci_channel;
2287};
2288#define HCI_DEV_NONE 0xffff
2289
2290#define HCI_CHANNEL_RAW 0
2291#define HCI_CHANNEL_MONITOR 2
2292#define HCI_CHANNEL_CONTROL 3
2293
2294struct hci_filter {
2295 uint32_t type_mask;
2296 uint32_t event_mask[2];
2297 uint16_t opcode;
2298};
2299
2300#define HCI_FLT_TYPE_BITS 31
2301#define HCI_FLT_EVENT_BITS 63
2302#define HCI_FLT_OGF_BITS 63
2303#define HCI_FLT_OCF_BITS 127
2304
2305/* Ioctl requests structures */
2306struct hci_dev_stats {
2307 uint32_t err_rx;
2308 uint32_t err_tx;
2309 uint32_t cmd_tx;
2310 uint32_t evt_rx;
2311 uint32_t acl_tx;
2312 uint32_t acl_rx;
2313 uint32_t sco_tx;
2314 uint32_t sco_rx;
2315 uint32_t byte_rx;
2316 uint32_t byte_tx;
2317};
2318
2319struct hci_dev_info {
2320 uint16_t dev_id;
2321 char name[8];
2322
2323 bdaddr_t bdaddr;
2324
2325 uint32_t flags;
2326 uint8_t type;
2327
2328 uint8_t features[8];
2329
2330 uint32_t pkt_type;
2331 uint32_t link_policy;
2332 uint32_t link_mode;
2333
2334 uint16_t acl_mtu;
2335 uint16_t acl_pkts;
2336 uint16_t sco_mtu;
2337 uint16_t sco_pkts;
2338
2339 struct hci_dev_stats stat;
2340};
2341
2342struct hci_conn_info {
2343 uint16_t handle;
2344 bdaddr_t bdaddr;
2345 uint8_t type;
2346 uint8_t out;
2347 uint16_t state;
2348 uint32_t link_mode;
2349};
2350
2351struct hci_dev_req {
2352 uint16_t dev_id;
2353 uint32_t dev_opt;
2354};
2355
2356struct hci_dev_list_req {
2357 uint16_t dev_num;
2358 struct hci_dev_req dev_req[0]; /* hci_dev_req structures */
2359};
2360
2361struct hci_conn_list_req {
2362 uint16_t dev_id;
2363 uint16_t conn_num;
2364 struct hci_conn_info conn_info[0];
2365};
2366
2367struct hci_conn_info_req {
2368 bdaddr_t bdaddr;
2369 uint8_t type;
2370 struct hci_conn_info conn_info[0];
2371};
2372
2373struct hci_auth_info_req {
2374 bdaddr_t bdaddr;
2375 uint8_t type;
2376};
2377
2378struct hci_inquiry_req {
2379 uint16_t dev_id;
2380 uint16_t flags;
2381 uint8_t lap[3];
2382 uint8_t length;
2383 uint8_t num_rsp;
2384};
2385#define IREQ_CACHE_FLUSH 0x0001
2386
2387#ifdef __cplusplus
2388}
2389#endif
2390
2391#endif /* __HCI_H */
02392
=== added file '.pc/ssp_parameter.patch/lib/mgmt.h'
--- .pc/ssp_parameter.patch/lib/mgmt.h 1970-01-01 00:00:00 +0000
+++ .pc/ssp_parameter.patch/lib/mgmt.h 2014-05-15 03:26:22 +0000
@@ -0,0 +1,554 @@
1/*
2 * BlueZ - Bluetooth protocol stack for Linux
3 *
4 * Copyright (C) 2010 Nokia Corporation
5 * Copyright (C) 2010 Marcel Holtmann <marcel@holtmann.org>
6 *
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 */
23
24#ifndef __packed
25#define __packed __attribute__((packed))
26#endif
27
28#define MGMT_INDEX_NONE 0xFFFF
29
30#define MGMT_STATUS_SUCCESS 0x00
31#define MGMT_STATUS_UNKNOWN_COMMAND 0x01
32#define MGMT_STATUS_NOT_CONNECTED 0x02
33#define MGMT_STATUS_FAILED 0x03
34#define MGMT_STATUS_CONNECT_FAILED 0x04
35#define MGMT_STATUS_AUTH_FAILED 0x05
36#define MGMT_STATUS_NOT_PAIRED 0x06
37#define MGMT_STATUS_NO_RESOURCES 0x07
38#define MGMT_STATUS_TIMEOUT 0x08
39#define MGMT_STATUS_ALREADY_CONNECTED 0x09
40#define MGMT_STATUS_BUSY 0x0a
41#define MGMT_STATUS_REJECTED 0x0b
42#define MGMT_STATUS_NOT_SUPPORTED 0x0c
43#define MGMT_STATUS_INVALID_PARAMS 0x0d
44#define MGMT_STATUS_DISCONNECTED 0x0e
45#define MGMT_STATUS_NOT_POWERED 0x0f
46#define MGMT_STATUS_CANCELLED 0x10
47#define MGMT_STATUS_INVALID_INDEX 0x11
48
49struct mgmt_hdr {
50 uint16_t opcode;
51 uint16_t index;
52 uint16_t len;
53} __packed;
54#define MGMT_HDR_SIZE 6
55
56struct mgmt_addr_info {
57 bdaddr_t bdaddr;
58 uint8_t type;
59} __packed;
60
61#define MGMT_OP_READ_VERSION 0x0001
62struct mgmt_rp_read_version {
63 uint8_t version;
64 uint16_t revision;
65} __packed;
66
67#define MGMT_OP_READ_COMMANDS 0x0002
68struct mgmt_rp_read_commands {
69 uint16_t num_commands;
70 uint16_t num_events;
71 uint16_t opcodes[0];
72} __packed;
73
74#define MGMT_OP_READ_INDEX_LIST 0x0003
75struct mgmt_rp_read_index_list {
76 uint16_t num_controllers;
77 uint16_t index[0];
78} __packed;
79
80/* Reserve one extra byte for names in management messages so that they
81 * are always guaranteed to be nul-terminated */
82#define MGMT_MAX_NAME_LENGTH (HCI_MAX_NAME_LENGTH + 1)
83#define MGMT_MAX_SHORT_NAME_LENGTH (10 + 1)
84
85#define MGMT_SETTING_POWERED 0x00000001
86#define MGMT_SETTING_CONNECTABLE 0x00000002
87#define MGMT_SETTING_FAST_CONNECTABLE 0x00000004
88#define MGMT_SETTING_DISCOVERABLE 0x00000008
89#define MGMT_SETTING_PAIRABLE 0x00000010
90#define MGMT_SETTING_LINK_SECURITY 0x00000020
91#define MGMT_SETTING_SSP 0x00000040
92#define MGMT_SETTING_BREDR 0x00000080
93#define MGMT_SETTING_HS 0x00000100
94#define MGMT_SETTING_LE 0x00000200
95
96#define MGMT_OP_READ_INFO 0x0004
97struct mgmt_rp_read_info {
98 bdaddr_t bdaddr;
99 uint8_t version;
100 uint16_t manufacturer;
101 uint32_t supported_settings;
102 uint32_t current_settings;
103 uint8_t dev_class[3];
104 uint8_t name[MGMT_MAX_NAME_LENGTH];
105 uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
106} __packed;
107
108struct mgmt_mode {
109 uint8_t val;
110} __packed;
111
112#define MGMT_OP_SET_POWERED 0x0005
113
114#define MGMT_OP_SET_DISCOVERABLE 0x0006
115struct mgmt_cp_set_discoverable {
116 uint8_t val;
117 uint16_t timeout;
118} __packed;
119
120#define MGMT_OP_SET_CONNECTABLE 0x0007
121
122#define MGMT_OP_SET_FAST_CONNECTABLE 0x0008
123
124#define MGMT_OP_SET_PAIRABLE 0x0009
125
126#define MGMT_OP_SET_LINK_SECURITY 0x000A
127
128#define MGMT_OP_SET_SSP 0x000B
129
130#define MGMT_OP_SET_HS 0x000C
131
132#define MGMT_OP_SET_LE 0x000D
133
134#define MGMT_OP_SET_DEV_CLASS 0x000E
135struct mgmt_cp_set_dev_class {
136 uint8_t major;
137 uint8_t minor;
138} __packed;
139
140#define MGMT_OP_SET_LOCAL_NAME 0x000F
141struct mgmt_cp_set_local_name {
142 uint8_t name[MGMT_MAX_NAME_LENGTH];
143 uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
144} __packed;
145
146#define MGMT_OP_ADD_UUID 0x0010
147struct mgmt_cp_add_uuid {
148 uint8_t uuid[16];
149 uint8_t svc_hint;
150} __packed;
151
152#define MGMT_OP_REMOVE_UUID 0x0011
153struct mgmt_cp_remove_uuid {
154 uint8_t uuid[16];
155} __packed;
156
157struct mgmt_link_key_info {
158 struct mgmt_addr_info addr;
159 uint8_t type;
160 uint8_t val[16];
161 uint8_t pin_len;
162} __packed;
163
164#define MGMT_OP_LOAD_LINK_KEYS 0x0012
165struct mgmt_cp_load_link_keys {
166 uint8_t debug_keys;
167 uint16_t key_count;
168 struct mgmt_link_key_info keys[0];
169} __packed;
170
171struct mgmt_ltk_info {
172 struct mgmt_addr_info addr;
173 uint8_t authenticated;
174 uint8_t master;
175 uint8_t enc_size;
176 uint16_t ediv;
177 uint8_t rand[8];
178 uint8_t val[16];
179} __packed;
180
181#define MGMT_OP_LOAD_LONG_TERM_KEYS 0x0013
182struct mgmt_cp_load_long_term_keys {
183 uint16_t key_count;
184 struct mgmt_ltk_info keys[0];
185} __packed;
186
187#define MGMT_OP_DISCONNECT 0x0014
188struct mgmt_cp_disconnect {
189 struct mgmt_addr_info addr;
190} __packed;
191struct mgmt_rp_disconnect {
192 struct mgmt_addr_info addr;
193} __packed;
194
195#define MGMT_OP_GET_CONNECTIONS 0x0015
196struct mgmt_rp_get_connections {
197 uint16_t conn_count;
198 struct mgmt_addr_info addr[0];
199} __packed;
200
201#define MGMT_OP_PIN_CODE_REPLY 0x0016
202struct mgmt_cp_pin_code_reply {
203 struct mgmt_addr_info addr;
204 uint8_t pin_len;
205 uint8_t pin_code[16];
206} __packed;
207
208#define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017
209struct mgmt_cp_pin_code_neg_reply {
210 struct mgmt_addr_info addr;
211} __packed;
212
213#define MGMT_OP_SET_IO_CAPABILITY 0x0018
214struct mgmt_cp_set_io_capability {
215 uint8_t io_capability;
216} __packed;
217
218#define MGMT_OP_PAIR_DEVICE 0x0019
219struct mgmt_cp_pair_device {
220 struct mgmt_addr_info addr;
221 uint8_t io_cap;
222} __packed;
223struct mgmt_rp_pair_device {
224 struct mgmt_addr_info addr;
225} __packed;
226
227#define MGMT_OP_CANCEL_PAIR_DEVICE 0x001A
228
229#define MGMT_OP_UNPAIR_DEVICE 0x001B
230struct mgmt_cp_unpair_device {
231 struct mgmt_addr_info addr;
232 uint8_t disconnect;
233} __packed;
234struct mgmt_rp_unpair_device {
235 struct mgmt_addr_info addr;
236} __packed;
237
238#define MGMT_OP_USER_CONFIRM_REPLY 0x001C
239struct mgmt_cp_user_confirm_reply {
240 struct mgmt_addr_info addr;
241} __packed;
242struct mgmt_rp_user_confirm_reply {
243 struct mgmt_addr_info addr;
244} __packed;
245
246#define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001D
247
248#define MGMT_OP_USER_PASSKEY_REPLY 0x001E
249struct mgmt_cp_user_passkey_reply {
250 struct mgmt_addr_info addr;
251 uint32_t passkey;
252} __packed;
253struct mgmt_rp_user_passkey_reply {
254 struct mgmt_addr_info addr;
255} __packed;
256
257#define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001F
258struct mgmt_cp_user_passkey_neg_reply {
259 struct mgmt_addr_info addr;
260} __packed;
261
262#define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020
263struct mgmt_rp_read_local_oob_data {
264 uint8_t hash[16];
265 uint8_t randomizer[16];
266} __packed;
267
268#define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0021
269struct mgmt_cp_add_remote_oob_data {
270 struct mgmt_addr_info addr;
271 uint8_t hash[16];
272 uint8_t randomizer[16];
273} __packed;
274
275#define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0022
276struct mgmt_cp_remove_remote_oob_data {
277 struct mgmt_addr_info addr;
278} __packed;
279
280#define MGMT_OP_START_DISCOVERY 0x0023
281struct mgmt_cp_start_discovery {
282 uint8_t type;
283} __packed;
284
285#define MGMT_OP_STOP_DISCOVERY 0x0024
286struct mgmt_cp_stop_discovery {
287 uint8_t type;
288} __packed;
289
290#define MGMT_OP_CONFIRM_NAME 0x0025
291struct mgmt_cp_confirm_name {
292 struct mgmt_addr_info addr;
293 uint8_t name_known;
294} __packed;
295struct mgmt_rp_confirm_name {
296 struct mgmt_addr_info addr;
297} __packed;
298
299#define MGMT_OP_BLOCK_DEVICE 0x0026
300struct mgmt_cp_block_device {
301 struct mgmt_addr_info addr;
302} __packed;
303
304#define MGMT_OP_UNBLOCK_DEVICE 0x0027
305struct mgmt_cp_unblock_device {
306 struct mgmt_addr_info addr;
307} __packed;
308
309#define MGMT_OP_SET_DEVICE_ID 0x0028
310struct mgmt_cp_set_device_id {
311 uint16_t source;
312 uint16_t vendor;
313 uint16_t product;
314 uint16_t version;
315} __packed;
316
317#define MGMT_EV_CMD_COMPLETE 0x0001
318struct mgmt_ev_cmd_complete {
319 uint16_t opcode;
320 uint8_t status;
321 uint8_t data[0];
322} __packed;
323
324#define MGMT_EV_CMD_STATUS 0x0002
325struct mgmt_ev_cmd_status {
326 uint16_t opcode;
327 uint8_t status;
328} __packed;
329
330#define MGMT_EV_CONTROLLER_ERROR 0x0003
331struct mgmt_ev_controller_error {
332 uint8_t error_code;
333} __packed;
334
335#define MGMT_EV_INDEX_ADDED 0x0004
336
337#define MGMT_EV_INDEX_REMOVED 0x0005
338
339#define MGMT_EV_NEW_SETTINGS 0x0006
340
341#define MGMT_EV_CLASS_OF_DEV_CHANGED 0x0007
342struct mgmt_ev_class_of_dev_changed {
343 uint8_t class_of_dev[3];
344} __packed;
345
346#define MGMT_EV_LOCAL_NAME_CHANGED 0x0008
347struct mgmt_ev_local_name_changed {
348 uint8_t name[MGMT_MAX_NAME_LENGTH];
349 uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
350} __packed;
351
352#define MGMT_EV_NEW_LINK_KEY 0x0009
353struct mgmt_ev_new_link_key {
354 uint8_t store_hint;
355 struct mgmt_link_key_info key;
356} __packed;
357
358#define MGMT_EV_NEW_LONG_TERM_KEY 0x000A
359struct mgmt_ev_new_long_term_key {
360 uint8_t store_hint;
361 struct mgmt_ltk_info key;
362} __packed;
363
364#define MGMT_EV_DEVICE_CONNECTED 0x000B
365struct mgmt_ev_device_connected {
366 struct mgmt_addr_info addr;
367 uint32_t flags;
368 uint16_t eir_len;
369 uint8_t eir[0];
370} __packed;
371
372#define MGMT_EV_DEVICE_DISCONNECTED 0x000C
373struct mgmt_ev_device_disconnected {
374 struct mgmt_addr_info addr;
375} __packed;
376
377#define MGMT_EV_CONNECT_FAILED 0x000D
378struct mgmt_ev_connect_failed {
379 struct mgmt_addr_info addr;
380 uint8_t status;
381} __packed;
382
383#define MGMT_EV_PIN_CODE_REQUEST 0x000E
384struct mgmt_ev_pin_code_request {
385 struct mgmt_addr_info addr;
386 uint8_t secure;
387} __packed;
388
389#define MGMT_EV_USER_CONFIRM_REQUEST 0x000F
390struct mgmt_ev_user_confirm_request {
391 struct mgmt_addr_info addr;
392 uint8_t confirm_hint;
393 uint32_t value;
394} __packed;
395
396#define MGMT_EV_USER_PASSKEY_REQUEST 0x0010
397struct mgmt_ev_user_passkey_request {
398 struct mgmt_addr_info addr;
399} __packed;
400
401#define MGMT_EV_AUTH_FAILED 0x0011
402struct mgmt_ev_auth_failed {
403 struct mgmt_addr_info addr;
404 uint8_t status;
405} __packed;
406
407#define MGMT_DEV_FOUND_CONFIRM_NAME 0x01
408#define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02
409
410#define MGMT_EV_DEVICE_FOUND 0x0012
411struct mgmt_ev_device_found {
412 struct mgmt_addr_info addr;
413 int8_t rssi;
414 uint32_t flags;
415 uint16_t eir_len;
416 uint8_t eir[0];
417} __packed;
418
419#define MGMT_EV_DISCOVERING 0x0013
420struct mgmt_ev_discovering {
421 uint8_t type;
422 uint8_t discovering;
423} __packed;
424
425#define MGMT_EV_DEVICE_BLOCKED 0x0014
426struct mgmt_ev_device_blocked {
427 struct mgmt_addr_info addr;
428} __packed;
429
430#define MGMT_EV_DEVICE_UNBLOCKED 0x0015
431struct mgmt_ev_device_unblocked {
432 struct mgmt_addr_info addr;
433} __packed;
434
435#define MGMT_EV_DEVICE_UNPAIRED 0x0016
436struct mgmt_ev_device_unpaired {
437 struct mgmt_addr_info addr;
438} __packed;
439
440static const char *mgmt_op[] = {
441 "<0x0000>",
442 "Read Version",
443 "Read Commands",
444 "Read Index List",
445 "Read Controller Info",
446 "Set Powered",
447 "Set Discoverable",
448 "Set Connectable",
449 "Set Fast Connectable", /* 0x0008 */
450 "Set Pairable",
451 "Set Link Security",
452 "Set Secure Simple Pairing",
453 "Set High Speed",
454 "Set Low Energy",
455 "Set Dev Class",
456 "Set Local Name",
457 "Add UUID", /* 0x0010 */
458 "Remove UUID",
459 "Load Link Keys",
460 "Load Long Term Keys",
461 "Disconnect",
462 "Get Connections",
463 "PIN Code Reply",
464 "PIN Code Neg Reply",
465 "Set IO Capability", /* 0x0018 */
466 "Pair Device",
467 "Cancel Pair Device",
468 "Unpair Device",
469 "User Confirm Reply",
470 "User Confirm Neg Reply",
471 "User Passkey Reply",
472 "User Passkey Neg Reply",
473 "Read Local OOB Data", /* 0x0020 */
474 "Add Remote OOB Data",
475 "Remove Remove OOB Data",
476 "Start Discovery",
477 "Stop Discovery",
478 "Confirm Name",
479 "Block Device",
480 "Unblock Device",
481 "Set Device ID",
482};
483
484static const char *mgmt_ev[] = {
485 "<0x0000>",
486 "Command Complete",
487 "Command Status",
488 "Controller Error",
489 "Index Added",
490 "Index Removed",
491 "New Settings",
492 "Class of Device Changed",
493 "Local Name Changed", /* 0x0008 */
494 "New Link Key",
495 "New Long Term Key",
496 "Device Connected",
497 "Device Disconnected",
498 "Connect Failed",
499 "PIN Code Request",
500 "User Confirm Request",
501 "User Passkey Request", /* 0x0010 */
502 "Authentication Failed",
503 "Device Found",
504 "Discovering",
505 "Device Blocked",
506 "Device Unblocked",
507 "Device Unpaired",
508};
509
510static const char *mgmt_status[] = {
511 "Success",
512 "Unknown Command",
513 "Not Connected",
514 "Failed",
515 "Connect Failed",
516 "Authentication Failed",
517 "Not Paired",
518 "No Resources",
519 "Timeout",
520 "Already Connected",
521 "Busy",
522 "Rejected",
523 "Not Supported",
524 "Invalid Parameters",
525 "Disconnected",
526 "Not Powered",
527 "Cancelled",
528 "Invalid Index",
529};
530
531#ifndef NELEM
532#define NELEM(x) (sizeof(x) / sizeof((x)[0]))
533#endif
534
535static inline const char *mgmt_opstr(uint16_t op)
536{
537 if (op >= NELEM(mgmt_op))
538 return "<unknown opcode>";
539 return mgmt_op[op];
540}
541
542static inline const char *mgmt_evstr(uint16_t ev)
543{
544 if (ev >= NELEM(mgmt_ev))
545 return "<unknown event>";
546 return mgmt_ev[ev];
547}
548
549static inline const char *mgmt_errstr(uint8_t status)
550{
551 if (status >= NELEM(mgmt_status))
552 return "<unknown status>";
553 return mgmt_status[status];
554}
0555
=== added directory '.pc/ssp_parameter.patch/plugins'
=== added file '.pc/ssp_parameter.patch/plugins/hciops.c'
--- .pc/ssp_parameter.patch/plugins/hciops.c 1970-01-01 00:00:00 +0000
+++ .pc/ssp_parameter.patch/plugins/hciops.c 2014-05-15 03:26:22 +0000
@@ -0,0 +1,3943 @@
1/*
2 *
3 * BlueZ - Bluetooth protocol stack for Linux
4 *
5 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 */
22
23#ifdef HAVE_CONFIG_H
24#include <config.h>
25#endif
26
27#include <stdio.h>
28#include <errno.h>
29#include <unistd.h>
30#include <stdlib.h>
31#include <sys/types.h>
32#include <sys/ioctl.h>
33#include <sys/wait.h>
34
35#include <bluetooth/bluetooth.h>
36#include <bluetooth/hci.h>
37#include <bluetooth/hci_lib.h>
38#include <bluetooth/sdp.h>
39#include <bluetooth/sdp_lib.h>
40
41#include <glib.h>
42
43#include "hcid.h"
44#include "sdpd.h"
45#include "btio.h"
46#include "adapter.h"
47#include "device.h"
48#include "plugin.h"
49#include "log.h"
50#include "storage.h"
51#include "event.h"
52#include "manager.h"
53#include "oob.h"
54#include "eir.h"
55
56#define DISCOV_HALTED 0
57#define DISCOV_INQ 1
58#define DISCOV_SCAN 2
59#define DISCOV_NAMES 3
60
61#define TIMEOUT_BR_LE_SCAN 5120 /* TGAP(100)/2 */
62#define TIMEOUT_LE_SCAN 10240 /* TGAP(gen_disc_scan_min) */
63
64#define LENGTH_BR_INQ 0x08
65#define LENGTH_BR_LE_INQ 0x04
66
67static int start_scanning(int index, int timeout);
68
69static int child_pipe[2] = { -1, -1 };
70
71static guint child_io_id = 0;
72static guint ctl_io_id = 0;
73
74enum adapter_type {
75 BR_EDR,
76 LE_ONLY,
77 BR_EDR_LE,
78 UNKNOWN,
79};
80
81/* Commands sent by kernel on starting an adapter */
82enum {
83 PENDING_BDADDR,
84 PENDING_VERSION,
85 PENDING_FEATURES,
86 PENDING_NAME,
87};
88
89struct bt_conn {
90 struct dev_info *dev;
91 bdaddr_t bdaddr;
92 uint16_t handle;
93 uint8_t loc_cap;
94 uint8_t loc_auth;
95 uint8_t rem_cap;
96 uint8_t rem_auth;
97 uint8_t rem_oob_data;
98 gboolean bonding_initiator;
99 gboolean secmode3;
100 GIOChannel *io; /* For raw L2CAP socket (bonding) */
101};
102
103struct oob_data {
104 bdaddr_t bdaddr;
105 uint8_t hash[16];
106 uint8_t randomizer[16];
107};
108
109enum name_state {
110 NAME_UNKNOWN,
111 NAME_NEEDED,
112 NAME_NOT_NEEDED,
113 NAME_PENDING,
114};
115
116struct found_dev {
117 bdaddr_t bdaddr;
118 int8_t rssi;
119 enum name_state name_state;
120};
121
122static int max_dev = -1;
123static struct dev_info {
124 int id;
125 int sk;
126 bdaddr_t bdaddr;
127 char name[249];
128 uint8_t eir[HCI_MAX_EIR_LENGTH];
129 uint8_t features[8];
130 uint8_t extfeatures[8];
131 uint8_t ssp_mode;
132
133 int8_t tx_power;
134
135 int discov_state;
136
137 uint32_t current_cod;
138 uint32_t wanted_cod;
139 uint32_t pending_cod;
140 gboolean cache_enable;
141 gboolean already_up;
142 gboolean registered;
143 gboolean pairable;
144
145 uint8_t io_capability;
146
147 struct hci_version ver;
148
149 uint16_t did_source;
150 uint16_t did_vendor;
151 uint16_t did_product;
152 uint16_t did_version;
153
154 gboolean up;
155 uint32_t pending;
156
157 GIOChannel *io;
158 guint watch_id;
159
160 gboolean debug_keys;
161 GSList *keys;
162 uint8_t pin_length;
163
164 GSList *oob_data;
165
166 GSList *uuids;
167
168 GSList *connections;
169
170 GSList *found_devs;
171 GSList *need_name;
172
173 guint stop_scan_id;
174
175 uint16_t discoverable_timeout;
176 guint discoverable_id;
177} *devs = NULL;
178
179static int found_dev_rssi_cmp(gconstpointer a, gconstpointer b)
180{
181 const struct found_dev *d1 = a, *d2 = b;
182 int rssi1, rssi2;
183
184 if (d2->name_state == NAME_NOT_NEEDED)
185 return -1;
186
187 rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
188 rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
189
190 return rssi1 - rssi2;
191}
192
193static int found_dev_bda_cmp(gconstpointer a, gconstpointer b)
194{
195 const struct found_dev *d1 = a, *d2 = b;
196
197 return bacmp(&d1->bdaddr, &d2->bdaddr);
198}
199
200static void found_dev_cleanup(struct dev_info *info)
201{
202 g_slist_free_full(info->found_devs, g_free);
203 info->found_devs = NULL;
204
205 g_slist_free_full(info->need_name, g_free);
206 info->need_name = NULL;
207}
208
209static int resolve_name(struct dev_info *info, bdaddr_t *bdaddr)
210{
211 remote_name_req_cp cp;
212 char addr[18];
213
214 ba2str(bdaddr, addr);
215 DBG("hci%d dba %s", info->id, addr);
216
217 memset(&cp, 0, sizeof(cp));
218 bacpy(&cp.bdaddr, bdaddr);
219 cp.pscan_rep_mode = 0x02;
220
221 if (hci_send_cmd(info->sk, OGF_LINK_CTL, OCF_REMOTE_NAME_REQ,
222 REMOTE_NAME_REQ_CP_SIZE, &cp) < 0)
223 return -errno;
224
225 return 0;
226}
227
228static int resolve_names(struct dev_info *info, struct btd_adapter *adapter)
229{
230 struct found_dev *dev;
231
232 DBG("found_dev %u need_name %u", g_slist_length(info->found_devs),
233 g_slist_length(info->need_name));
234
235 if (g_slist_length(info->need_name) == 0)
236 return -ENOENT;
237
238 dev = info->need_name->data;
239 resolve_name(info, &dev->bdaddr);
240 dev->name_state = NAME_PENDING;
241
242 return 0;
243}
244
245static void set_state(int index, int state)
246{
247 struct btd_adapter *adapter;
248 struct dev_info *dev = &devs[index];
249
250 if (dev->discov_state == state)
251 return;
252
253 adapter = manager_find_adapter_by_id(index);
254 if (!adapter) {
255 error("No matching adapter found");
256 return;
257 }
258
259 dev->discov_state = state;
260
261 DBG("hci%d: new state %d", index, dev->discov_state);
262
263 switch (dev->discov_state) {
264 case DISCOV_HALTED:
265 found_dev_cleanup(dev);
266 adapter_set_discovering(adapter, FALSE);
267 break;
268 case DISCOV_INQ:
269 case DISCOV_SCAN:
270 adapter_set_discovering(adapter, TRUE);
271 break;
272 case DISCOV_NAMES:
273 if (resolve_names(dev, adapter) < 0)
274 set_state(index, DISCOV_HALTED);
275 break;
276 }
277}
278
279static inline gboolean is_le_capable(int index)
280{
281 struct dev_info *dev = &devs[index];
282
283 return (dev->features[4] & LMP_LE &&
284 dev->extfeatures[0] & LMP_HOST_LE) ? TRUE : FALSE;
285}
286
287static inline gboolean is_bredr_capable(int index)
288{
289 struct dev_info *dev = &devs[index];
290
291 return (dev->features[4] & LMP_NO_BREDR) == 0 ? TRUE : FALSE;
292}
293
294static int get_adapter_type(int index)
295{
296 if (is_le_capable(index) && is_bredr_capable(index))
297 return BR_EDR_LE;
298 else if (is_le_capable(index))
299 return LE_ONLY;
300 else if (is_bredr_capable(index))
301 return BR_EDR;
302
303 return UNKNOWN;
304}
305
306static int ignore_device(struct hci_dev_info *di)
307{
308 return hci_test_bit(HCI_RAW, &di->flags) || di->type >> 4 != HCI_BREDR;
309}
310
311static struct dev_info *init_dev_info(int index, int sk, gboolean registered,
312 gboolean already_up)
313{
314 struct dev_info *dev = &devs[index];
315
316 memset(dev, 0, sizeof(*dev));
317
318 dev->id = index;
319 dev->sk = sk;
320 dev->cache_enable = TRUE;
321 dev->registered = registered;
322 dev->already_up = already_up;
323 dev->io_capability = 0x03; /* No Input No Output */
324 dev->discov_state = DISCOV_HALTED;
325
326 return dev;
327}
328
329/* Async HCI command handling with callback support */
330
331struct hci_cmd_data {
332 bt_hci_result_t cb;
333 uint16_t handle;
334 uint16_t ocf;
335 gpointer caller_data;
336};
337
338static gboolean hci_event_watch(GIOChannel *io,
339 GIOCondition cond, gpointer user_data)
340{
341 unsigned char buf[HCI_MAX_EVENT_SIZE], *body;
342 struct hci_cmd_data *cmd = user_data;
343 evt_cmd_status *evt_status;
344 evt_auth_complete *evt_auth;
345 evt_encrypt_change *evt_enc;
346 hci_event_hdr *hdr;
347 set_conn_encrypt_cp cp;
348 int dd;
349 uint16_t ocf;
350 uint8_t status = HCI_OE_POWER_OFF;
351
352 if (cond & G_IO_NVAL) {
353 cmd->cb(status, cmd->caller_data);
354 return FALSE;
355 }
356
357 if (cond & (G_IO_ERR | G_IO_HUP))
358 goto failed;
359
360 dd = g_io_channel_unix_get_fd(io);
361
362 if (read(dd, buf, sizeof(buf)) < 0)
363 goto failed;
364
365 hdr = (hci_event_hdr *) (buf + 1);
366 body = buf + (1 + HCI_EVENT_HDR_SIZE);
367
368 switch (hdr->evt) {
369 case EVT_CMD_STATUS:
370 evt_status = (evt_cmd_status *) body;
371 ocf = cmd_opcode_ocf(evt_status->opcode);
372 if (ocf != cmd->ocf)
373 return TRUE;
374 switch (ocf) {
375 case OCF_AUTH_REQUESTED:
376 case OCF_SET_CONN_ENCRYPT:
377 if (evt_status->status != 0) {
378 /* Baseband rejected command */
379 status = evt_status->status;
380 goto failed;
381 }
382 break;
383 default:
384 return TRUE;
385 }
386 /* Wait for the next event */
387 return TRUE;
388 case EVT_AUTH_COMPLETE:
389 evt_auth = (evt_auth_complete *) body;
390 if (evt_auth->handle != cmd->handle) {
391 /* Skipping */
392 return TRUE;
393 }
394
395 if (evt_auth->status != 0x00) {
396 status = evt_auth->status;
397 /* Abort encryption */
398 goto failed;
399 }
400
401 memset(&cp, 0, sizeof(cp));
402 cp.handle = cmd->handle;
403 cp.encrypt = 1;
404
405 cmd->ocf = OCF_SET_CONN_ENCRYPT;
406
407 if (hci_send_cmd(dd, OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT,
408 SET_CONN_ENCRYPT_CP_SIZE, &cp) < 0) {
409 status = HCI_COMMAND_DISALLOWED;
410 goto failed;
411 }
412 /* Wait for encrypt change event */
413 return TRUE;
414 case EVT_ENCRYPT_CHANGE:
415 evt_enc = (evt_encrypt_change *) body;
416 if (evt_enc->handle != cmd->handle)
417 return TRUE;
418
419 /* Procedure finished: reporting status */
420 status = evt_enc->status;
421 break;
422 default:
423 /* Skipping */
424 return TRUE;
425 }
426
427failed:
428 cmd->cb(status, cmd->caller_data);
429 g_io_channel_shutdown(io, TRUE, NULL);
430
431 return FALSE;
432}
433
434static int write_inq_mode(int index, uint8_t mode)
435{
436 struct dev_info *dev = &devs[index];
437 write_inquiry_mode_cp cp;
438
439 memset(&cp, 0, sizeof(cp));
440 cp.mode = mode;
441
442 if (hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_WRITE_INQUIRY_MODE,
443 WRITE_INQUIRY_MODE_CP_SIZE, &cp) < 0)
444 return -errno;
445
446 return 0;
447}
448
449static uint8_t get_inquiry_mode(int index)
450{
451 struct dev_info *dev = &devs[index];
452
453 if (dev->features[6] & LMP_EXT_INQ)
454 return 2;
455
456 if (dev->features[3] & LMP_RSSI_INQ)
457 return 1;
458
459 if (dev->ver.manufacturer == 11 && dev->ver.hci_rev == 0x00 &&
460 dev->ver.lmp_subver == 0x0757)
461 return 1;
462
463 if (dev->ver.manufacturer == 15) {
464 if (dev->ver.hci_rev == 0x03 &&
465 dev->ver.lmp_subver == 0x6963)
466 return 1;
467 if (dev->ver.hci_rev == 0x09 &&
468 dev->ver.lmp_subver == 0x6963)
469 return 1;
470 if (dev->ver.hci_rev == 0x00 &&
471 dev->ver.lmp_subver == 0x6965)
472 return 1;
473 }
474
475 if (dev->ver.manufacturer == 31 && dev->ver.hci_rev == 0x2005 &&
476 dev->ver.lmp_subver == 0x1805)
477 return 1;
478
479 return 0;
480}
481
482static int init_ssp_mode(int index)
483{
484 struct dev_info *dev = &devs[index];
485 write_simple_pairing_mode_cp cp;
486
487 if (ioctl(dev->sk, HCIGETAUTHINFO, NULL) < 0 && errno == EINVAL)
488 return 0;
489
490 memset(&cp, 0, sizeof(cp));
491 cp.mode = 0x01;
492
493 if (hci_send_cmd(dev->sk, OGF_HOST_CTL,
494 OCF_WRITE_SIMPLE_PAIRING_MODE,
495 WRITE_SIMPLE_PAIRING_MODE_CP_SIZE, &cp) < 0)
496 return -errno;
497
498 return 0;
499}
500
501static int hciops_set_discoverable(int index, gboolean discoverable,
502 uint16_t timeout)
503{
504 struct dev_info *dev = &devs[index];
505 uint8_t mode;
506
507 if (discoverable)
508 mode = (SCAN_PAGE | SCAN_INQUIRY);
509 else
510 mode = SCAN_PAGE;
511
512 DBG("hci%d discoverable %d", index, discoverable);
513
514 if (hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE,
515 1, &mode) < 0)
516 return -errno;
517
518 dev->discoverable_timeout = timeout;
519
520 return 0;
521}
522
523static int hciops_set_pairable(int index, gboolean pairable)
524{
525 struct btd_adapter *adapter;
526
527 DBG("hci%d pairable %d", index, pairable);
528
529 adapter = manager_find_adapter(&devs[index].bdaddr);
530 if (adapter)
531 btd_adapter_pairable_changed(adapter, pairable);
532
533 devs[index].pairable = pairable;
534
535 return 0;
536}
537
538static int hciops_power_off(int index)
539{
540 struct dev_info *dev = &devs[index];
541
542 DBG("hci%d", index);
543
544 if (ioctl(dev->sk, HCIDEVDOWN, index) < 0 && errno != EALREADY)
545 return -errno;
546
547 return 0;
548}
549
550static void set_event_mask(int index)
551{
552 struct dev_info *dev = &devs[index];
553 /* The second byte is 0xff instead of 0x9f (two reserved bits
554 * disabled) since a Broadcom 1.2 dongle doesn't respond to the
555 * command otherwise */
556 uint8_t events[8] = { 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x00, 0x00 };
557
558 /* Events for 1.2 and newer controllers */
559 if (dev->ver.lmp_ver > 1) {
560 events[4] |= 0x01; /* Flow Specification Complete */
561 events[4] |= 0x02; /* Inquiry Result with RSSI */
562 events[4] |= 0x04; /* Read Remote Extended Features Complete */
563 events[5] |= 0x08; /* Synchronous Connection Complete */
564 events[5] |= 0x10; /* Synchronous Connection Changed */
565 }
566
567 if (dev->features[3] & LMP_RSSI_INQ)
568 events[4] |= 0x02; /* Inquiry Result with RSSI */
569
570 if (dev->features[5] & LMP_SNIFF_SUBR)
571 events[5] |= 0x20; /* Sniff Subrating */
572
573 if (dev->features[5] & LMP_PAUSE_ENC)
574 events[5] |= 0x80; /* Encryption Key Refresh Complete */
575
576 if (dev->features[6] & LMP_EXT_INQ)
577 events[5] |= 0x40; /* Extended Inquiry Result */
578
579 if (dev->features[6] & LMP_NFLUSH_PKTS)
580 events[7] |= 0x01; /* Enhanced Flush Complete */
581
582 if (dev->features[7] & LMP_LSTO)
583 events[6] |= 0x80; /* Link Supervision Timeout Changed */
584
585 if (dev->features[6] & LMP_SIMPLE_PAIR) {
586 events[6] |= 0x01; /* IO Capability Request */
587 events[6] |= 0x02; /* IO Capability Response */
588 events[6] |= 0x04; /* User Confirmation Request */
589 events[6] |= 0x08; /* User Passkey Request */
590 events[6] |= 0x10; /* Remote OOB Data Request */
591 events[6] |= 0x20; /* Simple Pairing Complete */
592 events[7] |= 0x04; /* User Passkey Notification */
593 events[7] |= 0x08; /* Keypress Notification */
594 events[7] |= 0x10; /* Remote Host Supported
595 * Features Notification */
596 }
597
598 if (dev->features[4] & LMP_LE)
599 events[7] |= 0x20; /* LE Meta-Event */
600
601 hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_SET_EVENT_MASK,
602 sizeof(events), events);
603}
604
605static void start_adapter(int index)
606{
607 struct dev_info *dev = &devs[index];
608 uint8_t inqmode;
609 uint16_t link_policy;
610
611 set_event_mask(index);
612
613 if (dev->features[6] & LMP_SIMPLE_PAIR)
614 init_ssp_mode(index);
615
616 inqmode = get_inquiry_mode(index);
617 if (inqmode)
618 write_inq_mode(index, inqmode);
619
620 if (dev->features[7] & LMP_INQ_TX_PWR)
621 hci_send_cmd(dev->sk, OGF_HOST_CTL,
622 OCF_READ_INQ_RESPONSE_TX_POWER_LEVEL, 0, NULL);
623
624 /* Set default link policy */
625 link_policy = main_opts.link_policy;
626
627 if (!(dev->features[0] & LMP_RSWITCH))
628 link_policy &= ~HCI_LP_RSWITCH;
629 if (!(dev->features[0] & LMP_HOLD))
630 link_policy &= ~HCI_LP_HOLD;
631 if (!(dev->features[0] & LMP_SNIFF))
632 link_policy &= ~HCI_LP_SNIFF;
633 if (!(dev->features[1] & LMP_PARK))
634 link_policy &= ~HCI_LP_PARK;
635
636 link_policy = htobs(link_policy);
637 hci_send_cmd(dev->sk, OGF_LINK_POLICY, OCF_WRITE_DEFAULT_LINK_POLICY,
638 sizeof(link_policy), &link_policy);
639
640 dev->current_cod = 0;
641 memset(dev->eir, 0, sizeof(dev->eir));
642}
643
644static int hciops_stop_inquiry(int index)
645{
646 struct dev_info *dev = &devs[index];
647
648 DBG("hci%d", index);
649
650 if (hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_INQUIRY_CANCEL, 0, 0) < 0)
651 return -errno;
652
653 return 0;
654}
655
656static void update_ext_inquiry_response(int index)
657{
658 struct dev_info *dev = &devs[index];
659 write_ext_inquiry_response_cp cp;
660
661 DBG("hci%d", index);
662
663 if (!(dev->features[6] & LMP_EXT_INQ))
664 return;
665
666 if (dev->ssp_mode == 0)
667 return;
668
669 if (dev->cache_enable)
670 return;
671
672 memset(&cp, 0, sizeof(cp));
673
674 eir_create(dev->name, dev->tx_power, dev->did_vendor, dev->did_product,
675 dev->did_version, dev->did_source, dev->uuids,
676 cp.data);
677
678 if (memcmp(cp.data, dev->eir, sizeof(cp.data)) == 0)
679 return;
680
681 memcpy(dev->eir, cp.data, sizeof(cp.data));
682
683 if (hci_send_cmd(dev->sk, OGF_HOST_CTL,
684 OCF_WRITE_EXT_INQUIRY_RESPONSE,
685 WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE, &cp) < 0)
686 error("Unable to write EIR data: %s (%d)",
687 strerror(errno), errno);
688}
689
690static int hciops_set_name(int index, const char *name)
691{
692 struct dev_info *dev = &devs[index];
693 change_local_name_cp cp;
694
695 DBG("hci%d, name %s", index, name);
696
697 memset(&cp, 0, sizeof(cp));
698 strncpy((char *) cp.name, name, sizeof(cp.name));
699
700 if (hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
701 CHANGE_LOCAL_NAME_CP_SIZE, &cp) < 0)
702 return -errno;
703
704 memcpy(dev->name, cp.name, 248);
705 update_ext_inquiry_response(index);
706
707 return 0;
708}
709
710static int write_class(int index, uint32_t class)
711{
712 struct dev_info *dev = &devs[index];
713 write_class_of_dev_cp cp;
714
715 DBG("hci%d class 0x%06x", index, class);
716
717 memcpy(cp.dev_class, &class, 3);
718
719 if (hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV,
720 WRITE_CLASS_OF_DEV_CP_SIZE, &cp) < 0)
721 return -errno;
722
723 dev->pending_cod = class;
724
725 return 0;
726}
727
728static int hciops_set_dev_class(int index, uint8_t major, uint8_t minor)
729{
730 struct dev_info *dev = &devs[index];
731 int err;
732
733 DBG("hci%d major %u minor %u", index, major, minor);
734
735 /* Update only the major and minor class bits keeping remaining bits
736 * intact*/
737 dev->wanted_cod &= 0xffe000;
738 dev->wanted_cod |= ((major & 0x1f) << 8) | minor;
739
740 if (dev->wanted_cod == dev->current_cod ||
741 dev->cache_enable || dev->pending_cod)
742 return 0;
743
744 DBG("Changing Major/Minor class to 0x%06x", dev->wanted_cod);
745
746 err = write_class(index, dev->wanted_cod);
747 if (err < 0)
748 error("Adapter class update failed: %s (%d)",
749 strerror(-err), -err);
750
751 return err;
752}
753
754static gboolean init_adapter(int index)
755{
756 struct dev_info *dev = &devs[index];
757 struct btd_adapter *adapter = NULL;
758 gboolean existing_adapter = dev->registered;
759 uint8_t mode, on_mode, major, minor;
760 gboolean pairable, discoverable;
761 const char *name;
762 uint16_t discoverable_timeout;
763
764 if (!dev->registered) {
765 adapter = btd_manager_register_adapter(index, TRUE);
766 if (adapter)
767 dev->registered = TRUE;
768 } else {
769 adapter = manager_find_adapter(&dev->bdaddr);
770 /* FIXME: manager_find_adapter should return a new ref */
771 btd_adapter_ref(adapter);
772 }
773
774 if (adapter == NULL)
775 return FALSE;
776
777 btd_adapter_get_mode(adapter, &mode, &on_mode,
778 &discoverable_timeout,
779 &pairable);
780
781 if (existing_adapter)
782 mode = on_mode;
783
784 if (mode == MODE_OFF) {
785 hciops_power_off(index);
786 goto done;
787 }
788
789 start_adapter(index);
790
791 name = btd_adapter_get_name(adapter);
792 if (name)
793 hciops_set_name(index, name);
794
795 btd_adapter_get_class(adapter, &major, &minor);
796 hciops_set_dev_class(index, major, minor);
797
798 btd_adapter_start(adapter);
799
800 discoverable = (mode == MODE_DISCOVERABLE);
801
802 hciops_set_discoverable(index, discoverable, discoverable_timeout);
803 hciops_set_pairable(index, pairable);
804
805 if (dev->already_up)
806 hciops_stop_inquiry(index);
807
808done:
809 btd_adapter_unref(adapter);
810 return TRUE;
811}
812
813static int hciops_encrypt_link(int index, bdaddr_t *dst, bt_hci_result_t cb,
814 gpointer user_data)
815{
816 GIOChannel *io;
817 struct hci_cmd_data *cmd;
818 struct hci_conn_info_req *cr;
819 auth_requested_cp cp;
820 struct hci_filter nf;
821 int dd, err;
822 uint32_t link_mode;
823 uint16_t handle;
824
825 dd = hci_open_dev(index);
826 if (dd < 0)
827 return -errno;
828
829 cr = g_malloc0(sizeof(*cr) + sizeof(struct hci_conn_info));
830 cr->type = ACL_LINK;
831 bacpy(&cr->bdaddr, dst);
832
833 err = ioctl(dd, HCIGETCONNINFO, cr);
834 link_mode = cr->conn_info->link_mode;
835 handle = cr->conn_info->handle;
836 g_free(cr);
837
838 if (err < 0) {
839 err = -errno;
840 goto fail;
841 }
842
843 if (link_mode & HCI_LM_ENCRYPT) {
844 err = -EALREADY;
845 goto fail;
846 }
847
848 memset(&cp, 0, sizeof(cp));
849 cp.handle = htobs(handle);
850
851 if (hci_send_cmd(dd, OGF_LINK_CTL, OCF_AUTH_REQUESTED,
852 AUTH_REQUESTED_CP_SIZE, &cp) < 0) {
853 err = -errno;
854 goto fail;
855 }
856
857 cmd = g_new0(struct hci_cmd_data, 1);
858 cmd->handle = handle;
859 cmd->ocf = OCF_AUTH_REQUESTED;
860 cmd->cb = cb;
861 cmd->caller_data = user_data;
862
863 hci_filter_clear(&nf);
864 hci_filter_set_ptype(HCI_EVENT_PKT, &nf);
865 hci_filter_set_event(EVT_CMD_STATUS, &nf);
866 hci_filter_set_event(EVT_AUTH_COMPLETE, &nf);
867 hci_filter_set_event(EVT_ENCRYPT_CHANGE, &nf);
868
869 if (setsockopt(dd, SOL_HCI, HCI_FILTER, &nf, sizeof(nf)) < 0) {
870 err = -errno;
871 g_free(cmd);
872 goto fail;
873 }
874
875 io = g_io_channel_unix_new(dd);
876 g_io_channel_set_close_on_unref(io, FALSE);
877 g_io_add_watch_full(io, G_PRIORITY_DEFAULT,
878 G_IO_HUP | G_IO_ERR | G_IO_NVAL | G_IO_IN,
879 hci_event_watch, cmd, g_free);
880 g_io_channel_unref(io);
881
882 return 0;
883
884fail:
885 close(dd);
886 return err;
887}
888
889static int hciops_set_did(int index, uint16_t vendor, uint16_t product,
890 uint16_t version, uint16_t source)
891{
892 struct dev_info *dev = &devs[index];
893
894 dev->did_vendor = vendor;
895 dev->did_product = product;
896 dev->did_version = version;
897 dev->did_source = source;
898
899 return 0;
900}
901
902/* End async HCI command handling */
903
904/* Start of HCI event callbacks */
905
906static gint conn_handle_cmp(gconstpointer a, gconstpointer b)
907{
908 const struct bt_conn *conn = a;
909 uint16_t handle = *((const uint16_t *) b);
910
911 return (int) conn->handle - (int) handle;
912}
913
914static struct bt_conn *find_conn_by_handle(struct dev_info *dev,
915 uint16_t handle)
916{
917 GSList *match;
918
919 match = g_slist_find_custom(dev->connections, &handle,
920 conn_handle_cmp);
921 if (match)
922 return match->data;
923
924 return NULL;
925}
926
927static gint conn_bdaddr_cmp(gconstpointer a, gconstpointer b)
928{
929 const struct bt_conn *conn = a;
930 const bdaddr_t *bdaddr = b;
931
932 return bacmp(&conn->bdaddr, bdaddr);
933}
934
935static struct bt_conn *find_connection(struct dev_info *dev, bdaddr_t *bdaddr)
936{
937 GSList *match;
938
939 match = g_slist_find_custom(dev->connections, bdaddr, conn_bdaddr_cmp);
940 if (match)
941 return match->data;
942
943 return NULL;
944}
945
946static struct bt_conn *get_connection(struct dev_info *dev, bdaddr_t *bdaddr)
947{
948 struct bt_conn *conn;
949
950 conn = find_connection(dev, bdaddr);
951 if (conn)
952 return conn;
953
954 conn = g_new0(struct bt_conn, 1);
955
956 conn->dev = dev;
957 conn->loc_cap = dev->io_capability;
958 conn->loc_auth = 0xff;
959 conn->rem_auth = 0xff;
960 bacpy(&conn->bdaddr, bdaddr);
961
962 dev->connections = g_slist_append(dev->connections, conn);
963
964 return conn;
965}
966
967static int get_handle(int index, bdaddr_t *bdaddr, uint16_t *handle)
968{
969 struct dev_info *dev = &devs[index];
970 struct bt_conn *conn;
971 char addr[18];
972
973 ba2str(bdaddr, addr);
974 DBG("hci%d dba %s", index, addr);
975
976 conn = find_connection(dev, bdaddr);
977 if (conn == NULL)
978 return -ENOENT;
979
980 *handle = conn->handle;
981
982 return 0;
983}
984
985static int disconnect_addr(int index, bdaddr_t *dba, uint8_t reason)
986{
987 disconnect_cp cp;
988 uint16_t handle;
989 int err;
990
991 err = get_handle(index, dba, &handle);
992 if (err < 0)
993 return err;
994
995 memset(&cp, 0, sizeof(cp));
996 cp.handle = htobs(handle);
997 cp.reason = reason;
998
999 if (hci_send_cmd(devs[index].sk, OGF_LINK_CTL, OCF_DISCONNECT,
1000 DISCONNECT_CP_SIZE, &cp) < 0)
1001 return -errno;
1002
1003 return 0;
1004}
1005
1006static void bonding_complete(struct dev_info *dev, struct bt_conn *conn,
1007 uint8_t status)
1008{
1009 struct btd_adapter *adapter;
1010
1011 DBG("status 0x%02x", status);
1012
1013 if (conn->io != NULL) {
1014 /* bonding_connect_cb takes care of the successul case */
1015 if (status != 0)
1016 g_io_channel_shutdown(conn->io, TRUE, NULL);
1017 g_io_channel_unref(conn->io);
1018 conn->io = NULL;
1019 }
1020
1021 conn->bonding_initiator = FALSE;
1022
1023 adapter = manager_find_adapter(&dev->bdaddr);
1024 if (adapter)
1025 adapter_bonding_complete(adapter, &conn->bdaddr, status);
1026}
1027
1028static int get_auth_info(int index, bdaddr_t *bdaddr, uint8_t *auth)
1029{
1030 struct dev_info *dev = &devs[index];
1031 struct hci_auth_info_req req;
1032 char addr[18];
1033
1034 ba2str(bdaddr, addr);
1035 DBG("hci%d dba %s", index, addr);
1036
1037 memset(&req, 0, sizeof(req));
1038 bacpy(&req.bdaddr, bdaddr);
1039
1040 if (ioctl(dev->sk, HCIGETAUTHINFO, (unsigned long) &req) < 0)
1041 return -errno;
1042
1043 if (auth)
1044 *auth = req.type;
1045
1046 return 0;
1047}
1048
1049/* Link Key handling */
1050
1051static void link_key_request(int index, bdaddr_t *dba)
1052{
1053 struct dev_info *dev = &devs[index];
1054 struct link_key_info *key_info;
1055 struct bt_conn *conn;
1056 GSList *match;
1057 char da[18];
1058
1059 ba2str(dba, da);
1060 DBG("hci%d dba %s", index, da);
1061
1062 conn = get_connection(dev, dba);
1063 if (conn->handle == 0)
1064 conn->secmode3 = TRUE;
1065
1066 get_auth_info(index, dba, &conn->loc_auth);
1067
1068 DBG("kernel auth requirements = 0x%02x", conn->loc_auth);
1069
1070 match = g_slist_find_custom(dev->keys, dba, (GCompareFunc) bacmp);
1071 if (match)
1072 key_info = match->data;
1073 else
1074 key_info = NULL;
1075
1076 DBG("Matching key %s", key_info ? "found" : "not found");
1077
1078 if (key_info == NULL || (!dev->debug_keys && key_info->type == 0x03)) {
1079 /* Link key not found */
1080 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_LINK_KEY_NEG_REPLY,
1081 6, dba);
1082 return;
1083 }
1084
1085 /* Link key found */
1086
1087 DBG("link key type 0x%02x", key_info->type);
1088
1089 /* Don't use unauthenticated combination keys if MITM is
1090 * required */
1091 if (key_info->type == 0x04 && conn->loc_auth != 0xff &&
1092 (conn->loc_auth & 0x01))
1093 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_LINK_KEY_NEG_REPLY,
1094 6, dba);
1095 else {
1096 link_key_reply_cp lr;
1097
1098 memcpy(lr.link_key, key_info->key, 16);
1099 bacpy(&lr.bdaddr, dba);
1100
1101 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_LINK_KEY_REPLY,
1102 LINK_KEY_REPLY_CP_SIZE, &lr);
1103 }
1104}
1105
1106static void link_key_notify(int index, void *ptr)
1107{
1108 struct dev_info *dev = &devs[index];
1109 evt_link_key_notify *evt = ptr;
1110 bdaddr_t *dba = &evt->bdaddr;
1111 struct link_key_info *key_info;
1112 uint8_t old_key_type, key_type;
1113 struct bt_conn *conn;
1114 GSList *match;
1115 char da[18];
1116 uint8_t status = 0;
1117
1118 ba2str(dba, da);
1119 DBG("hci%d dba %s type %d", index, da, evt->key_type);
1120
1121 conn = get_connection(dev, &evt->bdaddr);
1122
1123 match = g_slist_find_custom(dev->keys, dba, (GCompareFunc) bacmp);
1124 if (match)
1125 key_info = match->data;
1126 else
1127 key_info = NULL;
1128
1129 if (key_info == NULL) {
1130 key_info = g_new0(struct link_key_info, 1);
1131 bacpy(&key_info->bdaddr, &evt->bdaddr);
1132 old_key_type = 0xff;
1133 } else {
1134 dev->keys = g_slist_remove(dev->keys, key_info);
1135 old_key_type = key_info->type;
1136 }
1137
1138 memcpy(key_info->key, evt->link_key, sizeof(evt->link_key));
1139 key_info->type = evt->key_type;
1140 key_info->pin_len = dev->pin_length;
1141
1142 key_type = evt->key_type;
1143
1144 DBG("key type 0x%02x old key type 0x%02x", key_type, old_key_type);
1145 DBG("local auth 0x%02x and remote auth 0x%02x",
1146 conn->loc_auth, conn->rem_auth);
1147
1148 if (key_type == HCI_LK_CHANGED_COMBINATION) {
1149 /* Some buggy controller combinations generate a changed
1150 * combination key for legacy pairing even when there's no
1151 * previous key */
1152 if (conn->rem_auth == 0xff && old_key_type == 0xff)
1153 key_type = HCI_LK_COMBINATION;
1154 else if (old_key_type != 0xff)
1155 key_type = old_key_type;
1156 else
1157 /* This is Changed Combination Link Key for
1158 * a temporary link key.*/
1159 goto done;
1160 }
1161
1162 key_info->type = key_type;
1163
1164 /* Skip the storage check if this is a debug key */
1165 if (key_type == HCI_LK_DEBUG_COMBINATION)
1166 goto done;
1167
1168 /* Store the link key persistently if one of the following is true:
1169 * 1. this is a legacy link key
1170 * 2. this is a changed combination key and there was a previously
1171 * stored one
1172 * 3. neither local nor remote side had no-bonding as a requirement
1173 * 4. the local side had dedicated bonding as a requirement
1174 * 5. the remote side is using dedicated bonding since in that case
1175 * also the local requirements are set to dedicated bonding
1176 * If none of the above match only keep the link key around for
1177 * this connection and set the temporary flag for the device.
1178 */
1179 if (key_type < HCI_LK_DEBUG_COMBINATION ||
1180 (key_type == HCI_LK_CHANGED_COMBINATION
1181 && old_key_type != HCI_LK_INVALID) ||
1182 (conn->loc_auth > 0x01 && conn->rem_auth > 0x01) ||
1183 (conn->loc_auth == 0x02 || conn->loc_auth == 0x03) ||
1184 (conn->rem_auth == 0x02 || conn->rem_auth == 0x03)) {
1185 int err;
1186
1187 err = btd_event_link_key_notify(&dev->bdaddr, dba,
1188 evt->link_key, key_type,
1189 dev->pin_length);
1190
1191 if (err == -ENODEV)
1192 status = HCI_OE_LOW_RESOURCES;
1193 else if (err < 0)
1194 status = HCI_MEMORY_FULL;
1195
1196 goto done;
1197 }
1198
1199done:
1200 dev->pin_length = 0;
1201
1202 if (status != 0) {
1203 g_free(key_info);
1204 bonding_complete(dev, conn, status);
1205 disconnect_addr(index, dba, status);
1206 return;
1207 }
1208
1209 dev->keys = g_slist_prepend(dev->keys, key_info);
1210
1211 /* If we're connected and not dedicated bonding initiators we're
1212 * done with the bonding process */
1213 if (!conn->bonding_initiator && conn->handle != 0)
1214 bonding_complete(dev, conn, 0);
1215}
1216
1217static void return_link_keys(int index, void *ptr)
1218{
1219 struct dev_info *dev = &devs[index];
1220 evt_return_link_keys *evt = ptr;
1221 uint8_t num = evt->num_keys;
1222 unsigned char key[16];
1223 char da[18];
1224 bdaddr_t dba;
1225 int i;
1226
1227 DBG("hci%d num_keys %u", index, num);
1228
1229 ptr++;
1230
1231 for (i = 0; i < num; i++) {
1232 bacpy(&dba, ptr); ba2str(&dba, da);
1233 memcpy(key, ptr + 6, 16);
1234
1235 DBG("hci%d returned key for %s", index, da);
1236
1237 btd_event_returned_link_key(&dev->bdaddr, &dba);
1238
1239 ptr += 22;
1240 }
1241}
1242
1243/* Simple Pairing handling */
1244
1245static int hciops_confirm_reply(int index, bdaddr_t *bdaddr, uint8_t bdaddr_type,
1246 gboolean success)
1247{
1248 struct dev_info *dev = &devs[index];
1249 user_confirm_reply_cp cp;
1250 char addr[18];
1251 int err;
1252
1253 ba2str(bdaddr, addr);
1254 DBG("hci%d dba %s success %d", index, addr, success);
1255
1256 memset(&cp, 0, sizeof(cp));
1257 bacpy(&cp.bdaddr, bdaddr);
1258
1259 if (success)
1260 err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
1261 OCF_USER_CONFIRM_REPLY,
1262 USER_CONFIRM_REPLY_CP_SIZE, &cp);
1263 else
1264 err = hci_send_cmd(dev->sk, OGF_LINK_CTL,
1265 OCF_USER_CONFIRM_NEG_REPLY,
1266 USER_CONFIRM_REPLY_CP_SIZE, &cp);
1267
1268 if (err < 0)
1269 err = -errno;
1270
1271 return err;
1272}
1273
1274static void user_confirm_request(int index, void *ptr)
1275{
1276 struct dev_info *dev = &devs[index];
1277 evt_user_confirm_request *req = ptr;
1278 gboolean loc_mitm, rem_mitm;
1279 struct bt_conn *conn;
1280
1281 DBG("hci%d", index);
1282
1283 conn = find_connection(dev, &req->bdaddr);
1284 if (conn == NULL)
1285 return;
1286
1287 loc_mitm = (conn->loc_auth & 0x01) ? TRUE : FALSE;
1288 rem_mitm = (conn->rem_auth & 0x01) ? TRUE : FALSE;
1289
1290 /* If we require MITM but the remote device can't provide that
1291 * (it has NoInputNoOutput) then reject the confirmation
1292 * request. The only exception is when we're dedicated bonding
1293 * initiators since then we always have the MITM bit set. */
1294 if (!conn->bonding_initiator && loc_mitm && conn->rem_cap == 0x03) {
1295 error("Rejecting request: remote device can't provide MITM");
1296 goto fail;
1297 }
1298
1299 /* If no side requires MITM protection; auto-accept */
1300 if ((conn->loc_auth == 0xff || !loc_mitm || conn->rem_cap == 0x03) &&
1301 (!rem_mitm || conn->loc_cap == 0x03)) {
1302 DBG("auto accept of confirmation");
1303
1304 /* Wait 5 milliseconds before doing auto-accept */
1305 usleep(5000);
1306
1307 if (hciops_confirm_reply(index, &req->bdaddr,
1308 BDADDR_BREDR, TRUE) < 0)
1309 goto fail;
1310
1311 return;
1312 }
1313
1314 if (btd_event_user_confirm(&dev->bdaddr, &req->bdaddr,
1315 btohl(req->passkey)) == 0)
1316 return;
1317
1318fail:
1319 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_USER_CONFIRM_NEG_REPLY,
1320 6, ptr);
1321}
1322
1323static void user_passkey_request(int index, void *ptr)
1324{
1325 struct dev_info *dev = &devs[index];
1326 evt_user_passkey_request *req = ptr;
1327
1328 DBG("hci%d", index);
1329
1330 if (btd_event_user_passkey(&dev->bdaddr, &req->bdaddr) < 0)
1331 hci_send_cmd(dev->sk, OGF_LINK_CTL,
1332 OCF_USER_PASSKEY_NEG_REPLY, 6, ptr);
1333}
1334
1335static void user_passkey_notify(int index, void *ptr)
1336{
1337 struct dev_info *dev = &devs[index];
1338 evt_user_passkey_notify *req = ptr;
1339
1340 DBG("hci%d", index);
1341
1342 btd_event_user_notify(&dev->bdaddr, &req->bdaddr,
1343 btohl(req->passkey));
1344}
1345
1346static gint oob_bdaddr_cmp(gconstpointer a, gconstpointer b)
1347{
1348 const struct oob_data *data = a;
1349 const bdaddr_t *bdaddr = b;
1350
1351 return bacmp(&data->bdaddr, bdaddr);
1352}
1353
1354static void remote_oob_data_request(int index, bdaddr_t *bdaddr)
1355{
1356 struct dev_info *dev = &devs[index];
1357 GSList *match;
1358
1359 DBG("hci%d", index);
1360
1361 match = g_slist_find_custom(dev->oob_data, bdaddr, oob_bdaddr_cmp);
1362
1363 if (match) {
1364 struct oob_data *data;
1365 remote_oob_data_reply_cp cp;
1366
1367 data = match->data;
1368
1369 bacpy(&cp.bdaddr, &data->bdaddr);
1370 memcpy(cp.hash, data->hash, sizeof(cp.hash));
1371 memcpy(cp.randomizer, data->randomizer, sizeof(cp.randomizer));
1372
1373 dev->oob_data = g_slist_delete_link(dev->oob_data, match);
1374
1375 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_REMOTE_OOB_DATA_REPLY,
1376 REMOTE_OOB_DATA_REPLY_CP_SIZE, &cp);
1377
1378 } else {
1379 hci_send_cmd(dev->sk, OGF_LINK_CTL,
1380 OCF_REMOTE_OOB_DATA_NEG_REPLY, 6, bdaddr);
1381 }
1382}
1383
1384static int get_io_cap(int index, bdaddr_t *bdaddr, uint8_t *cap, uint8_t *auth)
1385{
1386 struct dev_info *dev = &devs[index];
1387 struct bt_conn *conn;
1388 int err;
1389
1390 conn = find_connection(dev, bdaddr);
1391 if (conn == NULL)
1392 return -ENOENT;
1393
1394 err = get_auth_info(index, bdaddr, &conn->loc_auth);
1395 if (err < 0)
1396 return err;
1397
1398 DBG("initial authentication requirement is 0x%02x", conn->loc_auth);
1399
1400 if (!dev->pairable && !conn->bonding_initiator) {
1401 if (conn->rem_auth < 0x02) {
1402 DBG("Allowing no bonding in non-bondable mode");
1403 /* Kernel defaults to general bonding and so
1404 * overwrite for this special case. Otherwise
1405 * non-pairable test cases will fail. */
1406 conn->loc_auth = conn->rem_auth;
1407 goto done;
1408 }
1409
1410 return -EPERM;
1411 }
1412
1413 /* If the kernel doesn't know the local requirement just mirror
1414 * the remote one */
1415 if (conn->loc_auth == 0xff)
1416 conn->loc_auth = conn->rem_auth;
1417
1418 if (conn->loc_auth == 0x00 || conn->loc_auth == 0x04) {
1419 /* If remote requests dedicated bonding follow that lead */
1420 if (conn->rem_auth == 0x02 || conn->rem_auth == 0x03) {
1421
1422 /* If both remote and local IO capabilities allow MITM
1423 * then require it, otherwise don't */
1424 if (conn->rem_cap == 0x03 || conn->loc_cap == 0x03)
1425 conn->loc_auth = 0x02;
1426 else
1427 conn->loc_auth = 0x03;
1428 }
1429
1430 /* If remote indicates no bonding then follow that. This
1431 * is important since the kernel might give general bonding
1432 * as default. */
1433 if (conn->rem_auth == 0x00 || conn->rem_auth == 0x01)
1434 conn->loc_auth = 0x00;
1435
1436 /* If remote requires MITM then also require it, unless
1437 * our IO capability is NoInputNoOutput (so some
1438 * just-works security cases can be tested) */
1439 if (conn->rem_auth != 0xff && (conn->rem_auth & 0x01) &&
1440 conn->loc_cap != 0x03)
1441 conn->loc_auth |= 0x01;
1442 }
1443
1444done:
1445 *cap = conn->loc_cap;
1446 *auth = conn->loc_auth;
1447
1448 DBG("final authentication requirement is 0x%02x", *auth);
1449
1450 return 0;
1451}
1452
1453static void io_capa_request(int index, void *ptr)
1454{
1455 struct dev_info *dev = &devs[index];
1456 bdaddr_t *dba = ptr;
1457 uint8_t cap, auth = 0xff;
1458 char da[18];
1459 int err;
1460
1461 ba2str(dba, da);
1462 DBG("hci%d IO capability request for %s", index, da);
1463
1464 err = get_io_cap(index, dba, &cap, &auth);
1465 if (err < 0) {
1466 io_capability_neg_reply_cp cp;
1467
1468 error("Getting IO capability failed: %s (%d)",
1469 strerror(-err), -err);
1470
1471 memset(&cp, 0, sizeof(cp));
1472 bacpy(&cp.bdaddr, dba);
1473 cp.reason = HCI_PAIRING_NOT_ALLOWED;
1474 hci_send_cmd(dev->sk, OGF_LINK_CTL,
1475 OCF_IO_CAPABILITY_NEG_REPLY,
1476 IO_CAPABILITY_NEG_REPLY_CP_SIZE, &cp);
1477 } else {
1478 io_capability_reply_cp cp;
1479 struct bt_conn *conn;
1480 GSList *match;
1481
1482 memset(&cp, 0, sizeof(cp));
1483 bacpy(&cp.bdaddr, dba);
1484 cp.capability = cap;
1485 cp.authentication = auth;
1486
1487 conn = find_connection(dev, dba);
1488 match = g_slist_find_custom(dev->oob_data, dba, oob_bdaddr_cmp);
1489
1490 if ((conn->bonding_initiator || conn->rem_oob_data == 0x01) &&
1491 match)
1492 cp.oob_data = 0x01;
1493 else
1494 cp.oob_data = 0x00;
1495
1496 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_IO_CAPABILITY_REPLY,
1497 IO_CAPABILITY_REPLY_CP_SIZE, &cp);
1498 }
1499}
1500
1501static void io_capa_response(int index, void *ptr)
1502{
1503 struct dev_info *dev = &devs[index];
1504 evt_io_capability_response *evt = ptr;
1505 struct bt_conn *conn;
1506 char da[18];
1507
1508 ba2str(&evt->bdaddr, da);
1509 DBG("hci%d IO capability response from %s", index, da);
1510
1511 conn = find_connection(dev, &evt->bdaddr);
1512 if (conn) {
1513 conn->rem_cap = evt->capability;
1514 conn->rem_auth = evt->authentication;
1515 conn->rem_oob_data = evt->oob_data;
1516 }
1517}
1518
1519/* PIN code handling */
1520
1521static void pin_code_request(int index, bdaddr_t *dba)
1522{
1523 struct dev_info *dev = &devs[index];
1524 struct bt_conn *conn;
1525 char addr[18];
1526 int err;
1527
1528 ba2str(dba, addr);
1529 DBG("hci%d PIN request for %s", index, addr);
1530
1531 conn = get_connection(dev, dba);
1532 if (conn->handle == 0)
1533 conn->secmode3 = TRUE;
1534
1535 /* Check if the adapter is not pairable and if there isn't a bonding in
1536 * progress */
1537 if (!dev->pairable && !conn->bonding_initiator) {
1538 DBG("Rejecting PIN request in non-pairable mode");
1539 goto reject;
1540 }
1541
1542 err = btd_event_request_pin(&dev->bdaddr, dba, FALSE);
1543 if (err < 0) {
1544 error("PIN code negative reply: %s", strerror(-err));
1545 goto reject;
1546 }
1547
1548 return;
1549
1550reject:
1551 hci_send_cmd(dev->sk, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, dba);
1552}
1553
1554static inline void remote_features_notify(int index, void *ptr)
1555{
1556 struct dev_info *dev = &devs[index];
1557 evt_remote_host_features_notify *evt = ptr;
1558
1559 if (evt->features[0] & 0x01)
1560 btd_event_set_legacy_pairing(&dev->bdaddr, &evt->bdaddr,
1561 FALSE);
1562 else
1563 btd_event_set_legacy_pairing(&dev->bdaddr, &evt->bdaddr,
1564 TRUE);
1565
1566 write_features_info(&dev->bdaddr, &evt->bdaddr, NULL, evt->features);
1567}
1568
1569static void read_local_version_complete(int index,
1570 const read_local_version_rp *rp)
1571{
1572 struct dev_info *dev = &devs[index];
1573
1574 if (rp->status)
1575 return;
1576
1577 dev->ver.manufacturer = btohs(bt_get_unaligned(&rp->manufacturer));
1578 dev->ver.hci_ver = rp->hci_ver;
1579 dev->ver.hci_rev = btohs(bt_get_unaligned(&rp->hci_rev));
1580 dev->ver.lmp_ver = rp->lmp_ver;
1581 dev->ver.lmp_subver = btohs(bt_get_unaligned(&rp->lmp_subver));
1582
1583 if (!dev->pending)
1584 return;
1585
1586 hci_clear_bit(PENDING_VERSION, &dev->pending);
1587
1588 DBG("Got version for hci%d", index);
1589
1590 if (!dev->pending && dev->up)
1591 init_adapter(index);
1592}
1593
1594static void read_local_features_complete(int index,
1595 const read_local_features_rp *rp)
1596{
1597 struct dev_info *dev = &devs[index];
1598
1599 if (rp->status)
1600 return;
1601
1602 memcpy(dev->features, rp->features, 8);
1603
1604 if (!dev->pending)
1605 return;
1606
1607 hci_clear_bit(PENDING_FEATURES, &dev->pending);
1608
1609 DBG("Got features for hci%d", index);
1610
1611 if (!dev->pending && dev->up)
1612 init_adapter(index);
1613}
1614
1615static void update_name(int index, const char *name)
1616{
1617 struct btd_adapter *adapter;
1618
1619 adapter = manager_find_adapter_by_id(index);
1620 if (adapter)
1621 adapter_name_changed(adapter, name);
1622
1623 update_ext_inquiry_response(index);
1624}
1625
1626static void read_local_name_complete(int index, read_local_name_rp *rp)
1627{
1628 struct dev_info *dev = &devs[index];
1629
1630 DBG("hci%d status %u", index, rp->status);
1631
1632 if (rp->status)
1633 return;
1634
1635 memcpy(dev->name, rp->name, 248);
1636
1637 if (!dev->pending) {
1638 update_name(index, (char *) rp->name);
1639 return;
1640 }
1641
1642 hci_clear_bit(PENDING_NAME, &dev->pending);
1643
1644 DBG("Got name for hci%d", index);
1645
1646 if (!dev->pending && dev->up)
1647 init_adapter(index);
1648}
1649
1650static void read_tx_power_complete(int index, void *ptr)
1651{
1652 struct dev_info *dev = &devs[index];
1653
1654 read_inq_response_tx_power_level_rp *rp = ptr;
1655
1656 DBG("hci%d status %u", index, rp->status);
1657
1658 if (rp->status)
1659 return;
1660
1661 dev->tx_power = rp->level;
1662 update_ext_inquiry_response(index);
1663}
1664
1665static void read_simple_pairing_mode_complete(int index, void *ptr)
1666{
1667 struct dev_info *dev = &devs[index];
1668 read_simple_pairing_mode_rp *rp = ptr;
1669
1670 DBG("hci%d status %u", index, rp->status);
1671
1672 if (rp->status)
1673 return;
1674
1675 dev->ssp_mode = rp->mode;
1676 update_ext_inquiry_response(index);
1677}
1678
1679static void read_local_ext_features_complete(int index,
1680 const read_local_ext_features_rp *rp)
1681{
1682 struct dev_info *dev = &devs[index];
1683
1684 DBG("hci%d status %u", index, rp->status);
1685
1686 if (rp->status)
1687 return;
1688
1689 /* Local Extended feature page number is 1 */
1690 if (rp->page_num != 1)
1691 return;
1692
1693 memcpy(dev->extfeatures, rp->features, sizeof(dev->extfeatures));
1694}
1695
1696static void read_bd_addr_complete(int index, read_bd_addr_rp *rp)
1697{
1698 struct dev_info *dev = &devs[index];
1699
1700 DBG("hci%d status %u", index, rp->status);
1701
1702 if (rp->status)
1703 return;
1704
1705 bacpy(&dev->bdaddr, &rp->bdaddr);
1706
1707 if (!dev->pending)
1708 return;
1709
1710 hci_clear_bit(PENDING_BDADDR, &dev->pending);
1711
1712 DBG("Got bdaddr for hci%d", index);
1713
1714 if (!dev->pending && dev->up)
1715 init_adapter(index);
1716}
1717
1718static inline void cs_inquiry_evt(int index, uint8_t status)
1719{
1720 if (status) {
1721 error("Inquiry Failed with status 0x%02x", status);
1722 return;
1723 }
1724
1725 set_state(index, DISCOV_INQ);
1726}
1727
1728static inline void cmd_status(int index, void *ptr)
1729{
1730 evt_cmd_status *evt = ptr;
1731 uint16_t opcode = btohs(evt->opcode);
1732
1733 if (opcode == cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY))
1734 cs_inquiry_evt(index, evt->status);
1735}
1736
1737static gboolean discoverable_timeout_handler(gpointer user_data)
1738{
1739 struct dev_info *dev = user_data;
1740
1741 hciops_set_discoverable(dev->id, FALSE, 0);
1742
1743 return FALSE;
1744}
1745
1746/* Limited Discoverable bit mask in CoD */
1747#define LIMITED_BIT 0x002000
1748
1749static int hciops_set_limited_discoverable(int index, gboolean limited)
1750{
1751 struct dev_info *dev = &devs[index];
1752 int num = (limited ? 2 : 1);
1753 uint8_t lap[] = { 0x33, 0x8b, 0x9e, 0x00, 0x8b, 0x9e };
1754 write_current_iac_lap_cp cp;
1755
1756 DBG("hci%d limited %d", index, limited);
1757
1758 /* Check if limited bit needs to be set/reset */
1759 if (limited)
1760 dev->wanted_cod |= LIMITED_BIT;
1761 else
1762 dev->wanted_cod &= ~LIMITED_BIT;
1763
1764 /* If we dont need the toggling, save an unnecessary CoD write */
1765 if (dev->pending_cod || dev->wanted_cod == dev->current_cod)
1766 return 0;
1767
1768 /*
1769 * 1: giac
1770 * 2: giac + liac
1771 */
1772 memset(&cp, 0, sizeof(cp));
1773 cp.num_current_iac = num;
1774 memcpy(&cp.lap, lap, num * 3);
1775
1776 if (hci_send_cmd(dev->sk, OGF_HOST_CTL, OCF_WRITE_CURRENT_IAC_LAP,
1777 (num * 3 + 1), &cp) < 0)
1778 return -errno;
1779
1780 return write_class(index, dev->wanted_cod);
1781}
1782
1783static void reset_discoverable_timeout(int index)
1784{
1785 struct dev_info *dev = &devs[index];
1786
1787 if (dev->discoverable_id > 0) {
1788 g_source_remove(dev->discoverable_id);
1789 dev->discoverable_id = 0;
1790 }
1791}
1792
1793static void set_discoverable_timeout(int index)
1794{
1795 struct dev_info *dev = &devs[index];
1796
1797 reset_discoverable_timeout(index);
1798
1799 if (dev->discoverable_timeout == 0) {
1800 hciops_set_limited_discoverable(index, FALSE);
1801 return;
1802 }
1803
1804 /* Set limited discoverable if pairable and interval between 0 to 60
1805 sec */
1806 if (dev->pairable && dev->discoverable_timeout <= 60)
1807 hciops_set_limited_discoverable(index, TRUE);
1808 else
1809 hciops_set_limited_discoverable(index, FALSE);
1810
1811 dev->discoverable_id = g_timeout_add_seconds(dev->discoverable_timeout,
1812 discoverable_timeout_handler,
1813 dev);
1814}
1815
1816static void read_scan_complete(int index, uint8_t status, void *ptr)
1817{
1818 struct btd_adapter *adapter;
1819 read_scan_enable_rp *rp = ptr;
1820
1821 DBG("hci%d status %u", index, status);
1822
1823 switch (rp->enable) {
1824 case (SCAN_PAGE | SCAN_INQUIRY):
1825 case SCAN_INQUIRY:
1826 set_discoverable_timeout(index);
1827 break;
1828 default:
1829 reset_discoverable_timeout(index);
1830 hciops_set_limited_discoverable(index, FALSE);
1831 }
1832
1833 adapter = manager_find_adapter_by_id(index);
1834 if (!adapter) {
1835 error("Unable to find matching adapter");
1836 return;
1837 }
1838
1839 adapter_mode_changed(adapter, rp->enable);
1840}
1841
1842static void write_class_complete(int index, uint8_t status)
1843{
1844 struct dev_info *dev = &devs[index];
1845 struct btd_adapter *adapter;
1846
1847 if (status)
1848 return;
1849
1850 if (dev->pending_cod == 0)
1851 return;
1852
1853 dev->current_cod = dev->pending_cod;
1854 dev->pending_cod = 0;
1855
1856 adapter = manager_find_adapter(&dev->bdaddr);
1857 if (adapter)
1858 btd_adapter_class_changed(adapter, dev->current_cod);
1859
1860 update_ext_inquiry_response(index);
1861
1862 if (dev->wanted_cod == dev->current_cod)
1863 return;
1864
1865 if (dev->wanted_cod & LIMITED_BIT &&
1866 !(dev->current_cod & LIMITED_BIT))
1867 hciops_set_limited_discoverable(index, TRUE);
1868 else if (!(dev->wanted_cod & LIMITED_BIT) &&
1869 (dev->current_cod & LIMITED_BIT))
1870 hciops_set_limited_discoverable(index, FALSE);
1871 else
1872 write_class(index, dev->wanted_cod);
1873}
1874
1875static void read_local_oob_data_complete(int index, uint8_t status,
1876 read_local_oob_data_rp *rp)
1877{
1878 struct btd_adapter *adapter = manager_find_adapter_by_id(index);
1879
1880 if (!adapter)
1881 return;
1882
1883 if (status)
1884 oob_read_local_data_complete(adapter, NULL, NULL);
1885 else
1886 oob_read_local_data_complete(adapter, rp->hash, rp->randomizer);
1887}
1888
1889static inline void inquiry_complete_evt(int index, uint8_t status)
1890{
1891 int adapter_type;
1892 struct btd_adapter *adapter;
1893
1894 if (status) {
1895 error("Inquiry Failed with status 0x%02x", status);
1896 return;
1897 }
1898
1899 adapter = manager_find_adapter_by_id(index);
1900 if (!adapter) {
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: