xref: /freebsd/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c (revision 878ed22696d5402cabd6f90932cc970ab912b7b0)
1878ed226SJulian Elischer /*
2878ed226SJulian Elischer  * host_controller_baseband.c
3878ed226SJulian Elischer  *
4878ed226SJulian Elischer  * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5878ed226SJulian Elischer  * All rights reserved.
6878ed226SJulian Elischer  *
7878ed226SJulian Elischer  * Redistribution and use in source and binary forms, with or without
8878ed226SJulian Elischer  * modification, are permitted provided that the following conditions
9878ed226SJulian Elischer  * are met:
10878ed226SJulian Elischer  * 1. Redistributions of source code must retain the above copyright
11878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer.
12878ed226SJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
13878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
14878ed226SJulian Elischer  *    documentation and/or other materials provided with the distribution.
15878ed226SJulian Elischer  *
16878ed226SJulian Elischer  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17878ed226SJulian Elischer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18878ed226SJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19878ed226SJulian Elischer  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20878ed226SJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21878ed226SJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22878ed226SJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23878ed226SJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24878ed226SJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25878ed226SJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26878ed226SJulian Elischer  * SUCH DAMAGE.
27878ed226SJulian Elischer  *
28878ed226SJulian Elischer  * $Id: host_controller_baseband.c,v 1.12 2002/11/19 18:34:06 max Exp $
29878ed226SJulian Elischer  * $FreeBSD$
30878ed226SJulian Elischer  */
31878ed226SJulian Elischer 
32878ed226SJulian Elischer #include <sys/types.h>
33878ed226SJulian Elischer #include <sys/endian.h>
34878ed226SJulian Elischer #include <errno.h>
35878ed226SJulian Elischer #include <ng_hci.h>
36878ed226SJulian Elischer #include <stdio.h>
37878ed226SJulian Elischer #include <string.h>
38878ed226SJulian Elischer #include "hccontrol.h"
39878ed226SJulian Elischer 
40878ed226SJulian Elischer /* Convert hex ASCII to int4 */
41878ed226SJulian Elischer static int
42878ed226SJulian Elischer hci_hexa2int4(const char *a)
43878ed226SJulian Elischer {
44878ed226SJulian Elischer 	if ('0' <= *a && *a <= '9')
45878ed226SJulian Elischer 		return (*a - '0');
46878ed226SJulian Elischer 
47878ed226SJulian Elischer 	if ('A' <= *a && *a <= 'F')
48878ed226SJulian Elischer 		return (*a - 'A' + 0xa);
49878ed226SJulian Elischer 
50878ed226SJulian Elischer 	if ('a' <= *a && *a <= 'f')
51878ed226SJulian Elischer 		return (*a - 'a' + 0xa);
52878ed226SJulian Elischer 
53878ed226SJulian Elischer 	return (-1);
54878ed226SJulian Elischer }
55878ed226SJulian Elischer 
56878ed226SJulian Elischer /* Convert hex ASCII to int8 */
57878ed226SJulian Elischer static int
58878ed226SJulian Elischer hci_hexa2int8(const char *a)
59878ed226SJulian Elischer {
60878ed226SJulian Elischer 	int	hi = hci_hexa2int4(a);
61878ed226SJulian Elischer 	int	lo = hci_hexa2int4(a + 1);
62878ed226SJulian Elischer 
63878ed226SJulian Elischer 	if (hi < 0 || lo < 0)
64878ed226SJulian Elischer 		return (-1);
65878ed226SJulian Elischer 
66878ed226SJulian Elischer 	return ((hi << 4) | lo);
67878ed226SJulian Elischer }
68878ed226SJulian Elischer 
69878ed226SJulian Elischer /* Convert ascii hex string to the u_int8_t[] */
70878ed226SJulian Elischer static int
71878ed226SJulian Elischer hci_hexstring2array(char const *s, u_int8_t *a, int asize)
72878ed226SJulian Elischer {
73878ed226SJulian Elischer 	int	i, l, b;
74878ed226SJulian Elischer 
75878ed226SJulian Elischer 	l = strlen(s) / 2;
76878ed226SJulian Elischer 	if (l > asize)
77878ed226SJulian Elischer 		l = asize;
78878ed226SJulian Elischer 
79878ed226SJulian Elischer 	for (i = 0; i < l; i++) {
80878ed226SJulian Elischer 		b = hci_hexa2int8(s + i * 2);
81878ed226SJulian Elischer 		if (b < 0)
82878ed226SJulian Elischer 			return (-1);
83878ed226SJulian Elischer 
84878ed226SJulian Elischer 		a[i] = (b & 0xff);
85878ed226SJulian Elischer 	}
86878ed226SJulian Elischer 
87878ed226SJulian Elischer 	return (0);
88878ed226SJulian Elischer }
89878ed226SJulian Elischer 
90878ed226SJulian Elischer /* Send RESET to the unit */
91878ed226SJulian Elischer static int
92878ed226SJulian Elischer hci_reset(int s, int argc, char **argv)
93878ed226SJulian Elischer {
94878ed226SJulian Elischer 	ng_hci_status_rp	rp;
95878ed226SJulian Elischer 	int			n;
96878ed226SJulian Elischer 
97878ed226SJulian Elischer 	n = sizeof(rp);
98878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
99878ed226SJulian Elischer 			NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
100878ed226SJulian Elischer 		return (ERROR);
101878ed226SJulian Elischer 
102878ed226SJulian Elischer 	if (rp.status != 0x00) {
103878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
104878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
105878ed226SJulian Elischer 		return (FAILED);
106878ed226SJulian Elischer 	}
107878ed226SJulian Elischer 
108878ed226SJulian Elischer 	return (OK);
109878ed226SJulian Elischer } /* hci_reset */
110878ed226SJulian Elischer 
111878ed226SJulian Elischer /* Send Read_PIN_Type command to the unit */
112878ed226SJulian Elischer static int
113878ed226SJulian Elischer hci_read_pin_type(int s, int argc, char **argv)
114878ed226SJulian Elischer {
115878ed226SJulian Elischer 	ng_hci_read_pin_type_rp	rp;
116878ed226SJulian Elischer 	int			n;
117878ed226SJulian Elischer 
118878ed226SJulian Elischer 	n = sizeof(rp);
119878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
120878ed226SJulian Elischer 			NG_HCI_OCF_READ_PIN_TYPE),
121878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
122878ed226SJulian Elischer 		return (ERROR);
123878ed226SJulian Elischer 
124878ed226SJulian Elischer 	if (rp.status != 0x00) {
125878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
126878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
127878ed226SJulian Elischer 		return (FAILED);
128878ed226SJulian Elischer 	}
129878ed226SJulian Elischer 
130878ed226SJulian Elischer 	fprintf(stdout, "PIN type: %s [%#02x]\n",
131878ed226SJulian Elischer 			hci_pin2str(rp.pin_type), rp.pin_type);
132878ed226SJulian Elischer 
133878ed226SJulian Elischer 	return (OK);
134878ed226SJulian Elischer } /* hci_read_pin_type */
135878ed226SJulian Elischer 
136878ed226SJulian Elischer /* Send Write_PIN_Type command to the unit */
137878ed226SJulian Elischer static int
138878ed226SJulian Elischer hci_write_pin_type(int s, int argc, char **argv)
139878ed226SJulian Elischer {
140878ed226SJulian Elischer 	ng_hci_write_pin_type_cp	cp;
141878ed226SJulian Elischer 	ng_hci_write_pin_type_rp	rp;
142878ed226SJulian Elischer 	int				n;
143878ed226SJulian Elischer 
144878ed226SJulian Elischer 	/* parse command parameters */
145878ed226SJulian Elischer 	switch (argc) {
146878ed226SJulian Elischer 	case 1:
147878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
148878ed226SJulian Elischer 			return (USAGE);
149878ed226SJulian Elischer 
150878ed226SJulian Elischer 		cp.pin_type = (u_int8_t) n;
151878ed226SJulian Elischer 		break;
152878ed226SJulian Elischer 
153878ed226SJulian Elischer 	default:
154878ed226SJulian Elischer 		return (USAGE);
155878ed226SJulian Elischer 	}
156878ed226SJulian Elischer 
157878ed226SJulian Elischer 	/* send command */
158878ed226SJulian Elischer 	n = sizeof(rp);
159878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
160878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PIN_TYPE),
161878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
162878ed226SJulian Elischer 			(char *) &rp , &n) ==  ERROR)
163878ed226SJulian Elischer 		return (ERROR);
164878ed226SJulian Elischer 
165878ed226SJulian Elischer 	if (rp.status != 0x00) {
166878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
167878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
168878ed226SJulian Elischer 		return (FAILED);
169878ed226SJulian Elischer 	}
170878ed226SJulian Elischer 
171878ed226SJulian Elischer 	return (OK);
172878ed226SJulian Elischer } /* hci_write_pin_type */
173878ed226SJulian Elischer 
174878ed226SJulian Elischer /* Send Read_Stored_Link_Key command to the unit */
175878ed226SJulian Elischer static int
176878ed226SJulian Elischer hci_read_stored_link_key(int s, int argc, char **argv)
177878ed226SJulian Elischer {
178878ed226SJulian Elischer 	struct {
179878ed226SJulian Elischer 		ng_hci_cmd_pkt_t			hdr;
180878ed226SJulian Elischer 		ng_hci_read_stored_link_key_cp		cp;
181878ed226SJulian Elischer 	} __attribute__ ((packed))			cmd;
182878ed226SJulian Elischer 
183878ed226SJulian Elischer 	struct {
184878ed226SJulian Elischer 		ng_hci_event_pkt_t			hdr;
185878ed226SJulian Elischer 		union {
186878ed226SJulian Elischer 			ng_hci_command_compl_ep		cc;
187878ed226SJulian Elischer 			ng_hci_return_link_keys_ep	key;
188878ed226SJulian Elischer 			u_int8_t			b[NG_HCI_EVENT_PKT_SIZE];
189878ed226SJulian Elischer 		}					ep;
190878ed226SJulian Elischer 	} __attribute__ ((packed))			event;
191878ed226SJulian Elischer 
192878ed226SJulian Elischer 	int						n,a0,a1,a2,a3,a4,a5;
193878ed226SJulian Elischer 
194878ed226SJulian Elischer 	/* Send command */
195878ed226SJulian Elischer 	memset(&cmd, 0, sizeof(cmd));
196878ed226SJulian Elischer 	cmd.hdr.type = NG_HCI_CMD_PKT;
197878ed226SJulian Elischer 	cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
198878ed226SJulian Elischer 				NG_HCI_OCF_READ_STORED_LINK_KEY));
199878ed226SJulian Elischer 	cmd.hdr.length = sizeof(cmd.cp);
200878ed226SJulian Elischer 
201878ed226SJulian Elischer 	switch (argc) {
202878ed226SJulian Elischer 	case 1:
203878ed226SJulian Elischer 		/* parse BD_ADDR */
204878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x:%x:%x:%x", &a5, &a4, &a3, &a2,
205878ed226SJulian Elischer 				&a1, &a0) != 6)
206878ed226SJulian Elischer 			return (USAGE);
207878ed226SJulian Elischer 
208878ed226SJulian Elischer 		cmd.cp.bdaddr.b[0] = (a0 & 0xff);
209878ed226SJulian Elischer 		cmd.cp.bdaddr.b[1] = (a1 & 0xff);
210878ed226SJulian Elischer 		cmd.cp.bdaddr.b[2] = (a2 & 0xff);
211878ed226SJulian Elischer 		cmd.cp.bdaddr.b[3] = (a3 & 0xff);
212878ed226SJulian Elischer 		cmd.cp.bdaddr.b[4] = (a4 & 0xff);
213878ed226SJulian Elischer 		cmd.cp.bdaddr.b[5] = (a5 & 0xff);
214878ed226SJulian Elischer 		break;
215878ed226SJulian Elischer 
216878ed226SJulian Elischer 	default:
217878ed226SJulian Elischer 		cmd.cp.read_all = 1;
218878ed226SJulian Elischer 		break;
219878ed226SJulian Elischer 	}
220878ed226SJulian Elischer 
221878ed226SJulian Elischer 	if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
222878ed226SJulian Elischer 		return (ERROR);
223878ed226SJulian Elischer 
224878ed226SJulian Elischer 	/* Receive events */
225878ed226SJulian Elischer again:
226878ed226SJulian Elischer 	memset(&event, 0, sizeof(event));
227878ed226SJulian Elischer 	n = sizeof(event);
228878ed226SJulian Elischer 	if (hci_recv(s, (char *) &event, &n) != OK)
229878ed226SJulian Elischer 		return (ERROR);
230878ed226SJulian Elischer 
231878ed226SJulian Elischer 	if (n <= sizeof(event.hdr)) {
232878ed226SJulian Elischer 		errno = EMSGSIZE;
233878ed226SJulian Elischer 		return (ERROR);
234878ed226SJulian Elischer 	}
235878ed226SJulian Elischer 
236878ed226SJulian Elischer 	if (event.hdr.type != NG_HCI_EVENT_PKT) {
237878ed226SJulian Elischer 		errno = EIO;
238878ed226SJulian Elischer 		return (ERROR);
239878ed226SJulian Elischer 	}
240878ed226SJulian Elischer 
241878ed226SJulian Elischer 	/* Parse event */
242878ed226SJulian Elischer 	switch (event.hdr.event) {
243878ed226SJulian Elischer 	case NG_HCI_EVENT_COMMAND_COMPL: {
244878ed226SJulian Elischer 		ng_hci_read_stored_link_key_rp	*rp = NULL;
245878ed226SJulian Elischer 
246878ed226SJulian Elischer 		if (event.ep.cc.opcode == 0x0000 ||
247878ed226SJulian Elischer 		    event.ep.cc.opcode != cmd.hdr.opcode)
248878ed226SJulian Elischer 			goto again;
249878ed226SJulian Elischer 
250878ed226SJulian Elischer 		rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b +
251878ed226SJulian Elischer 				sizeof(event.ep.cc));
252878ed226SJulian Elischer 
253878ed226SJulian Elischer 		fprintf(stdout, "Complete: Status: %s [%#x]\n",
254878ed226SJulian Elischer 				hci_status2str(rp->status), rp->status);
255878ed226SJulian Elischer 		fprintf(stdout, "Maximum Number of keys: %d\n",
256878ed226SJulian Elischer 				le16toh(rp->max_num_keys));
257878ed226SJulian Elischer 		fprintf(stdout, "Number of keys read: %d\n",
258878ed226SJulian Elischer 				le16toh(rp->num_keys_read));
259878ed226SJulian Elischer 		} break;
260878ed226SJulian Elischer 
261878ed226SJulian Elischer 	case NG_HCI_EVENT_RETURN_LINK_KEYS: {
262878ed226SJulian Elischer 		struct _key {
263878ed226SJulian Elischer 			bdaddr_t	bdaddr;
264878ed226SJulian Elischer 			u_int8_t	key[NG_HCI_KEY_SIZE];
265878ed226SJulian Elischer 		} __attribute__ ((packed))	*k = NULL;
266878ed226SJulian Elischer 
267878ed226SJulian Elischer 		fprintf(stdout, "Event: Number of keys: %d\n",
268878ed226SJulian Elischer 			event.ep.key.num_keys);
269878ed226SJulian Elischer 
270878ed226SJulian Elischer 		k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
271878ed226SJulian Elischer 		for (n = 0; n < event.ep.key.num_keys; n++) {
272878ed226SJulian Elischer 			fprintf(stdout, "\t%d: %02x:%02x:%02x:%02x:%02x:%02x ",
273878ed226SJulian Elischer 				n + 1,
274878ed226SJulian Elischer 				k->bdaddr.b[5], k->bdaddr.b[4], k->bdaddr.b[3],
275878ed226SJulian Elischer 				k->bdaddr.b[2], k->bdaddr.b[1], k->bdaddr.b[0]);
276878ed226SJulian Elischer 
277878ed226SJulian Elischer 			for (a0 = 0; a0 < sizeof(k->key); a0++)
278878ed226SJulian Elischer 				fprintf(stdout, "%02x", k->key[a0]);
279878ed226SJulian Elischer 			fprintf(stdout, "\n");
280878ed226SJulian Elischer 
281878ed226SJulian Elischer 			k ++;
282878ed226SJulian Elischer 		}
283878ed226SJulian Elischer 
284878ed226SJulian Elischer 		goto again;
285878ed226SJulian Elischer 
286878ed226SJulian Elischer 		} break;
287878ed226SJulian Elischer 
288878ed226SJulian Elischer 	default:
289878ed226SJulian Elischer 		goto again;
290878ed226SJulian Elischer 	}
291878ed226SJulian Elischer 
292878ed226SJulian Elischer 	return (OK);
293878ed226SJulian Elischer } /* hci_read_store_link_key */
294878ed226SJulian Elischer 
295878ed226SJulian Elischer /* Send Write_Stored_Link_Key command to the unit */
296878ed226SJulian Elischer static int
297878ed226SJulian Elischer hci_write_stored_link_key(int s, int argc, char **argv)
298878ed226SJulian Elischer {
299878ed226SJulian Elischer 	struct {
300878ed226SJulian Elischer 		ng_hci_write_stored_link_key_cp	p;
301878ed226SJulian Elischer 		bdaddr_t			bdaddr;
302878ed226SJulian Elischer 		u_int8_t			key[NG_HCI_KEY_SIZE];
303878ed226SJulian Elischer 	}					cp;
304878ed226SJulian Elischer 	ng_hci_write_stored_link_key_rp		rp;
305878ed226SJulian Elischer 	int32_t					n, a0, a1, a2, a3, a4, a5;
306878ed226SJulian Elischer 
307878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
308878ed226SJulian Elischer 
309878ed226SJulian Elischer 	switch (argc) {
310878ed226SJulian Elischer 	case 2:
311878ed226SJulian Elischer 		cp.p.num_keys_write = 1;
312878ed226SJulian Elischer 
313878ed226SJulian Elischer 		/* parse BD_ADDR */
314878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x:%x:%x:%x",
315878ed226SJulian Elischer 				&a5, &a4, &a3, &a2, &a1, &a0) != 6)
316878ed226SJulian Elischer 			return (USAGE);
317878ed226SJulian Elischer 
318878ed226SJulian Elischer 		cp.bdaddr.b[0] = (a0 & 0xff);
319878ed226SJulian Elischer 		cp.bdaddr.b[1] = (a1 & 0xff);
320878ed226SJulian Elischer 		cp.bdaddr.b[2] = (a2 & 0xff);
321878ed226SJulian Elischer 		cp.bdaddr.b[3] = (a3 & 0xff);
322878ed226SJulian Elischer 		cp.bdaddr.b[4] = (a4 & 0xff);
323878ed226SJulian Elischer 		cp.bdaddr.b[5] = (a5 & 0xff);
324878ed226SJulian Elischer 
325878ed226SJulian Elischer 		/* parse key */
326878ed226SJulian Elischer 		if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
327878ed226SJulian Elischer 			return (USAGE);
328878ed226SJulian Elischer 		break;
329878ed226SJulian Elischer 
330878ed226SJulian Elischer 	default:
331878ed226SJulian Elischer 		return (USAGE);
332878ed226SJulian Elischer 	}
333878ed226SJulian Elischer 
334878ed226SJulian Elischer 	/* send command */
335878ed226SJulian Elischer 	n = sizeof(rp);
336878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
337878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_STORED_LINK_KEY),
338878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
339878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
340878ed226SJulian Elischer 		return (ERROR);
341878ed226SJulian Elischer 
342878ed226SJulian Elischer 	if (rp.status != 0x00) {
343878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
344878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
345878ed226SJulian Elischer 		return (FAILED);
346878ed226SJulian Elischer 	}
347878ed226SJulian Elischer 
348878ed226SJulian Elischer 	fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
349878ed226SJulian Elischer 
350878ed226SJulian Elischer 	return (OK);
351878ed226SJulian Elischer } /* hci_write_stored_link_key */
352878ed226SJulian Elischer 
353878ed226SJulian Elischer 
354878ed226SJulian Elischer /* Send Delete_Stored_Link_Key command to the unit */
355878ed226SJulian Elischer static int
356878ed226SJulian Elischer hci_delete_stored_link_key(int s, int argc, char **argv)
357878ed226SJulian Elischer {
358878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_cp	cp;
359878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_rp	rp;
360878ed226SJulian Elischer 	int32_t					n, a0, a1, a2, a3, a4, a5;
361878ed226SJulian Elischer 
362878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
363878ed226SJulian Elischer 
364878ed226SJulian Elischer 	switch (argc) {
365878ed226SJulian Elischer 	case 1:
366878ed226SJulian Elischer 		/* parse BD_ADDR */
367878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x:%x:%x:%x",
368878ed226SJulian Elischer 				&a5, &a4, &a3, &a2, &a1, &a0) != 6)
369878ed226SJulian Elischer 			return (USAGE);
370878ed226SJulian Elischer 
371878ed226SJulian Elischer 		cp.bdaddr.b[0] = (a0 & 0xff);
372878ed226SJulian Elischer 		cp.bdaddr.b[1] = (a1 & 0xff);
373878ed226SJulian Elischer 		cp.bdaddr.b[2] = (a2 & 0xff);
374878ed226SJulian Elischer 		cp.bdaddr.b[3] = (a3 & 0xff);
375878ed226SJulian Elischer 		cp.bdaddr.b[4] = (a4 & 0xff);
376878ed226SJulian Elischer 		cp.bdaddr.b[5] = (a5 & 0xff);
377878ed226SJulian Elischer 		break;
378878ed226SJulian Elischer 
379878ed226SJulian Elischer 	default:
380878ed226SJulian Elischer 		cp.delete_all = 1;
381878ed226SJulian Elischer 		break;
382878ed226SJulian Elischer 	}
383878ed226SJulian Elischer 
384878ed226SJulian Elischer 	/* send command */
385878ed226SJulian Elischer 	n = sizeof(cp);
386878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
387878ed226SJulian Elischer 			NG_HCI_OCF_DELETE_STORED_LINK_KEY),
388878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
389878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
390878ed226SJulian Elischer 		return (ERROR);
391878ed226SJulian Elischer 
392878ed226SJulian Elischer 	if (rp.status != 0x00) {
393878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
394878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
395878ed226SJulian Elischer 		return (FAILED);
396878ed226SJulian Elischer 	}
397878ed226SJulian Elischer 
398878ed226SJulian Elischer 	fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
399878ed226SJulian Elischer 
400878ed226SJulian Elischer 	return (OK);
401878ed226SJulian Elischer } /* hci_delete_stored_link_key */
402878ed226SJulian Elischer 
403878ed226SJulian Elischer /* Send Change_Local_Name command to the unit */
404878ed226SJulian Elischer static int
405878ed226SJulian Elischer hci_change_local_name(int s, int argc, char **argv)
406878ed226SJulian Elischer {
407878ed226SJulian Elischer 	ng_hci_change_local_name_cp	cp;
408878ed226SJulian Elischer 	ng_hci_change_local_name_rp	rp;
409878ed226SJulian Elischer 	int				n;
410878ed226SJulian Elischer 
411878ed226SJulian Elischer 	/* parse command parameters */
412878ed226SJulian Elischer 	switch (argc) {
413878ed226SJulian Elischer 	case 1:
414878ed226SJulian Elischer 		snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
415878ed226SJulian Elischer 		break;
416878ed226SJulian Elischer 
417878ed226SJulian Elischer 	default:
418878ed226SJulian Elischer 		return (USAGE);
419878ed226SJulian Elischer 	}
420878ed226SJulian Elischer 
421878ed226SJulian Elischer 	/* send command */
422878ed226SJulian Elischer 	n = sizeof(rp);
423878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
424878ed226SJulian Elischer 			NG_HCI_OCF_CHANGE_LOCAL_NAME),
425878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
426878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
427878ed226SJulian Elischer 		return (ERROR);
428878ed226SJulian Elischer 
429878ed226SJulian Elischer 	if (rp.status != 0x00) {
430878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
431878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
432878ed226SJulian Elischer 		return (FAILED);
433878ed226SJulian Elischer 	}
434878ed226SJulian Elischer 
435878ed226SJulian Elischer 	return (OK);
436878ed226SJulian Elischer } /* hci_change_local_name */
437878ed226SJulian Elischer 
438878ed226SJulian Elischer /* Send Read_Local_Name command to the unit */
439878ed226SJulian Elischer static int
440878ed226SJulian Elischer hci_read_local_name(int s, int argc, char **argv)
441878ed226SJulian Elischer {
442878ed226SJulian Elischer 	ng_hci_read_local_name_rp	rp;
443878ed226SJulian Elischer 	int				n;
444878ed226SJulian Elischer 
445878ed226SJulian Elischer 	n = sizeof(rp);
446878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
447878ed226SJulian Elischer 			NG_HCI_OCF_READ_LOCAL_NAME),
448878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
449878ed226SJulian Elischer 		return (ERROR);
450878ed226SJulian Elischer 
451878ed226SJulian Elischer 	if (rp.status != 0x00) {
452878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
453878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
454878ed226SJulian Elischer 		return (FAILED);
455878ed226SJulian Elischer 	}
456878ed226SJulian Elischer 
457878ed226SJulian Elischer 	fprintf(stdout, "Local name: %s\n", rp.name);
458878ed226SJulian Elischer 
459878ed226SJulian Elischer 	return (OK);
460878ed226SJulian Elischer } /* hci_read_local_name */
461878ed226SJulian Elischer 
462878ed226SJulian Elischer /* Send Read_Connection_Accept_Timeout to the unit */
463878ed226SJulian Elischer static int
464878ed226SJulian Elischer hci_read_connection_accept_timeout(int s, int argc, char **argv)
465878ed226SJulian Elischer {
466878ed226SJulian Elischer 	ng_hci_read_con_accept_timo_rp	rp;
467878ed226SJulian Elischer 	int				n;
468878ed226SJulian Elischer 
469878ed226SJulian Elischer 	n = sizeof(rp);
470878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
471878ed226SJulian Elischer 			NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
472878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
473878ed226SJulian Elischer 		return (ERROR);
474878ed226SJulian Elischer 
475878ed226SJulian Elischer 	if (rp.status != 0x00) {
476878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
477878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
478878ed226SJulian Elischer 		return (FAILED);
479878ed226SJulian Elischer 	}
480878ed226SJulian Elischer 
481878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
482878ed226SJulian Elischer 	fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
483878ed226SJulian Elischer 			rp.timeout * 0.625, rp.timeout);
484878ed226SJulian Elischer 
485878ed226SJulian Elischer 	return (OK);
486878ed226SJulian Elischer } /* hci_read_connection_accept_timeout */
487878ed226SJulian Elischer 
488878ed226SJulian Elischer /* Send Write_Connection_Accept_Timeout to the unit */
489878ed226SJulian Elischer static int
490878ed226SJulian Elischer hci_write_connection_accept_timeout(int s, int argc, char **argv)
491878ed226SJulian Elischer {
492878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_cp	cp;
493878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_rp	rp;
494878ed226SJulian Elischer 	int				n;
495878ed226SJulian Elischer 
496878ed226SJulian Elischer 	/* parse command parameters */
497878ed226SJulian Elischer 	switch (argc) {
498878ed226SJulian Elischer 	case 1:
499878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
500878ed226SJulian Elischer 			return (USAGE);
501878ed226SJulian Elischer 
502878ed226SJulian Elischer 		cp.timeout = (u_int16_t) n;
503878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
504878ed226SJulian Elischer 		break;
505878ed226SJulian Elischer 
506878ed226SJulian Elischer 	default:
507878ed226SJulian Elischer 		return (USAGE);
508878ed226SJulian Elischer 	}
509878ed226SJulian Elischer 
510878ed226SJulian Elischer 	/* send command */
511878ed226SJulian Elischer 	n = sizeof(rp);
512878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
513878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
514878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
515878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
516878ed226SJulian Elischer 		return (ERROR);
517878ed226SJulian Elischer 
518878ed226SJulian Elischer 	if (rp.status != 0x00) {
519878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
520878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
521878ed226SJulian Elischer 		return (FAILED);
522878ed226SJulian Elischer 	}
523878ed226SJulian Elischer 
524878ed226SJulian Elischer 	return (OK);
525878ed226SJulian Elischer } /* hci_write_connection_accept_timeout */
526878ed226SJulian Elischer 
527878ed226SJulian Elischer /* Send Read_Page_Timeout command to the unit */
528878ed226SJulian Elischer static int
529878ed226SJulian Elischer hci_read_page_timeout(int s, int argc, char **argv)
530878ed226SJulian Elischer {
531878ed226SJulian Elischer 	ng_hci_read_page_timo_rp	rp;
532878ed226SJulian Elischer 	int				n;
533878ed226SJulian Elischer 
534878ed226SJulian Elischer 	n = sizeof(rp);
535878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
536878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_TIMO),
537878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
538878ed226SJulian Elischer 		return (ERROR);
539878ed226SJulian Elischer 
540878ed226SJulian Elischer 	if (rp.status != 0x00) {
541878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
542878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
543878ed226SJulian Elischer 		return (FAILED);
544878ed226SJulian Elischer 	}
545878ed226SJulian Elischer 
546878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
547878ed226SJulian Elischer 	fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
548878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
549878ed226SJulian Elischer 
550878ed226SJulian Elischer 	return (OK);
551878ed226SJulian Elischer } /* hci_read_page_timeoout */
552878ed226SJulian Elischer 
553878ed226SJulian Elischer /* Send Write_Page_Timeout command to the unit */
554878ed226SJulian Elischer static int
555878ed226SJulian Elischer hci_write_page_timeout(int s, int argc, char **argv)
556878ed226SJulian Elischer {
557878ed226SJulian Elischer 	ng_hci_write_page_timo_cp	cp;
558878ed226SJulian Elischer 	ng_hci_write_page_timo_rp	rp;
559878ed226SJulian Elischer 	int				n;
560878ed226SJulian Elischer 
561878ed226SJulian Elischer 	/* parse command parameters */
562878ed226SJulian Elischer 	switch (argc) {
563878ed226SJulian Elischer 	case 1:
564878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
565878ed226SJulian Elischer 			return (USAGE);
566878ed226SJulian Elischer 
567878ed226SJulian Elischer 		cp.timeout = (u_int16_t) n;
568878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
569878ed226SJulian Elischer 		break;
570878ed226SJulian Elischer 
571878ed226SJulian Elischer 	default:
572878ed226SJulian Elischer 		return (USAGE);
573878ed226SJulian Elischer 	}
574878ed226SJulian Elischer 
575878ed226SJulian Elischer 	/* send command */
576878ed226SJulian Elischer 	n = sizeof(rp);
577878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
578878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_TIMO),
579878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
580878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
581878ed226SJulian Elischer 		return (ERROR);
582878ed226SJulian Elischer 
583878ed226SJulian Elischer 	if (rp.status != 0x00) {
584878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
585878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
586878ed226SJulian Elischer 		return (FAILED);
587878ed226SJulian Elischer 	}
588878ed226SJulian Elischer 
589878ed226SJulian Elischer 	return (OK);
590878ed226SJulian Elischer } /* hci_write_page_timeout */
591878ed226SJulian Elischer 
592878ed226SJulian Elischer /* Send Read_Scan_Enable command to the unit */
593878ed226SJulian Elischer static int
594878ed226SJulian Elischer hci_read_scan_enable(int s, int argc, char **argv)
595878ed226SJulian Elischer {
596878ed226SJulian Elischer 	ng_hci_read_scan_enable_rp	rp;
597878ed226SJulian Elischer 	int				n;
598878ed226SJulian Elischer 
599878ed226SJulian Elischer 	n = sizeof(rp);
600878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
601878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCAN_ENABLE),
602878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
603878ed226SJulian Elischer 		return (ERROR);
604878ed226SJulian Elischer 
605878ed226SJulian Elischer 	if (rp.status != 0x00) {
606878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
607878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
608878ed226SJulian Elischer 		return (FAILED);
609878ed226SJulian Elischer 	}
610878ed226SJulian Elischer 
611878ed226SJulian Elischer 	fprintf(stdout, "Scan enable: %s [%#02x]\n",
612878ed226SJulian Elischer 		hci_scan2str(rp.scan_enable), rp.scan_enable);
613878ed226SJulian Elischer 
614878ed226SJulian Elischer 	return (OK);
615878ed226SJulian Elischer } /* hci_read_scan_enable */
616878ed226SJulian Elischer 
617878ed226SJulian Elischer /* Send Write_Scan_Enable command to the unit */
618878ed226SJulian Elischer static int
619878ed226SJulian Elischer hci_write_scan_enable(int s, int argc, char **argv)
620878ed226SJulian Elischer {
621878ed226SJulian Elischer 	ng_hci_write_scan_enable_cp	cp;
622878ed226SJulian Elischer 	ng_hci_write_scan_enable_rp	rp;
623878ed226SJulian Elischer 	int				n;
624878ed226SJulian Elischer 
625878ed226SJulian Elischer 	/* parse command parameters */
626878ed226SJulian Elischer 	switch (argc) {
627878ed226SJulian Elischer 	case 1:
628878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
629878ed226SJulian Elischer 			return (USAGE);
630878ed226SJulian Elischer 
631878ed226SJulian Elischer 		cp.scan_enable = (u_int8_t) n;
632878ed226SJulian Elischer 		break;
633878ed226SJulian Elischer 
634878ed226SJulian Elischer 	default:
635878ed226SJulian Elischer 		return (USAGE);
636878ed226SJulian Elischer 	}
637878ed226SJulian Elischer 
638878ed226SJulian Elischer 	n = sizeof(rp);
639878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
640878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCAN_ENABLE),
641878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
642878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
643878ed226SJulian Elischer 		return (ERROR);
644878ed226SJulian Elischer 
645878ed226SJulian Elischer 	if (rp.status != 0x00) {
646878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
647878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
648878ed226SJulian Elischer 		return (FAILED);
649878ed226SJulian Elischer 	}
650878ed226SJulian Elischer 
651878ed226SJulian Elischer 	return (OK);
652878ed226SJulian Elischer } /* hci_write_scan_enable */
653878ed226SJulian Elischer 
654878ed226SJulian Elischer /* Send Read_Page_Scan_Activity command to the unit */
655878ed226SJulian Elischer static int
656878ed226SJulian Elischer hci_read_page_scan_activity(int s, int argc, char **argv)
657878ed226SJulian Elischer {
658878ed226SJulian Elischer 	ng_hci_read_page_scan_activity_rp	rp;
659878ed226SJulian Elischer 	int					n;
660878ed226SJulian Elischer 
661878ed226SJulian Elischer 	n = sizeof(rp);
662878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
663878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
664878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
665878ed226SJulian Elischer 		return (ERROR);
666878ed226SJulian Elischer 
667878ed226SJulian Elischer 	if (rp.status != 0x00) {
668878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
669878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
670878ed226SJulian Elischer 		return (FAILED);
671878ed226SJulian Elischer 	}
672878ed226SJulian Elischer 
673878ed226SJulian Elischer 	rp.page_scan_interval = le16toh(rp.page_scan_interval);
674878ed226SJulian Elischer 	rp.page_scan_window = le16toh(rp.page_scan_window);
675878ed226SJulian Elischer 
676878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
677878ed226SJulian Elischer 		rp.page_scan_interval * 0.625, rp.page_scan_interval);
678878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
679878ed226SJulian Elischer 		rp.page_scan_window * 0.625, rp.page_scan_window);
680878ed226SJulian Elischer 
681878ed226SJulian Elischer 	return (OK);
682878ed226SJulian Elischer } /* hci_read_page_scan_activity */
683878ed226SJulian Elischer 
684878ed226SJulian Elischer /* Send Write_Page_Scan_Activity command to the unit */
685878ed226SJulian Elischer static int
686878ed226SJulian Elischer hci_write_page_scan_activity(int s, int argc, char **argv)
687878ed226SJulian Elischer {
688878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_cp	cp;
689878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_rp	rp;
690878ed226SJulian Elischer 	int					n;
691878ed226SJulian Elischer 
692878ed226SJulian Elischer 	/* parse command parameters */
693878ed226SJulian Elischer 	switch (argc) {
694878ed226SJulian Elischer 	case 2:
695878ed226SJulian Elischer 		/* page scan interval */
696878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
697878ed226SJulian Elischer 			return (USAGE);
698878ed226SJulian Elischer 
699878ed226SJulian Elischer 		cp.page_scan_interval = (u_int16_t) n;
700878ed226SJulian Elischer 
701878ed226SJulian Elischer 		/* page scan window */
702878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
703878ed226SJulian Elischer 			return (USAGE);
704878ed226SJulian Elischer 
705878ed226SJulian Elischer 		cp.page_scan_window = (u_int16_t) n;
706878ed226SJulian Elischer 
707878ed226SJulian Elischer 		if (cp.page_scan_window > cp.page_scan_interval)
708878ed226SJulian Elischer 			return (USAGE);
709878ed226SJulian Elischer 
710878ed226SJulian Elischer 		cp.page_scan_interval = htole16(cp.page_scan_interval);
711878ed226SJulian Elischer 		cp.page_scan_window = htole16(cp.page_scan_window);
712878ed226SJulian Elischer 		break;
713878ed226SJulian Elischer 
714878ed226SJulian Elischer 	default:
715878ed226SJulian Elischer 		return (USAGE);
716878ed226SJulian Elischer 	}
717878ed226SJulian Elischer 
718878ed226SJulian Elischer 	/* send command */
719878ed226SJulian Elischer 	n = sizeof(rp);
720878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
721878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
722878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
723878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
724878ed226SJulian Elischer 		return (ERROR);
725878ed226SJulian Elischer 
726878ed226SJulian Elischer 	if (rp.status != 0x00) {
727878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
728878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
729878ed226SJulian Elischer 		return (FAILED);
730878ed226SJulian Elischer 	}
731878ed226SJulian Elischer 
732878ed226SJulian Elischer 	return (OK);
733878ed226SJulian Elischer } /* hci_write_page_scan_activity */
734878ed226SJulian Elischer 
735878ed226SJulian Elischer /* Send Read_Inquiry_Scan_Activity command to the unit */
736878ed226SJulian Elischer static int
737878ed226SJulian Elischer hci_read_inquiry_scan_activity(int s, int argc, char **argv)
738878ed226SJulian Elischer {
739878ed226SJulian Elischer 	ng_hci_read_inquiry_scan_activity_rp	rp;
740878ed226SJulian Elischer 	int					n;
741878ed226SJulian Elischer 
742878ed226SJulian Elischer 	n = sizeof(rp);
743878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
744878ed226SJulian Elischer 			NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
745878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
746878ed226SJulian Elischer 		return (ERROR);
747878ed226SJulian Elischer 
748878ed226SJulian Elischer 	if (rp.status != 0x00) {
749878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
750878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
751878ed226SJulian Elischer 		return (FAILED);
752878ed226SJulian Elischer 	}
753878ed226SJulian Elischer 
754878ed226SJulian Elischer 	rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
755878ed226SJulian Elischer 	rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
756878ed226SJulian Elischer 
757878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
758878ed226SJulian Elischer 		rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
759878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
760878ed226SJulian Elischer 		rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
761878ed226SJulian Elischer 
762878ed226SJulian Elischer 	return (OK);
763878ed226SJulian Elischer } /* hci_read_inquiry_scan_activity */
764878ed226SJulian Elischer 
765878ed226SJulian Elischer /* Send Write_Inquiry_Scan_Activity command to the unit */
766878ed226SJulian Elischer static int
767878ed226SJulian Elischer hci_write_inquiry_scan_activity(int s, int argc, char **argv)
768878ed226SJulian Elischer {
769878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_cp	cp;
770878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_rp	rp;
771878ed226SJulian Elischer 	int					n;
772878ed226SJulian Elischer 
773878ed226SJulian Elischer 	/* parse command parameters */
774878ed226SJulian Elischer 	switch (argc) {
775878ed226SJulian Elischer 	case 2:
776878ed226SJulian Elischer 		/* inquiry scan interval */
777878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
778878ed226SJulian Elischer 			return (USAGE);
779878ed226SJulian Elischer 
780878ed226SJulian Elischer 		cp.inquiry_scan_interval = (u_int16_t) n;
781878ed226SJulian Elischer 
782878ed226SJulian Elischer 		/* inquiry scan window */
783878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
784878ed226SJulian Elischer 			return (USAGE);
785878ed226SJulian Elischer 
786878ed226SJulian Elischer 		cp.inquiry_scan_window = (u_int16_t) n;
787878ed226SJulian Elischer 
788878ed226SJulian Elischer 		if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
789878ed226SJulian Elischer 			return (USAGE);
790878ed226SJulian Elischer 
791878ed226SJulian Elischer 		cp.inquiry_scan_interval =
792878ed226SJulian Elischer 			htole16(cp.inquiry_scan_interval);
793878ed226SJulian Elischer 		cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
794878ed226SJulian Elischer 		break;
795878ed226SJulian Elischer 
796878ed226SJulian Elischer 	default:
797878ed226SJulian Elischer 		return (USAGE);
798878ed226SJulian Elischer 	}
799878ed226SJulian Elischer 
800878ed226SJulian Elischer 	/* send command */
801878ed226SJulian Elischer 	n = sizeof(rp);
802878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
803878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
804878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
805878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
806878ed226SJulian Elischer 		return (ERROR);
807878ed226SJulian Elischer 
808878ed226SJulian Elischer 	if (rp.status != 0x00) {
809878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
810878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
811878ed226SJulian Elischer 		return (FAILED);
812878ed226SJulian Elischer 	}
813878ed226SJulian Elischer 
814878ed226SJulian Elischer 	return (OK);
815878ed226SJulian Elischer } /* hci_write_inquiry_scan_activity */
816878ed226SJulian Elischer 
817878ed226SJulian Elischer /* Send Read_Authentication_Enable command to the unit */
818878ed226SJulian Elischer static int
819878ed226SJulian Elischer hci_read_authentication_enable(int s, int argc, char **argv)
820878ed226SJulian Elischer {
821878ed226SJulian Elischer 	ng_hci_read_auth_enable_rp	rp;
822878ed226SJulian Elischer 	int				n;
823878ed226SJulian Elischer 
824878ed226SJulian Elischer 	n = sizeof(rp);
825878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
826878ed226SJulian Elischer 			NG_HCI_OCF_READ_AUTH_ENABLE),
827878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
828878ed226SJulian Elischer 		return (ERROR);
829878ed226SJulian Elischer 
830878ed226SJulian Elischer 	if (rp.status != 0x00) {
831878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
832878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
833878ed226SJulian Elischer 		return (FAILED);
834878ed226SJulian Elischer 	}
835878ed226SJulian Elischer 
836878ed226SJulian Elischer 	fprintf(stdout, "Authentication Enable: %s [%d]\n",
837878ed226SJulian Elischer 		rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
838878ed226SJulian Elischer 
839878ed226SJulian Elischer 	return (OK);
840878ed226SJulian Elischer } /* hci_read_authentication_enable */
841878ed226SJulian Elischer 
842878ed226SJulian Elischer /* Send Write_Authentication_Enable command to the unit */
843878ed226SJulian Elischer static int
844878ed226SJulian Elischer hci_write_authentication_enable(int s, int argc, char **argv)
845878ed226SJulian Elischer {
846878ed226SJulian Elischer 	ng_hci_write_auth_enable_cp	cp;
847878ed226SJulian Elischer 	ng_hci_write_auth_enable_rp	rp;
848878ed226SJulian Elischer 	int				n;
849878ed226SJulian Elischer 
850878ed226SJulian Elischer 	/* parse command parameters */
851878ed226SJulian Elischer 	switch (argc) {
852878ed226SJulian Elischer 	case 1:
853878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
854878ed226SJulian Elischer 			return (USAGE);
855878ed226SJulian Elischer 
856878ed226SJulian Elischer 		cp.auth_enable = (u_int8_t) n;
857878ed226SJulian Elischer 		break;
858878ed226SJulian Elischer 
859878ed226SJulian Elischer 	default:
860878ed226SJulian Elischer 		return (USAGE);
861878ed226SJulian Elischer 	}
862878ed226SJulian Elischer 
863878ed226SJulian Elischer 	/* send command */
864878ed226SJulian Elischer 	n = sizeof(rp);
865878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
866878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_AUTH_ENABLE),
867878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
868878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
869878ed226SJulian Elischer 		return (ERROR);
870878ed226SJulian Elischer 
871878ed226SJulian Elischer 	if (rp.status != 0x00) {
872878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
873878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
874878ed226SJulian Elischer 		return (FAILED);
875878ed226SJulian Elischer 	}
876878ed226SJulian Elischer 
877878ed226SJulian Elischer 	return (OK);
878878ed226SJulian Elischer } /* hci_write_authentication_enable */
879878ed226SJulian Elischer 
880878ed226SJulian Elischer /* Send Read_Encryption_Mode command to the unit */
881878ed226SJulian Elischer static int
882878ed226SJulian Elischer hci_read_encryption_mode(int s, int argc, char **argv)
883878ed226SJulian Elischer {
884878ed226SJulian Elischer 	ng_hci_read_encryption_mode_rp	rp;
885878ed226SJulian Elischer 	int				n;
886878ed226SJulian Elischer 
887878ed226SJulian Elischer 	n = sizeof(rp);
888878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
889878ed226SJulian Elischer 			NG_HCI_OCF_READ_ENCRYPTION_MODE),
890878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
891878ed226SJulian Elischer 		return (ERROR);
892878ed226SJulian Elischer 
893878ed226SJulian Elischer 	if (rp.status != 0x00) {
894878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
895878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
896878ed226SJulian Elischer 		return (FAILED);
897878ed226SJulian Elischer 	}
898878ed226SJulian Elischer 
899878ed226SJulian Elischer 	fprintf(stdout, "Encryption mode: %s [%#02x]\n",
900878ed226SJulian Elischer 		hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
901878ed226SJulian Elischer 
902878ed226SJulian Elischer 	return (OK);
903878ed226SJulian Elischer } /* hci_read_encryption_mode */
904878ed226SJulian Elischer 
905878ed226SJulian Elischer /* Send Write_Encryption_Mode command to the unit */
906878ed226SJulian Elischer static int
907878ed226SJulian Elischer hci_write_encryption_mode(int s, int argc, char **argv)
908878ed226SJulian Elischer {
909878ed226SJulian Elischer 	ng_hci_write_encryption_mode_cp	cp;
910878ed226SJulian Elischer 	ng_hci_write_encryption_mode_rp	rp;
911878ed226SJulian Elischer 	int				n;
912878ed226SJulian Elischer 
913878ed226SJulian Elischer 	/* parse command parameters */
914878ed226SJulian Elischer 	switch (argc) {
915878ed226SJulian Elischer 	case 1:
916878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
917878ed226SJulian Elischer 			return (USAGE);
918878ed226SJulian Elischer 
919878ed226SJulian Elischer 		cp.encryption_mode = (u_int8_t) n;
920878ed226SJulian Elischer 		break;
921878ed226SJulian Elischer 
922878ed226SJulian Elischer 	default:
923878ed226SJulian Elischer 		return (USAGE);
924878ed226SJulian Elischer 	}
925878ed226SJulian Elischer 
926878ed226SJulian Elischer 	/* send command */
927878ed226SJulian Elischer 	n = sizeof(rp);
928878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
929878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
930878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
931878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
932878ed226SJulian Elischer 		return (ERROR);
933878ed226SJulian Elischer 
934878ed226SJulian Elischer 	if (rp.status != 0x00) {
935878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
936878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
937878ed226SJulian Elischer 		return (FAILED);
938878ed226SJulian Elischer 	}
939878ed226SJulian Elischer 
940878ed226SJulian Elischer 	return (OK);
941878ed226SJulian Elischer } /* hci_write_encryption_mode */
942878ed226SJulian Elischer 
943878ed226SJulian Elischer /* Send Read_Class_Of_Device command to the unit */
944878ed226SJulian Elischer static int
945878ed226SJulian Elischer hci_read_class_of_device(int s, int argc, char **argv)
946878ed226SJulian Elischer {
947878ed226SJulian Elischer 	ng_hci_read_unit_class_rp	rp;
948878ed226SJulian Elischer 	int				n;
949878ed226SJulian Elischer 
950878ed226SJulian Elischer 	n = sizeof(rp);
951878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
952878ed226SJulian Elischer 			NG_HCI_OCF_READ_UNIT_CLASS),
953878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
954878ed226SJulian Elischer 		return (ERROR);
955878ed226SJulian Elischer 
956878ed226SJulian Elischer 	if (rp.status != 0x00) {
957878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
958878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
959878ed226SJulian Elischer 		return (FAILED);
960878ed226SJulian Elischer 	}
961878ed226SJulian Elischer 
962878ed226SJulian Elischer 	fprintf(stdout, "Class: %02x:%02x:%02x\n",
963878ed226SJulian Elischer 		rp.uclass[2], rp.uclass[1], rp.uclass[0]);
964878ed226SJulian Elischer 
965878ed226SJulian Elischer 	return (0);
966878ed226SJulian Elischer } /* hci_read_class_of_device */
967878ed226SJulian Elischer 
968878ed226SJulian Elischer /* Send Write_Class_Of_Device command to the unit */
969878ed226SJulian Elischer static int
970878ed226SJulian Elischer hci_write_class_of_device(int s, int argc, char **argv)
971878ed226SJulian Elischer {
972878ed226SJulian Elischer 	ng_hci_write_unit_class_cp	cp;
973878ed226SJulian Elischer 	ng_hci_write_unit_class_rp	rp;
974878ed226SJulian Elischer 	int				n0, n1, n2;
975878ed226SJulian Elischer 
976878ed226SJulian Elischer 	/* parse command parameters */
977878ed226SJulian Elischer 	switch (argc) {
978878ed226SJulian Elischer 	case 1:
979878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
980878ed226SJulian Elischer 			return (USAGE);
981878ed226SJulian Elischer 
982878ed226SJulian Elischer 		cp.uclass[0] = (n0 & 0xff);
983878ed226SJulian Elischer 		cp.uclass[1] = (n1 & 0xff);
984878ed226SJulian Elischer 		cp.uclass[2] = (n2 & 0xff);
985878ed226SJulian Elischer 		break;
986878ed226SJulian Elischer 
987878ed226SJulian Elischer 	default:
988878ed226SJulian Elischer 		return (USAGE);
989878ed226SJulian Elischer 	}
990878ed226SJulian Elischer 
991878ed226SJulian Elischer 	/* send command */
992878ed226SJulian Elischer 	n0 = sizeof(rp);
993878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
994878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_UNIT_CLASS),
995878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
996878ed226SJulian Elischer 			(char *) &rp, &n0) == ERROR)
997878ed226SJulian Elischer 		return (ERROR);
998878ed226SJulian Elischer 
999878ed226SJulian Elischer 	if (rp.status != 0x00) {
1000878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1001878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1002878ed226SJulian Elischer 		return (FAILED);
1003878ed226SJulian Elischer 	}
1004878ed226SJulian Elischer 
1005878ed226SJulian Elischer 	return (OK);
1006878ed226SJulian Elischer } /* hci_write_class_of_device */
1007878ed226SJulian Elischer 
1008878ed226SJulian Elischer /* Send Read_Voice_Settings command to the unit */
1009878ed226SJulian Elischer static int
1010878ed226SJulian Elischer hci_read_voice_settings(int s, int argc, char **argv)
1011878ed226SJulian Elischer {
1012878ed226SJulian Elischer 	ng_hci_read_voice_settings_rp	rp;
1013878ed226SJulian Elischer 	int				n,
1014878ed226SJulian Elischer 					input_coding,
1015878ed226SJulian Elischer 					input_data_format,
1016878ed226SJulian Elischer 					input_sample_size;
1017878ed226SJulian Elischer 
1018878ed226SJulian Elischer 	n = sizeof(rp);
1019878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1020878ed226SJulian Elischer 			NG_HCI_OCF_READ_VOICE_SETTINGS),
1021878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1022878ed226SJulian Elischer 		return (ERROR);
1023878ed226SJulian Elischer 
1024878ed226SJulian Elischer 	if (rp.status != 0x00) {
1025878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1026878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1027878ed226SJulian Elischer 		return (FAILED);
1028878ed226SJulian Elischer 	}
1029878ed226SJulian Elischer 
1030878ed226SJulian Elischer 	rp.settings = le16toh(rp.settings);
1031878ed226SJulian Elischer 
1032878ed226SJulian Elischer 	input_coding      = (rp.settings & 0x0300) >> 8;
1033878ed226SJulian Elischer 	input_data_format = (rp.settings & 0x00c0) >> 6;
1034878ed226SJulian Elischer 	input_sample_size = (rp.settings & 0x0020) >> 5;
1035878ed226SJulian Elischer 
1036878ed226SJulian Elischer 	fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1037878ed226SJulian Elischer 	fprintf(stdout, "Input coding: %s [%d]\n",
1038878ed226SJulian Elischer 		hci_coding2str(input_coding), input_coding);
1039878ed226SJulian Elischer 	fprintf(stdout, "Input data format: %s [%d]\n",
1040878ed226SJulian Elischer 		hci_vdata2str(input_data_format), input_data_format);
1041878ed226SJulian Elischer 
1042878ed226SJulian Elischer 	if (input_coding == 0x00) /* Only for Linear PCM */
1043878ed226SJulian Elischer 		fprintf(stdout, "Input sample size: %d bit [%d]\n",
1044878ed226SJulian Elischer 			input_sample_size? 16 : 8, input_sample_size);
1045878ed226SJulian Elischer 
1046878ed226SJulian Elischer 	return (OK);
1047878ed226SJulian Elischer } /* hci_read_voice_settings */
1048878ed226SJulian Elischer 
1049878ed226SJulian Elischer /* Send Write_Voice_Settings command to the unit */
1050878ed226SJulian Elischer static int
1051878ed226SJulian Elischer hci_write_voice_settings(int s, int argc, char **argv)
1052878ed226SJulian Elischer {
1053878ed226SJulian Elischer 	ng_hci_write_voice_settings_cp	cp;
1054878ed226SJulian Elischer 	ng_hci_write_voice_settings_rp	rp;
1055878ed226SJulian Elischer 	int				n;
1056878ed226SJulian Elischer 
1057878ed226SJulian Elischer 	/* parse command parameters */
1058878ed226SJulian Elischer 	switch (argc) {
1059878ed226SJulian Elischer 	case 1:
1060878ed226SJulian Elischer 		if (sscanf(argv[0], "%x", &n) != 1)
1061878ed226SJulian Elischer 			return (USAGE);
1062878ed226SJulian Elischer 
1063878ed226SJulian Elischer 		cp.settings = (u_int16_t) n;
1064878ed226SJulian Elischer 		cp.settings = htole16(cp.settings);
1065878ed226SJulian Elischer 		break;
1066878ed226SJulian Elischer 
1067878ed226SJulian Elischer 	default:
1068878ed226SJulian Elischer 		return (USAGE);
1069878ed226SJulian Elischer 	}
1070878ed226SJulian Elischer 
1071878ed226SJulian Elischer 	/* send command */
1072878ed226SJulian Elischer 	n = sizeof(rp);
1073878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1074878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1075878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1076878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1077878ed226SJulian Elischer 		return (ERROR);
1078878ed226SJulian Elischer 
1079878ed226SJulian Elischer 	if (rp.status != 0x00) {
1080878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1081878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1082878ed226SJulian Elischer 		return (FAILED);
1083878ed226SJulian Elischer 	}
1084878ed226SJulian Elischer 
1085878ed226SJulian Elischer 	return (OK);
1086878ed226SJulian Elischer } /* hci_write_voice_settings */
1087878ed226SJulian Elischer 
1088878ed226SJulian Elischer /* Send Read_Number_Broadcast_Restransmissions */
1089878ed226SJulian Elischer static int
1090878ed226SJulian Elischer hci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1091878ed226SJulian Elischer {
1092878ed226SJulian Elischer 	ng_hci_read_num_broadcast_retrans_rp	rp;
1093878ed226SJulian Elischer 	int					n;
1094878ed226SJulian Elischer 
1095878ed226SJulian Elischer 	n = sizeof(rp);
1096878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1097878ed226SJulian Elischer 			NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1098878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1099878ed226SJulian Elischer 		return (ERROR);
1100878ed226SJulian Elischer 
1101878ed226SJulian Elischer 	if (rp.status != 0x00) {
1102878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1103878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1104878ed226SJulian Elischer 		return (FAILED);
1105878ed226SJulian Elischer 	}
1106878ed226SJulian Elischer 
1107878ed226SJulian Elischer 	fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1108878ed226SJulian Elischer 		rp.counter);
1109878ed226SJulian Elischer 
1110878ed226SJulian Elischer 	return (OK);
1111878ed226SJulian Elischer } /* hci_read_number_broadcast_retransmissions */
1112878ed226SJulian Elischer 
1113878ed226SJulian Elischer /* Send Write_Number_Broadcast_Restransmissions */
1114878ed226SJulian Elischer static int
1115878ed226SJulian Elischer hci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1116878ed226SJulian Elischer {
1117878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_cp	cp;
1118878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_rp	rp;
1119878ed226SJulian Elischer 	int					n;
1120878ed226SJulian Elischer 
1121878ed226SJulian Elischer 	/* parse command parameters */
1122878ed226SJulian Elischer 	switch (argc) {
1123878ed226SJulian Elischer 	case 1:
1124878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1125878ed226SJulian Elischer 			return (USAGE);
1126878ed226SJulian Elischer 
1127878ed226SJulian Elischer 		cp.counter = (u_int8_t) n;
1128878ed226SJulian Elischer 		break;
1129878ed226SJulian Elischer 
1130878ed226SJulian Elischer 	default:
1131878ed226SJulian Elischer 		return (USAGE);
1132878ed226SJulian Elischer 	}
1133878ed226SJulian Elischer 
1134878ed226SJulian Elischer 	/* send command */
1135878ed226SJulian Elischer 	n = sizeof(rp);
1136878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1137878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1138878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1139878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1140878ed226SJulian Elischer 		return (ERROR);
1141878ed226SJulian Elischer 
1142878ed226SJulian Elischer 	if (rp.status != 0x00) {
1143878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1144878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1145878ed226SJulian Elischer 		return (FAILED);
1146878ed226SJulian Elischer 	}
1147878ed226SJulian Elischer 
1148878ed226SJulian Elischer 	return (OK);
1149878ed226SJulian Elischer } /* hci_write_number_broadcast_retransmissions */
1150878ed226SJulian Elischer 
1151878ed226SJulian Elischer /* Send Read_Hold_Mode_Activity command to the unit */
1152878ed226SJulian Elischer static int
1153878ed226SJulian Elischer hci_read_hold_mode_activity(int s, int argc, char **argv)
1154878ed226SJulian Elischer {
1155878ed226SJulian Elischer 	ng_hci_read_hold_mode_activity_rp	rp;
1156878ed226SJulian Elischer 	int					n;
1157878ed226SJulian Elischer 	char					buffer[1024];
1158878ed226SJulian Elischer 
1159878ed226SJulian Elischer 	n = sizeof(rp);
1160878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1161878ed226SJulian Elischer 			NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1162878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1163878ed226SJulian Elischer 		return (ERROR);
1164878ed226SJulian Elischer 
1165878ed226SJulian Elischer 	if (rp.status != 0x00) {
1166878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1167878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1168878ed226SJulian Elischer 		return (FAILED);
1169878ed226SJulian Elischer 	}
1170878ed226SJulian Elischer 
1171878ed226SJulian Elischer 	fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1172878ed226SJulian Elischer 	if (rp.hold_mode_activity == 0)
1173878ed226SJulian Elischer 		fprintf(stdout, "Maintain current Power State");
1174878ed226SJulian Elischer 	else
1175878ed226SJulian Elischer 		fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1176878ed226SJulian Elischer 				buffer, sizeof(buffer)));
1177878ed226SJulian Elischer 
1178878ed226SJulian Elischer 	fprintf(stdout, "\n");
1179878ed226SJulian Elischer 
1180878ed226SJulian Elischer 	return (OK);
1181878ed226SJulian Elischer } /* hci_read_hold_mode_activity */
1182878ed226SJulian Elischer 
1183878ed226SJulian Elischer /* Send Write_Hold_Mode_Activity command to the unit */
1184878ed226SJulian Elischer static int
1185878ed226SJulian Elischer hci_write_hold_mode_activity(int s, int argc, char **argv)
1186878ed226SJulian Elischer {
1187878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_cp	cp;
1188878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_rp	rp;
1189878ed226SJulian Elischer 	int					n;
1190878ed226SJulian Elischer 
1191878ed226SJulian Elischer 	/* parse command parameters */
1192878ed226SJulian Elischer 	switch (argc) {
1193878ed226SJulian Elischer 	case 1:
1194878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1195878ed226SJulian Elischer 			return (USAGE);
1196878ed226SJulian Elischer 
1197878ed226SJulian Elischer 		cp.hold_mode_activity = (u_int8_t) n;
1198878ed226SJulian Elischer 		break;
1199878ed226SJulian Elischer 
1200878ed226SJulian Elischer 	default:
1201878ed226SJulian Elischer 		return (USAGE);
1202878ed226SJulian Elischer 	}
1203878ed226SJulian Elischer 
1204878ed226SJulian Elischer 	/* send command */
1205878ed226SJulian Elischer 	n = sizeof(rp);
1206878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1207878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1208878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1209878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1210878ed226SJulian Elischer 		return (ERROR);
1211878ed226SJulian Elischer 
1212878ed226SJulian Elischer 	if (rp.status != 0x00) {
1213878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1214878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1215878ed226SJulian Elischer 		return (FAILED);
1216878ed226SJulian Elischer 	}
1217878ed226SJulian Elischer 
1218878ed226SJulian Elischer 	return (OK);
1219878ed226SJulian Elischer } /* hci_write_hold_mode_activity */
1220878ed226SJulian Elischer 
1221878ed226SJulian Elischer /* Send Read_SCO_Flow_Control_Enable command to the unit */
1222878ed226SJulian Elischer static int
1223878ed226SJulian Elischer hci_read_sco_flow_control_enable(int s, int argc, char **argv)
1224878ed226SJulian Elischer {
1225878ed226SJulian Elischer 	ng_hci_read_sco_flow_control_rp	rp;
1226878ed226SJulian Elischer 	int				n;
1227878ed226SJulian Elischer 
1228878ed226SJulian Elischer 	n = sizeof(rp);
1229878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1230878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1231878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1232878ed226SJulian Elischer 		return (ERROR);
1233878ed226SJulian Elischer 
1234878ed226SJulian Elischer 	if (rp.status != 0x00) {
1235878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1236878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1237878ed226SJulian Elischer 		return (FAILED);
1238878ed226SJulian Elischer 	}
1239878ed226SJulian Elischer 
1240878ed226SJulian Elischer 	fprintf(stdout, "SCO flow control %s [%d]\n",
1241878ed226SJulian Elischer 		rp.flow_control? "enabled" : "disabled", rp.flow_control);
1242878ed226SJulian Elischer 
1243878ed226SJulian Elischer 	return (OK);
1244878ed226SJulian Elischer } /* hci_read_sco_flow_control_enable */
1245878ed226SJulian Elischer 
1246878ed226SJulian Elischer /* Send Write_SCO_Flow_Control_Enable command to the unit */
1247878ed226SJulian Elischer static int
1248878ed226SJulian Elischer hci_write_sco_flow_control_enable(int s, int argc, char **argv)
1249878ed226SJulian Elischer {
1250878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_cp	cp;
1251878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_rp	rp;
1252878ed226SJulian Elischer 	int					n;
1253878ed226SJulian Elischer 
1254878ed226SJulian Elischer 	/* parse command parameters */
1255878ed226SJulian Elischer 	switch (argc) {
1256878ed226SJulian Elischer 	case 1:
1257878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1258878ed226SJulian Elischer 			return (USAGE);
1259878ed226SJulian Elischer 
1260878ed226SJulian Elischer 		cp.flow_control = (u_int8_t) n;
1261878ed226SJulian Elischer 		break;
1262878ed226SJulian Elischer 
1263878ed226SJulian Elischer 	default:
1264878ed226SJulian Elischer 		return (USAGE);
1265878ed226SJulian Elischer 	}
1266878ed226SJulian Elischer 
1267878ed226SJulian Elischer 	/* send command */
1268878ed226SJulian Elischer 	n = sizeof(rp);
1269878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1270878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1271878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1272878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1273878ed226SJulian Elischer 		return (ERROR);
1274878ed226SJulian Elischer 
1275878ed226SJulian Elischer 	if (rp.status != 0x00) {
1276878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1277878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1278878ed226SJulian Elischer 		return (FAILED);
1279878ed226SJulian Elischer 	}
1280878ed226SJulian Elischer 
1281878ed226SJulian Elischer 	return (OK);
1282878ed226SJulian Elischer } /* hci_write_sco_flow_control_enable */
1283878ed226SJulian Elischer 
1284878ed226SJulian Elischer /* Send Read_Link_Supervision_Timeout command to the unit */
1285878ed226SJulian Elischer static int
1286878ed226SJulian Elischer hci_read_link_supervision_timeout(int s, int argc, char **argv)
1287878ed226SJulian Elischer {
1288878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_cp	cp;
1289878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_rp	rp;
1290878ed226SJulian Elischer 	int					n;
1291878ed226SJulian Elischer 
1292878ed226SJulian Elischer 	switch (argc) {
1293878ed226SJulian Elischer 	case 1:
1294878ed226SJulian Elischer 		/* connection handle */
1295878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1296878ed226SJulian Elischer 			return (USAGE);
1297878ed226SJulian Elischer 
1298878ed226SJulian Elischer 		cp.con_handle = (u_int16_t) (n & 0x0fff);
1299878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1300878ed226SJulian Elischer 		break;
1301878ed226SJulian Elischer 
1302878ed226SJulian Elischer 	default:
1303878ed226SJulian Elischer 		return (USAGE);
1304878ed226SJulian Elischer 	}
1305878ed226SJulian Elischer 
1306878ed226SJulian Elischer 	/* send command */
1307878ed226SJulian Elischer 	n = sizeof(rp);
1308878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1309878ed226SJulian Elischer 			NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1310878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1311878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1312878ed226SJulian Elischer 		return (ERROR);
1313878ed226SJulian Elischer 
1314878ed226SJulian Elischer 	if (rp.status != 0x00) {
1315878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1316878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1317878ed226SJulian Elischer 		return (FAILED);
1318878ed226SJulian Elischer 	}
1319878ed226SJulian Elischer 
1320878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
1321878ed226SJulian Elischer 
1322878ed226SJulian Elischer 	fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1323878ed226SJulian Elischer 	fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1324878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
1325878ed226SJulian Elischer 
1326878ed226SJulian Elischer 	return (OK);
1327878ed226SJulian Elischer } /* hci_read_link_supervision_timeout */
1328878ed226SJulian Elischer 
1329878ed226SJulian Elischer /* Send Write_Link_Supervision_Timeout command to the unit */
1330878ed226SJulian Elischer static int
1331878ed226SJulian Elischer hci_write_link_supervision_timeout(int s, int argc, char **argv)
1332878ed226SJulian Elischer {
1333878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_cp	cp;
1334878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_rp	rp;
1335878ed226SJulian Elischer 	int					n;
1336878ed226SJulian Elischer 
1337878ed226SJulian Elischer 	switch (argc) {
1338878ed226SJulian Elischer 	case 2:
1339878ed226SJulian Elischer 		/* connection handle */
1340878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1341878ed226SJulian Elischer 			return (USAGE);
1342878ed226SJulian Elischer 
1343878ed226SJulian Elischer 		cp.con_handle = (u_int16_t) (n & 0x0fff);
1344878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1345878ed226SJulian Elischer 
1346878ed226SJulian Elischer 		/* link supervision timeout */
1347878ed226SJulian Elischer 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xeff)
1348878ed226SJulian Elischer 			return (USAGE);
1349878ed226SJulian Elischer 
1350878ed226SJulian Elischer 		cp.timeout = (u_int16_t) (n & 0x0fff);
1351878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
1352878ed226SJulian Elischer 		break;
1353878ed226SJulian Elischer 
1354878ed226SJulian Elischer 	default:
1355878ed226SJulian Elischer 		return (USAGE);
1356878ed226SJulian Elischer 	}
1357878ed226SJulian Elischer 
1358878ed226SJulian Elischer 	/* send command */
1359878ed226SJulian Elischer 	n = sizeof(rp);
1360878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1361878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1362878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1363878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1364878ed226SJulian Elischer 		return (ERROR);
1365878ed226SJulian Elischer 
1366878ed226SJulian Elischer 	if (rp.status != 0x00) {
1367878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1368878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1369878ed226SJulian Elischer 		return (FAILED);
1370878ed226SJulian Elischer 	}
1371878ed226SJulian Elischer 
1372878ed226SJulian Elischer 	return (OK);
1373878ed226SJulian Elischer } /* hci_write_link_supervision_timeout */
1374878ed226SJulian Elischer 
1375878ed226SJulian Elischer struct hci_command	host_controller_baseband_commands[] = {
1376878ed226SJulian Elischer {
1377878ed226SJulian Elischer "reset",
1378878ed226SJulian Elischer "\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1379878ed226SJulian Elischer "After the reset is completed, the current operational state will be lost,\n" \
1380878ed226SJulian Elischer "the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1381878ed226SJulian Elischer "automatically revert to the default values for the parameters for which\n" \
1382878ed226SJulian Elischer "default values are defined in the specification.",
1383878ed226SJulian Elischer &hci_reset
1384878ed226SJulian Elischer },
1385878ed226SJulian Elischer {
1386878ed226SJulian Elischer "read_pin_type",
1387878ed226SJulian Elischer "\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1388878ed226SJulian Elischer "Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1389878ed226SJulian Elischer "code.",
1390878ed226SJulian Elischer &hci_read_pin_type
1391878ed226SJulian Elischer },
1392878ed226SJulian Elischer {
1393878ed226SJulian Elischer "write_pin_type <pin_type>",
1394878ed226SJulian Elischer "\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1395878ed226SJulian Elischer "Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1396878ed226SJulian Elischer "code.\n\n" \
1397878ed226SJulian Elischer "\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1398878ed226SJulian Elischer &hci_write_pin_type
1399878ed226SJulian Elischer },
1400878ed226SJulian Elischer {
1401878ed226SJulian Elischer "read_stored_link_key [<bdaddr>]",
1402878ed226SJulian Elischer "\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1403878ed226SJulian Elischer "more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1404878ed226SJulian Elischer "Controller can store a limited number of link keys for other Bluetooth\n" \
1405878ed226SJulian Elischer "devices.\n\n" \
1406878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR",
1407878ed226SJulian Elischer &hci_read_stored_link_key
1408878ed226SJulian Elischer },
1409878ed226SJulian Elischer {
1410878ed226SJulian Elischer "write_stored_link_key <bdaddr> <key>",
1411878ed226SJulian Elischer "\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1412878ed226SJulian Elischer "or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1413878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1414878ed226SJulian Elischer "Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1415878ed226SJulian Elischer "Host Controller then no additional link keys will be stored.\n\n" \
1416878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR\n" \
1417878ed226SJulian Elischer "\t<key>    - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1418878ed226SJulian Elischer &hci_write_stored_link_key
1419878ed226SJulian Elischer },
1420878ed226SJulian Elischer {
1421878ed226SJulian Elischer "delete_stored_link_key [<bdaddr>]",
1422878ed226SJulian Elischer "\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1423878ed226SJulian Elischer "or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1424878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1425878ed226SJulian Elischer "Bluetooth devices.\n\n" \
1426878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR",
1427878ed226SJulian Elischer &hci_delete_stored_link_key
1428878ed226SJulian Elischer },
1429878ed226SJulian Elischer {
1430878ed226SJulian Elischer "change_local_name <name>",
1431878ed226SJulian Elischer "\nThe Change_Local_Name command provides the ability to modify the user\n" \
1432878ed226SJulian Elischer "friendly name for the Bluetooth unit.\n\n" \
1433878ed226SJulian Elischer "\t<name> - string",
1434878ed226SJulian Elischer &hci_change_local_name
1435878ed226SJulian Elischer },
1436878ed226SJulian Elischer {
1437878ed226SJulian Elischer "read_local_name",
1438878ed226SJulian Elischer "\nThe Read_Local_Name command provides the ability to read the\n" \
1439878ed226SJulian Elischer "stored user-friendly name for the Bluetooth unit.",
1440878ed226SJulian Elischer &hci_read_local_name
1441878ed226SJulian Elischer },
1442878ed226SJulian Elischer {
1443878ed226SJulian Elischer "read_connection_accept_timeout",
1444878ed226SJulian Elischer "\nThis command will read the value for the Connection_Accept_Timeout\n" \
1445878ed226SJulian Elischer "configuration parameter. The Connection_Accept_Timeout configuration\n" \
1446878ed226SJulian Elischer "parameter allows the Bluetooth hardware to automatically deny a\n" \
1447878ed226SJulian Elischer "connection request after a specified time period has occurred and\n" \
1448878ed226SJulian Elischer "the new connection is not accepted. Connection Accept Timeout\n" \
1449878ed226SJulian Elischer "measured in Number of Baseband slots.",
1450878ed226SJulian Elischer &hci_read_connection_accept_timeout
1451878ed226SJulian Elischer },
1452878ed226SJulian Elischer {
1453878ed226SJulian Elischer "write_connection_accept_timeout <timeout>",
1454878ed226SJulian Elischer "\nThis command will write the value for the Connection_Accept_Timeout\n" \
1455878ed226SJulian Elischer "configuration parameter.\n\n" \
1456878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1457878ed226SJulian Elischer &hci_write_connection_accept_timeout
1458878ed226SJulian Elischer },
1459878ed226SJulian Elischer {
1460878ed226SJulian Elischer "read_page_timeout",
1461878ed226SJulian Elischer "\nThis command will read the value for the Page_Timeout configuration\n" \
1462878ed226SJulian Elischer "parameter. The Page_Timeout configuration parameter defines the\n" \
1463878ed226SJulian Elischer "maximum time the local Link Manager will wait for a baseband page\n" \
1464878ed226SJulian Elischer "response from the remote unit at a locally initiated connection\n" \
1465878ed226SJulian Elischer "attempt. Page Timeout measured in Number of Baseband slots.",
1466878ed226SJulian Elischer &hci_read_page_timeout
1467878ed226SJulian Elischer },
1468878ed226SJulian Elischer {
1469878ed226SJulian Elischer "write_page_timeout <timeout>",
1470878ed226SJulian Elischer "\nThis command will write the value for the Page_Timeout configuration\n" \
1471878ed226SJulian Elischer "parameter.\n\n" \
1472878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1473878ed226SJulian Elischer &hci_write_page_timeout
1474878ed226SJulian Elischer },
1475878ed226SJulian Elischer {
1476878ed226SJulian Elischer "read_scan_enable",
1477878ed226SJulian Elischer "\nThis command will read the value for the Scan_Enable parameter. The\n" \
1478878ed226SJulian Elischer "Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1479878ed226SJulian Elischer "will periodically scan for page attempts and/or inquiry requests\n" \
1480878ed226SJulian Elischer "from other Bluetooth unit.\n\n" \
1481878ed226SJulian Elischer "\t0x00 - No Scans enabled.\n" \
1482878ed226SJulian Elischer "\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1483878ed226SJulian Elischer "\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1484878ed226SJulian Elischer "\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1485878ed226SJulian Elischer &hci_read_scan_enable
1486878ed226SJulian Elischer },
1487878ed226SJulian Elischer {
1488878ed226SJulian Elischer "write_scan_enable <scan_enable>",
1489878ed226SJulian Elischer "\nThis command will write the value for the Scan_Enable parameter.\n" \
1490878ed226SJulian Elischer "The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1491878ed226SJulian Elischer "unit will periodically scan for page attempts and/or inquiry\n" \
1492878ed226SJulian Elischer "requests from other Bluetooth unit.\n\n" \
1493878ed226SJulian Elischer "\t<scan_enable> - dd;\n" \
1494878ed226SJulian Elischer "\t0 - No Scans enabled.\n" \
1495878ed226SJulian Elischer "\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1496878ed226SJulian Elischer "\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1497878ed226SJulian Elischer "\t3 - Inquiry Scan enabled. Page Scan enabled.",
1498878ed226SJulian Elischer &hci_write_scan_enable
1499878ed226SJulian Elischer },
1500878ed226SJulian Elischer {
1501878ed226SJulian Elischer "read_page_scan_activity",
1502878ed226SJulian Elischer "\nThis command will read the value for Page_Scan_Activity configuration\n" \
1503878ed226SJulian Elischer "parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1504878ed226SJulian Elischer "amount of time between consecutive page scans. This time interval is \n" \
1505878ed226SJulian Elischer "defined from when the Host Controller started its last page scan until\n" \
1506878ed226SJulian Elischer "it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1507878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. The\n" \
1508878ed226SJulian Elischer "Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1509878ed226SJulian Elischer &hci_read_page_scan_activity
1510878ed226SJulian Elischer },
1511878ed226SJulian Elischer {
1512878ed226SJulian Elischer "write_page_scan_activity interval(dddd) window(dddd)",
1513878ed226SJulian Elischer "\nThis command will write the value for Page_Scan_Activity configuration\n" \
1514878ed226SJulian Elischer "parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1515878ed226SJulian Elischer "amount of time between consecutive page scans. This is defined as the time\n" \
1516878ed226SJulian Elischer "interval from when the Host Controller started its last page scan until it\n" \
1517878ed226SJulian Elischer "begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1518878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. \n" \
1519878ed226SJulian Elischer "The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1520878ed226SJulian Elischer "\t<interval> - Range: 0x0012 -� 0x100, Time = N * 0.625 msec\n" \
1521878ed226SJulian Elischer "\t<window>   - Range: 0x0012 -� 0x100, Time = N * 0.625 msen",
1522878ed226SJulian Elischer &hci_write_page_scan_activity
1523878ed226SJulian Elischer },
1524878ed226SJulian Elischer {
1525878ed226SJulian Elischer "read_inquiry_scan_activity",
1526878ed226SJulian Elischer "\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1527878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1528878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1529878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1530878ed226SJulian Elischer "until it begins the next inquiry scan.",
1531878ed226SJulian Elischer &hci_read_inquiry_scan_activity
1532878ed226SJulian Elischer },
1533878ed226SJulian Elischer {
1534878ed226SJulian Elischer "write_inquiry_scan_activity interval(dddd) window(dddd)",
1535878ed226SJulian Elischer "\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1536878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1537878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1538878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1539878ed226SJulian Elischer "until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1540878ed226SJulian Elischer "parameter defines the amount of time for the duration of the inquiry scan.\n" \
1541878ed226SJulian Elischer "The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1542878ed226SJulian Elischer "\t<interval> - Range: 0x0012 -� 0x100, Time = N * 0.625 msec\n" \
1543878ed226SJulian Elischer "\t<window>   - Range: 0x0012 -� 0x100, Time = N * 0.625 msen",
1544878ed226SJulian Elischer &hci_write_inquiry_scan_activity
1545878ed226SJulian Elischer },
1546878ed226SJulian Elischer {
1547878ed226SJulian Elischer "read_authentication_enable",
1548878ed226SJulian Elischer "\nThis command will read the value for the Authentication_Enable parameter.\n"\
1549878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires\n"\
1550878ed226SJulian Elischer "to authenticate the remote unit at connection setup (between the\n" \
1551878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n"\
1552878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1553878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1554878ed226SJulian Elischer "authenticate the other unit.",
1555878ed226SJulian Elischer &hci_read_authentication_enable
1556878ed226SJulian Elischer },
1557878ed226SJulian Elischer {
1558878ed226SJulian Elischer "write_authentication_enable enable(0|1)",
1559878ed226SJulian Elischer "\nThis command will write the value for the Authentication_Enable parameter.\n"\
1560878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires to\n"\
1561878ed226SJulian Elischer "authenticate the remote unit at connection setup (between the\n" \
1562878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1563878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1564878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1565878ed226SJulian Elischer "authenticate the other unit.",
1566878ed226SJulian Elischer &hci_write_authentication_enable
1567878ed226SJulian Elischer },
1568878ed226SJulian Elischer {
1569878ed226SJulian Elischer "read_encryption_mode",
1570878ed226SJulian Elischer "\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1571878ed226SJulian Elischer "Encryption_Mode parameter controls if the local unit requires encryption\n" \
1572878ed226SJulian Elischer "to the remote unit at connection setup (between the Create_Connection\n" \
1573878ed226SJulian Elischer "command or acceptance of an incoming ACL connection and the corresponding\n" \
1574878ed226SJulian Elischer "Connection Complete event). At connection setup, only the unit(s) with\n" \
1575878ed226SJulian Elischer "the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1576878ed226SJulian Elischer "enabled will try to encrypt the connection to the other unit.\n\n" \
1577878ed226SJulian Elischer "\t<encryption_mode>:\n" \
1578878ed226SJulian Elischer "\t0x00 - Encryption disabled.\n" \
1579878ed226SJulian Elischer "\t0x01 - Encryption only for point-to-point packets.\n" \
1580878ed226SJulian Elischer "\t0x02 - Encryption for both point-to-point and broadcast packets.",
1581878ed226SJulian Elischer &hci_read_encryption_mode
1582878ed226SJulian Elischer },
1583878ed226SJulian Elischer {
1584878ed226SJulian Elischer "write_encryption_mode mode(0|1|2)",
1585878ed226SJulian Elischer "\tThis command will write the value for the Encryption_Mode parameter.\n" \
1586878ed226SJulian Elischer "The Encryption_Mode parameter controls if the local unit requires\n" \
1587878ed226SJulian Elischer "encryption to the remote unit at connection setup (between the\n" \
1588878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1589878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup,\n" \
1590878ed226SJulian Elischer "only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1591878ed226SJulian Elischer "Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1592878ed226SJulian Elischer "the other unit.\n\n" \
1593878ed226SJulian Elischer "\t<encryption_mode> (dd)\n" \
1594878ed226SJulian Elischer "\t0 - Encryption disabled.\n" \
1595878ed226SJulian Elischer "\t1 - Encryption only for point-to-point packets.\n" \
1596878ed226SJulian Elischer "\t2 - Encryption for both point-to-point and broadcast packets.",
1597878ed226SJulian Elischer &hci_write_encryption_mode
1598878ed226SJulian Elischer },
1599878ed226SJulian Elischer {
1600878ed226SJulian Elischer "read_class_of_device",
1601878ed226SJulian Elischer "\nThis command will read the value for the Class_of_Device parameter.\n" \
1602878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of\n" \
1603878ed226SJulian Elischer "the local unit to other units.",
1604878ed226SJulian Elischer &hci_read_class_of_device
1605878ed226SJulian Elischer },
1606878ed226SJulian Elischer {
1607878ed226SJulian Elischer "write_class_of_device class(xx:xx:xx)",
1608878ed226SJulian Elischer "\nThis command will write the value for the Class_of_Device parameter.\n" \
1609878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of \n" \
1610878ed226SJulian Elischer "the local unit to other units.\n\n" \
1611878ed226SJulian Elischer "\t<class> (xx:xx:xx) - class of device",
1612878ed226SJulian Elischer &hci_write_class_of_device
1613878ed226SJulian Elischer },
1614878ed226SJulian Elischer {
1615878ed226SJulian Elischer "read_voice_settings",
1616878ed226SJulian Elischer "\nThis command will read the values for the Voice_Setting parameter.\n" \
1617878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1618878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1619878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1620878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1621878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.",
1622878ed226SJulian Elischer &hci_read_voice_settings
1623878ed226SJulian Elischer },
1624878ed226SJulian Elischer {
1625878ed226SJulian Elischer "write_voice_settings settings(xxxx)",
1626878ed226SJulian Elischer "\nThis command will write the values for the Voice_Setting parameter.\n" \
1627878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1628878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1629878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1630878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1631878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.\n\n" \
1632878ed226SJulian Elischer "\t<voice_settings> (xxxx) - voice settings",
1633878ed226SJulian Elischer &hci_write_voice_settings
1634878ed226SJulian Elischer },
1635878ed226SJulian Elischer {
1636878ed226SJulian Elischer "read_number_broadcast_retransmissions",
1637878ed226SJulian Elischer "\nThis command will read the unit's parameter value for the Number of\n" \
1638878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1639878ed226SJulian Elischer "unreliable.",
1640878ed226SJulian Elischer &hci_read_number_broadcast_retransmissions
1641878ed226SJulian Elischer },
1642878ed226SJulian Elischer {
1643878ed226SJulian Elischer "write_number_broadcast_retransmissions count(dd)",
1644878ed226SJulian Elischer "\nThis command will write the unit's parameter value for the Number of\n" \
1645878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1646878ed226SJulian Elischer "unreliable.\n\n" \
1647878ed226SJulian Elischer "\t<count> (dd) - number of broadcast retransimissions",
1648878ed226SJulian Elischer &hci_write_number_broadcast_retransmissions
1649878ed226SJulian Elischer },
1650878ed226SJulian Elischer {
1651878ed226SJulian Elischer "read_hold_mode_activity",
1652878ed226SJulian Elischer "\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1653878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1654878ed226SJulian Elischer "be suspended when the unit is in hold mode.",
1655878ed226SJulian Elischer &hci_read_hold_mode_activity
1656878ed226SJulian Elischer },
1657878ed226SJulian Elischer {
1658878ed226SJulian Elischer "write_hold_mode_activity settings(0|1|2|4)",
1659878ed226SJulian Elischer "\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1660878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1661878ed226SJulian Elischer "be suspended when the unit is in hold mode.\n\n" \
1662878ed226SJulian Elischer "\t<settings> (dd) - bit mask:\n" \
1663878ed226SJulian Elischer "\t0 - Maintain current Power State. Default\n" \
1664878ed226SJulian Elischer "\t1 - Suspend Page Scan.\n" \
1665878ed226SJulian Elischer "\t2 - Suspend Inquiry Scan.\n" \
1666878ed226SJulian Elischer "\t4 - Suspend Periodic Inquiries.",
1667878ed226SJulian Elischer &hci_write_hold_mode_activity
1668878ed226SJulian Elischer },
1669878ed226SJulian Elischer {
1670878ed226SJulian Elischer "read_sco_flow_control_enable",
1671878ed226SJulian Elischer "\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1672878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1673878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1674878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1675878ed226SJulian Elischer "disable SCO flow control.",
1676878ed226SJulian Elischer &hci_read_sco_flow_control_enable
1677878ed226SJulian Elischer },
1678878ed226SJulian Elischer {
1679878ed226SJulian Elischer "write_sco_flow_control_enable enable(0|1)",
1680878ed226SJulian Elischer "\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1681878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1682878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1683878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1684878ed226SJulian Elischer "disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1685878ed226SJulian Elischer "changed if no connections exist.",
1686878ed226SJulian Elischer &hci_write_sco_flow_control_enable
1687878ed226SJulian Elischer },
1688878ed226SJulian Elischer {
1689878ed226SJulian Elischer "read_link_supervision_timeout <connection_handle>",
1690878ed226SJulian Elischer "\nThis command will read the value for the Link_Supervision_Timeout\n" \
1691878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1692878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1693878ed226SJulian Elischer "reason, no Baseband packets are received from that Connection Handle for a\n" \
1694878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n"
1695878ed226SJulian Elischer "disconnected.\n\n" \
1696878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n",
1697878ed226SJulian Elischer &hci_read_link_supervision_timeout
1698878ed226SJulian Elischer },
1699878ed226SJulian Elischer {
1700878ed226SJulian Elischer "write_link_supervision_timeout <connection_handle> <timeout>",
1701878ed226SJulian Elischer "\nThis command will write the value for the Link_Supervision_Timeout\n" \
1702878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1703878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1704878ed226SJulian Elischer "reason, no Baseband packets are received from that connection handle for a\n" \
1705878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n" \
1706878ed226SJulian Elischer "disconnected.\n\n" \
1707878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n" \
1708878ed226SJulian Elischer "\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1709878ed226SJulian Elischer &hci_write_link_supervision_timeout
1710878ed226SJulian Elischer },
1711878ed226SJulian Elischer { NULL, }
1712878ed226SJulian Elischer };
1713878ed226SJulian Elischer 
1714