summaryrefslogtreecommitdiff
path: root/emulator/bthost.h
blob: cdc12dc1ce8e2644c287e40ca2a97543bc78721c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2011-2012  Intel Corporation
 *  Copyright (C) 2004-2010  Marcel Holtmann <marcel@holtmann.org>
 *  Copyright 2023 NXP
 *
 *
 */

#include <stdint.h>
#include <sys/uio.h>

#include "lib/bluetooth.h"

typedef void (*bthost_send_func) (const struct iovec *iov, int iovlen,
							void *user_data);

struct bthost;

struct bthost *bthost_create(void);
void bthost_destroy(struct bthost *bthost);

typedef void (*bthost_ready_cb) (void);
void bthost_notify_ready(struct bthost *bthost, bthost_ready_cb cb);

typedef void (*bthost_debug_func_t)(const char *str, void *user_data);
typedef void (*bthost_destroy_func_t)(void *user_data);
bool bthost_set_debug(struct bthost *bthost, bthost_debug_func_t callback,
			void *user_data, bthost_destroy_func_t destroy);
void bthost_debug(struct bthost *bthost, const char *format, ...)
					__attribute__((format(printf, 2, 3)));

void bthost_set_send_handler(struct bthost *bthost, bthost_send_func handler,
							void *user_data);

void bthost_receive_h4(struct bthost *bthost, const void *data, uint16_t len);

typedef void (*bthost_cmd_complete_cb) (uint16_t opcode, uint8_t status,
					const void *param, uint8_t len,
					void *user_data);

void bthost_set_cmd_complete_cb(struct bthost *bthost,
				bthost_cmd_complete_cb cb, void *user_data);

typedef uint8_t (*bthost_accept_conn_cb) (uint16_t handle, void *user_data);
typedef void (*bthost_new_conn_cb) (uint16_t handle, void *user_data);

void bthost_set_connect_cb(struct bthost *bthost, bthost_new_conn_cb cb,
							void *user_data);

void bthost_set_iso_cb(struct bthost *bthost, bthost_accept_conn_cb accept,
				bthost_new_conn_cb cb, void *user_data);

void bthost_hci_connect(struct bthost *bthost, const uint8_t *bdaddr,
							uint8_t addr_type);

void bthost_hci_ext_connect(struct bthost *bthost, const uint8_t *bdaddr,
							uint8_t addr_type);

void bthost_hci_disconnect(struct bthost *bthost, uint16_t handle,
								uint8_t reason);

typedef void (*bthost_cid_hook_func_t)(const void *data, uint16_t len,
							void *user_data);

void bthost_add_cid_hook(struct bthost *bthost, uint16_t handle, uint16_t cid,
				bthost_cid_hook_func_t func, void *user_data);

typedef void (*bthost_iso_hook_func_t)(const void *data, uint16_t len,
							void *user_data);

void bthost_add_iso_hook(struct bthost *bthost, uint16_t handle,
				bthost_iso_hook_func_t func, void *user_data,
				bthost_destroy_func_t destroy);

void bthost_send_cid(struct bthost *bthost, uint16_t handle, uint16_t cid,
					const void *data, uint16_t len);
void bthost_send_cid_v(struct bthost *bthost, uint16_t handle, uint16_t cid,
					const struct iovec *iov, int iovcnt);
void bthost_send_iso(struct bthost *bthost, uint16_t handle, bool ts,
					uint16_t sn, uint32_t timestamp,
					const struct iovec *iov, int iovcnt);

typedef void (*bthost_l2cap_rsp_cb) (uint8_t code, const void *data,
						uint16_t len, void *user_data);

bool bthost_l2cap_req(struct bthost *bthost, uint16_t handle, uint8_t req,
				const void *data, uint16_t len,
				bthost_l2cap_rsp_cb cb, void *user_data);

void bthost_write_scan_enable(struct bthost *bthost, uint8_t scan);

void bthost_set_adv_data(struct bthost *bthost, const uint8_t *data,
								uint8_t len);
void bthost_set_adv_enable(struct bthost *bthost, uint8_t enable);

void bthost_set_ext_adv_data(struct bthost *bthost, const uint8_t *data,
								uint8_t len);
void bthost_set_ext_adv_params(struct bthost *bthost);
void bthost_set_ext_adv_enable(struct bthost *bthost, uint8_t enable);
void bthost_set_pa_params(struct bthost *bthost);
void bthost_set_pa_enable(struct bthost *bthost, uint8_t enable);
void bthost_create_big(struct bthost *bthost, uint8_t num_bis, uint8_t enc,
				const uint8_t *bcode);
bool bthost_search_ext_adv_addr(struct bthost *bthost, const uint8_t *addr);

void bthost_set_cig_params(struct bthost *bthost, uint8_t cig_id,
				uint8_t cis_id, const struct bt_iso_qos *qos);
void bthost_create_cis(struct bthost *bthost, uint16_t cis_handle,
						uint16_t acl_handle);


void bthost_set_scan_params(struct bthost *bthost, uint8_t scan_type,
				uint8_t addr_type, uint8_t filter_policy);
void bthost_set_scan_enable(struct bthost *bthost, uint8_t enable);

void bthost_write_ssp_mode(struct bthost *bthost, uint8_t mode);

void bthost_write_le_host_supported(struct bthost *bthost, uint8_t mode);

void bthost_request_auth(struct bthost *bthost, uint16_t handle);

void bthost_le_start_encrypt(struct bthost *bthost, uint16_t handle,
							const uint8_t ltk[16]);
typedef void (*bthost_l2cap_connect_cb) (uint16_t handle, uint16_t cid,
							void *user_data);
typedef void (*bthost_l2cap_disconnect_cb) (void *user_data);

void bthost_add_l2cap_server(struct bthost *bthost, uint16_t psm,
				bthost_l2cap_connect_cb func,
				bthost_l2cap_disconnect_cb disconn_func,
				void *user_data);

void bthost_set_sc_support(struct bthost *bthost, bool enable);

void bthost_set_pin_code(struct bthost *bthost, const uint8_t *pin,
							uint8_t pin_len);
void bthost_set_io_capability(struct bthost *bthost, uint8_t io_capability);
uint8_t bthost_get_io_capability(struct bthost *bthost);
void bthost_set_auth_req(struct bthost *bthost, uint8_t auth_req);
uint8_t bthost_get_auth_req(struct bthost *bthost);
void bthost_set_reject_user_confirm(struct bthost *bthost, bool reject);
bool bthost_get_reject_user_confirm(struct bthost *bthost);

bool bthost_bredr_capable(struct bthost *bthost);

uint64_t bthost_conn_get_fixed_chan(struct bthost *bthost, uint16_t handle);

typedef void (*bthost_rfcomm_connect_cb) (uint16_t handle, uint16_t cid,
						void *user_data, bool status);

void bthost_add_rfcomm_server(struct bthost *bthost, uint8_t channel,
			bthost_rfcomm_connect_cb func, void *user_data);

bool bthost_connect_rfcomm(struct bthost *bthost, uint16_t handle,
				uint8_t channel, bthost_rfcomm_connect_cb func,
				void *user_data);

typedef void (*bthost_rfcomm_chan_hook_func_t) (const void *data, uint16_t len,
							void *user_data);

void bthost_add_rfcomm_chan_hook(struct bthost *bthost, uint16_t handle,
					uint8_t channel,
					bthost_rfcomm_chan_hook_func_t func,
					void *user_data);

void bthost_send_rfcomm_data(struct bthost *bthost, uint16_t handle,
					uint8_t channel, const void *data,
					uint16_t len);

void bthost_start(struct bthost *bthost);

/* LE SMP support */

void *smp_start(struct bthost *bthost);
void smp_stop(void *smp_data);
void *smp_conn_add(void *smp_data, uint16_t handle,
			const uint8_t *ia, uint8_t ia_type,
			const uint8_t *ra, uint8_t ra_type, bool conn_init);
void smp_conn_del(void *conn_data);
void smp_conn_encrypted(void *conn_data, uint8_t encrypt);
void smp_data(void *conn_data, const void *data, uint16_t len);
void smp_bredr_data(void *conn_data, const void *data, uint16_t len);
int smp_get_ltk(void *smp_data, uint64_t rand, uint16_t ediv, uint8_t *ltk);
void smp_pair(void *conn_data, uint8_t io_cap, uint8_t auth_req);