1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_INCLUDE_BLUETOOTH_H
18 #define ANDROID_INCLUDE_BLUETOOTH_H
19 
20 #include <stdbool.h>
21 #include <stdint.h>
22 #include <sys/cdefs.h>
23 #include <sys/types.h>
24 
25 #include "avrcp/avrcp.h"
26 #include "bluetooth/uuid.h"
27 #include "raw_address.h"
28 
29 /**
30  * The Bluetooth Hardware Module ID
31  */
32 
33 #define BT_HARDWARE_MODULE_ID "bluetooth"
34 #define BT_STACK_MODULE_ID "bluetooth"
35 
36 /** Bluetooth profile interface IDs */
37 #define BT_PROFILE_HANDSFREE_ID "handsfree"
38 #define BT_PROFILE_HANDSFREE_CLIENT_ID "handsfree_client"
39 #define BT_PROFILE_ADVANCED_AUDIO_ID "a2dp"
40 #define BT_PROFILE_ADVANCED_AUDIO_SINK_ID "a2dp_sink"
41 #define BT_PROFILE_HEALTH_ID "health"
42 #define BT_PROFILE_SOCKETS_ID "socket"
43 #define BT_PROFILE_HIDHOST_ID "hidhost"
44 #define BT_PROFILE_HIDDEV_ID "hiddev"
45 #define BT_PROFILE_PAN_ID "pan"
46 #define BT_PROFILE_MAP_CLIENT_ID "map_client"
47 #define BT_PROFILE_SDP_CLIENT_ID "sdp"
48 #define BT_PROFILE_GATT_ID "gatt"
49 #define BT_PROFILE_AV_RC_ID "avrcp"
50 #define BT_PROFILE_AV_RC_CTRL_ID "avrcp_ctrl"
51 #define BT_PROFILE_HEARING_AID_ID "hearing_aid"
52 
53 /** Bluetooth test interface IDs */
54 #define BT_TEST_INTERFACE_MCAP_ID "mcap_test"
55 
56 /** Bluetooth Device Name */
57 typedef struct { uint8_t name[249]; } __attribute__((packed)) bt_bdname_t;
58 
59 /** Bluetooth Adapter Visibility Modes*/
60 typedef enum {
61   BT_SCAN_MODE_NONE,
62   BT_SCAN_MODE_CONNECTABLE,
63   BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE
64 } bt_scan_mode_t;
65 
66 /** Bluetooth Adapter State */
67 typedef enum { BT_STATE_OFF, BT_STATE_ON } bt_state_t;
68 
69 /** Bluetooth Error Status */
70 /** We need to build on this */
71 
72 typedef enum {
73   BT_STATUS_SUCCESS,
74   BT_STATUS_FAIL,
75   BT_STATUS_NOT_READY,
76   BT_STATUS_NOMEM,
77   BT_STATUS_BUSY,
78   BT_STATUS_DONE, /* request already completed */
79   BT_STATUS_UNSUPPORTED,
80   BT_STATUS_PARM_INVALID,
81   BT_STATUS_UNHANDLED,
82   BT_STATUS_AUTH_FAILURE,
83   BT_STATUS_RMT_DEV_DOWN,
84   BT_STATUS_AUTH_REJECTED,
85   BT_STATUS_JNI_ENVIRONMENT_ERROR,
86   BT_STATUS_JNI_THREAD_ATTACH_ERROR,
87   BT_STATUS_WAKELOCK_ERROR
88 } bt_status_t;
89 
90 /** Bluetooth PinKey Code */
91 typedef struct { uint8_t pin[16]; } __attribute__((packed)) bt_pin_code_t;
92 
93 typedef struct {
94   uint8_t status;
95   uint8_t ctrl_state;   /* stack reported state */
96   uint64_t tx_time;     /* in ms */
97   uint64_t rx_time;     /* in ms */
98   uint64_t idle_time;   /* in ms */
99   uint64_t energy_used; /* a product of mA, V and ms */
100 } __attribute__((packed)) bt_activity_energy_info;
101 
102 typedef struct {
103   int32_t app_uid;
104   uint64_t tx_bytes;
105   uint64_t rx_bytes;
106 } __attribute__((packed)) bt_uid_traffic_t;
107 
108 /** Bluetooth Adapter Discovery state */
109 typedef enum {
110   BT_DISCOVERY_STOPPED,
111   BT_DISCOVERY_STARTED
112 } bt_discovery_state_t;
113 
114 /** Bluetooth ACL connection state */
115 typedef enum {
116   BT_ACL_STATE_CONNECTED,
117   BT_ACL_STATE_DISCONNECTED
118 } bt_acl_state_t;
119 
120 /** Bluetooth SDP service record */
121 typedef struct {
122   bluetooth::Uuid uuid;
123   uint16_t channel;
124   char name[256];  // what's the maximum length
125 } bt_service_record_t;
126 
127 /** Bluetooth Remote Version info */
128 typedef struct {
129   int version;
130   int sub_ver;
131   int manufacturer;
132 } bt_remote_version_t;
133 
134 typedef struct {
135   uint16_t version_supported;
136   uint8_t local_privacy_enabled;
137   uint8_t max_adv_instance;
138   uint8_t rpa_offload_supported;
139   uint8_t max_irk_list_size;
140   uint8_t max_adv_filter_supported;
141   uint8_t activity_energy_info_supported;
142   uint16_t scan_result_storage_size;
143   uint16_t total_trackable_advertisers;
144   bool extended_scan_support;
145   bool debug_logging_supported;
146   bool le_2m_phy_supported;
147   bool le_coded_phy_supported;
148   bool le_extended_advertising_supported;
149   bool le_periodic_advertising_supported;
150   uint16_t le_maximum_advertising_data_length;
151 } bt_local_le_features_t;
152 
153 /* Bluetooth Adapter and Remote Device property types */
154 typedef enum {
155   /* Properties common to both adapter and remote device */
156   /**
157    * Description - Bluetooth Device Name
158    * Access mode - Adapter name can be GET/SET. Remote device can be GET
159    * Data type   - bt_bdname_t
160    */
161   BT_PROPERTY_BDNAME = 0x1,
162   /**
163    * Description - Bluetooth Device Address
164    * Access mode - Only GET.
165    * Data type   - RawAddress
166    */
167   BT_PROPERTY_BDADDR,
168   /**
169    * Description - Bluetooth Service 128-bit UUIDs
170    * Access mode - Only GET.
171    * Data type   - Array of bluetooth::Uuid (Array size inferred from property
172    *               length).
173    */
174   BT_PROPERTY_UUIDS,
175   /**
176    * Description - Bluetooth Class of Device as found in Assigned Numbers
177    * Access mode - Only GET.
178    * Data type   - uint32_t.
179    */
180   BT_PROPERTY_CLASS_OF_DEVICE,
181   /**
182    * Description - Device Type - BREDR, BLE or DUAL Mode
183    * Access mode - Only GET.
184    * Data type   - bt_device_type_t
185    */
186   BT_PROPERTY_TYPE_OF_DEVICE,
187   /**
188    * Description - Bluetooth Service Record
189    * Access mode - Only GET.
190    * Data type   - bt_service_record_t
191    */
192   BT_PROPERTY_SERVICE_RECORD,
193 
194   /* Properties unique to adapter */
195   /**
196    * Description - Bluetooth Adapter scan mode
197    * Access mode - GET and SET
198    * Data type   - bt_scan_mode_t.
199    */
200   BT_PROPERTY_ADAPTER_SCAN_MODE,
201   /**
202    * Description - List of bonded devices
203    * Access mode - Only GET.
204    * Data type   - Array of RawAddress of the bonded remote devices
205    *               (Array size inferred from property length).
206    */
207   BT_PROPERTY_ADAPTER_BONDED_DEVICES,
208   /**
209    * Description - Bluetooth Adapter Discovery timeout (in seconds)
210    * Access mode - GET and SET
211    * Data type   - uint32_t
212    */
213   BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT,
214 
215   /* Properties unique to remote device */
216   /**
217    * Description - User defined friendly name of the remote device
218    * Access mode - GET and SET
219    * Data type   - bt_bdname_t.
220    */
221   BT_PROPERTY_REMOTE_FRIENDLY_NAME,
222   /**
223    * Description - RSSI value of the inquired remote device
224    * Access mode - Only GET.
225    * Data type   - int8_t.
226    */
227   BT_PROPERTY_REMOTE_RSSI,
228   /**
229    * Description - Remote version info
230    * Access mode - SET/GET.
231    * Data type   - bt_remote_version_t.
232    */
233 
234   BT_PROPERTY_REMOTE_VERSION_INFO,
235 
236   /**
237    * Description - Local LE features
238    * Access mode - GET.
239    * Data type   - bt_local_le_features_t.
240    */
241   BT_PROPERTY_LOCAL_LE_FEATURES,
242 
243   BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP = 0xFF,
244 } bt_property_type_t;
245 
246 /** Bluetooth Adapter Property data structure */
247 typedef struct {
248   bt_property_type_t type;
249   int len;
250   void* val;
251 } bt_property_t;
252 
253 /** Bluetooth Out Of Band data for bonding */
254 typedef struct {
255   uint8_t le_bt_dev_addr[7]; /* LE Bluetooth Device Address */
256   uint8_t c192[16];          /* Simple Pairing Hash C-192 */
257   uint8_t r192[16];          /* Simple Pairing Randomizer R-192 */
258   uint8_t c256[16];          /* Simple Pairing Hash C-256 */
259   uint8_t r256[16];          /* Simple Pairing Randomizer R-256 */
260   uint8_t sm_tk[16];         /* Security Manager TK Value */
261   uint8_t le_sc_c[16];       /* LE Secure Connections Confirmation Value */
262   uint8_t le_sc_r[16];       /* LE Secure Connections Random Value */
263 } bt_out_of_band_data_t;
264 
265 /** Bluetooth Device Type */
266 typedef enum {
267   BT_DEVICE_DEVTYPE_BREDR = 0x1,
268   BT_DEVICE_DEVTYPE_BLE,
269   BT_DEVICE_DEVTYPE_DUAL
270 } bt_device_type_t;
271 /** Bluetooth Bond state */
272 typedef enum {
273   BT_BOND_STATE_NONE,
274   BT_BOND_STATE_BONDING,
275   BT_BOND_STATE_BONDED
276 } bt_bond_state_t;
277 
278 /** Bluetooth SSP Bonding Variant */
279 typedef enum {
280   BT_SSP_VARIANT_PASSKEY_CONFIRMATION,
281   BT_SSP_VARIANT_PASSKEY_ENTRY,
282   BT_SSP_VARIANT_CONSENT,
283   BT_SSP_VARIANT_PASSKEY_NOTIFICATION
284 } bt_ssp_variant_t;
285 
286 #define BT_MAX_NUM_UUIDS 32
287 
288 /** Bluetooth Interface callbacks */
289 
290 /** Bluetooth Enable/Disable Callback. */
291 typedef void (*adapter_state_changed_callback)(bt_state_t state);
292 
293 /** GET/SET Adapter Properties callback */
294 /* TODO: For the GET/SET property APIs/callbacks, we may need a session
295  * identifier to associate the call with the callback. This would be needed
296  * whenever more than one simultaneous instance of the same adapter_type
297  * is get/set.
298  *
299  * If this is going to be handled in the Java framework, then we do not need
300  * to manage sessions here.
301  */
302 typedef void (*adapter_properties_callback)(bt_status_t status,
303                                             int num_properties,
304                                             bt_property_t* properties);
305 
306 /** GET/SET Remote Device Properties callback */
307 /** TODO: For remote device properties, do not see a need to get/set
308  * multiple properties - num_properties shall be 1
309  */
310 typedef void (*remote_device_properties_callback)(bt_status_t status,
311                                                   RawAddress* bd_addr,
312                                                   int num_properties,
313                                                   bt_property_t* properties);
314 
315 /** New device discovered callback */
316 /** If EIR data is not present, then BD_NAME and RSSI shall be NULL and -1
317  * respectively */
318 typedef void (*device_found_callback)(int num_properties,
319                                       bt_property_t* properties);
320 
321 /** Discovery state changed callback */
322 typedef void (*discovery_state_changed_callback)(bt_discovery_state_t state);
323 
324 /** Bluetooth Legacy PinKey Request callback */
325 typedef void (*pin_request_callback)(RawAddress* remote_bd_addr,
326                                      bt_bdname_t* bd_name, uint32_t cod,
327                                      bool min_16_digit);
328 
329 /** Bluetooth SSP Request callback - Just Works & Numeric Comparison*/
330 /** pass_key - Shall be 0 for BT_SSP_PAIRING_VARIANT_CONSENT &
331  *  BT_SSP_PAIRING_PASSKEY_ENTRY */
332 /* TODO: Passkey request callback shall not be needed for devices with display
333  * capability. We still need support this in the stack for completeness */
334 typedef void (*ssp_request_callback)(RawAddress* remote_bd_addr,
335                                      bt_bdname_t* bd_name, uint32_t cod,
336                                      bt_ssp_variant_t pairing_variant,
337                                      uint32_t pass_key);
338 
339 /** Bluetooth Bond state changed callback */
340 /* Invoked in response to create_bond, cancel_bond or remove_bond */
341 typedef void (*bond_state_changed_callback)(bt_status_t status,
342                                             RawAddress* remote_bd_addr,
343                                             bt_bond_state_t state);
344 
345 /** Bluetooth ACL connection state changed callback */
346 typedef void (*acl_state_changed_callback)(bt_status_t status,
347                                            RawAddress* remote_bd_addr,
348                                            bt_acl_state_t state);
349 
350 typedef enum { ASSOCIATE_JVM, DISASSOCIATE_JVM } bt_cb_thread_evt;
351 
352 /** Thread Associate/Disassociate JVM Callback */
353 /* Callback that is invoked by the callback thread to allow upper layer to
354  * attach/detach to/from the JVM */
355 typedef void (*callback_thread_event)(bt_cb_thread_evt evt);
356 
357 /** Bluetooth Test Mode Callback */
358 /* Receive any HCI event from controller. Must be in DUT Mode for this callback
359  * to be received */
360 typedef void (*dut_mode_recv_callback)(uint16_t opcode, uint8_t* buf,
361                                        uint8_t len);
362 
363 /* LE Test mode callbacks
364  * This callback shall be invoked whenever the le_tx_test, le_rx_test or
365  * le_test_end is invoked The num_packets is valid only for le_test_end command
366  */
367 typedef void (*le_test_mode_callback)(bt_status_t status, uint16_t num_packets);
368 
369 /** Callback invoked when energy details are obtained */
370 /* Ctrl_state-Current controller state-Active-1,scan-2,or idle-3 state as
371  * defined by HCI spec. If the ctrl_state value is 0, it means the API call
372  * failed Time values-In milliseconds as returned by the controller Energy
373  * used-Value as returned by the controller Status-Provides the status of the
374  * read_energy_info API call uid_data provides an array of bt_uid_traffic_t,
375  * where the array is terminated by an element with app_uid set to -1.
376  */
377 typedef void (*energy_info_callback)(bt_activity_energy_info* energy_info,
378                                      bt_uid_traffic_t* uid_data);
379 
380 /** TODO: Add callbacks for Link Up/Down and other generic
381  *  notifications/callbacks */
382 
383 /** Bluetooth DM callback structure. */
384 typedef struct {
385   /** set to sizeof(bt_callbacks_t) */
386   size_t size;
387   adapter_state_changed_callback adapter_state_changed_cb;
388   adapter_properties_callback adapter_properties_cb;
389   remote_device_properties_callback remote_device_properties_cb;
390   device_found_callback device_found_cb;
391   discovery_state_changed_callback discovery_state_changed_cb;
392   pin_request_callback pin_request_cb;
393   ssp_request_callback ssp_request_cb;
394   bond_state_changed_callback bond_state_changed_cb;
395   acl_state_changed_callback acl_state_changed_cb;
396   callback_thread_event thread_evt_cb;
397   dut_mode_recv_callback dut_mode_recv_cb;
398   le_test_mode_callback le_test_mode_cb;
399   energy_info_callback energy_info_cb;
400 } bt_callbacks_t;
401 
402 typedef void (*alarm_cb)(void* data);
403 typedef bool (*set_wake_alarm_callout)(uint64_t delay_millis, bool should_wake,
404                                        alarm_cb cb, void* data);
405 typedef int (*acquire_wake_lock_callout)(const char* lock_name);
406 typedef int (*release_wake_lock_callout)(const char* lock_name);
407 
408 /** The set of functions required by bluedroid to set wake alarms and
409  * grab wake locks. This struct is passed into the stack through the
410  * |set_os_callouts| function on |bt_interface_t|.
411  */
412 typedef struct {
413   /* set to sizeof(bt_os_callouts_t) */
414   size_t size;
415 
416   set_wake_alarm_callout set_wake_alarm;
417   acquire_wake_lock_callout acquire_wake_lock;
418   release_wake_lock_callout release_wake_lock;
419 } bt_os_callouts_t;
420 
421 /** NOTE: By default, no profiles are initialized at the time of init/enable.
422  *  Whenever the application invokes the 'init' API of a profile, then one of
423  *  the following shall occur:
424  *
425  *    1.) If Bluetooth is not enabled, then the Bluetooth core shall mark the
426  *        profile as enabled. Subsequently, when the application invokes the
427  *        Bluetooth 'enable', as part of the enable sequence the profile that
428  * were marked shall be enabled by calling appropriate stack APIs. The
429  *        'adapter_properties_cb' shall return the list of UUIDs of the
430  *        enabled profiles.
431  *
432  *    2.) If Bluetooth is enabled, then the Bluetooth core shall invoke the
433  * stack profile API to initialize the profile and trigger a
434  *        'adapter_properties_cb' with the current list of UUIDs including the
435  *        newly added profile's UUID.
436  *
437  *   The reverse shall occur whenever the profile 'cleanup' APIs are invoked
438  */
439 
440 /** Represents the standard Bluetooth DM interface. */
441 typedef struct {
442   /** set to sizeof(bt_interface_t) */
443   size_t size;
444   /**
445    * Opens the interface and provides the callback routines
446    * to the implemenation of this interface.
447    */
448   int (*init)(bt_callbacks_t* callbacks);
449 
450   /** Enable Bluetooth. */
451   int (*enable)(bool guest_mode);
452 
453   /** Disable Bluetooth. */
454   int (*disable)(void);
455 
456   /** Closes the interface. */
457   void (*cleanup)(void);
458 
459   /** Get all Bluetooth Adapter properties at init */
460   int (*get_adapter_properties)(void);
461 
462   /** Get Bluetooth Adapter property of 'type' */
463   int (*get_adapter_property)(bt_property_type_t type);
464 
465   /** Set Bluetooth Adapter property of 'type' */
466   /* Based on the type, val shall be one of
467    * RawAddress or bt_bdname_t or bt_scanmode_t etc
468    */
469   int (*set_adapter_property)(const bt_property_t* property);
470 
471   /** Get all Remote Device properties */
472   int (*get_remote_device_properties)(RawAddress* remote_addr);
473 
474   /** Get Remote Device property of 'type' */
475   int (*get_remote_device_property)(RawAddress* remote_addr,
476                                     bt_property_type_t type);
477 
478   /** Set Remote Device property of 'type' */
479   int (*set_remote_device_property)(RawAddress* remote_addr,
480                                     const bt_property_t* property);
481 
482   /** Get Remote Device's service record  for the given UUID */
483   int (*get_remote_service_record)(const RawAddress& remote_addr,
484                                    const bluetooth::Uuid& uuid);
485 
486   /** Start SDP to get remote services */
487   int (*get_remote_services)(RawAddress* remote_addr);
488 
489   /** Start Discovery */
490   int (*start_discovery)(void);
491 
492   /** Cancel Discovery */
493   int (*cancel_discovery)(void);
494 
495   /** Create Bluetooth Bonding */
496   int (*create_bond)(const RawAddress* bd_addr, int transport);
497 
498   /** Create Bluetooth Bond using out of band data */
499   int (*create_bond_out_of_band)(const RawAddress* bd_addr, int transport,
500                                  const bt_out_of_band_data_t* oob_data);
501 
502   /** Remove Bond */
503   int (*remove_bond)(const RawAddress* bd_addr);
504 
505   /** Cancel Bond */
506   int (*cancel_bond)(const RawAddress* bd_addr);
507 
508   /**
509    * Get the connection status for a given remote device.
510    * return value of 0 means the device is not connected,
511    * non-zero return status indicates an active connection.
512    */
513   int (*get_connection_state)(const RawAddress* bd_addr);
514 
515   /** BT Legacy PinKey Reply */
516   /** If accept==FALSE, then pin_len and pin_code shall be 0x0 */
517   int (*pin_reply)(const RawAddress* bd_addr, uint8_t accept, uint8_t pin_len,
518                    bt_pin_code_t* pin_code);
519 
520   /** BT SSP Reply - Just Works, Numeric Comparison and Passkey
521    * passkey shall be zero for BT_SSP_VARIANT_PASSKEY_COMPARISON &
522    * BT_SSP_VARIANT_CONSENT
523    * For BT_SSP_VARIANT_PASSKEY_ENTRY, if accept==FALSE, then passkey
524    * shall be zero */
525   int (*ssp_reply)(const RawAddress* bd_addr, bt_ssp_variant_t variant,
526                    uint8_t accept, uint32_t passkey);
527 
528   /** Get Bluetooth profile interface */
529   const void* (*get_profile_interface)(const char* profile_id);
530 
531   /** Bluetooth Test Mode APIs - Bluetooth must be enabled for these APIs */
532   /* Configure DUT Mode - Use this mode to enter/exit DUT mode */
533   int (*dut_mode_configure)(uint8_t enable);
534 
535   /* Send any test HCI (vendor-specific) command to the controller. Must be in
536    * DUT Mode */
537   int (*dut_mode_send)(uint16_t opcode, uint8_t* buf, uint8_t len);
538   /** BLE Test Mode APIs */
539   /* opcode MUST be one of: LE_Receiver_Test, LE_Transmitter_Test, LE_Test_End
540    */
541   int (*le_test_mode)(uint16_t opcode, uint8_t* buf, uint8_t len);
542 
543   /** Sets the OS call-out functions that bluedroid needs for alarms and wake
544    * locks. This should be called immediately after a successful |init|.
545    */
546   int (*set_os_callouts)(bt_os_callouts_t* callouts);
547 
548   /** Read Energy info details - return value indicates BT_STATUS_SUCCESS or
549    * BT_STATUS_NOT_READY Success indicates that the VSC command was sent to
550    * controller
551    */
552   int (*read_energy_info)();
553 
554   /**
555    * Native support for dumpsys function
556    * Function is synchronous and |fd| is owned by caller.
557    * |arguments| are arguments which may affect the output, encoded as
558    * UTF-8 strings.
559    */
560   void (*dump)(int fd, const char** arguments);
561 
562   /**
563    * Native support for metrics protobuf dumping. The dumping format will be
564    * raw byte array
565    *
566    * @param output an externally allocated string to dump serialized protobuf
567    */
568   void (*dumpMetrics)(std::string* output);
569 
570   /**
571    * Clear /data/misc/bt_config.conf and erase all stored connections
572    */
573   int (*config_clear)(void);
574 
575   /**
576    * Clear (reset) the dynamic portion of the device interoperability database.
577    */
578   void (*interop_database_clear)(void);
579 
580   /**
581    * Add a new device interoperability workaround for a remote device whose
582    * first |len| bytes of the its device address match |addr|.
583    * NOTE: |feature| has to match an item defined in interop_feature_t
584    * (interop.h).
585    */
586   void (*interop_database_add)(uint16_t feature, const RawAddress* addr,
587                                size_t len);
588 
589   /**
590    * Get the AvrcpTarget Service interface to interact with the Avrcp Service
591    */
592   bluetooth::avrcp::ServiceInterface* (*get_avrcp_service)(void);
593 } bt_interface_t;
594 
595 #define BLUETOOTH_INTERFACE_STRING "bluetoothInterface"
596 
597 #endif /* ANDROID_INCLUDE_BLUETOOTH_H */
598