cdd334d37f6a0f9826530724f1c9aa0595209a23
[platform/upstream/bluez.git] / src / adapter.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *
4  *  BlueZ - Bluetooth protocol stack for Linux
5  *
6  *  Copyright (C) 2006-2010  Nokia Corporation
7  *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
8  *
9  *
10  */
11
12 #include <stdbool.h>
13 #include <dbus/dbus.h>
14 #include <glib.h>
15 #include <lib/bluetooth.h>
16 #include <lib/sdp.h>
17
18 #define ADAPTER_INTERFACE       "org.bluez.Adapter1"
19
20 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
21 #include <bluetooth/bluetooth.h>
22 #include <bluetooth/sdp.h>
23 #include <bluetooth/hci.h>
24 #include <bluetooth/hci_lib.h>
25 #endif
26
27 #define MAX_NAME_LENGTH         248
28
29 /* Invalid SSP passkey value used to indicate negative replies */
30 #define INVALID_PASSKEY         0xffffffff
31
32 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
33 #define BT_DISC_TYPE_DEFAULT    0
34 #define BT_DISC_TYPE_BREDR_ONLY 1
35 #define BT_DISC_TYPE_LE_ONLY    2
36 #define BT_DISC_TYPE_LE_BREDR   3
37
38 #define TIZEN_FEATURE_PLATFROM_SCAN_FILTER
39 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
40
41 #define COMPANY_ID_APPLE 0x004C
42 /* Deafult value set to 16(same as vendor specific value)
43  * and value shall be changed when required */
44 #define SCAN_FILTER_SLOTS_MAX 16
45
46 #define ADV_TYPE_IND    0x00
47 #define ADV_TYPE_DIRECT_IND     0x01
48 #define ADV_TYPE_SCAN_IND       0x02
49 #define ADV_TYPE_NONCONN_IND            0x03
50 #define ADV_TYPE_SCAN_RESPONSE  0x04
51
52 typedef enum {
53         NONE_REPORT,
54         SCAN_REPORT,
55         IBEACON_REPORT,
56 } adapter_le_scan_report_type;
57
58 typedef enum {
59         LE_PASSIVE_SCAN,
60         LE_ACTIVE_SCAN,
61 } adapter_le_scan_type;
62 #endif /* TIZEN_FEATURE_PLATFROM_SCAN_FILTER */
63
64 #endif
65
66 struct btd_adapter;
67 struct btd_device;
68 struct queue;
69 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
70 typedef enum {
71         BLUETOOTH_A2DP_SOURCE_ROLE = 0,
72         BLUETOOTH_A2DP_SINK_ROLE,
73 } bluetooth_a2dp_role_t;
74 #endif
75
76 struct btd_adapter *btd_adapter_get_default(void);
77 bool btd_adapter_is_default(struct btd_adapter *adapter);
78 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
79 bluetooth_a2dp_role_t btd_adapter_get_a2dp_role(struct btd_adapter *adapter);
80 void btd_adapter_set_a2dp_role(struct btd_adapter *adapter, bluetooth_a2dp_role_t role);
81 void btd_adapter_emit_a2dp_role_changed(struct btd_adapter *adapter);
82 #endif
83 uint16_t btd_adapter_get_index(struct btd_adapter *adapter);
84
85 typedef void (*adapter_cb) (struct btd_adapter *adapter, gpointer user_data);
86
87 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
88 typedef void (*oob_ext_read_local_cb_t) (struct btd_adapter *adapter,
89                                         const uint8_t *hash192,
90                                         const uint8_t *randomizer192,
91                                         const uint8_t *hash256,
92                                         const uint8_t *randomizer256,
93                                         void *user_data);
94 typedef void (*le_oob_read_local_cb_t) (struct btd_adapter *adapter,
95                                         const uint16_t eir_len, const uint8_t *eir, void *user_data);
96 #endif
97 typedef void (*oob_read_local_cb_t) (struct btd_adapter *adapter,
98                                         const uint8_t *hash,
99                                         const uint8_t *randomizer,
100                                         void *user_data);
101 typedef void (*oob_bonding_cb_t) (struct btd_adapter *adapter,
102                                         const bdaddr_t *bdaddr, uint8_t status,
103                                         void *user_data);
104
105 struct oob_handler {
106 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
107         oob_ext_read_local_cb_t read_local_cb;
108         le_oob_read_local_cb_t le_read_local_cb;
109 #else
110         oob_read_local_cb_t read_local_cb;
111 #endif
112         oob_bonding_cb_t bonding_cb;
113         bdaddr_t remote_addr;
114         void *user_data;
115 };
116
117 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
118 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
119 typedef enum {
120         NONE_CHARGING,
121         WIRE_CHARGING,
122         WIRELESS_CHARGING,
123 } charging_state_e;
124 #endif  /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
125 #endif
126
127 int adapter_init(void);
128 void adapter_cleanup(void);
129 void adapter_shutdown(void);
130
131 typedef void (*btd_disconnect_cb) (struct btd_device *device, uint8_t reason);
132 void btd_add_disconnect_cb(btd_disconnect_cb func);
133 void btd_remove_disconnect_cb(btd_disconnect_cb func);
134
135 typedef void (*btd_conn_fail_cb) (struct btd_device *device, uint8_t status);
136 void btd_add_conn_fail_cb(btd_conn_fail_cb func);
137 void btd_remove_conn_fail_cb(btd_conn_fail_cb func);
138
139 struct btd_adapter *adapter_find(const bdaddr_t *sba);
140 struct btd_adapter *adapter_find_by_id(int id);
141 void adapter_foreach(adapter_cb func, gpointer user_data);
142
143 bool btd_adapter_get_pairable(struct btd_adapter *adapter);
144 bool btd_adapter_get_powered(struct btd_adapter *adapter);
145 bool btd_adapter_get_connectable(struct btd_adapter *adapter);
146 bool btd_adapter_get_discoverable(struct btd_adapter *adapter);
147 bool btd_adapter_get_bredr(struct btd_adapter *adapter);
148
149 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter);
150
151 uint32_t btd_adapter_get_class(struct btd_adapter *adapter);
152 const char *btd_adapter_get_name(struct btd_adapter *adapter);
153 void btd_adapter_remove_device(struct btd_adapter *adapter,
154                                 struct btd_device *dev);
155 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
156                                         const bdaddr_t *addr,
157                                         uint8_t addr_type);
158 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter);
159
160 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
161                                                         const bdaddr_t *dst,
162                                                         uint8_t dst_type);
163 struct btd_device *btd_adapter_find_device_by_path(struct btd_adapter *adapter,
164                                                    const char *path);
165
166 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
167 void btd_adapter_update_found_device(struct btd_adapter *adapter,
168                                         const bdaddr_t *bdaddr,
169                                         uint8_t bdaddr_type, int8_t rssi,
170                                         bool confirm, bool legacy, uint8_t adv_type,
171                                         const uint8_t *data, uint8_t data_len,
172                                         bool monitoring);
173 #else
174 void btd_adapter_update_found_device(struct btd_adapter *adapter,
175                                         const bdaddr_t *bdaddr,
176                                         uint8_t bdaddr_type, int8_t rssi,
177                                         bool confirm, bool legacy,
178                                         bool not_connectable,
179                                         const uint8_t *data, uint8_t data_len,
180                                         bool monitored);
181 #endif
182 const char *adapter_get_path(struct btd_adapter *adapter);
183 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter);
184 uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter);
185 const char *btd_adapter_get_storage_dir(struct btd_adapter *adapter);
186 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
187 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter);
188 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter);
189 #endif
190 int adapter_set_name(struct btd_adapter *adapter, const char *name);
191
192 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec);
193 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle);
194
195 struct agent *adapter_get_agent(struct btd_adapter *adapter);
196
197 bool btd_adapter_uuid_is_allowed(struct btd_adapter *adapter, const char *uuid);
198
199 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter);
200 void btd_adapter_unref(struct btd_adapter *adapter);
201
202 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
203                                                         uint8_t minor);
204
205 struct btd_adapter_driver {
206         const char *name;
207         int (*probe)(struct btd_adapter *adapter);
208         void (*remove)(struct btd_adapter *adapter);
209         void (*resume)(struct btd_adapter *adapter);
210         void (*device_added)(struct btd_adapter *adapter,
211                                                 struct btd_device *device);
212         void (*device_removed)(struct btd_adapter *adapter,
213                                                 struct btd_device *device);
214         void (*device_resolved)(struct btd_adapter *adapter,
215                                                 struct btd_device *device);
216 };
217
218 void device_resolved_drivers(struct btd_adapter *adapter,
219                                                 struct btd_device *device);
220 typedef void (*service_auth_cb) (DBusError *derr, void *user_data);
221
222 void adapter_add_profile(struct btd_adapter *adapter, gpointer p);
223 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p);
224 int btd_register_adapter_driver(struct btd_adapter_driver *driver);
225 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver);
226 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
227                 const char *uuid, service_auth_cb cb, void *user_data);
228 guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdaddr_t *dst,
229                 const char *uuid, service_auth_cb cb, void *user_data);
230 int btd_cancel_authorization(guint id);
231
232 int btd_adapter_restore_powered(struct btd_adapter *adapter);
233
234 typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter,
235                         struct btd_device *dev, char *out, bool *display,
236                                                         unsigned int attempt);
237 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
238                                                 btd_adapter_pin_cb_t cb);
239 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
240                                                 btd_adapter_pin_cb_t cb);
241
242 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
243                                                 struct btd_adapter *adapter);
244 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter);
245 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter);
246
247 typedef void (*btd_msd_cb_t) (struct btd_adapter *adapter,
248                                                         struct btd_device *dev,
249                                                         uint16_t company,
250                                                         const uint8_t *data,
251                                                         uint8_t data_len);
252 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
253                                                         btd_msd_cb_t cb);
254 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
255                                                         btd_msd_cb_t cb);
256
257 /* If TRUE, enables fast connectabe, i.e. reduces page scan interval and changes
258  * type. If FALSE, disables fast connectable, i.e. sets page scan interval and
259  * type to default values. Valid for both connectable and discoverable modes. */
260 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
261                                                         gboolean enable);
262
263 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
264                                 int which, int timeout, uint32_t *clock,
265                                 uint16_t *accuracy);
266
267 int btd_adapter_block_address(struct btd_adapter *adapter,
268                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type);
269 int btd_adapter_unblock_address(struct btd_adapter *adapter,
270                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type);
271
272 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
273                                                         const bdaddr_t *bdaddr,
274                                                         uint8_t bdaddr_type);
275
276 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
277                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type);
278
279 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
280                                         const  bdaddr_t *bdaddr,
281                                         const char *pin, size_t pin_len);
282 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
283                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
284                                 gboolean success);
285 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
286                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
287                                 uint32_t passkey);
288
289 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
290                                         uint8_t addr_type, uint8_t io_cap);
291
292 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
293                                         uint8_t addr_type, uint8_t io_cap);
294
295 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
296                                                         uint8_t addr_type);
297
298 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap);
299
300 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter);
301
302 int btd_adapter_le_read_local_oob_data(struct btd_adapter *adapter);
303
304 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
305                                         const bdaddr_t *bdaddr,
306                                         uint8_t *hash, uint8_t *randomizer);
307
308 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
309                                                         const bdaddr_t *bdaddr);
310
311 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
312 int btd_adapter_add_remote_oob_ext_data(struct btd_adapter *adapter,
313                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
314                                 uint8_t *hash192, uint8_t *randomizer192,
315                                 uint8_t *hash256, uint8_t *randomizer256);
316
317 int btd_adapter_remove_remote_oob_ext_data(struct btd_adapter *adapter,
318                                 const bdaddr_t *bdaddr, uint8_t bdaddr_type);
319 #endif
320
321 int btd_adapter_gatt_server_start(struct btd_adapter *adapter);
322 void btd_adapter_gatt_server_stop(struct btd_adapter *adapter);
323
324 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter);
325
326 int adapter_connect_list_add(struct btd_adapter *adapter,
327                                         struct btd_device *device);
328 void adapter_connect_list_remove(struct btd_adapter *adapter,
329                                                 struct btd_device *device);
330 typedef void (*adapter_set_device_flags_func_t)(uint8_t status, uint16_t length,
331                                                 const void *param,
332                                                 void *user_data);
333 void adapter_set_device_flags(struct btd_adapter *adapter,
334                                 struct btd_device *device, uint32_t flags,
335                                 adapter_set_device_flags_func_t func,
336                                 void *user_data);
337 void adapter_auto_connect_add(struct btd_adapter *adapter,
338                                         struct btd_device *device);
339 void adapter_auto_connect_remove(struct btd_adapter *adapter,
340                                         struct btd_device *device);
341 void adapter_accept_list_add(struct btd_adapter *adapter,
342                                                 struct btd_device *dev);
343 void adapter_accept_list_remove(struct btd_adapter *adapter,
344                                                 struct btd_device *dev);
345
346 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
347                                                 struct oob_handler *handler);
348 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter);
349
350 void btd_adapter_for_each_device(struct btd_adapter *adapter,
351                         void (*cb)(struct btd_device *device, void *data),
352                         void *data);
353
354 bool btd_le_connect_before_pairing(void);
355
356 enum kernel_features {
357         KERNEL_CONN_CONTROL             = 1 << 0,
358         KERNEL_BLOCKED_KEYS_SUPPORTED   = 1 << 1,
359         KERNEL_SET_SYSTEM_CONFIG        = 1 << 2,
360         KERNEL_EXP_FEATURES             = 1 << 3,
361         KERNEL_HAS_RESUME_EVT           = 1 << 4,
362         KERNEL_HAS_EXT_ADV_ADD_CMDS     = 1 << 5,
363         KERNEL_HAS_CONTROLLER_CAP_CMD   = 1 << 6,
364 };
365
366 bool btd_has_kernel_features(uint32_t feature);
367
368 bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
369                                                 struct queue *uuids);
370 bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
371                                                 const char *uuid_str);
372 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
373 void adapter_send_event(const char *event);
374
375 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
376                                                 const bdaddr_t *bdaddr,
377                                                 uint8_t bdaddr_type);
378 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
379                                                 const bdaddr_t *bdaddr,
380                                                 uint8_t bdaddr_type);
381
382 uint8_t btd_adapter_get_rpa_res_support_value(
383                 struct btd_adapter *adapter);
384
385 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
386                                                 struct btd_device *device);
387
388 typedef void (*read_max_data_length_cb_t) (struct btd_adapter *adapter,
389                                         int result,
390                                         const uint16_t max_txOctects,
391                                         const uint16_t max_txTime,
392                                         const uint16_t max_rxOctects,
393                                         const uint16_t max_rxTime,
394                                         void *user_data);
395
396 struct le_data_length_read_handler {
397         read_max_data_length_cb_t read_callback;
398         void *user_data;
399 };
400
401 typedef void (*read_host_suggested_default_data_length_cb_t) (struct btd_adapter *adapter,
402                                         const uint16_t def_txOctects,
403                                         const uint16_t def_txTime,
404                                         void *user_data);
405
406 struct le_data_length_read_default_data_length_handler {
407         read_host_suggested_default_data_length_cb_t read_callback;
408         void *user_data;
409 };
410
411 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
412                         uint16_t max_tx_octets, uint16_t max_tx_time);
413
414 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver);
415
416 int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
417                                    const bdaddr_t *bdaddr, gboolean enable);
418
419 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
420 charging_state_e get_charging_state(struct btd_adapter *adapter);
421 #endif  /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
422 #endif