xref: /freebsd/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c (revision 1de7b4b805ddbf2429da511c053686ac4591ed89)
1*1de7b4b8SPedro F. Giffuni /*-
2878ed226SJulian Elischer  * host_controller_baseband.c
3878ed226SJulian Elischer  *
4*1de7b4b8SPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5*1de7b4b8SPedro F. Giffuni  *
6878ed226SJulian Elischer  * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
7878ed226SJulian Elischer  * All rights reserved.
8878ed226SJulian Elischer  *
9878ed226SJulian Elischer  * Redistribution and use in source and binary forms, with or without
10878ed226SJulian Elischer  * modification, are permitted provided that the following conditions
11878ed226SJulian Elischer  * are met:
12878ed226SJulian Elischer  * 1. Redistributions of source code must retain the above copyright
13878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer.
14878ed226SJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
15878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
16878ed226SJulian Elischer  *    documentation and/or other materials provided with the distribution.
17878ed226SJulian Elischer  *
18878ed226SJulian Elischer  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19878ed226SJulian Elischer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20878ed226SJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21878ed226SJulian Elischer  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22878ed226SJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23878ed226SJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24878ed226SJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25878ed226SJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26878ed226SJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27878ed226SJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28878ed226SJulian Elischer  * SUCH DAMAGE.
29878ed226SJulian Elischer  *
300986ab12SMaksim Yevmenkin  * $Id: host_controller_baseband.c,v 1.4 2003/08/18 19:19:53 max Exp $
31878ed226SJulian Elischer  * $FreeBSD$
32878ed226SJulian Elischer  */
33878ed226SJulian Elischer 
348d6f425dSTakanori Watanabe #define L2CAP_SOCKET_CHECKED
350986ab12SMaksim Yevmenkin #include <bluetooth.h>
36878ed226SJulian Elischer #include <errno.h>
37878ed226SJulian Elischer #include <stdio.h>
38878ed226SJulian Elischer #include <string.h>
39878ed226SJulian Elischer #include "hccontrol.h"
40878ed226SJulian Elischer 
41878ed226SJulian Elischer /* Convert hex ASCII to int4 */
42878ed226SJulian Elischer static int
43878ed226SJulian Elischer hci_hexa2int4(const char *a)
44878ed226SJulian Elischer {
45878ed226SJulian Elischer 	if ('0' <= *a && *a <= '9')
46878ed226SJulian Elischer 		return (*a - '0');
47878ed226SJulian Elischer 
48878ed226SJulian Elischer 	if ('A' <= *a && *a <= 'F')
49878ed226SJulian Elischer 		return (*a - 'A' + 0xa);
50878ed226SJulian Elischer 
51878ed226SJulian Elischer 	if ('a' <= *a && *a <= 'f')
52878ed226SJulian Elischer 		return (*a - 'a' + 0xa);
53878ed226SJulian Elischer 
54878ed226SJulian Elischer 	return (-1);
55878ed226SJulian Elischer }
56878ed226SJulian Elischer 
57878ed226SJulian Elischer /* Convert hex ASCII to int8 */
58878ed226SJulian Elischer static int
59878ed226SJulian Elischer hci_hexa2int8(const char *a)
60878ed226SJulian Elischer {
61878ed226SJulian Elischer 	int	hi = hci_hexa2int4(a);
62878ed226SJulian Elischer 	int	lo = hci_hexa2int4(a + 1);
63878ed226SJulian Elischer 
64878ed226SJulian Elischer 	if (hi < 0 || lo < 0)
65878ed226SJulian Elischer 		return (-1);
66878ed226SJulian Elischer 
67878ed226SJulian Elischer 	return ((hi << 4) | lo);
68878ed226SJulian Elischer }
69878ed226SJulian Elischer 
70079a8a3eSMaksim Yevmenkin /* Convert ascii hex string to the uint8_t[] */
71878ed226SJulian Elischer static int
72079a8a3eSMaksim Yevmenkin hci_hexstring2array(char const *s, uint8_t *a, int asize)
73878ed226SJulian Elischer {
74878ed226SJulian Elischer 	int	i, l, b;
75878ed226SJulian Elischer 
76878ed226SJulian Elischer 	l = strlen(s) / 2;
77878ed226SJulian Elischer 	if (l > asize)
78878ed226SJulian Elischer 		l = asize;
79878ed226SJulian Elischer 
80878ed226SJulian Elischer 	for (i = 0; i < l; i++) {
81878ed226SJulian Elischer 		b = hci_hexa2int8(s + i * 2);
82878ed226SJulian Elischer 		if (b < 0)
83878ed226SJulian Elischer 			return (-1);
84878ed226SJulian Elischer 
85878ed226SJulian Elischer 		a[i] = (b & 0xff);
86878ed226SJulian Elischer 	}
87878ed226SJulian Elischer 
88878ed226SJulian Elischer 	return (0);
89878ed226SJulian Elischer }
90878ed226SJulian Elischer 
91878ed226SJulian Elischer /* Send RESET to the unit */
92878ed226SJulian Elischer static int
93878ed226SJulian Elischer hci_reset(int s, int argc, char **argv)
94878ed226SJulian Elischer {
95878ed226SJulian Elischer 	ng_hci_status_rp	rp;
96878ed226SJulian Elischer 	int			n;
97878ed226SJulian Elischer 
98878ed226SJulian Elischer 	n = sizeof(rp);
99878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
100878ed226SJulian Elischer 			NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
101878ed226SJulian Elischer 		return (ERROR);
102878ed226SJulian Elischer 
103878ed226SJulian Elischer 	if (rp.status != 0x00) {
104878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
105878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
106878ed226SJulian Elischer 		return (FAILED);
107878ed226SJulian Elischer 	}
108878ed226SJulian Elischer 
109878ed226SJulian Elischer 	return (OK);
110878ed226SJulian Elischer } /* hci_reset */
111878ed226SJulian Elischer 
112878ed226SJulian Elischer /* Send Read_PIN_Type command to the unit */
113878ed226SJulian Elischer static int
114878ed226SJulian Elischer hci_read_pin_type(int s, int argc, char **argv)
115878ed226SJulian Elischer {
116878ed226SJulian Elischer 	ng_hci_read_pin_type_rp	rp;
117878ed226SJulian Elischer 	int			n;
118878ed226SJulian Elischer 
119878ed226SJulian Elischer 	n = sizeof(rp);
120878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
121878ed226SJulian Elischer 			NG_HCI_OCF_READ_PIN_TYPE),
122878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
123878ed226SJulian Elischer 		return (ERROR);
124878ed226SJulian Elischer 
125878ed226SJulian Elischer 	if (rp.status != 0x00) {
126878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
127878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
128878ed226SJulian Elischer 		return (FAILED);
129878ed226SJulian Elischer 	}
130878ed226SJulian Elischer 
131878ed226SJulian Elischer 	fprintf(stdout, "PIN type: %s [%#02x]\n",
132878ed226SJulian Elischer 			hci_pin2str(rp.pin_type), rp.pin_type);
133878ed226SJulian Elischer 
134878ed226SJulian Elischer 	return (OK);
135878ed226SJulian Elischer } /* hci_read_pin_type */
136878ed226SJulian Elischer 
137878ed226SJulian Elischer /* Send Write_PIN_Type command to the unit */
138878ed226SJulian Elischer static int
139878ed226SJulian Elischer hci_write_pin_type(int s, int argc, char **argv)
140878ed226SJulian Elischer {
141878ed226SJulian Elischer 	ng_hci_write_pin_type_cp	cp;
142878ed226SJulian Elischer 	ng_hci_write_pin_type_rp	rp;
143878ed226SJulian Elischer 	int				n;
144878ed226SJulian Elischer 
145878ed226SJulian Elischer 	/* parse command parameters */
146878ed226SJulian Elischer 	switch (argc) {
147878ed226SJulian Elischer 	case 1:
148878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
149878ed226SJulian Elischer 			return (USAGE);
150878ed226SJulian Elischer 
151079a8a3eSMaksim Yevmenkin 		cp.pin_type = (uint8_t) n;
152878ed226SJulian Elischer 		break;
153878ed226SJulian Elischer 
154878ed226SJulian Elischer 	default:
155878ed226SJulian Elischer 		return (USAGE);
156878ed226SJulian Elischer 	}
157878ed226SJulian Elischer 
158878ed226SJulian Elischer 	/* send command */
159878ed226SJulian Elischer 	n = sizeof(rp);
160878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
161878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PIN_TYPE),
162878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
163878ed226SJulian Elischer 			(char *) &rp , &n) ==  ERROR)
164878ed226SJulian Elischer 		return (ERROR);
165878ed226SJulian Elischer 
166878ed226SJulian Elischer 	if (rp.status != 0x00) {
167878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
168878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
169878ed226SJulian Elischer 		return (FAILED);
170878ed226SJulian Elischer 	}
171878ed226SJulian Elischer 
172878ed226SJulian Elischer 	return (OK);
173878ed226SJulian Elischer } /* hci_write_pin_type */
174878ed226SJulian Elischer 
175878ed226SJulian Elischer /* Send Read_Stored_Link_Key command to the unit */
176878ed226SJulian Elischer static int
177878ed226SJulian Elischer hci_read_stored_link_key(int s, int argc, char **argv)
178878ed226SJulian Elischer {
179878ed226SJulian Elischer 	struct {
180878ed226SJulian Elischer 		ng_hci_cmd_pkt_t			hdr;
181878ed226SJulian Elischer 		ng_hci_read_stored_link_key_cp		cp;
182878ed226SJulian Elischer 	} __attribute__ ((packed))			cmd;
183878ed226SJulian Elischer 
184878ed226SJulian Elischer 	struct {
185878ed226SJulian Elischer 		ng_hci_event_pkt_t			hdr;
186878ed226SJulian Elischer 		union {
187878ed226SJulian Elischer 			ng_hci_command_compl_ep		cc;
188878ed226SJulian Elischer 			ng_hci_return_link_keys_ep	key;
189079a8a3eSMaksim Yevmenkin 			uint8_t				b[NG_HCI_EVENT_PKT_SIZE];
190878ed226SJulian Elischer 		}					ep;
191878ed226SJulian Elischer 	} __attribute__ ((packed))			event;
192878ed226SJulian Elischer 
1930986ab12SMaksim Yevmenkin 	int						n, n1;
194878ed226SJulian Elischer 
195878ed226SJulian Elischer 	/* Send command */
196878ed226SJulian Elischer 	memset(&cmd, 0, sizeof(cmd));
197878ed226SJulian Elischer 	cmd.hdr.type = NG_HCI_CMD_PKT;
198878ed226SJulian Elischer 	cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
199878ed226SJulian Elischer 				NG_HCI_OCF_READ_STORED_LINK_KEY));
200878ed226SJulian Elischer 	cmd.hdr.length = sizeof(cmd.cp);
201878ed226SJulian Elischer 
202878ed226SJulian Elischer 	switch (argc) {
203878ed226SJulian Elischer 	case 1:
204878ed226SJulian Elischer 		/* parse BD_ADDR */
2050986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cmd.cp.bdaddr)) {
2060986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
2070986ab12SMaksim Yevmenkin 
2080986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
209878ed226SJulian Elischer 				return (USAGE);
210878ed226SJulian Elischer 
2110986ab12SMaksim Yevmenkin 			memcpy(&cmd.cp.bdaddr, he->h_addr, sizeof(cmd.cp.bdaddr));
2120986ab12SMaksim Yevmenkin 		}
213878ed226SJulian Elischer 		break;
214878ed226SJulian Elischer 
215878ed226SJulian Elischer 	default:
216878ed226SJulian Elischer 		cmd.cp.read_all = 1;
217878ed226SJulian Elischer 		break;
218878ed226SJulian Elischer 	}
219878ed226SJulian Elischer 
220878ed226SJulian Elischer 	if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
221878ed226SJulian Elischer 		return (ERROR);
222878ed226SJulian Elischer 
223878ed226SJulian Elischer 	/* Receive events */
224878ed226SJulian Elischer again:
225878ed226SJulian Elischer 	memset(&event, 0, sizeof(event));
226878ed226SJulian Elischer 	n = sizeof(event);
227878ed226SJulian Elischer 	if (hci_recv(s, (char *) &event, &n) != OK)
228878ed226SJulian Elischer 		return (ERROR);
229878ed226SJulian Elischer 
230878ed226SJulian Elischer 	if (n <= sizeof(event.hdr)) {
231878ed226SJulian Elischer 		errno = EMSGSIZE;
232878ed226SJulian Elischer 		return (ERROR);
233878ed226SJulian Elischer 	}
234878ed226SJulian Elischer 
235878ed226SJulian Elischer 	if (event.hdr.type != NG_HCI_EVENT_PKT) {
236878ed226SJulian Elischer 		errno = EIO;
237878ed226SJulian Elischer 		return (ERROR);
238878ed226SJulian Elischer 	}
239878ed226SJulian Elischer 
240878ed226SJulian Elischer 	/* Parse event */
241878ed226SJulian Elischer 	switch (event.hdr.event) {
242878ed226SJulian Elischer 	case NG_HCI_EVENT_COMMAND_COMPL: {
243878ed226SJulian Elischer 		ng_hci_read_stored_link_key_rp	*rp = NULL;
244878ed226SJulian Elischer 
245878ed226SJulian Elischer 		if (event.ep.cc.opcode == 0x0000 ||
246878ed226SJulian Elischer 		    event.ep.cc.opcode != cmd.hdr.opcode)
247878ed226SJulian Elischer 			goto again;
248878ed226SJulian Elischer 
249878ed226SJulian Elischer 		rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b +
250878ed226SJulian Elischer 				sizeof(event.ep.cc));
251878ed226SJulian Elischer 
252878ed226SJulian Elischer 		fprintf(stdout, "Complete: Status: %s [%#x]\n",
253878ed226SJulian Elischer 				hci_status2str(rp->status), rp->status);
254878ed226SJulian Elischer 		fprintf(stdout, "Maximum Number of keys: %d\n",
255878ed226SJulian Elischer 				le16toh(rp->max_num_keys));
256878ed226SJulian Elischer 		fprintf(stdout, "Number of keys read: %d\n",
257878ed226SJulian Elischer 				le16toh(rp->num_keys_read));
258878ed226SJulian Elischer 		} break;
259878ed226SJulian Elischer 
260878ed226SJulian Elischer 	case NG_HCI_EVENT_RETURN_LINK_KEYS: {
261878ed226SJulian Elischer 		struct _key {
262878ed226SJulian Elischer 			bdaddr_t	bdaddr;
263079a8a3eSMaksim Yevmenkin 			uint8_t		key[NG_HCI_KEY_SIZE];
264878ed226SJulian Elischer 		} __attribute__ ((packed))	*k = NULL;
265878ed226SJulian Elischer 
266878ed226SJulian Elischer 		fprintf(stdout, "Event: Number of keys: %d\n",
267878ed226SJulian Elischer 			event.ep.key.num_keys);
268878ed226SJulian Elischer 
269878ed226SJulian Elischer 		k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
270878ed226SJulian Elischer 		for (n = 0; n < event.ep.key.num_keys; n++) {
2710986ab12SMaksim Yevmenkin 			fprintf(stdout, "\t%d: %s ",
2720986ab12SMaksim Yevmenkin 				n + 1, hci_bdaddr2str(&k->bdaddr));
273878ed226SJulian Elischer 
2740986ab12SMaksim Yevmenkin 			for (n1 = 0; n1 < sizeof(k->key); n1++)
2750986ab12SMaksim Yevmenkin 				fprintf(stdout, "%02x", k->key[n1]);
276878ed226SJulian Elischer 			fprintf(stdout, "\n");
277878ed226SJulian Elischer 
278878ed226SJulian Elischer 			k ++;
279878ed226SJulian Elischer 		}
280878ed226SJulian Elischer 
281878ed226SJulian Elischer 		goto again;
282878ed226SJulian Elischer 
283878ed226SJulian Elischer 		} break;
284878ed226SJulian Elischer 
285878ed226SJulian Elischer 	default:
286878ed226SJulian Elischer 		goto again;
287878ed226SJulian Elischer 	}
288878ed226SJulian Elischer 
289878ed226SJulian Elischer 	return (OK);
290878ed226SJulian Elischer } /* hci_read_store_link_key */
291878ed226SJulian Elischer 
292878ed226SJulian Elischer /* Send Write_Stored_Link_Key command to the unit */
293878ed226SJulian Elischer static int
294878ed226SJulian Elischer hci_write_stored_link_key(int s, int argc, char **argv)
295878ed226SJulian Elischer {
296878ed226SJulian Elischer 	struct {
297878ed226SJulian Elischer 		ng_hci_write_stored_link_key_cp	p;
298878ed226SJulian Elischer 		bdaddr_t			bdaddr;
299079a8a3eSMaksim Yevmenkin 		uint8_t				key[NG_HCI_KEY_SIZE];
300878ed226SJulian Elischer 	}					cp;
301878ed226SJulian Elischer 	ng_hci_write_stored_link_key_rp		rp;
3020986ab12SMaksim Yevmenkin 	int32_t					n;
303878ed226SJulian Elischer 
304878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
305878ed226SJulian Elischer 
306878ed226SJulian Elischer 	switch (argc) {
307878ed226SJulian Elischer 	case 2:
308878ed226SJulian Elischer 		cp.p.num_keys_write = 1;
309878ed226SJulian Elischer 
310878ed226SJulian Elischer 		/* parse BD_ADDR */
3110986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3120986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3130986ab12SMaksim Yevmenkin 
3140986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
315878ed226SJulian Elischer 				return (USAGE);
316878ed226SJulian Elischer 
3170986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3180986ab12SMaksim Yevmenkin 		}
319878ed226SJulian Elischer 
320878ed226SJulian Elischer 		/* parse key */
321878ed226SJulian Elischer 		if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
322878ed226SJulian Elischer 			return (USAGE);
323878ed226SJulian Elischer 		break;
324878ed226SJulian Elischer 
325878ed226SJulian Elischer 	default:
326878ed226SJulian Elischer 		return (USAGE);
327878ed226SJulian Elischer 	}
328878ed226SJulian Elischer 
329878ed226SJulian Elischer 	/* send command */
330878ed226SJulian Elischer 	n = sizeof(rp);
331878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
332878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_STORED_LINK_KEY),
333878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
334878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
335878ed226SJulian Elischer 		return (ERROR);
336878ed226SJulian Elischer 
337878ed226SJulian Elischer 	if (rp.status != 0x00) {
338878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
339878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
340878ed226SJulian Elischer 		return (FAILED);
341878ed226SJulian Elischer 	}
342878ed226SJulian Elischer 
343878ed226SJulian Elischer 	fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
344878ed226SJulian Elischer 
345878ed226SJulian Elischer 	return (OK);
346878ed226SJulian Elischer } /* hci_write_stored_link_key */
347878ed226SJulian Elischer 
348878ed226SJulian Elischer 
349878ed226SJulian Elischer /* Send Delete_Stored_Link_Key command to the unit */
350878ed226SJulian Elischer static int
351878ed226SJulian Elischer hci_delete_stored_link_key(int s, int argc, char **argv)
352878ed226SJulian Elischer {
353878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_cp	cp;
354878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_rp	rp;
3550986ab12SMaksim Yevmenkin 	int32_t					n;
356878ed226SJulian Elischer 
357878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
358878ed226SJulian Elischer 
359878ed226SJulian Elischer 	switch (argc) {
360878ed226SJulian Elischer 	case 1:
361878ed226SJulian Elischer 		/* parse BD_ADDR */
3620986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3630986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3640986ab12SMaksim Yevmenkin 
3650986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
366878ed226SJulian Elischer 				return (USAGE);
367878ed226SJulian Elischer 
3680986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3690986ab12SMaksim Yevmenkin 		}
370878ed226SJulian Elischer 		break;
371878ed226SJulian Elischer 
372878ed226SJulian Elischer 	default:
373878ed226SJulian Elischer 		cp.delete_all = 1;
374878ed226SJulian Elischer 		break;
375878ed226SJulian Elischer 	}
376878ed226SJulian Elischer 
377878ed226SJulian Elischer 	/* send command */
378878ed226SJulian Elischer 	n = sizeof(cp);
379878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
380878ed226SJulian Elischer 			NG_HCI_OCF_DELETE_STORED_LINK_KEY),
381878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
382878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
383878ed226SJulian Elischer 		return (ERROR);
384878ed226SJulian Elischer 
385878ed226SJulian Elischer 	if (rp.status != 0x00) {
386878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
387878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
388878ed226SJulian Elischer 		return (FAILED);
389878ed226SJulian Elischer 	}
390878ed226SJulian Elischer 
391878ed226SJulian Elischer 	fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
392878ed226SJulian Elischer 
393878ed226SJulian Elischer 	return (OK);
394878ed226SJulian Elischer } /* hci_delete_stored_link_key */
395878ed226SJulian Elischer 
396878ed226SJulian Elischer /* Send Change_Local_Name command to the unit */
397878ed226SJulian Elischer static int
398878ed226SJulian Elischer hci_change_local_name(int s, int argc, char **argv)
399878ed226SJulian Elischer {
400878ed226SJulian Elischer 	ng_hci_change_local_name_cp	cp;
401878ed226SJulian Elischer 	ng_hci_change_local_name_rp	rp;
402878ed226SJulian Elischer 	int				n;
403878ed226SJulian Elischer 
404878ed226SJulian Elischer 	/* parse command parameters */
405878ed226SJulian Elischer 	switch (argc) {
406878ed226SJulian Elischer 	case 1:
407878ed226SJulian Elischer 		snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
408878ed226SJulian Elischer 		break;
409878ed226SJulian Elischer 
410878ed226SJulian Elischer 	default:
411878ed226SJulian Elischer 		return (USAGE);
412878ed226SJulian Elischer 	}
413878ed226SJulian Elischer 
414878ed226SJulian Elischer 	/* send command */
415878ed226SJulian Elischer 	n = sizeof(rp);
416878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
417878ed226SJulian Elischer 			NG_HCI_OCF_CHANGE_LOCAL_NAME),
418878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
419878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
420878ed226SJulian Elischer 		return (ERROR);
421878ed226SJulian Elischer 
422878ed226SJulian Elischer 	if (rp.status != 0x00) {
423878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
424878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
425878ed226SJulian Elischer 		return (FAILED);
426878ed226SJulian Elischer 	}
427878ed226SJulian Elischer 
428878ed226SJulian Elischer 	return (OK);
429878ed226SJulian Elischer } /* hci_change_local_name */
430878ed226SJulian Elischer 
431878ed226SJulian Elischer /* Send Read_Local_Name command to the unit */
432878ed226SJulian Elischer static int
433878ed226SJulian Elischer hci_read_local_name(int s, int argc, char **argv)
434878ed226SJulian Elischer {
435878ed226SJulian Elischer 	ng_hci_read_local_name_rp	rp;
436878ed226SJulian Elischer 	int				n;
437878ed226SJulian Elischer 
438878ed226SJulian Elischer 	n = sizeof(rp);
439878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
440878ed226SJulian Elischer 			NG_HCI_OCF_READ_LOCAL_NAME),
441878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
442878ed226SJulian Elischer 		return (ERROR);
443878ed226SJulian Elischer 
444878ed226SJulian Elischer 	if (rp.status != 0x00) {
445878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
446878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
447878ed226SJulian Elischer 		return (FAILED);
448878ed226SJulian Elischer 	}
449878ed226SJulian Elischer 
450878ed226SJulian Elischer 	fprintf(stdout, "Local name: %s\n", rp.name);
451878ed226SJulian Elischer 
452878ed226SJulian Elischer 	return (OK);
453878ed226SJulian Elischer } /* hci_read_local_name */
454878ed226SJulian Elischer 
455878ed226SJulian Elischer /* Send Read_Connection_Accept_Timeout to the unit */
456878ed226SJulian Elischer static int
457878ed226SJulian Elischer hci_read_connection_accept_timeout(int s, int argc, char **argv)
458878ed226SJulian Elischer {
459878ed226SJulian Elischer 	ng_hci_read_con_accept_timo_rp	rp;
460878ed226SJulian Elischer 	int				n;
461878ed226SJulian Elischer 
462878ed226SJulian Elischer 	n = sizeof(rp);
463878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
464878ed226SJulian Elischer 			NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
465878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
466878ed226SJulian Elischer 		return (ERROR);
467878ed226SJulian Elischer 
468878ed226SJulian Elischer 	if (rp.status != 0x00) {
469878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
470878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
471878ed226SJulian Elischer 		return (FAILED);
472878ed226SJulian Elischer 	}
473878ed226SJulian Elischer 
474878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
475878ed226SJulian Elischer 	fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
476878ed226SJulian Elischer 			rp.timeout * 0.625, rp.timeout);
477878ed226SJulian Elischer 
478878ed226SJulian Elischer 	return (OK);
479878ed226SJulian Elischer } /* hci_read_connection_accept_timeout */
480878ed226SJulian Elischer 
481878ed226SJulian Elischer /* Send Write_Connection_Accept_Timeout to the unit */
482878ed226SJulian Elischer static int
483878ed226SJulian Elischer hci_write_connection_accept_timeout(int s, int argc, char **argv)
484878ed226SJulian Elischer {
485878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_cp	cp;
486878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_rp	rp;
487878ed226SJulian Elischer 	int				n;
488878ed226SJulian Elischer 
489878ed226SJulian Elischer 	/* parse command parameters */
490878ed226SJulian Elischer 	switch (argc) {
491878ed226SJulian Elischer 	case 1:
492878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
493878ed226SJulian Elischer 			return (USAGE);
494878ed226SJulian Elischer 
495079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) n;
496878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
497878ed226SJulian Elischer 		break;
498878ed226SJulian Elischer 
499878ed226SJulian Elischer 	default:
500878ed226SJulian Elischer 		return (USAGE);
501878ed226SJulian Elischer 	}
502878ed226SJulian Elischer 
503878ed226SJulian Elischer 	/* send command */
504878ed226SJulian Elischer 	n = sizeof(rp);
505878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
506878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
507878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
508878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
509878ed226SJulian Elischer 		return (ERROR);
510878ed226SJulian Elischer 
511878ed226SJulian Elischer 	if (rp.status != 0x00) {
512878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
513878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
514878ed226SJulian Elischer 		return (FAILED);
515878ed226SJulian Elischer 	}
516878ed226SJulian Elischer 
517878ed226SJulian Elischer 	return (OK);
518878ed226SJulian Elischer } /* hci_write_connection_accept_timeout */
519878ed226SJulian Elischer 
520878ed226SJulian Elischer /* Send Read_Page_Timeout command to the unit */
521878ed226SJulian Elischer static int
522878ed226SJulian Elischer hci_read_page_timeout(int s, int argc, char **argv)
523878ed226SJulian Elischer {
524878ed226SJulian Elischer 	ng_hci_read_page_timo_rp	rp;
525878ed226SJulian Elischer 	int				n;
526878ed226SJulian Elischer 
527878ed226SJulian Elischer 	n = sizeof(rp);
528878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
529878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_TIMO),
530878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
531878ed226SJulian Elischer 		return (ERROR);
532878ed226SJulian Elischer 
533878ed226SJulian Elischer 	if (rp.status != 0x00) {
534878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
535878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
536878ed226SJulian Elischer 		return (FAILED);
537878ed226SJulian Elischer 	}
538878ed226SJulian Elischer 
539878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
540878ed226SJulian Elischer 	fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
541878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
542878ed226SJulian Elischer 
543878ed226SJulian Elischer 	return (OK);
544878ed226SJulian Elischer } /* hci_read_page_timeoout */
545878ed226SJulian Elischer 
546878ed226SJulian Elischer /* Send Write_Page_Timeout command to the unit */
547878ed226SJulian Elischer static int
548878ed226SJulian Elischer hci_write_page_timeout(int s, int argc, char **argv)
549878ed226SJulian Elischer {
550878ed226SJulian Elischer 	ng_hci_write_page_timo_cp	cp;
551878ed226SJulian Elischer 	ng_hci_write_page_timo_rp	rp;
552878ed226SJulian Elischer 	int				n;
553878ed226SJulian Elischer 
554878ed226SJulian Elischer 	/* parse command parameters */
555878ed226SJulian Elischer 	switch (argc) {
556878ed226SJulian Elischer 	case 1:
557878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
558878ed226SJulian Elischer 			return (USAGE);
559878ed226SJulian Elischer 
560079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) n;
561878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
562878ed226SJulian Elischer 		break;
563878ed226SJulian Elischer 
564878ed226SJulian Elischer 	default:
565878ed226SJulian Elischer 		return (USAGE);
566878ed226SJulian Elischer 	}
567878ed226SJulian Elischer 
568878ed226SJulian Elischer 	/* send command */
569878ed226SJulian Elischer 	n = sizeof(rp);
570878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
571878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_TIMO),
572878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
573878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
574878ed226SJulian Elischer 		return (ERROR);
575878ed226SJulian Elischer 
576878ed226SJulian Elischer 	if (rp.status != 0x00) {
577878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
578878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
579878ed226SJulian Elischer 		return (FAILED);
580878ed226SJulian Elischer 	}
581878ed226SJulian Elischer 
582878ed226SJulian Elischer 	return (OK);
583878ed226SJulian Elischer } /* hci_write_page_timeout */
584878ed226SJulian Elischer 
585878ed226SJulian Elischer /* Send Read_Scan_Enable command to the unit */
586878ed226SJulian Elischer static int
587878ed226SJulian Elischer hci_read_scan_enable(int s, int argc, char **argv)
588878ed226SJulian Elischer {
589878ed226SJulian Elischer 	ng_hci_read_scan_enable_rp	rp;
590878ed226SJulian Elischer 	int				n;
591878ed226SJulian Elischer 
592878ed226SJulian Elischer 	n = sizeof(rp);
593878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
594878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCAN_ENABLE),
595878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
596878ed226SJulian Elischer 		return (ERROR);
597878ed226SJulian Elischer 
598878ed226SJulian Elischer 	if (rp.status != 0x00) {
599878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
600878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
601878ed226SJulian Elischer 		return (FAILED);
602878ed226SJulian Elischer 	}
603878ed226SJulian Elischer 
604878ed226SJulian Elischer 	fprintf(stdout, "Scan enable: %s [%#02x]\n",
605878ed226SJulian Elischer 		hci_scan2str(rp.scan_enable), rp.scan_enable);
606878ed226SJulian Elischer 
607878ed226SJulian Elischer 	return (OK);
608878ed226SJulian Elischer } /* hci_read_scan_enable */
609878ed226SJulian Elischer 
610878ed226SJulian Elischer /* Send Write_Scan_Enable command to the unit */
611878ed226SJulian Elischer static int
612878ed226SJulian Elischer hci_write_scan_enable(int s, int argc, char **argv)
613878ed226SJulian Elischer {
614878ed226SJulian Elischer 	ng_hci_write_scan_enable_cp	cp;
615878ed226SJulian Elischer 	ng_hci_write_scan_enable_rp	rp;
616878ed226SJulian Elischer 	int				n;
617878ed226SJulian Elischer 
618878ed226SJulian Elischer 	/* parse command parameters */
619878ed226SJulian Elischer 	switch (argc) {
620878ed226SJulian Elischer 	case 1:
621878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
622878ed226SJulian Elischer 			return (USAGE);
623878ed226SJulian Elischer 
624079a8a3eSMaksim Yevmenkin 		cp.scan_enable = (uint8_t) n;
625878ed226SJulian Elischer 		break;
626878ed226SJulian Elischer 
627878ed226SJulian Elischer 	default:
628878ed226SJulian Elischer 		return (USAGE);
629878ed226SJulian Elischer 	}
630878ed226SJulian Elischer 
631878ed226SJulian Elischer 	n = sizeof(rp);
632878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
633878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCAN_ENABLE),
634878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
635878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
636878ed226SJulian Elischer 		return (ERROR);
637878ed226SJulian Elischer 
638878ed226SJulian Elischer 	if (rp.status != 0x00) {
639878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
640878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
641878ed226SJulian Elischer 		return (FAILED);
642878ed226SJulian Elischer 	}
643878ed226SJulian Elischer 
644878ed226SJulian Elischer 	return (OK);
645878ed226SJulian Elischer } /* hci_write_scan_enable */
646878ed226SJulian Elischer 
647878ed226SJulian Elischer /* Send Read_Page_Scan_Activity command to the unit */
648878ed226SJulian Elischer static int
649878ed226SJulian Elischer hci_read_page_scan_activity(int s, int argc, char **argv)
650878ed226SJulian Elischer {
651878ed226SJulian Elischer 	ng_hci_read_page_scan_activity_rp	rp;
652878ed226SJulian Elischer 	int					n;
653878ed226SJulian Elischer 
654878ed226SJulian Elischer 	n = sizeof(rp);
655878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
656878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
657878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
658878ed226SJulian Elischer 		return (ERROR);
659878ed226SJulian Elischer 
660878ed226SJulian Elischer 	if (rp.status != 0x00) {
661878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
662878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
663878ed226SJulian Elischer 		return (FAILED);
664878ed226SJulian Elischer 	}
665878ed226SJulian Elischer 
666878ed226SJulian Elischer 	rp.page_scan_interval = le16toh(rp.page_scan_interval);
667878ed226SJulian Elischer 	rp.page_scan_window = le16toh(rp.page_scan_window);
668878ed226SJulian Elischer 
669878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
670878ed226SJulian Elischer 		rp.page_scan_interval * 0.625, rp.page_scan_interval);
671878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
672878ed226SJulian Elischer 		rp.page_scan_window * 0.625, rp.page_scan_window);
673878ed226SJulian Elischer 
674878ed226SJulian Elischer 	return (OK);
675878ed226SJulian Elischer } /* hci_read_page_scan_activity */
676878ed226SJulian Elischer 
677878ed226SJulian Elischer /* Send Write_Page_Scan_Activity command to the unit */
678878ed226SJulian Elischer static int
679878ed226SJulian Elischer hci_write_page_scan_activity(int s, int argc, char **argv)
680878ed226SJulian Elischer {
681878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_cp	cp;
682878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_rp	rp;
683878ed226SJulian Elischer 	int					n;
684878ed226SJulian Elischer 
685878ed226SJulian Elischer 	/* parse command parameters */
686878ed226SJulian Elischer 	switch (argc) {
687878ed226SJulian Elischer 	case 2:
688878ed226SJulian Elischer 		/* page scan interval */
689878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
690878ed226SJulian Elischer 			return (USAGE);
691878ed226SJulian Elischer 
692079a8a3eSMaksim Yevmenkin 		cp.page_scan_interval = (uint16_t) n;
693878ed226SJulian Elischer 
694878ed226SJulian Elischer 		/* page scan window */
6959e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
696878ed226SJulian Elischer 			return (USAGE);
697878ed226SJulian Elischer 
698079a8a3eSMaksim Yevmenkin 		cp.page_scan_window = (uint16_t) n;
699878ed226SJulian Elischer 
700878ed226SJulian Elischer 		if (cp.page_scan_window > cp.page_scan_interval)
701878ed226SJulian Elischer 			return (USAGE);
702878ed226SJulian Elischer 
703878ed226SJulian Elischer 		cp.page_scan_interval = htole16(cp.page_scan_interval);
704878ed226SJulian Elischer 		cp.page_scan_window = htole16(cp.page_scan_window);
705878ed226SJulian Elischer 		break;
706878ed226SJulian Elischer 
707878ed226SJulian Elischer 	default:
708878ed226SJulian Elischer 		return (USAGE);
709878ed226SJulian Elischer 	}
710878ed226SJulian Elischer 
711878ed226SJulian Elischer 	/* send command */
712878ed226SJulian Elischer 	n = sizeof(rp);
713878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
714878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
715878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
716878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
717878ed226SJulian Elischer 		return (ERROR);
718878ed226SJulian Elischer 
719878ed226SJulian Elischer 	if (rp.status != 0x00) {
720878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
721878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
722878ed226SJulian Elischer 		return (FAILED);
723878ed226SJulian Elischer 	}
724878ed226SJulian Elischer 
725878ed226SJulian Elischer 	return (OK);
726878ed226SJulian Elischer } /* hci_write_page_scan_activity */
727878ed226SJulian Elischer 
728878ed226SJulian Elischer /* Send Read_Inquiry_Scan_Activity command to the unit */
729878ed226SJulian Elischer static int
730878ed226SJulian Elischer hci_read_inquiry_scan_activity(int s, int argc, char **argv)
731878ed226SJulian Elischer {
732878ed226SJulian Elischer 	ng_hci_read_inquiry_scan_activity_rp	rp;
733878ed226SJulian Elischer 	int					n;
734878ed226SJulian Elischer 
735878ed226SJulian Elischer 	n = sizeof(rp);
736878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
737878ed226SJulian Elischer 			NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
738878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
739878ed226SJulian Elischer 		return (ERROR);
740878ed226SJulian Elischer 
741878ed226SJulian Elischer 	if (rp.status != 0x00) {
742878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
743878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
744878ed226SJulian Elischer 		return (FAILED);
745878ed226SJulian Elischer 	}
746878ed226SJulian Elischer 
747878ed226SJulian Elischer 	rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
748878ed226SJulian Elischer 	rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
749878ed226SJulian Elischer 
750878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
751878ed226SJulian Elischer 		rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
752878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
753878ed226SJulian Elischer 		rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
754878ed226SJulian Elischer 
755878ed226SJulian Elischer 	return (OK);
756878ed226SJulian Elischer } /* hci_read_inquiry_scan_activity */
757878ed226SJulian Elischer 
758878ed226SJulian Elischer /* Send Write_Inquiry_Scan_Activity command to the unit */
759878ed226SJulian Elischer static int
760878ed226SJulian Elischer hci_write_inquiry_scan_activity(int s, int argc, char **argv)
761878ed226SJulian Elischer {
762878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_cp	cp;
763878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_rp	rp;
764878ed226SJulian Elischer 	int					n;
765878ed226SJulian Elischer 
766878ed226SJulian Elischer 	/* parse command parameters */
767878ed226SJulian Elischer 	switch (argc) {
768878ed226SJulian Elischer 	case 2:
769878ed226SJulian Elischer 		/* inquiry scan interval */
770878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
771878ed226SJulian Elischer 			return (USAGE);
772878ed226SJulian Elischer 
773079a8a3eSMaksim Yevmenkin 		cp.inquiry_scan_interval = (uint16_t) n;
774878ed226SJulian Elischer 
775878ed226SJulian Elischer 		/* inquiry scan window */
7769e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
777878ed226SJulian Elischer 			return (USAGE);
778878ed226SJulian Elischer 
779079a8a3eSMaksim Yevmenkin 		cp.inquiry_scan_window = (uint16_t) n;
780878ed226SJulian Elischer 
781878ed226SJulian Elischer 		if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
782878ed226SJulian Elischer 			return (USAGE);
783878ed226SJulian Elischer 
784878ed226SJulian Elischer 		cp.inquiry_scan_interval =
785878ed226SJulian Elischer 			htole16(cp.inquiry_scan_interval);
786878ed226SJulian Elischer 		cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
787878ed226SJulian Elischer 		break;
788878ed226SJulian Elischer 
789878ed226SJulian Elischer 	default:
790878ed226SJulian Elischer 		return (USAGE);
791878ed226SJulian Elischer 	}
792878ed226SJulian Elischer 
793878ed226SJulian Elischer 	/* send command */
794878ed226SJulian Elischer 	n = sizeof(rp);
795878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
796878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
797878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
798878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
799878ed226SJulian Elischer 		return (ERROR);
800878ed226SJulian Elischer 
801878ed226SJulian Elischer 	if (rp.status != 0x00) {
802878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
803878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
804878ed226SJulian Elischer 		return (FAILED);
805878ed226SJulian Elischer 	}
806878ed226SJulian Elischer 
807878ed226SJulian Elischer 	return (OK);
808878ed226SJulian Elischer } /* hci_write_inquiry_scan_activity */
809878ed226SJulian Elischer 
810878ed226SJulian Elischer /* Send Read_Authentication_Enable command to the unit */
811878ed226SJulian Elischer static int
812878ed226SJulian Elischer hci_read_authentication_enable(int s, int argc, char **argv)
813878ed226SJulian Elischer {
814878ed226SJulian Elischer 	ng_hci_read_auth_enable_rp	rp;
815878ed226SJulian Elischer 	int				n;
816878ed226SJulian Elischer 
817878ed226SJulian Elischer 	n = sizeof(rp);
818878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
819878ed226SJulian Elischer 			NG_HCI_OCF_READ_AUTH_ENABLE),
820878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
821878ed226SJulian Elischer 		return (ERROR);
822878ed226SJulian Elischer 
823878ed226SJulian Elischer 	if (rp.status != 0x00) {
824878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
825878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
826878ed226SJulian Elischer 		return (FAILED);
827878ed226SJulian Elischer 	}
828878ed226SJulian Elischer 
829878ed226SJulian Elischer 	fprintf(stdout, "Authentication Enable: %s [%d]\n",
830878ed226SJulian Elischer 		rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
831878ed226SJulian Elischer 
832878ed226SJulian Elischer 	return (OK);
833878ed226SJulian Elischer } /* hci_read_authentication_enable */
834878ed226SJulian Elischer 
835878ed226SJulian Elischer /* Send Write_Authentication_Enable command to the unit */
836878ed226SJulian Elischer static int
837878ed226SJulian Elischer hci_write_authentication_enable(int s, int argc, char **argv)
838878ed226SJulian Elischer {
839878ed226SJulian Elischer 	ng_hci_write_auth_enable_cp	cp;
840878ed226SJulian Elischer 	ng_hci_write_auth_enable_rp	rp;
841878ed226SJulian Elischer 	int				n;
842878ed226SJulian Elischer 
843878ed226SJulian Elischer 	/* parse command parameters */
844878ed226SJulian Elischer 	switch (argc) {
845878ed226SJulian Elischer 	case 1:
846878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
847878ed226SJulian Elischer 			return (USAGE);
848878ed226SJulian Elischer 
849079a8a3eSMaksim Yevmenkin 		cp.auth_enable = (uint8_t) n;
850878ed226SJulian Elischer 		break;
851878ed226SJulian Elischer 
852878ed226SJulian Elischer 	default:
853878ed226SJulian Elischer 		return (USAGE);
854878ed226SJulian Elischer 	}
855878ed226SJulian Elischer 
856878ed226SJulian Elischer 	/* send command */
857878ed226SJulian Elischer 	n = sizeof(rp);
858878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
859878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_AUTH_ENABLE),
860878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
861878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
862878ed226SJulian Elischer 		return (ERROR);
863878ed226SJulian Elischer 
864878ed226SJulian Elischer 	if (rp.status != 0x00) {
865878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
866878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
867878ed226SJulian Elischer 		return (FAILED);
868878ed226SJulian Elischer 	}
869878ed226SJulian Elischer 
870878ed226SJulian Elischer 	return (OK);
871878ed226SJulian Elischer } /* hci_write_authentication_enable */
872878ed226SJulian Elischer 
873878ed226SJulian Elischer /* Send Read_Encryption_Mode command to the unit */
874878ed226SJulian Elischer static int
875878ed226SJulian Elischer hci_read_encryption_mode(int s, int argc, char **argv)
876878ed226SJulian Elischer {
877878ed226SJulian Elischer 	ng_hci_read_encryption_mode_rp	rp;
878878ed226SJulian Elischer 	int				n;
879878ed226SJulian Elischer 
880878ed226SJulian Elischer 	n = sizeof(rp);
881878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
882878ed226SJulian Elischer 			NG_HCI_OCF_READ_ENCRYPTION_MODE),
883878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
884878ed226SJulian Elischer 		return (ERROR);
885878ed226SJulian Elischer 
886878ed226SJulian Elischer 	if (rp.status != 0x00) {
887878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
888878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
889878ed226SJulian Elischer 		return (FAILED);
890878ed226SJulian Elischer 	}
891878ed226SJulian Elischer 
892878ed226SJulian Elischer 	fprintf(stdout, "Encryption mode: %s [%#02x]\n",
893878ed226SJulian Elischer 		hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
894878ed226SJulian Elischer 
895878ed226SJulian Elischer 	return (OK);
896878ed226SJulian Elischer } /* hci_read_encryption_mode */
897878ed226SJulian Elischer 
898878ed226SJulian Elischer /* Send Write_Encryption_Mode command to the unit */
899878ed226SJulian Elischer static int
900878ed226SJulian Elischer hci_write_encryption_mode(int s, int argc, char **argv)
901878ed226SJulian Elischer {
902878ed226SJulian Elischer 	ng_hci_write_encryption_mode_cp	cp;
903878ed226SJulian Elischer 	ng_hci_write_encryption_mode_rp	rp;
904878ed226SJulian Elischer 	int				n;
905878ed226SJulian Elischer 
906878ed226SJulian Elischer 	/* parse command parameters */
907878ed226SJulian Elischer 	switch (argc) {
908878ed226SJulian Elischer 	case 1:
909878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
910878ed226SJulian Elischer 			return (USAGE);
911878ed226SJulian Elischer 
912079a8a3eSMaksim Yevmenkin 		cp.encryption_mode = (uint8_t) n;
913878ed226SJulian Elischer 		break;
914878ed226SJulian Elischer 
915878ed226SJulian Elischer 	default:
916878ed226SJulian Elischer 		return (USAGE);
917878ed226SJulian Elischer 	}
918878ed226SJulian Elischer 
919878ed226SJulian Elischer 	/* send command */
920878ed226SJulian Elischer 	n = sizeof(rp);
921878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
922878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
923878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
924878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
925878ed226SJulian Elischer 		return (ERROR);
926878ed226SJulian Elischer 
927878ed226SJulian Elischer 	if (rp.status != 0x00) {
928878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
929878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
930878ed226SJulian Elischer 		return (FAILED);
931878ed226SJulian Elischer 	}
932878ed226SJulian Elischer 
933878ed226SJulian Elischer 	return (OK);
934878ed226SJulian Elischer } /* hci_write_encryption_mode */
935878ed226SJulian Elischer 
936878ed226SJulian Elischer /* Send Read_Class_Of_Device command to the unit */
937878ed226SJulian Elischer static int
938878ed226SJulian Elischer hci_read_class_of_device(int s, int argc, char **argv)
939878ed226SJulian Elischer {
940878ed226SJulian Elischer 	ng_hci_read_unit_class_rp	rp;
941878ed226SJulian Elischer 	int				n;
942878ed226SJulian Elischer 
943878ed226SJulian Elischer 	n = sizeof(rp);
944878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
945878ed226SJulian Elischer 			NG_HCI_OCF_READ_UNIT_CLASS),
946878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
947878ed226SJulian Elischer 		return (ERROR);
948878ed226SJulian Elischer 
949878ed226SJulian Elischer 	if (rp.status != 0x00) {
950878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
951878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
952878ed226SJulian Elischer 		return (FAILED);
953878ed226SJulian Elischer 	}
954878ed226SJulian Elischer 
955878ed226SJulian Elischer 	fprintf(stdout, "Class: %02x:%02x:%02x\n",
956878ed226SJulian Elischer 		rp.uclass[2], rp.uclass[1], rp.uclass[0]);
957878ed226SJulian Elischer 
958878ed226SJulian Elischer 	return (0);
959878ed226SJulian Elischer } /* hci_read_class_of_device */
960878ed226SJulian Elischer 
961878ed226SJulian Elischer /* Send Write_Class_Of_Device command to the unit */
962878ed226SJulian Elischer static int
963878ed226SJulian Elischer hci_write_class_of_device(int s, int argc, char **argv)
964878ed226SJulian Elischer {
965878ed226SJulian Elischer 	ng_hci_write_unit_class_cp	cp;
966878ed226SJulian Elischer 	ng_hci_write_unit_class_rp	rp;
967878ed226SJulian Elischer 	int				n0, n1, n2;
968878ed226SJulian Elischer 
969878ed226SJulian Elischer 	/* parse command parameters */
970878ed226SJulian Elischer 	switch (argc) {
971878ed226SJulian Elischer 	case 1:
972878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
973878ed226SJulian Elischer 			return (USAGE);
974878ed226SJulian Elischer 
975878ed226SJulian Elischer 		cp.uclass[0] = (n0 & 0xff);
976878ed226SJulian Elischer 		cp.uclass[1] = (n1 & 0xff);
977878ed226SJulian Elischer 		cp.uclass[2] = (n2 & 0xff);
978878ed226SJulian Elischer 		break;
979878ed226SJulian Elischer 
980878ed226SJulian Elischer 	default:
981878ed226SJulian Elischer 		return (USAGE);
982878ed226SJulian Elischer 	}
983878ed226SJulian Elischer 
984878ed226SJulian Elischer 	/* send command */
985878ed226SJulian Elischer 	n0 = sizeof(rp);
986878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
987878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_UNIT_CLASS),
988878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
989878ed226SJulian Elischer 			(char *) &rp, &n0) == ERROR)
990878ed226SJulian Elischer 		return (ERROR);
991878ed226SJulian Elischer 
992878ed226SJulian Elischer 	if (rp.status != 0x00) {
993878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
994878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
995878ed226SJulian Elischer 		return (FAILED);
996878ed226SJulian Elischer 	}
997878ed226SJulian Elischer 
998878ed226SJulian Elischer 	return (OK);
999878ed226SJulian Elischer } /* hci_write_class_of_device */
1000878ed226SJulian Elischer 
1001878ed226SJulian Elischer /* Send Read_Voice_Settings command to the unit */
1002878ed226SJulian Elischer static int
1003878ed226SJulian Elischer hci_read_voice_settings(int s, int argc, char **argv)
1004878ed226SJulian Elischer {
1005878ed226SJulian Elischer 	ng_hci_read_voice_settings_rp	rp;
1006878ed226SJulian Elischer 	int				n,
1007878ed226SJulian Elischer 					input_coding,
1008878ed226SJulian Elischer 					input_data_format,
1009878ed226SJulian Elischer 					input_sample_size;
1010878ed226SJulian Elischer 
1011878ed226SJulian Elischer 	n = sizeof(rp);
1012878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1013878ed226SJulian Elischer 			NG_HCI_OCF_READ_VOICE_SETTINGS),
1014878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1015878ed226SJulian Elischer 		return (ERROR);
1016878ed226SJulian Elischer 
1017878ed226SJulian Elischer 	if (rp.status != 0x00) {
1018878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1019878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1020878ed226SJulian Elischer 		return (FAILED);
1021878ed226SJulian Elischer 	}
1022878ed226SJulian Elischer 
1023878ed226SJulian Elischer 	rp.settings = le16toh(rp.settings);
1024878ed226SJulian Elischer 
1025878ed226SJulian Elischer 	input_coding      = (rp.settings & 0x0300) >> 8;
1026878ed226SJulian Elischer 	input_data_format = (rp.settings & 0x00c0) >> 6;
1027878ed226SJulian Elischer 	input_sample_size = (rp.settings & 0x0020) >> 5;
1028878ed226SJulian Elischer 
1029878ed226SJulian Elischer 	fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1030878ed226SJulian Elischer 	fprintf(stdout, "Input coding: %s [%d]\n",
1031878ed226SJulian Elischer 		hci_coding2str(input_coding), input_coding);
1032878ed226SJulian Elischer 	fprintf(stdout, "Input data format: %s [%d]\n",
1033878ed226SJulian Elischer 		hci_vdata2str(input_data_format), input_data_format);
1034878ed226SJulian Elischer 
1035878ed226SJulian Elischer 	if (input_coding == 0x00) /* Only for Linear PCM */
1036878ed226SJulian Elischer 		fprintf(stdout, "Input sample size: %d bit [%d]\n",
1037878ed226SJulian Elischer 			input_sample_size? 16 : 8, input_sample_size);
1038878ed226SJulian Elischer 
1039878ed226SJulian Elischer 	return (OK);
1040878ed226SJulian Elischer } /* hci_read_voice_settings */
1041878ed226SJulian Elischer 
1042878ed226SJulian Elischer /* Send Write_Voice_Settings command to the unit */
1043878ed226SJulian Elischer static int
1044878ed226SJulian Elischer hci_write_voice_settings(int s, int argc, char **argv)
1045878ed226SJulian Elischer {
1046878ed226SJulian Elischer 	ng_hci_write_voice_settings_cp	cp;
1047878ed226SJulian Elischer 	ng_hci_write_voice_settings_rp	rp;
1048878ed226SJulian Elischer 	int				n;
1049878ed226SJulian Elischer 
1050878ed226SJulian Elischer 	/* parse command parameters */
1051878ed226SJulian Elischer 	switch (argc) {
1052878ed226SJulian Elischer 	case 1:
1053878ed226SJulian Elischer 		if (sscanf(argv[0], "%x", &n) != 1)
1054878ed226SJulian Elischer 			return (USAGE);
1055878ed226SJulian Elischer 
1056079a8a3eSMaksim Yevmenkin 		cp.settings = (uint16_t) n;
1057878ed226SJulian Elischer 		cp.settings = htole16(cp.settings);
1058878ed226SJulian Elischer 		break;
1059878ed226SJulian Elischer 
1060878ed226SJulian Elischer 	default:
1061878ed226SJulian Elischer 		return (USAGE);
1062878ed226SJulian Elischer 	}
1063878ed226SJulian Elischer 
1064878ed226SJulian Elischer 	/* send command */
1065878ed226SJulian Elischer 	n = sizeof(rp);
1066878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1067878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1068878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1069878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1070878ed226SJulian Elischer 		return (ERROR);
1071878ed226SJulian Elischer 
1072878ed226SJulian Elischer 	if (rp.status != 0x00) {
1073878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1074878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1075878ed226SJulian Elischer 		return (FAILED);
1076878ed226SJulian Elischer 	}
1077878ed226SJulian Elischer 
1078878ed226SJulian Elischer 	return (OK);
1079878ed226SJulian Elischer } /* hci_write_voice_settings */
1080878ed226SJulian Elischer 
1081878ed226SJulian Elischer /* Send Read_Number_Broadcast_Restransmissions */
1082878ed226SJulian Elischer static int
1083878ed226SJulian Elischer hci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1084878ed226SJulian Elischer {
1085878ed226SJulian Elischer 	ng_hci_read_num_broadcast_retrans_rp	rp;
1086878ed226SJulian Elischer 	int					n;
1087878ed226SJulian Elischer 
1088878ed226SJulian Elischer 	n = sizeof(rp);
1089878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1090878ed226SJulian Elischer 			NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1091878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1092878ed226SJulian Elischer 		return (ERROR);
1093878ed226SJulian Elischer 
1094878ed226SJulian Elischer 	if (rp.status != 0x00) {
1095878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1096878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1097878ed226SJulian Elischer 		return (FAILED);
1098878ed226SJulian Elischer 	}
1099878ed226SJulian Elischer 
1100878ed226SJulian Elischer 	fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1101878ed226SJulian Elischer 		rp.counter);
1102878ed226SJulian Elischer 
1103878ed226SJulian Elischer 	return (OK);
1104878ed226SJulian Elischer } /* hci_read_number_broadcast_retransmissions */
1105878ed226SJulian Elischer 
1106878ed226SJulian Elischer /* Send Write_Number_Broadcast_Restransmissions */
1107878ed226SJulian Elischer static int
1108878ed226SJulian Elischer hci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1109878ed226SJulian Elischer {
1110878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_cp	cp;
1111878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_rp	rp;
1112878ed226SJulian Elischer 	int					n;
1113878ed226SJulian Elischer 
1114878ed226SJulian Elischer 	/* parse command parameters */
1115878ed226SJulian Elischer 	switch (argc) {
1116878ed226SJulian Elischer 	case 1:
1117878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1118878ed226SJulian Elischer 			return (USAGE);
1119878ed226SJulian Elischer 
1120079a8a3eSMaksim Yevmenkin 		cp.counter = (uint8_t) n;
1121878ed226SJulian Elischer 		break;
1122878ed226SJulian Elischer 
1123878ed226SJulian Elischer 	default:
1124878ed226SJulian Elischer 		return (USAGE);
1125878ed226SJulian Elischer 	}
1126878ed226SJulian Elischer 
1127878ed226SJulian Elischer 	/* send command */
1128878ed226SJulian Elischer 	n = sizeof(rp);
1129878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1130878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1131878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1132878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1133878ed226SJulian Elischer 		return (ERROR);
1134878ed226SJulian Elischer 
1135878ed226SJulian Elischer 	if (rp.status != 0x00) {
1136878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1137878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1138878ed226SJulian Elischer 		return (FAILED);
1139878ed226SJulian Elischer 	}
1140878ed226SJulian Elischer 
1141878ed226SJulian Elischer 	return (OK);
1142878ed226SJulian Elischer } /* hci_write_number_broadcast_retransmissions */
1143878ed226SJulian Elischer 
1144878ed226SJulian Elischer /* Send Read_Hold_Mode_Activity command to the unit */
1145878ed226SJulian Elischer static int
1146878ed226SJulian Elischer hci_read_hold_mode_activity(int s, int argc, char **argv)
1147878ed226SJulian Elischer {
1148878ed226SJulian Elischer 	ng_hci_read_hold_mode_activity_rp	rp;
1149878ed226SJulian Elischer 	int					n;
1150878ed226SJulian Elischer 	char					buffer[1024];
1151878ed226SJulian Elischer 
1152878ed226SJulian Elischer 	n = sizeof(rp);
1153878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1154878ed226SJulian Elischer 			NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1155878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1156878ed226SJulian Elischer 		return (ERROR);
1157878ed226SJulian Elischer 
1158878ed226SJulian Elischer 	if (rp.status != 0x00) {
1159878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1160878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1161878ed226SJulian Elischer 		return (FAILED);
1162878ed226SJulian Elischer 	}
1163878ed226SJulian Elischer 
1164878ed226SJulian Elischer 	fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1165878ed226SJulian Elischer 	if (rp.hold_mode_activity == 0)
1166878ed226SJulian Elischer 		fprintf(stdout, "Maintain current Power State");
1167878ed226SJulian Elischer 	else
1168878ed226SJulian Elischer 		fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1169878ed226SJulian Elischer 				buffer, sizeof(buffer)));
1170878ed226SJulian Elischer 
1171878ed226SJulian Elischer 	fprintf(stdout, "\n");
1172878ed226SJulian Elischer 
1173878ed226SJulian Elischer 	return (OK);
1174878ed226SJulian Elischer } /* hci_read_hold_mode_activity */
1175878ed226SJulian Elischer 
1176878ed226SJulian Elischer /* Send Write_Hold_Mode_Activity command to the unit */
1177878ed226SJulian Elischer static int
1178878ed226SJulian Elischer hci_write_hold_mode_activity(int s, int argc, char **argv)
1179878ed226SJulian Elischer {
1180878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_cp	cp;
1181878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_rp	rp;
1182878ed226SJulian Elischer 	int					n;
1183878ed226SJulian Elischer 
1184878ed226SJulian Elischer 	/* parse command parameters */
1185878ed226SJulian Elischer 	switch (argc) {
1186878ed226SJulian Elischer 	case 1:
1187878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1188878ed226SJulian Elischer 			return (USAGE);
1189878ed226SJulian Elischer 
1190079a8a3eSMaksim Yevmenkin 		cp.hold_mode_activity = (uint8_t) n;
1191878ed226SJulian Elischer 		break;
1192878ed226SJulian Elischer 
1193878ed226SJulian Elischer 	default:
1194878ed226SJulian Elischer 		return (USAGE);
1195878ed226SJulian Elischer 	}
1196878ed226SJulian Elischer 
1197878ed226SJulian Elischer 	/* send command */
1198878ed226SJulian Elischer 	n = sizeof(rp);
1199878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1200878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1201878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1202878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1203878ed226SJulian Elischer 		return (ERROR);
1204878ed226SJulian Elischer 
1205878ed226SJulian Elischer 	if (rp.status != 0x00) {
1206878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1207878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1208878ed226SJulian Elischer 		return (FAILED);
1209878ed226SJulian Elischer 	}
1210878ed226SJulian Elischer 
1211878ed226SJulian Elischer 	return (OK);
1212878ed226SJulian Elischer } /* hci_write_hold_mode_activity */
1213878ed226SJulian Elischer 
1214878ed226SJulian Elischer /* Send Read_SCO_Flow_Control_Enable command to the unit */
1215878ed226SJulian Elischer static int
1216878ed226SJulian Elischer hci_read_sco_flow_control_enable(int s, int argc, char **argv)
1217878ed226SJulian Elischer {
1218878ed226SJulian Elischer 	ng_hci_read_sco_flow_control_rp	rp;
1219878ed226SJulian Elischer 	int				n;
1220878ed226SJulian Elischer 
1221878ed226SJulian Elischer 	n = sizeof(rp);
1222878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1223878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1224878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1225878ed226SJulian Elischer 		return (ERROR);
1226878ed226SJulian Elischer 
1227878ed226SJulian Elischer 	if (rp.status != 0x00) {
1228878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1229878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1230878ed226SJulian Elischer 		return (FAILED);
1231878ed226SJulian Elischer 	}
1232878ed226SJulian Elischer 
1233878ed226SJulian Elischer 	fprintf(stdout, "SCO flow control %s [%d]\n",
1234878ed226SJulian Elischer 		rp.flow_control? "enabled" : "disabled", rp.flow_control);
1235878ed226SJulian Elischer 
1236878ed226SJulian Elischer 	return (OK);
1237878ed226SJulian Elischer } /* hci_read_sco_flow_control_enable */
1238878ed226SJulian Elischer 
1239878ed226SJulian Elischer /* Send Write_SCO_Flow_Control_Enable command to the unit */
1240878ed226SJulian Elischer static int
1241878ed226SJulian Elischer hci_write_sco_flow_control_enable(int s, int argc, char **argv)
1242878ed226SJulian Elischer {
1243878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_cp	cp;
1244878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_rp	rp;
1245878ed226SJulian Elischer 	int					n;
1246878ed226SJulian Elischer 
1247878ed226SJulian Elischer 	/* parse command parameters */
1248878ed226SJulian Elischer 	switch (argc) {
1249878ed226SJulian Elischer 	case 1:
1250878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1251878ed226SJulian Elischer 			return (USAGE);
1252878ed226SJulian Elischer 
1253079a8a3eSMaksim Yevmenkin 		cp.flow_control = (uint8_t) n;
1254878ed226SJulian Elischer 		break;
1255878ed226SJulian Elischer 
1256878ed226SJulian Elischer 	default:
1257878ed226SJulian Elischer 		return (USAGE);
1258878ed226SJulian Elischer 	}
1259878ed226SJulian Elischer 
1260878ed226SJulian Elischer 	/* send command */
1261878ed226SJulian Elischer 	n = sizeof(rp);
1262878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1263878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1264878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1265878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1266878ed226SJulian Elischer 		return (ERROR);
1267878ed226SJulian Elischer 
1268878ed226SJulian Elischer 	if (rp.status != 0x00) {
1269878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1270878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1271878ed226SJulian Elischer 		return (FAILED);
1272878ed226SJulian Elischer 	}
1273878ed226SJulian Elischer 
1274878ed226SJulian Elischer 	return (OK);
1275878ed226SJulian Elischer } /* hci_write_sco_flow_control_enable */
1276878ed226SJulian Elischer 
1277878ed226SJulian Elischer /* Send Read_Link_Supervision_Timeout command to the unit */
1278878ed226SJulian Elischer static int
1279878ed226SJulian Elischer hci_read_link_supervision_timeout(int s, int argc, char **argv)
1280878ed226SJulian Elischer {
1281878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_cp	cp;
1282878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_rp	rp;
1283878ed226SJulian Elischer 	int					n;
1284878ed226SJulian Elischer 
1285878ed226SJulian Elischer 	switch (argc) {
1286878ed226SJulian Elischer 	case 1:
1287878ed226SJulian Elischer 		/* connection handle */
1288878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1289878ed226SJulian Elischer 			return (USAGE);
1290878ed226SJulian Elischer 
1291079a8a3eSMaksim Yevmenkin 		cp.con_handle = (uint16_t) (n & 0x0fff);
1292878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1293878ed226SJulian Elischer 		break;
1294878ed226SJulian Elischer 
1295878ed226SJulian Elischer 	default:
1296878ed226SJulian Elischer 		return (USAGE);
1297878ed226SJulian Elischer 	}
1298878ed226SJulian Elischer 
1299878ed226SJulian Elischer 	/* send command */
1300878ed226SJulian Elischer 	n = sizeof(rp);
1301878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1302878ed226SJulian Elischer 			NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1303878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1304878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1305878ed226SJulian Elischer 		return (ERROR);
1306878ed226SJulian Elischer 
1307878ed226SJulian Elischer 	if (rp.status != 0x00) {
1308878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1309878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1310878ed226SJulian Elischer 		return (FAILED);
1311878ed226SJulian Elischer 	}
1312878ed226SJulian Elischer 
1313878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
1314878ed226SJulian Elischer 
1315878ed226SJulian Elischer 	fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1316878ed226SJulian Elischer 	fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1317878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
1318878ed226SJulian Elischer 
1319878ed226SJulian Elischer 	return (OK);
1320878ed226SJulian Elischer } /* hci_read_link_supervision_timeout */
1321878ed226SJulian Elischer 
1322878ed226SJulian Elischer /* Send Write_Link_Supervision_Timeout command to the unit */
1323878ed226SJulian Elischer static int
1324878ed226SJulian Elischer hci_write_link_supervision_timeout(int s, int argc, char **argv)
1325878ed226SJulian Elischer {
1326878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_cp	cp;
1327878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_rp	rp;
1328878ed226SJulian Elischer 	int					n;
1329878ed226SJulian Elischer 
1330878ed226SJulian Elischer 	switch (argc) {
1331878ed226SJulian Elischer 	case 2:
1332878ed226SJulian Elischer 		/* connection handle */
1333878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1334878ed226SJulian Elischer 			return (USAGE);
1335878ed226SJulian Elischer 
1336079a8a3eSMaksim Yevmenkin 		cp.con_handle = (uint16_t) (n & 0x0fff);
1337878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1338878ed226SJulian Elischer 
1339878ed226SJulian Elischer 		/* link supervision timeout */
13409e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xffff)
1341878ed226SJulian Elischer 			return (USAGE);
1342878ed226SJulian Elischer 
1343079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) (n & 0x0fff);
1344878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
1345878ed226SJulian Elischer 		break;
1346878ed226SJulian Elischer 
1347878ed226SJulian Elischer 	default:
1348878ed226SJulian Elischer 		return (USAGE);
1349878ed226SJulian Elischer 	}
1350878ed226SJulian Elischer 
1351878ed226SJulian Elischer 	/* send command */
1352878ed226SJulian Elischer 	n = sizeof(rp);
1353878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1354878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1355878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1356878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1357878ed226SJulian Elischer 		return (ERROR);
1358878ed226SJulian Elischer 
1359878ed226SJulian Elischer 	if (rp.status != 0x00) {
1360878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1361878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1362878ed226SJulian Elischer 		return (FAILED);
1363878ed226SJulian Elischer 	}
1364878ed226SJulian Elischer 
1365878ed226SJulian Elischer 	return (OK);
1366878ed226SJulian Elischer } /* hci_write_link_supervision_timeout */
1367878ed226SJulian Elischer 
13680986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Period_Mode command to the unit */
13690986ab12SMaksim Yevmenkin static int
13700986ab12SMaksim Yevmenkin hci_read_page_scan_period_mode(int s, int argc, char **argv)
13710986ab12SMaksim Yevmenkin {
13720986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_period_rp	rp;
13730986ab12SMaksim Yevmenkin 	int				n;
13740986ab12SMaksim Yevmenkin 
13750986ab12SMaksim Yevmenkin 	n = sizeof(rp);
13760986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
13770986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN_PERIOD),
13780986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
13790986ab12SMaksim Yevmenkin 		return (ERROR);
13800986ab12SMaksim Yevmenkin 
13810986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
13820986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
13830986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
13840986ab12SMaksim Yevmenkin 		return (FAILED);
13850986ab12SMaksim Yevmenkin 	}
13860986ab12SMaksim Yevmenkin 
13870986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan period mode: %#02x\n",
13880986ab12SMaksim Yevmenkin 		rp.page_scan_period_mode);
13890986ab12SMaksim Yevmenkin 
13900986ab12SMaksim Yevmenkin 	return (OK);
13910986ab12SMaksim Yevmenkin } /* hci_read_page_scan_period_mode */
13920986ab12SMaksim Yevmenkin 
13930986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Period_Mode command to the unit */
13940986ab12SMaksim Yevmenkin static int
13950986ab12SMaksim Yevmenkin hci_write_page_scan_period_mode(int s, int argc, char **argv)
13960986ab12SMaksim Yevmenkin {
13970986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_cp	cp;
13980986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_rp	rp;
13990986ab12SMaksim Yevmenkin 	int					n;
14000986ab12SMaksim Yevmenkin 
14010986ab12SMaksim Yevmenkin 	/* parse command arguments */
14020986ab12SMaksim Yevmenkin 	switch (argc) {
14030986ab12SMaksim Yevmenkin 	case 1:
14040986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
14050986ab12SMaksim Yevmenkin 			return (USAGE);
14060986ab12SMaksim Yevmenkin 
14070986ab12SMaksim Yevmenkin 		cp.page_scan_period_mode = (n & 0xff);
14080986ab12SMaksim Yevmenkin 		break;
14090986ab12SMaksim Yevmenkin 
14100986ab12SMaksim Yevmenkin 	default:
14110986ab12SMaksim Yevmenkin 		return (USAGE);
14120986ab12SMaksim Yevmenkin 	}
14130986ab12SMaksim Yevmenkin 
14140986ab12SMaksim Yevmenkin 	/* send command */
14150986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14160986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14170986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN_PERIOD),
14180986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14190986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14200986ab12SMaksim Yevmenkin 		return (ERROR);
14210986ab12SMaksim Yevmenkin 
14220986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14230986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14240986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14250986ab12SMaksim Yevmenkin 		return (FAILED);
14260986ab12SMaksim Yevmenkin 	}
14270986ab12SMaksim Yevmenkin 
14280986ab12SMaksim Yevmenkin 	return (OK);
14290986ab12SMaksim Yevmenkin } /* hci_write_page_scan_period_mode */
14300986ab12SMaksim Yevmenkin 
14310986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Mode command to the unit */
14320986ab12SMaksim Yevmenkin static int
14330986ab12SMaksim Yevmenkin hci_read_page_scan_mode(int s, int argc, char **argv)
14340986ab12SMaksim Yevmenkin {
14350986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_rp	rp;
14360986ab12SMaksim Yevmenkin 	int				n;
14370986ab12SMaksim Yevmenkin 
14380986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14390986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14400986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN),
14410986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14420986ab12SMaksim Yevmenkin 		return (ERROR);
14430986ab12SMaksim Yevmenkin 
14440986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14450986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14460986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14470986ab12SMaksim Yevmenkin 		return (FAILED);
14480986ab12SMaksim Yevmenkin 	}
14490986ab12SMaksim Yevmenkin 
14500986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan mode: %#02x\n", rp.page_scan_mode);
14510986ab12SMaksim Yevmenkin 
14520986ab12SMaksim Yevmenkin 	return (OK);
14530986ab12SMaksim Yevmenkin } /* hci_read_page_scan_mode */
14540986ab12SMaksim Yevmenkin 
14550986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Mode command to the unit */
14560986ab12SMaksim Yevmenkin static int
14570986ab12SMaksim Yevmenkin hci_write_page_scan_mode(int s, int argc, char **argv)
14580986ab12SMaksim Yevmenkin {
14590986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_cp	cp;
14600986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_rp	rp;
14610986ab12SMaksim Yevmenkin 	int				n;
14620986ab12SMaksim Yevmenkin 
14630986ab12SMaksim Yevmenkin 	/* parse command arguments */
14640986ab12SMaksim Yevmenkin 	switch (argc) {
14650986ab12SMaksim Yevmenkin 	case 1:
14660986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
14670986ab12SMaksim Yevmenkin 			return (USAGE);
14680986ab12SMaksim Yevmenkin 
14690986ab12SMaksim Yevmenkin 		cp.page_scan_mode = (n & 0xff);
14700986ab12SMaksim Yevmenkin 		break;
14710986ab12SMaksim Yevmenkin 
14720986ab12SMaksim Yevmenkin 	default:
14730986ab12SMaksim Yevmenkin 		return (USAGE);
14740986ab12SMaksim Yevmenkin 	}
14750986ab12SMaksim Yevmenkin 
14760986ab12SMaksim Yevmenkin 	/* send command */
14770986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14780986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14790986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN),
14800986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14810986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14820986ab12SMaksim Yevmenkin 		return (ERROR);
14830986ab12SMaksim Yevmenkin 
14840986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14850986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14860986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14870986ab12SMaksim Yevmenkin 		return (FAILED);
14880986ab12SMaksim Yevmenkin 	}
14890986ab12SMaksim Yevmenkin 
14900986ab12SMaksim Yevmenkin 	return (OK);
14910986ab12SMaksim Yevmenkin } /* hci_write_page_scan_mode */
14920986ab12SMaksim Yevmenkin 
1493bcff2d91STakanori Watanabe static int
1494bcff2d91STakanori Watanabe hci_read_le_host_supported_command(int s, int argc, char **argv)
1495bcff2d91STakanori Watanabe {
1496bcff2d91STakanori Watanabe 	ng_hci_read_le_host_supported_rp rp;
1497bcff2d91STakanori Watanabe 	int n;
1498bcff2d91STakanori Watanabe 	n = sizeof(rp);
1499bcff2d91STakanori Watanabe 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1500bcff2d91STakanori Watanabe 			NG_HCI_OCF_READ_LE_HOST_SUPPORTED),
1501bcff2d91STakanori Watanabe 			(char *) &rp, &n) == ERROR)
1502bcff2d91STakanori Watanabe 		return (ERROR);
1503bcff2d91STakanori Watanabe 
1504bcff2d91STakanori Watanabe 	if (rp.status != 0x00) {
1505bcff2d91STakanori Watanabe 		fprintf(stdout, "Status: %s [%#02x]\n",
1506bcff2d91STakanori Watanabe 			hci_status2str(rp.status), rp.status);
1507bcff2d91STakanori Watanabe 		return (FAILED);
1508bcff2d91STakanori Watanabe 	}
1509bcff2d91STakanori Watanabe 
1510bcff2d91STakanori Watanabe 	fprintf(stdout, "LE Host support: %#02x\n", rp.le_supported_host);
1511bcff2d91STakanori Watanabe 	fprintf(stdout, "Simulateneouse LE Host : %#02x\n", rp.simultaneous_le_host);
1512bcff2d91STakanori Watanabe 
1513bcff2d91STakanori Watanabe 	return (OK);
1514bcff2d91STakanori Watanabe 
1515bcff2d91STakanori Watanabe }
1516bcff2d91STakanori Watanabe static int
1517bcff2d91STakanori Watanabe hci_write_le_host_supported_command(int s, int argc, char **argv)
1518bcff2d91STakanori Watanabe {
1519bcff2d91STakanori Watanabe 	ng_hci_write_le_host_supported_cp cp;
1520bcff2d91STakanori Watanabe 	ng_hci_write_le_host_supported_rp rp;
1521bcff2d91STakanori Watanabe 
1522bcff2d91STakanori Watanabe 	int n;
1523bcff2d91STakanori Watanabe 
1524bcff2d91STakanori Watanabe 	cp.le_supported_host = 0;
1525bcff2d91STakanori Watanabe 	cp.simultaneous_le_host = 0;
1526bcff2d91STakanori Watanabe 	switch (argc) {
1527bcff2d91STakanori Watanabe 	case 2:
1528bcff2d91STakanori Watanabe 		if (sscanf(argv[1], "%d", &n) != 1 || (n != 0 && n != 1)){
1529bcff2d91STakanori Watanabe 			printf("ARGC2: %d\n", n);
1530bcff2d91STakanori Watanabe 			return (USAGE);
1531bcff2d91STakanori Watanabe 		}
1532bcff2d91STakanori Watanabe 		cp.simultaneous_le_host = (n &1);
1533bcff2d91STakanori Watanabe 
1534bcff2d91STakanori Watanabe 	case 1:
1535bcff2d91STakanori Watanabe 		if (sscanf(argv[0], "%d", &n) != 1 || (n != 0 && n != 1)){
1536bcff2d91STakanori Watanabe 			printf("ARGC1: %d\n", n);
1537bcff2d91STakanori Watanabe 			return (USAGE);
1538bcff2d91STakanori Watanabe 		}
1539bcff2d91STakanori Watanabe 
1540bcff2d91STakanori Watanabe 		cp.le_supported_host = (n &1);
1541bcff2d91STakanori Watanabe 		break;
1542bcff2d91STakanori Watanabe 
1543bcff2d91STakanori Watanabe 	default:
1544bcff2d91STakanori Watanabe 		return (USAGE);
1545bcff2d91STakanori Watanabe 	}
1546bcff2d91STakanori Watanabe 
1547bcff2d91STakanori Watanabe 
1548bcff2d91STakanori Watanabe 	/* send command */
1549bcff2d91STakanori Watanabe 	n = sizeof(rp);
1550bcff2d91STakanori Watanabe 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1551bcff2d91STakanori Watanabe 			NG_HCI_OCF_WRITE_LE_HOST_SUPPORTED),
1552bcff2d91STakanori Watanabe 			(char const *) &cp, sizeof(cp),
1553bcff2d91STakanori Watanabe 			(char *) &rp, &n) == ERROR)
1554bcff2d91STakanori Watanabe 		return (ERROR);
1555bcff2d91STakanori Watanabe 
1556bcff2d91STakanori Watanabe 	if (rp.status != 0x00) {
1557bcff2d91STakanori Watanabe 		fprintf(stdout, "Status: %s [%#02x]\n",
1558bcff2d91STakanori Watanabe 			hci_status2str(rp.status), rp.status);
1559bcff2d91STakanori Watanabe 		return (FAILED);
1560bcff2d91STakanori Watanabe 	}
1561bcff2d91STakanori Watanabe 
1562bcff2d91STakanori Watanabe 	return (OK);
1563bcff2d91STakanori Watanabe }
1564bcff2d91STakanori Watanabe 
1565878ed226SJulian Elischer struct hci_command	host_controller_baseband_commands[] = {
1566878ed226SJulian Elischer {
1567878ed226SJulian Elischer "reset",
1568878ed226SJulian Elischer "\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1569878ed226SJulian Elischer "After the reset is completed, the current operational state will be lost,\n" \
1570878ed226SJulian Elischer "the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1571878ed226SJulian Elischer "automatically revert to the default values for the parameters for which\n" \
1572878ed226SJulian Elischer "default values are defined in the specification.",
1573878ed226SJulian Elischer &hci_reset
1574878ed226SJulian Elischer },
1575878ed226SJulian Elischer {
1576878ed226SJulian Elischer "read_pin_type",
1577878ed226SJulian Elischer "\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1578878ed226SJulian Elischer "Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1579878ed226SJulian Elischer "code.",
1580878ed226SJulian Elischer &hci_read_pin_type
1581878ed226SJulian Elischer },
1582878ed226SJulian Elischer {
1583878ed226SJulian Elischer "write_pin_type <pin_type>",
1584878ed226SJulian Elischer "\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1585878ed226SJulian Elischer "Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1586878ed226SJulian Elischer "code.\n\n" \
1587878ed226SJulian Elischer "\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1588878ed226SJulian Elischer &hci_write_pin_type
1589878ed226SJulian Elischer },
1590878ed226SJulian Elischer {
15912aa65cf7SMaksim Yevmenkin "read_stored_link_key [<BD_ADDR>]",
1592878ed226SJulian Elischer "\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1593878ed226SJulian Elischer "more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1594878ed226SJulian Elischer "Controller can store a limited number of link keys for other Bluetooth\n" \
1595878ed226SJulian Elischer "devices.\n\n" \
15962aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1597878ed226SJulian Elischer &hci_read_stored_link_key
1598878ed226SJulian Elischer },
1599878ed226SJulian Elischer {
16002aa65cf7SMaksim Yevmenkin "write_stored_link_key <BD_ADDR> <key>",
1601878ed226SJulian Elischer "\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1602878ed226SJulian Elischer "or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1603878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1604878ed226SJulian Elischer "Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1605878ed226SJulian Elischer "Host Controller then no additional link keys will be stored.\n\n" \
16062aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name\n" \
1607878ed226SJulian Elischer "\t<key>     - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1608878ed226SJulian Elischer &hci_write_stored_link_key
1609878ed226SJulian Elischer },
1610878ed226SJulian Elischer {
16112aa65cf7SMaksim Yevmenkin "delete_stored_link_key [<BD_ADDR>]",
1612878ed226SJulian Elischer "\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1613878ed226SJulian Elischer "or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1614878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1615878ed226SJulian Elischer "Bluetooth devices.\n\n" \
16162aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1617878ed226SJulian Elischer &hci_delete_stored_link_key
1618878ed226SJulian Elischer },
1619878ed226SJulian Elischer {
1620878ed226SJulian Elischer "change_local_name <name>",
1621878ed226SJulian Elischer "\nThe Change_Local_Name command provides the ability to modify the user\n" \
1622878ed226SJulian Elischer "friendly name for the Bluetooth unit.\n\n" \
1623878ed226SJulian Elischer "\t<name> - string",
1624878ed226SJulian Elischer &hci_change_local_name
1625878ed226SJulian Elischer },
1626878ed226SJulian Elischer {
1627878ed226SJulian Elischer "read_local_name",
1628878ed226SJulian Elischer "\nThe Read_Local_Name command provides the ability to read the\n" \
1629878ed226SJulian Elischer "stored user-friendly name for the Bluetooth unit.",
1630878ed226SJulian Elischer &hci_read_local_name
1631878ed226SJulian Elischer },
1632878ed226SJulian Elischer {
1633878ed226SJulian Elischer "read_connection_accept_timeout",
1634878ed226SJulian Elischer "\nThis command will read the value for the Connection_Accept_Timeout\n" \
1635878ed226SJulian Elischer "configuration parameter. The Connection_Accept_Timeout configuration\n" \
1636878ed226SJulian Elischer "parameter allows the Bluetooth hardware to automatically deny a\n" \
1637878ed226SJulian Elischer "connection request after a specified time period has occurred and\n" \
1638878ed226SJulian Elischer "the new connection is not accepted. Connection Accept Timeout\n" \
1639878ed226SJulian Elischer "measured in Number of Baseband slots.",
1640878ed226SJulian Elischer &hci_read_connection_accept_timeout
1641878ed226SJulian Elischer },
1642878ed226SJulian Elischer {
1643878ed226SJulian Elischer "write_connection_accept_timeout <timeout>",
1644878ed226SJulian Elischer "\nThis command will write the value for the Connection_Accept_Timeout\n" \
1645878ed226SJulian Elischer "configuration parameter.\n\n" \
1646878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1647878ed226SJulian Elischer &hci_write_connection_accept_timeout
1648878ed226SJulian Elischer },
1649878ed226SJulian Elischer {
1650878ed226SJulian Elischer "read_page_timeout",
1651878ed226SJulian Elischer "\nThis command will read the value for the Page_Timeout configuration\n" \
1652878ed226SJulian Elischer "parameter. The Page_Timeout configuration parameter defines the\n" \
1653878ed226SJulian Elischer "maximum time the local Link Manager will wait for a baseband page\n" \
1654878ed226SJulian Elischer "response from the remote unit at a locally initiated connection\n" \
1655878ed226SJulian Elischer "attempt. Page Timeout measured in Number of Baseband slots.",
1656878ed226SJulian Elischer &hci_read_page_timeout
1657878ed226SJulian Elischer },
1658878ed226SJulian Elischer {
1659878ed226SJulian Elischer "write_page_timeout <timeout>",
1660878ed226SJulian Elischer "\nThis command will write the value for the Page_Timeout configuration\n" \
1661878ed226SJulian Elischer "parameter.\n\n" \
1662878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1663878ed226SJulian Elischer &hci_write_page_timeout
1664878ed226SJulian Elischer },
1665878ed226SJulian Elischer {
1666878ed226SJulian Elischer "read_scan_enable",
1667878ed226SJulian Elischer "\nThis command will read the value for the Scan_Enable parameter. The\n" \
1668878ed226SJulian Elischer "Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1669878ed226SJulian Elischer "will periodically scan for page attempts and/or inquiry requests\n" \
1670878ed226SJulian Elischer "from other Bluetooth unit.\n\n" \
1671878ed226SJulian Elischer "\t0x00 - No Scans enabled.\n" \
1672878ed226SJulian Elischer "\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1673878ed226SJulian Elischer "\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1674878ed226SJulian Elischer "\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1675878ed226SJulian Elischer &hci_read_scan_enable
1676878ed226SJulian Elischer },
1677878ed226SJulian Elischer {
1678878ed226SJulian Elischer "write_scan_enable <scan_enable>",
1679878ed226SJulian Elischer "\nThis command will write the value for the Scan_Enable parameter.\n" \
1680878ed226SJulian Elischer "The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1681878ed226SJulian Elischer "unit will periodically scan for page attempts and/or inquiry\n" \
1682878ed226SJulian Elischer "requests from other Bluetooth unit.\n\n" \
1683878ed226SJulian Elischer "\t<scan_enable> - dd;\n" \
1684878ed226SJulian Elischer "\t0 - No Scans enabled.\n" \
1685878ed226SJulian Elischer "\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1686878ed226SJulian Elischer "\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1687878ed226SJulian Elischer "\t3 - Inquiry Scan enabled. Page Scan enabled.",
1688878ed226SJulian Elischer &hci_write_scan_enable
1689878ed226SJulian Elischer },
1690878ed226SJulian Elischer {
1691878ed226SJulian Elischer "read_page_scan_activity",
1692878ed226SJulian Elischer "\nThis command will read the value for Page_Scan_Activity configuration\n" \
1693878ed226SJulian Elischer "parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1694878ed226SJulian Elischer "amount of time between consecutive page scans. This time interval is \n" \
1695878ed226SJulian Elischer "defined from when the Host Controller started its last page scan until\n" \
1696878ed226SJulian Elischer "it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1697878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. The\n" \
1698878ed226SJulian Elischer "Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1699878ed226SJulian Elischer &hci_read_page_scan_activity
1700878ed226SJulian Elischer },
1701878ed226SJulian Elischer {
1702878ed226SJulian Elischer "write_page_scan_activity interval(dddd) window(dddd)",
1703878ed226SJulian Elischer "\nThis command will write the value for Page_Scan_Activity configuration\n" \
1704878ed226SJulian Elischer "parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1705878ed226SJulian Elischer "amount of time between consecutive page scans. This is defined as the time\n" \
1706878ed226SJulian Elischer "interval from when the Host Controller started its last page scan until it\n" \
1707878ed226SJulian Elischer "begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1708878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. \n" \
1709878ed226SJulian Elischer "The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1710f76b3199SUlrich Spörlein "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
171145360108SStefan Farfeleder "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1712878ed226SJulian Elischer &hci_write_page_scan_activity
1713878ed226SJulian Elischer },
1714878ed226SJulian Elischer {
1715878ed226SJulian Elischer "read_inquiry_scan_activity",
1716878ed226SJulian Elischer "\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1717878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1718878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1719878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1720878ed226SJulian Elischer "until it begins the next inquiry scan.",
1721878ed226SJulian Elischer &hci_read_inquiry_scan_activity
1722878ed226SJulian Elischer },
1723878ed226SJulian Elischer {
1724878ed226SJulian Elischer "write_inquiry_scan_activity interval(dddd) window(dddd)",
1725878ed226SJulian Elischer "\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1726878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1727878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1728878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1729878ed226SJulian Elischer "until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1730878ed226SJulian Elischer "parameter defines the amount of time for the duration of the inquiry scan.\n" \
1731878ed226SJulian Elischer "The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1732f76b3199SUlrich Spörlein "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
173345360108SStefan Farfeleder "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1734878ed226SJulian Elischer &hci_write_inquiry_scan_activity
1735878ed226SJulian Elischer },
1736878ed226SJulian Elischer {
1737878ed226SJulian Elischer "read_authentication_enable",
1738878ed226SJulian Elischer "\nThis command will read the value for the Authentication_Enable parameter.\n"\
1739878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires\n"\
1740878ed226SJulian Elischer "to authenticate the remote unit at connection setup (between the\n" \
1741878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n"\
1742878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1743878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1744878ed226SJulian Elischer "authenticate the other unit.",
1745878ed226SJulian Elischer &hci_read_authentication_enable
1746878ed226SJulian Elischer },
1747878ed226SJulian Elischer {
1748878ed226SJulian Elischer "write_authentication_enable enable(0|1)",
1749878ed226SJulian Elischer "\nThis command will write the value for the Authentication_Enable parameter.\n"\
1750878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires to\n"\
1751878ed226SJulian Elischer "authenticate the remote unit at connection setup (between the\n" \
1752878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1753878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1754878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1755878ed226SJulian Elischer "authenticate the other unit.",
1756878ed226SJulian Elischer &hci_write_authentication_enable
1757878ed226SJulian Elischer },
1758878ed226SJulian Elischer {
1759878ed226SJulian Elischer "read_encryption_mode",
1760878ed226SJulian Elischer "\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1761878ed226SJulian Elischer "Encryption_Mode parameter controls if the local unit requires encryption\n" \
1762878ed226SJulian Elischer "to the remote unit at connection setup (between the Create_Connection\n" \
1763878ed226SJulian Elischer "command or acceptance of an incoming ACL connection and the corresponding\n" \
1764878ed226SJulian Elischer "Connection Complete event). At connection setup, only the unit(s) with\n" \
1765878ed226SJulian Elischer "the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1766878ed226SJulian Elischer "enabled will try to encrypt the connection to the other unit.\n\n" \
1767878ed226SJulian Elischer "\t<encryption_mode>:\n" \
1768878ed226SJulian Elischer "\t0x00 - Encryption disabled.\n" \
1769878ed226SJulian Elischer "\t0x01 - Encryption only for point-to-point packets.\n" \
1770878ed226SJulian Elischer "\t0x02 - Encryption for both point-to-point and broadcast packets.",
1771878ed226SJulian Elischer &hci_read_encryption_mode
1772878ed226SJulian Elischer },
1773878ed226SJulian Elischer {
1774878ed226SJulian Elischer "write_encryption_mode mode(0|1|2)",
1775878ed226SJulian Elischer "\tThis command will write the value for the Encryption_Mode parameter.\n" \
1776878ed226SJulian Elischer "The Encryption_Mode parameter controls if the local unit requires\n" \
1777878ed226SJulian Elischer "encryption to the remote unit at connection setup (between the\n" \
1778878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1779878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup,\n" \
1780878ed226SJulian Elischer "only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1781878ed226SJulian Elischer "Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1782878ed226SJulian Elischer "the other unit.\n\n" \
1783878ed226SJulian Elischer "\t<encryption_mode> (dd)\n" \
1784878ed226SJulian Elischer "\t0 - Encryption disabled.\n" \
1785878ed226SJulian Elischer "\t1 - Encryption only for point-to-point packets.\n" \
1786878ed226SJulian Elischer "\t2 - Encryption for both point-to-point and broadcast packets.",
1787878ed226SJulian Elischer &hci_write_encryption_mode
1788878ed226SJulian Elischer },
1789878ed226SJulian Elischer {
1790878ed226SJulian Elischer "read_class_of_device",
1791878ed226SJulian Elischer "\nThis command will read the value for the Class_of_Device parameter.\n" \
1792878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of\n" \
1793878ed226SJulian Elischer "the local unit to other units.",
1794878ed226SJulian Elischer &hci_read_class_of_device
1795878ed226SJulian Elischer },
1796878ed226SJulian Elischer {
1797878ed226SJulian Elischer "write_class_of_device class(xx:xx:xx)",
1798878ed226SJulian Elischer "\nThis command will write the value for the Class_of_Device parameter.\n" \
1799878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of \n" \
1800878ed226SJulian Elischer "the local unit to other units.\n\n" \
1801878ed226SJulian Elischer "\t<class> (xx:xx:xx) - class of device",
1802878ed226SJulian Elischer &hci_write_class_of_device
1803878ed226SJulian Elischer },
1804878ed226SJulian Elischer {
1805878ed226SJulian Elischer "read_voice_settings",
1806878ed226SJulian Elischer "\nThis command will read the values for the Voice_Setting parameter.\n" \
1807878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1808878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1809878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1810878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1811878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.",
1812878ed226SJulian Elischer &hci_read_voice_settings
1813878ed226SJulian Elischer },
1814878ed226SJulian Elischer {
1815878ed226SJulian Elischer "write_voice_settings settings(xxxx)",
1816878ed226SJulian Elischer "\nThis command will write the values for the Voice_Setting parameter.\n" \
1817878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1818878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1819878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1820878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1821878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.\n\n" \
1822878ed226SJulian Elischer "\t<voice_settings> (xxxx) - voice settings",
1823878ed226SJulian Elischer &hci_write_voice_settings
1824878ed226SJulian Elischer },
1825878ed226SJulian Elischer {
1826878ed226SJulian Elischer "read_number_broadcast_retransmissions",
1827878ed226SJulian Elischer "\nThis command will read the unit's parameter value for the Number of\n" \
1828878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1829878ed226SJulian Elischer "unreliable.",
1830878ed226SJulian Elischer &hci_read_number_broadcast_retransmissions
1831878ed226SJulian Elischer },
1832878ed226SJulian Elischer {
1833878ed226SJulian Elischer "write_number_broadcast_retransmissions count(dd)",
1834878ed226SJulian Elischer "\nThis command will write the unit's parameter value for the Number of\n" \
1835878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1836878ed226SJulian Elischer "unreliable.\n\n" \
1837878ed226SJulian Elischer "\t<count> (dd) - number of broadcast retransimissions",
1838878ed226SJulian Elischer &hci_write_number_broadcast_retransmissions
1839878ed226SJulian Elischer },
1840878ed226SJulian Elischer {
1841878ed226SJulian Elischer "read_hold_mode_activity",
1842878ed226SJulian Elischer "\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1843878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1844878ed226SJulian Elischer "be suspended when the unit is in hold mode.",
1845878ed226SJulian Elischer &hci_read_hold_mode_activity
1846878ed226SJulian Elischer },
1847878ed226SJulian Elischer {
1848878ed226SJulian Elischer "write_hold_mode_activity settings(0|1|2|4)",
1849878ed226SJulian Elischer "\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1850878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1851878ed226SJulian Elischer "be suspended when the unit is in hold mode.\n\n" \
1852878ed226SJulian Elischer "\t<settings> (dd) - bit mask:\n" \
1853878ed226SJulian Elischer "\t0 - Maintain current Power State. Default\n" \
1854878ed226SJulian Elischer "\t1 - Suspend Page Scan.\n" \
1855878ed226SJulian Elischer "\t2 - Suspend Inquiry Scan.\n" \
1856878ed226SJulian Elischer "\t4 - Suspend Periodic Inquiries.",
1857878ed226SJulian Elischer &hci_write_hold_mode_activity
1858878ed226SJulian Elischer },
1859878ed226SJulian Elischer {
1860878ed226SJulian Elischer "read_sco_flow_control_enable",
1861878ed226SJulian Elischer "\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1862878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1863878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1864878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1865878ed226SJulian Elischer "disable SCO flow control.",
1866878ed226SJulian Elischer &hci_read_sco_flow_control_enable
1867878ed226SJulian Elischer },
1868878ed226SJulian Elischer {
1869878ed226SJulian Elischer "write_sco_flow_control_enable enable(0|1)",
1870878ed226SJulian Elischer "\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1871878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1872878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1873878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1874878ed226SJulian Elischer "disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1875878ed226SJulian Elischer "changed if no connections exist.",
1876878ed226SJulian Elischer &hci_write_sco_flow_control_enable
1877878ed226SJulian Elischer },
1878878ed226SJulian Elischer {
1879878ed226SJulian Elischer "read_link_supervision_timeout <connection_handle>",
1880878ed226SJulian Elischer "\nThis command will read the value for the Link_Supervision_Timeout\n" \
1881878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1882878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1883878ed226SJulian Elischer "reason, no Baseband packets are received from that Connection Handle for a\n" \
1884878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n"
1885878ed226SJulian Elischer "disconnected.\n\n" \
1886878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n",
1887878ed226SJulian Elischer &hci_read_link_supervision_timeout
1888878ed226SJulian Elischer },
1889878ed226SJulian Elischer {
1890878ed226SJulian Elischer "write_link_supervision_timeout <connection_handle> <timeout>",
1891878ed226SJulian Elischer "\nThis command will write the value for the Link_Supervision_Timeout\n" \
1892878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1893878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1894878ed226SJulian Elischer "reason, no Baseband packets are received from that connection handle for a\n" \
1895878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n" \
1896878ed226SJulian Elischer "disconnected.\n\n" \
1897878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n" \
1898878ed226SJulian Elischer "\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1899878ed226SJulian Elischer &hci_write_link_supervision_timeout
1900878ed226SJulian Elischer },
19010986ab12SMaksim Yevmenkin {
19020986ab12SMaksim Yevmenkin "read_page_scan_period_mode",
19030986ab12SMaksim Yevmenkin "\nThis command is used to read the mandatory Page_Scan_Period_Mode of the\n" \
19040986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
19050986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
19060986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
19070986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
19080986ab12SMaksim Yevmenkin "following page scans.",
19090986ab12SMaksim Yevmenkin &hci_read_page_scan_period_mode
19100986ab12SMaksim Yevmenkin },
19110986ab12SMaksim Yevmenkin {
19120986ab12SMaksim Yevmenkin "write_page_scan_period_mode <page_scan_period_mode>",
19130986ab12SMaksim Yevmenkin "\nThis command is used to write the mandatory Page_Scan_Period_Mode of the\n" \
19140986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
19150986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
19160986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
19170986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
19180986ab12SMaksim Yevmenkin "following page scans.\n\n" \
19190986ab12SMaksim Yevmenkin "\t<page_scan_period_mode> - dd; page scan period mode:\n" \
19200986ab12SMaksim Yevmenkin "\t0x00 - P0 (Default)\n" \
19210986ab12SMaksim Yevmenkin "\t0x01 - P1\n" \
19220986ab12SMaksim Yevmenkin "\t0x02 - P2",
19230986ab12SMaksim Yevmenkin &hci_write_page_scan_period_mode
19240986ab12SMaksim Yevmenkin },
19250986ab12SMaksim Yevmenkin {
19260986ab12SMaksim Yevmenkin "read_page_scan_mode",
19270986ab12SMaksim Yevmenkin "\nThis command is used to read the default page scan mode of the local\n" \
19280986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
19290986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently one mandatory page scan\n"\
19300986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n" \
19310986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
19320986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.",
19330986ab12SMaksim Yevmenkin &hci_read_page_scan_mode
19340986ab12SMaksim Yevmenkin },
19350986ab12SMaksim Yevmenkin {
19360986ab12SMaksim Yevmenkin "write_page_scan_mode <page_scan_mode>",
19370986ab12SMaksim Yevmenkin "\nThis command is used to write the default page scan mode of the local\n" \
19380986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
19390986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently, one mandatory page scan\n"\
19400986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n"\
19410986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
19420986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.\n\n" \
19430986ab12SMaksim Yevmenkin "\t<page_scan_mode> - dd; page scan mode:\n" \
19440986ab12SMaksim Yevmenkin "\t0x00 - Mandatory Page Scan Mode (Default)\n" \
19450986ab12SMaksim Yevmenkin "\t0x01 - Optional Page Scan Mode I\n" \
19460986ab12SMaksim Yevmenkin "\t0x02 - Optional Page Scan Mode II\n" \
19470986ab12SMaksim Yevmenkin "\t0x03 - Optional Page Scan Mode III",
19480986ab12SMaksim Yevmenkin &hci_write_page_scan_mode
19490986ab12SMaksim Yevmenkin },
1950bcff2d91STakanori Watanabe {
1951bcff2d91STakanori Watanabe "read_le_host_supported_command",	\
1952bcff2d91STakanori Watanabe "Read if this host is in le supported mode and stimulatenouse le supported mode",
1953bcff2d91STakanori Watanabe &hci_read_le_host_supported_command,
1954bcff2d91STakanori Watanabe },
1955bcff2d91STakanori Watanabe {
1956bcff2d91STakanori Watanabe "write_le_host_supported_command",	\
1957bcff2d91STakanori Watanabe "write_le_host_supported_command le_host[0|1] stimultajeous_le[0|1]",
1958bcff2d91STakanori Watanabe &hci_write_le_host_supported_command,
1959bcff2d91STakanori Watanabe },
1960bcff2d91STakanori Watanabe 
1961878ed226SJulian Elischer { NULL, }
1962878ed226SJulian Elischer };
1963878ed226SJulian Elischer 
1964