xref: /freebsd/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c (revision 8d6f425ddd8021ae2257ba9682f8844254ecdde1)
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  *
280986ab12SMaksim Yevmenkin  * $Id: host_controller_baseband.c,v 1.4 2003/08/18 19:19:53 max Exp $
29878ed226SJulian Elischer  * $FreeBSD$
30878ed226SJulian Elischer  */
31878ed226SJulian Elischer 
32*8d6f425dSTakanori Watanabe #define L2CAP_SOCKET_CHECKED
330986ab12SMaksim Yevmenkin #include <bluetooth.h>
34878ed226SJulian Elischer #include <errno.h>
35878ed226SJulian Elischer #include <stdio.h>
36878ed226SJulian Elischer #include <string.h>
37878ed226SJulian Elischer #include "hccontrol.h"
38878ed226SJulian Elischer 
39878ed226SJulian Elischer /* Convert hex ASCII to int4 */
40878ed226SJulian Elischer static int
41878ed226SJulian Elischer hci_hexa2int4(const char *a)
42878ed226SJulian Elischer {
43878ed226SJulian Elischer 	if ('0' <= *a && *a <= '9')
44878ed226SJulian Elischer 		return (*a - '0');
45878ed226SJulian Elischer 
46878ed226SJulian Elischer 	if ('A' <= *a && *a <= 'F')
47878ed226SJulian Elischer 		return (*a - 'A' + 0xa);
48878ed226SJulian Elischer 
49878ed226SJulian Elischer 	if ('a' <= *a && *a <= 'f')
50878ed226SJulian Elischer 		return (*a - 'a' + 0xa);
51878ed226SJulian Elischer 
52878ed226SJulian Elischer 	return (-1);
53878ed226SJulian Elischer }
54878ed226SJulian Elischer 
55878ed226SJulian Elischer /* Convert hex ASCII to int8 */
56878ed226SJulian Elischer static int
57878ed226SJulian Elischer hci_hexa2int8(const char *a)
58878ed226SJulian Elischer {
59878ed226SJulian Elischer 	int	hi = hci_hexa2int4(a);
60878ed226SJulian Elischer 	int	lo = hci_hexa2int4(a + 1);
61878ed226SJulian Elischer 
62878ed226SJulian Elischer 	if (hi < 0 || lo < 0)
63878ed226SJulian Elischer 		return (-1);
64878ed226SJulian Elischer 
65878ed226SJulian Elischer 	return ((hi << 4) | lo);
66878ed226SJulian Elischer }
67878ed226SJulian Elischer 
68079a8a3eSMaksim Yevmenkin /* Convert ascii hex string to the uint8_t[] */
69878ed226SJulian Elischer static int
70079a8a3eSMaksim Yevmenkin hci_hexstring2array(char const *s, uint8_t *a, int asize)
71878ed226SJulian Elischer {
72878ed226SJulian Elischer 	int	i, l, b;
73878ed226SJulian Elischer 
74878ed226SJulian Elischer 	l = strlen(s) / 2;
75878ed226SJulian Elischer 	if (l > asize)
76878ed226SJulian Elischer 		l = asize;
77878ed226SJulian Elischer 
78878ed226SJulian Elischer 	for (i = 0; i < l; i++) {
79878ed226SJulian Elischer 		b = hci_hexa2int8(s + i * 2);
80878ed226SJulian Elischer 		if (b < 0)
81878ed226SJulian Elischer 			return (-1);
82878ed226SJulian Elischer 
83878ed226SJulian Elischer 		a[i] = (b & 0xff);
84878ed226SJulian Elischer 	}
85878ed226SJulian Elischer 
86878ed226SJulian Elischer 	return (0);
87878ed226SJulian Elischer }
88878ed226SJulian Elischer 
89878ed226SJulian Elischer /* Send RESET to the unit */
90878ed226SJulian Elischer static int
91878ed226SJulian Elischer hci_reset(int s, int argc, char **argv)
92878ed226SJulian Elischer {
93878ed226SJulian Elischer 	ng_hci_status_rp	rp;
94878ed226SJulian Elischer 	int			n;
95878ed226SJulian Elischer 
96878ed226SJulian Elischer 	n = sizeof(rp);
97878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
98878ed226SJulian Elischer 			NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
99878ed226SJulian Elischer 		return (ERROR);
100878ed226SJulian Elischer 
101878ed226SJulian Elischer 	if (rp.status != 0x00) {
102878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
103878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
104878ed226SJulian Elischer 		return (FAILED);
105878ed226SJulian Elischer 	}
106878ed226SJulian Elischer 
107878ed226SJulian Elischer 	return (OK);
108878ed226SJulian Elischer } /* hci_reset */
109878ed226SJulian Elischer 
110878ed226SJulian Elischer /* Send Read_PIN_Type command to the unit */
111878ed226SJulian Elischer static int
112878ed226SJulian Elischer hci_read_pin_type(int s, int argc, char **argv)
113878ed226SJulian Elischer {
114878ed226SJulian Elischer 	ng_hci_read_pin_type_rp	rp;
115878ed226SJulian Elischer 	int			n;
116878ed226SJulian Elischer 
117878ed226SJulian Elischer 	n = sizeof(rp);
118878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
119878ed226SJulian Elischer 			NG_HCI_OCF_READ_PIN_TYPE),
120878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
121878ed226SJulian Elischer 		return (ERROR);
122878ed226SJulian Elischer 
123878ed226SJulian Elischer 	if (rp.status != 0x00) {
124878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
125878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
126878ed226SJulian Elischer 		return (FAILED);
127878ed226SJulian Elischer 	}
128878ed226SJulian Elischer 
129878ed226SJulian Elischer 	fprintf(stdout, "PIN type: %s [%#02x]\n",
130878ed226SJulian Elischer 			hci_pin2str(rp.pin_type), rp.pin_type);
131878ed226SJulian Elischer 
132878ed226SJulian Elischer 	return (OK);
133878ed226SJulian Elischer } /* hci_read_pin_type */
134878ed226SJulian Elischer 
135878ed226SJulian Elischer /* Send Write_PIN_Type command to the unit */
136878ed226SJulian Elischer static int
137878ed226SJulian Elischer hci_write_pin_type(int s, int argc, char **argv)
138878ed226SJulian Elischer {
139878ed226SJulian Elischer 	ng_hci_write_pin_type_cp	cp;
140878ed226SJulian Elischer 	ng_hci_write_pin_type_rp	rp;
141878ed226SJulian Elischer 	int				n;
142878ed226SJulian Elischer 
143878ed226SJulian Elischer 	/* parse command parameters */
144878ed226SJulian Elischer 	switch (argc) {
145878ed226SJulian Elischer 	case 1:
146878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
147878ed226SJulian Elischer 			return (USAGE);
148878ed226SJulian Elischer 
149079a8a3eSMaksim Yevmenkin 		cp.pin_type = (uint8_t) n;
150878ed226SJulian Elischer 		break;
151878ed226SJulian Elischer 
152878ed226SJulian Elischer 	default:
153878ed226SJulian Elischer 		return (USAGE);
154878ed226SJulian Elischer 	}
155878ed226SJulian Elischer 
156878ed226SJulian Elischer 	/* send command */
157878ed226SJulian Elischer 	n = sizeof(rp);
158878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
159878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PIN_TYPE),
160878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
161878ed226SJulian Elischer 			(char *) &rp , &n) ==  ERROR)
162878ed226SJulian Elischer 		return (ERROR);
163878ed226SJulian Elischer 
164878ed226SJulian Elischer 	if (rp.status != 0x00) {
165878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
166878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
167878ed226SJulian Elischer 		return (FAILED);
168878ed226SJulian Elischer 	}
169878ed226SJulian Elischer 
170878ed226SJulian Elischer 	return (OK);
171878ed226SJulian Elischer } /* hci_write_pin_type */
172878ed226SJulian Elischer 
173878ed226SJulian Elischer /* Send Read_Stored_Link_Key command to the unit */
174878ed226SJulian Elischer static int
175878ed226SJulian Elischer hci_read_stored_link_key(int s, int argc, char **argv)
176878ed226SJulian Elischer {
177878ed226SJulian Elischer 	struct {
178878ed226SJulian Elischer 		ng_hci_cmd_pkt_t			hdr;
179878ed226SJulian Elischer 		ng_hci_read_stored_link_key_cp		cp;
180878ed226SJulian Elischer 	} __attribute__ ((packed))			cmd;
181878ed226SJulian Elischer 
182878ed226SJulian Elischer 	struct {
183878ed226SJulian Elischer 		ng_hci_event_pkt_t			hdr;
184878ed226SJulian Elischer 		union {
185878ed226SJulian Elischer 			ng_hci_command_compl_ep		cc;
186878ed226SJulian Elischer 			ng_hci_return_link_keys_ep	key;
187079a8a3eSMaksim Yevmenkin 			uint8_t				b[NG_HCI_EVENT_PKT_SIZE];
188878ed226SJulian Elischer 		}					ep;
189878ed226SJulian Elischer 	} __attribute__ ((packed))			event;
190878ed226SJulian Elischer 
1910986ab12SMaksim Yevmenkin 	int						n, n1;
192878ed226SJulian Elischer 
193878ed226SJulian Elischer 	/* Send command */
194878ed226SJulian Elischer 	memset(&cmd, 0, sizeof(cmd));
195878ed226SJulian Elischer 	cmd.hdr.type = NG_HCI_CMD_PKT;
196878ed226SJulian Elischer 	cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
197878ed226SJulian Elischer 				NG_HCI_OCF_READ_STORED_LINK_KEY));
198878ed226SJulian Elischer 	cmd.hdr.length = sizeof(cmd.cp);
199878ed226SJulian Elischer 
200878ed226SJulian Elischer 	switch (argc) {
201878ed226SJulian Elischer 	case 1:
202878ed226SJulian Elischer 		/* parse BD_ADDR */
2030986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cmd.cp.bdaddr)) {
2040986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
2050986ab12SMaksim Yevmenkin 
2060986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
207878ed226SJulian Elischer 				return (USAGE);
208878ed226SJulian Elischer 
2090986ab12SMaksim Yevmenkin 			memcpy(&cmd.cp.bdaddr, he->h_addr, sizeof(cmd.cp.bdaddr));
2100986ab12SMaksim Yevmenkin 		}
211878ed226SJulian Elischer 		break;
212878ed226SJulian Elischer 
213878ed226SJulian Elischer 	default:
214878ed226SJulian Elischer 		cmd.cp.read_all = 1;
215878ed226SJulian Elischer 		break;
216878ed226SJulian Elischer 	}
217878ed226SJulian Elischer 
218878ed226SJulian Elischer 	if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
219878ed226SJulian Elischer 		return (ERROR);
220878ed226SJulian Elischer 
221878ed226SJulian Elischer 	/* Receive events */
222878ed226SJulian Elischer again:
223878ed226SJulian Elischer 	memset(&event, 0, sizeof(event));
224878ed226SJulian Elischer 	n = sizeof(event);
225878ed226SJulian Elischer 	if (hci_recv(s, (char *) &event, &n) != OK)
226878ed226SJulian Elischer 		return (ERROR);
227878ed226SJulian Elischer 
228878ed226SJulian Elischer 	if (n <= sizeof(event.hdr)) {
229878ed226SJulian Elischer 		errno = EMSGSIZE;
230878ed226SJulian Elischer 		return (ERROR);
231878ed226SJulian Elischer 	}
232878ed226SJulian Elischer 
233878ed226SJulian Elischer 	if (event.hdr.type != NG_HCI_EVENT_PKT) {
234878ed226SJulian Elischer 		errno = EIO;
235878ed226SJulian Elischer 		return (ERROR);
236878ed226SJulian Elischer 	}
237878ed226SJulian Elischer 
238878ed226SJulian Elischer 	/* Parse event */
239878ed226SJulian Elischer 	switch (event.hdr.event) {
240878ed226SJulian Elischer 	case NG_HCI_EVENT_COMMAND_COMPL: {
241878ed226SJulian Elischer 		ng_hci_read_stored_link_key_rp	*rp = NULL;
242878ed226SJulian Elischer 
243878ed226SJulian Elischer 		if (event.ep.cc.opcode == 0x0000 ||
244878ed226SJulian Elischer 		    event.ep.cc.opcode != cmd.hdr.opcode)
245878ed226SJulian Elischer 			goto again;
246878ed226SJulian Elischer 
247878ed226SJulian Elischer 		rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b +
248878ed226SJulian Elischer 				sizeof(event.ep.cc));
249878ed226SJulian Elischer 
250878ed226SJulian Elischer 		fprintf(stdout, "Complete: Status: %s [%#x]\n",
251878ed226SJulian Elischer 				hci_status2str(rp->status), rp->status);
252878ed226SJulian Elischer 		fprintf(stdout, "Maximum Number of keys: %d\n",
253878ed226SJulian Elischer 				le16toh(rp->max_num_keys));
254878ed226SJulian Elischer 		fprintf(stdout, "Number of keys read: %d\n",
255878ed226SJulian Elischer 				le16toh(rp->num_keys_read));
256878ed226SJulian Elischer 		} break;
257878ed226SJulian Elischer 
258878ed226SJulian Elischer 	case NG_HCI_EVENT_RETURN_LINK_KEYS: {
259878ed226SJulian Elischer 		struct _key {
260878ed226SJulian Elischer 			bdaddr_t	bdaddr;
261079a8a3eSMaksim Yevmenkin 			uint8_t		key[NG_HCI_KEY_SIZE];
262878ed226SJulian Elischer 		} __attribute__ ((packed))	*k = NULL;
263878ed226SJulian Elischer 
264878ed226SJulian Elischer 		fprintf(stdout, "Event: Number of keys: %d\n",
265878ed226SJulian Elischer 			event.ep.key.num_keys);
266878ed226SJulian Elischer 
267878ed226SJulian Elischer 		k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
268878ed226SJulian Elischer 		for (n = 0; n < event.ep.key.num_keys; n++) {
2690986ab12SMaksim Yevmenkin 			fprintf(stdout, "\t%d: %s ",
2700986ab12SMaksim Yevmenkin 				n + 1, hci_bdaddr2str(&k->bdaddr));
271878ed226SJulian Elischer 
2720986ab12SMaksim Yevmenkin 			for (n1 = 0; n1 < sizeof(k->key); n1++)
2730986ab12SMaksim Yevmenkin 				fprintf(stdout, "%02x", k->key[n1]);
274878ed226SJulian Elischer 			fprintf(stdout, "\n");
275878ed226SJulian Elischer 
276878ed226SJulian Elischer 			k ++;
277878ed226SJulian Elischer 		}
278878ed226SJulian Elischer 
279878ed226SJulian Elischer 		goto again;
280878ed226SJulian Elischer 
281878ed226SJulian Elischer 		} break;
282878ed226SJulian Elischer 
283878ed226SJulian Elischer 	default:
284878ed226SJulian Elischer 		goto again;
285878ed226SJulian Elischer 	}
286878ed226SJulian Elischer 
287878ed226SJulian Elischer 	return (OK);
288878ed226SJulian Elischer } /* hci_read_store_link_key */
289878ed226SJulian Elischer 
290878ed226SJulian Elischer /* Send Write_Stored_Link_Key command to the unit */
291878ed226SJulian Elischer static int
292878ed226SJulian Elischer hci_write_stored_link_key(int s, int argc, char **argv)
293878ed226SJulian Elischer {
294878ed226SJulian Elischer 	struct {
295878ed226SJulian Elischer 		ng_hci_write_stored_link_key_cp	p;
296878ed226SJulian Elischer 		bdaddr_t			bdaddr;
297079a8a3eSMaksim Yevmenkin 		uint8_t				key[NG_HCI_KEY_SIZE];
298878ed226SJulian Elischer 	}					cp;
299878ed226SJulian Elischer 	ng_hci_write_stored_link_key_rp		rp;
3000986ab12SMaksim Yevmenkin 	int32_t					n;
301878ed226SJulian Elischer 
302878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
303878ed226SJulian Elischer 
304878ed226SJulian Elischer 	switch (argc) {
305878ed226SJulian Elischer 	case 2:
306878ed226SJulian Elischer 		cp.p.num_keys_write = 1;
307878ed226SJulian Elischer 
308878ed226SJulian Elischer 		/* parse BD_ADDR */
3090986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3100986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3110986ab12SMaksim Yevmenkin 
3120986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
313878ed226SJulian Elischer 				return (USAGE);
314878ed226SJulian Elischer 
3150986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3160986ab12SMaksim Yevmenkin 		}
317878ed226SJulian Elischer 
318878ed226SJulian Elischer 		/* parse key */
319878ed226SJulian Elischer 		if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
320878ed226SJulian Elischer 			return (USAGE);
321878ed226SJulian Elischer 		break;
322878ed226SJulian Elischer 
323878ed226SJulian Elischer 	default:
324878ed226SJulian Elischer 		return (USAGE);
325878ed226SJulian Elischer 	}
326878ed226SJulian Elischer 
327878ed226SJulian Elischer 	/* send command */
328878ed226SJulian Elischer 	n = sizeof(rp);
329878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
330878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_STORED_LINK_KEY),
331878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
332878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
333878ed226SJulian Elischer 		return (ERROR);
334878ed226SJulian Elischer 
335878ed226SJulian Elischer 	if (rp.status != 0x00) {
336878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
337878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
338878ed226SJulian Elischer 		return (FAILED);
339878ed226SJulian Elischer 	}
340878ed226SJulian Elischer 
341878ed226SJulian Elischer 	fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
342878ed226SJulian Elischer 
343878ed226SJulian Elischer 	return (OK);
344878ed226SJulian Elischer } /* hci_write_stored_link_key */
345878ed226SJulian Elischer 
346878ed226SJulian Elischer 
347878ed226SJulian Elischer /* Send Delete_Stored_Link_Key command to the unit */
348878ed226SJulian Elischer static int
349878ed226SJulian Elischer hci_delete_stored_link_key(int s, int argc, char **argv)
350878ed226SJulian Elischer {
351878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_cp	cp;
352878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_rp	rp;
3530986ab12SMaksim Yevmenkin 	int32_t					n;
354878ed226SJulian Elischer 
355878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
356878ed226SJulian Elischer 
357878ed226SJulian Elischer 	switch (argc) {
358878ed226SJulian Elischer 	case 1:
359878ed226SJulian Elischer 		/* parse BD_ADDR */
3600986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3610986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3620986ab12SMaksim Yevmenkin 
3630986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
364878ed226SJulian Elischer 				return (USAGE);
365878ed226SJulian Elischer 
3660986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3670986ab12SMaksim Yevmenkin 		}
368878ed226SJulian Elischer 		break;
369878ed226SJulian Elischer 
370878ed226SJulian Elischer 	default:
371878ed226SJulian Elischer 		cp.delete_all = 1;
372878ed226SJulian Elischer 		break;
373878ed226SJulian Elischer 	}
374878ed226SJulian Elischer 
375878ed226SJulian Elischer 	/* send command */
376878ed226SJulian Elischer 	n = sizeof(cp);
377878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
378878ed226SJulian Elischer 			NG_HCI_OCF_DELETE_STORED_LINK_KEY),
379878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
380878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
381878ed226SJulian Elischer 		return (ERROR);
382878ed226SJulian Elischer 
383878ed226SJulian Elischer 	if (rp.status != 0x00) {
384878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
385878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
386878ed226SJulian Elischer 		return (FAILED);
387878ed226SJulian Elischer 	}
388878ed226SJulian Elischer 
389878ed226SJulian Elischer 	fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
390878ed226SJulian Elischer 
391878ed226SJulian Elischer 	return (OK);
392878ed226SJulian Elischer } /* hci_delete_stored_link_key */
393878ed226SJulian Elischer 
394878ed226SJulian Elischer /* Send Change_Local_Name command to the unit */
395878ed226SJulian Elischer static int
396878ed226SJulian Elischer hci_change_local_name(int s, int argc, char **argv)
397878ed226SJulian Elischer {
398878ed226SJulian Elischer 	ng_hci_change_local_name_cp	cp;
399878ed226SJulian Elischer 	ng_hci_change_local_name_rp	rp;
400878ed226SJulian Elischer 	int				n;
401878ed226SJulian Elischer 
402878ed226SJulian Elischer 	/* parse command parameters */
403878ed226SJulian Elischer 	switch (argc) {
404878ed226SJulian Elischer 	case 1:
405878ed226SJulian Elischer 		snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
406878ed226SJulian Elischer 		break;
407878ed226SJulian Elischer 
408878ed226SJulian Elischer 	default:
409878ed226SJulian Elischer 		return (USAGE);
410878ed226SJulian Elischer 	}
411878ed226SJulian Elischer 
412878ed226SJulian Elischer 	/* send command */
413878ed226SJulian Elischer 	n = sizeof(rp);
414878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
415878ed226SJulian Elischer 			NG_HCI_OCF_CHANGE_LOCAL_NAME),
416878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
417878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
418878ed226SJulian Elischer 		return (ERROR);
419878ed226SJulian Elischer 
420878ed226SJulian Elischer 	if (rp.status != 0x00) {
421878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
422878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
423878ed226SJulian Elischer 		return (FAILED);
424878ed226SJulian Elischer 	}
425878ed226SJulian Elischer 
426878ed226SJulian Elischer 	return (OK);
427878ed226SJulian Elischer } /* hci_change_local_name */
428878ed226SJulian Elischer 
429878ed226SJulian Elischer /* Send Read_Local_Name command to the unit */
430878ed226SJulian Elischer static int
431878ed226SJulian Elischer hci_read_local_name(int s, int argc, char **argv)
432878ed226SJulian Elischer {
433878ed226SJulian Elischer 	ng_hci_read_local_name_rp	rp;
434878ed226SJulian Elischer 	int				n;
435878ed226SJulian Elischer 
436878ed226SJulian Elischer 	n = sizeof(rp);
437878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
438878ed226SJulian Elischer 			NG_HCI_OCF_READ_LOCAL_NAME),
439878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
440878ed226SJulian Elischer 		return (ERROR);
441878ed226SJulian Elischer 
442878ed226SJulian Elischer 	if (rp.status != 0x00) {
443878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
444878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
445878ed226SJulian Elischer 		return (FAILED);
446878ed226SJulian Elischer 	}
447878ed226SJulian Elischer 
448878ed226SJulian Elischer 	fprintf(stdout, "Local name: %s\n", rp.name);
449878ed226SJulian Elischer 
450878ed226SJulian Elischer 	return (OK);
451878ed226SJulian Elischer } /* hci_read_local_name */
452878ed226SJulian Elischer 
453878ed226SJulian Elischer /* Send Read_Connection_Accept_Timeout to the unit */
454878ed226SJulian Elischer static int
455878ed226SJulian Elischer hci_read_connection_accept_timeout(int s, int argc, char **argv)
456878ed226SJulian Elischer {
457878ed226SJulian Elischer 	ng_hci_read_con_accept_timo_rp	rp;
458878ed226SJulian Elischer 	int				n;
459878ed226SJulian Elischer 
460878ed226SJulian Elischer 	n = sizeof(rp);
461878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
462878ed226SJulian Elischer 			NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
463878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
464878ed226SJulian Elischer 		return (ERROR);
465878ed226SJulian Elischer 
466878ed226SJulian Elischer 	if (rp.status != 0x00) {
467878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
468878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
469878ed226SJulian Elischer 		return (FAILED);
470878ed226SJulian Elischer 	}
471878ed226SJulian Elischer 
472878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
473878ed226SJulian Elischer 	fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
474878ed226SJulian Elischer 			rp.timeout * 0.625, rp.timeout);
475878ed226SJulian Elischer 
476878ed226SJulian Elischer 	return (OK);
477878ed226SJulian Elischer } /* hci_read_connection_accept_timeout */
478878ed226SJulian Elischer 
479878ed226SJulian Elischer /* Send Write_Connection_Accept_Timeout to the unit */
480878ed226SJulian Elischer static int
481878ed226SJulian Elischer hci_write_connection_accept_timeout(int s, int argc, char **argv)
482878ed226SJulian Elischer {
483878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_cp	cp;
484878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_rp	rp;
485878ed226SJulian Elischer 	int				n;
486878ed226SJulian Elischer 
487878ed226SJulian Elischer 	/* parse command parameters */
488878ed226SJulian Elischer 	switch (argc) {
489878ed226SJulian Elischer 	case 1:
490878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
491878ed226SJulian Elischer 			return (USAGE);
492878ed226SJulian Elischer 
493079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) n;
494878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
495878ed226SJulian Elischer 		break;
496878ed226SJulian Elischer 
497878ed226SJulian Elischer 	default:
498878ed226SJulian Elischer 		return (USAGE);
499878ed226SJulian Elischer 	}
500878ed226SJulian Elischer 
501878ed226SJulian Elischer 	/* send command */
502878ed226SJulian Elischer 	n = sizeof(rp);
503878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
504878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
505878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
506878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
507878ed226SJulian Elischer 		return (ERROR);
508878ed226SJulian Elischer 
509878ed226SJulian Elischer 	if (rp.status != 0x00) {
510878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
511878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
512878ed226SJulian Elischer 		return (FAILED);
513878ed226SJulian Elischer 	}
514878ed226SJulian Elischer 
515878ed226SJulian Elischer 	return (OK);
516878ed226SJulian Elischer } /* hci_write_connection_accept_timeout */
517878ed226SJulian Elischer 
518878ed226SJulian Elischer /* Send Read_Page_Timeout command to the unit */
519878ed226SJulian Elischer static int
520878ed226SJulian Elischer hci_read_page_timeout(int s, int argc, char **argv)
521878ed226SJulian Elischer {
522878ed226SJulian Elischer 	ng_hci_read_page_timo_rp	rp;
523878ed226SJulian Elischer 	int				n;
524878ed226SJulian Elischer 
525878ed226SJulian Elischer 	n = sizeof(rp);
526878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
527878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_TIMO),
528878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
529878ed226SJulian Elischer 		return (ERROR);
530878ed226SJulian Elischer 
531878ed226SJulian Elischer 	if (rp.status != 0x00) {
532878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
533878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
534878ed226SJulian Elischer 		return (FAILED);
535878ed226SJulian Elischer 	}
536878ed226SJulian Elischer 
537878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
538878ed226SJulian Elischer 	fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
539878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
540878ed226SJulian Elischer 
541878ed226SJulian Elischer 	return (OK);
542878ed226SJulian Elischer } /* hci_read_page_timeoout */
543878ed226SJulian Elischer 
544878ed226SJulian Elischer /* Send Write_Page_Timeout command to the unit */
545878ed226SJulian Elischer static int
546878ed226SJulian Elischer hci_write_page_timeout(int s, int argc, char **argv)
547878ed226SJulian Elischer {
548878ed226SJulian Elischer 	ng_hci_write_page_timo_cp	cp;
549878ed226SJulian Elischer 	ng_hci_write_page_timo_rp	rp;
550878ed226SJulian Elischer 	int				n;
551878ed226SJulian Elischer 
552878ed226SJulian Elischer 	/* parse command parameters */
553878ed226SJulian Elischer 	switch (argc) {
554878ed226SJulian Elischer 	case 1:
555878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
556878ed226SJulian Elischer 			return (USAGE);
557878ed226SJulian Elischer 
558079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) n;
559878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
560878ed226SJulian Elischer 		break;
561878ed226SJulian Elischer 
562878ed226SJulian Elischer 	default:
563878ed226SJulian Elischer 		return (USAGE);
564878ed226SJulian Elischer 	}
565878ed226SJulian Elischer 
566878ed226SJulian Elischer 	/* send command */
567878ed226SJulian Elischer 	n = sizeof(rp);
568878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
569878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_TIMO),
570878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
571878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
572878ed226SJulian Elischer 		return (ERROR);
573878ed226SJulian Elischer 
574878ed226SJulian Elischer 	if (rp.status != 0x00) {
575878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
576878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
577878ed226SJulian Elischer 		return (FAILED);
578878ed226SJulian Elischer 	}
579878ed226SJulian Elischer 
580878ed226SJulian Elischer 	return (OK);
581878ed226SJulian Elischer } /* hci_write_page_timeout */
582878ed226SJulian Elischer 
583878ed226SJulian Elischer /* Send Read_Scan_Enable command to the unit */
584878ed226SJulian Elischer static int
585878ed226SJulian Elischer hci_read_scan_enable(int s, int argc, char **argv)
586878ed226SJulian Elischer {
587878ed226SJulian Elischer 	ng_hci_read_scan_enable_rp	rp;
588878ed226SJulian Elischer 	int				n;
589878ed226SJulian Elischer 
590878ed226SJulian Elischer 	n = sizeof(rp);
591878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
592878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCAN_ENABLE),
593878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
594878ed226SJulian Elischer 		return (ERROR);
595878ed226SJulian Elischer 
596878ed226SJulian Elischer 	if (rp.status != 0x00) {
597878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
598878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
599878ed226SJulian Elischer 		return (FAILED);
600878ed226SJulian Elischer 	}
601878ed226SJulian Elischer 
602878ed226SJulian Elischer 	fprintf(stdout, "Scan enable: %s [%#02x]\n",
603878ed226SJulian Elischer 		hci_scan2str(rp.scan_enable), rp.scan_enable);
604878ed226SJulian Elischer 
605878ed226SJulian Elischer 	return (OK);
606878ed226SJulian Elischer } /* hci_read_scan_enable */
607878ed226SJulian Elischer 
608878ed226SJulian Elischer /* Send Write_Scan_Enable command to the unit */
609878ed226SJulian Elischer static int
610878ed226SJulian Elischer hci_write_scan_enable(int s, int argc, char **argv)
611878ed226SJulian Elischer {
612878ed226SJulian Elischer 	ng_hci_write_scan_enable_cp	cp;
613878ed226SJulian Elischer 	ng_hci_write_scan_enable_rp	rp;
614878ed226SJulian Elischer 	int				n;
615878ed226SJulian Elischer 
616878ed226SJulian Elischer 	/* parse command parameters */
617878ed226SJulian Elischer 	switch (argc) {
618878ed226SJulian Elischer 	case 1:
619878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
620878ed226SJulian Elischer 			return (USAGE);
621878ed226SJulian Elischer 
622079a8a3eSMaksim Yevmenkin 		cp.scan_enable = (uint8_t) n;
623878ed226SJulian Elischer 		break;
624878ed226SJulian Elischer 
625878ed226SJulian Elischer 	default:
626878ed226SJulian Elischer 		return (USAGE);
627878ed226SJulian Elischer 	}
628878ed226SJulian Elischer 
629878ed226SJulian Elischer 	n = sizeof(rp);
630878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
631878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCAN_ENABLE),
632878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
633878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
634878ed226SJulian Elischer 		return (ERROR);
635878ed226SJulian Elischer 
636878ed226SJulian Elischer 	if (rp.status != 0x00) {
637878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
638878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
639878ed226SJulian Elischer 		return (FAILED);
640878ed226SJulian Elischer 	}
641878ed226SJulian Elischer 
642878ed226SJulian Elischer 	return (OK);
643878ed226SJulian Elischer } /* hci_write_scan_enable */
644878ed226SJulian Elischer 
645878ed226SJulian Elischer /* Send Read_Page_Scan_Activity command to the unit */
646878ed226SJulian Elischer static int
647878ed226SJulian Elischer hci_read_page_scan_activity(int s, int argc, char **argv)
648878ed226SJulian Elischer {
649878ed226SJulian Elischer 	ng_hci_read_page_scan_activity_rp	rp;
650878ed226SJulian Elischer 	int					n;
651878ed226SJulian Elischer 
652878ed226SJulian Elischer 	n = sizeof(rp);
653878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
654878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
655878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
656878ed226SJulian Elischer 		return (ERROR);
657878ed226SJulian Elischer 
658878ed226SJulian Elischer 	if (rp.status != 0x00) {
659878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
660878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
661878ed226SJulian Elischer 		return (FAILED);
662878ed226SJulian Elischer 	}
663878ed226SJulian Elischer 
664878ed226SJulian Elischer 	rp.page_scan_interval = le16toh(rp.page_scan_interval);
665878ed226SJulian Elischer 	rp.page_scan_window = le16toh(rp.page_scan_window);
666878ed226SJulian Elischer 
667878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
668878ed226SJulian Elischer 		rp.page_scan_interval * 0.625, rp.page_scan_interval);
669878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
670878ed226SJulian Elischer 		rp.page_scan_window * 0.625, rp.page_scan_window);
671878ed226SJulian Elischer 
672878ed226SJulian Elischer 	return (OK);
673878ed226SJulian Elischer } /* hci_read_page_scan_activity */
674878ed226SJulian Elischer 
675878ed226SJulian Elischer /* Send Write_Page_Scan_Activity command to the unit */
676878ed226SJulian Elischer static int
677878ed226SJulian Elischer hci_write_page_scan_activity(int s, int argc, char **argv)
678878ed226SJulian Elischer {
679878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_cp	cp;
680878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_rp	rp;
681878ed226SJulian Elischer 	int					n;
682878ed226SJulian Elischer 
683878ed226SJulian Elischer 	/* parse command parameters */
684878ed226SJulian Elischer 	switch (argc) {
685878ed226SJulian Elischer 	case 2:
686878ed226SJulian Elischer 		/* page scan interval */
687878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
688878ed226SJulian Elischer 			return (USAGE);
689878ed226SJulian Elischer 
690079a8a3eSMaksim Yevmenkin 		cp.page_scan_interval = (uint16_t) n;
691878ed226SJulian Elischer 
692878ed226SJulian Elischer 		/* page scan window */
6939e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
694878ed226SJulian Elischer 			return (USAGE);
695878ed226SJulian Elischer 
696079a8a3eSMaksim Yevmenkin 		cp.page_scan_window = (uint16_t) n;
697878ed226SJulian Elischer 
698878ed226SJulian Elischer 		if (cp.page_scan_window > cp.page_scan_interval)
699878ed226SJulian Elischer 			return (USAGE);
700878ed226SJulian Elischer 
701878ed226SJulian Elischer 		cp.page_scan_interval = htole16(cp.page_scan_interval);
702878ed226SJulian Elischer 		cp.page_scan_window = htole16(cp.page_scan_window);
703878ed226SJulian Elischer 		break;
704878ed226SJulian Elischer 
705878ed226SJulian Elischer 	default:
706878ed226SJulian Elischer 		return (USAGE);
707878ed226SJulian Elischer 	}
708878ed226SJulian Elischer 
709878ed226SJulian Elischer 	/* send command */
710878ed226SJulian Elischer 	n = sizeof(rp);
711878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
712878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
713878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
714878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
715878ed226SJulian Elischer 		return (ERROR);
716878ed226SJulian Elischer 
717878ed226SJulian Elischer 	if (rp.status != 0x00) {
718878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
719878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
720878ed226SJulian Elischer 		return (FAILED);
721878ed226SJulian Elischer 	}
722878ed226SJulian Elischer 
723878ed226SJulian Elischer 	return (OK);
724878ed226SJulian Elischer } /* hci_write_page_scan_activity */
725878ed226SJulian Elischer 
726878ed226SJulian Elischer /* Send Read_Inquiry_Scan_Activity command to the unit */
727878ed226SJulian Elischer static int
728878ed226SJulian Elischer hci_read_inquiry_scan_activity(int s, int argc, char **argv)
729878ed226SJulian Elischer {
730878ed226SJulian Elischer 	ng_hci_read_inquiry_scan_activity_rp	rp;
731878ed226SJulian Elischer 	int					n;
732878ed226SJulian Elischer 
733878ed226SJulian Elischer 	n = sizeof(rp);
734878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
735878ed226SJulian Elischer 			NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
736878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
737878ed226SJulian Elischer 		return (ERROR);
738878ed226SJulian Elischer 
739878ed226SJulian Elischer 	if (rp.status != 0x00) {
740878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
741878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
742878ed226SJulian Elischer 		return (FAILED);
743878ed226SJulian Elischer 	}
744878ed226SJulian Elischer 
745878ed226SJulian Elischer 	rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
746878ed226SJulian Elischer 	rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
747878ed226SJulian Elischer 
748878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
749878ed226SJulian Elischer 		rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
750878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
751878ed226SJulian Elischer 		rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
752878ed226SJulian Elischer 
753878ed226SJulian Elischer 	return (OK);
754878ed226SJulian Elischer } /* hci_read_inquiry_scan_activity */
755878ed226SJulian Elischer 
756878ed226SJulian Elischer /* Send Write_Inquiry_Scan_Activity command to the unit */
757878ed226SJulian Elischer static int
758878ed226SJulian Elischer hci_write_inquiry_scan_activity(int s, int argc, char **argv)
759878ed226SJulian Elischer {
760878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_cp	cp;
761878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_rp	rp;
762878ed226SJulian Elischer 	int					n;
763878ed226SJulian Elischer 
764878ed226SJulian Elischer 	/* parse command parameters */
765878ed226SJulian Elischer 	switch (argc) {
766878ed226SJulian Elischer 	case 2:
767878ed226SJulian Elischer 		/* inquiry scan interval */
768878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
769878ed226SJulian Elischer 			return (USAGE);
770878ed226SJulian Elischer 
771079a8a3eSMaksim Yevmenkin 		cp.inquiry_scan_interval = (uint16_t) n;
772878ed226SJulian Elischer 
773878ed226SJulian Elischer 		/* inquiry scan window */
7749e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
775878ed226SJulian Elischer 			return (USAGE);
776878ed226SJulian Elischer 
777079a8a3eSMaksim Yevmenkin 		cp.inquiry_scan_window = (uint16_t) n;
778878ed226SJulian Elischer 
779878ed226SJulian Elischer 		if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
780878ed226SJulian Elischer 			return (USAGE);
781878ed226SJulian Elischer 
782878ed226SJulian Elischer 		cp.inquiry_scan_interval =
783878ed226SJulian Elischer 			htole16(cp.inquiry_scan_interval);
784878ed226SJulian Elischer 		cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
785878ed226SJulian Elischer 		break;
786878ed226SJulian Elischer 
787878ed226SJulian Elischer 	default:
788878ed226SJulian Elischer 		return (USAGE);
789878ed226SJulian Elischer 	}
790878ed226SJulian Elischer 
791878ed226SJulian Elischer 	/* send command */
792878ed226SJulian Elischer 	n = sizeof(rp);
793878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
794878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
795878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
796878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
797878ed226SJulian Elischer 		return (ERROR);
798878ed226SJulian Elischer 
799878ed226SJulian Elischer 	if (rp.status != 0x00) {
800878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
801878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
802878ed226SJulian Elischer 		return (FAILED);
803878ed226SJulian Elischer 	}
804878ed226SJulian Elischer 
805878ed226SJulian Elischer 	return (OK);
806878ed226SJulian Elischer } /* hci_write_inquiry_scan_activity */
807878ed226SJulian Elischer 
808878ed226SJulian Elischer /* Send Read_Authentication_Enable command to the unit */
809878ed226SJulian Elischer static int
810878ed226SJulian Elischer hci_read_authentication_enable(int s, int argc, char **argv)
811878ed226SJulian Elischer {
812878ed226SJulian Elischer 	ng_hci_read_auth_enable_rp	rp;
813878ed226SJulian Elischer 	int				n;
814878ed226SJulian Elischer 
815878ed226SJulian Elischer 	n = sizeof(rp);
816878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
817878ed226SJulian Elischer 			NG_HCI_OCF_READ_AUTH_ENABLE),
818878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
819878ed226SJulian Elischer 		return (ERROR);
820878ed226SJulian Elischer 
821878ed226SJulian Elischer 	if (rp.status != 0x00) {
822878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
823878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
824878ed226SJulian Elischer 		return (FAILED);
825878ed226SJulian Elischer 	}
826878ed226SJulian Elischer 
827878ed226SJulian Elischer 	fprintf(stdout, "Authentication Enable: %s [%d]\n",
828878ed226SJulian Elischer 		rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
829878ed226SJulian Elischer 
830878ed226SJulian Elischer 	return (OK);
831878ed226SJulian Elischer } /* hci_read_authentication_enable */
832878ed226SJulian Elischer 
833878ed226SJulian Elischer /* Send Write_Authentication_Enable command to the unit */
834878ed226SJulian Elischer static int
835878ed226SJulian Elischer hci_write_authentication_enable(int s, int argc, char **argv)
836878ed226SJulian Elischer {
837878ed226SJulian Elischer 	ng_hci_write_auth_enable_cp	cp;
838878ed226SJulian Elischer 	ng_hci_write_auth_enable_rp	rp;
839878ed226SJulian Elischer 	int				n;
840878ed226SJulian Elischer 
841878ed226SJulian Elischer 	/* parse command parameters */
842878ed226SJulian Elischer 	switch (argc) {
843878ed226SJulian Elischer 	case 1:
844878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
845878ed226SJulian Elischer 			return (USAGE);
846878ed226SJulian Elischer 
847079a8a3eSMaksim Yevmenkin 		cp.auth_enable = (uint8_t) n;
848878ed226SJulian Elischer 		break;
849878ed226SJulian Elischer 
850878ed226SJulian Elischer 	default:
851878ed226SJulian Elischer 		return (USAGE);
852878ed226SJulian Elischer 	}
853878ed226SJulian Elischer 
854878ed226SJulian Elischer 	/* send command */
855878ed226SJulian Elischer 	n = sizeof(rp);
856878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
857878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_AUTH_ENABLE),
858878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
859878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
860878ed226SJulian Elischer 		return (ERROR);
861878ed226SJulian Elischer 
862878ed226SJulian Elischer 	if (rp.status != 0x00) {
863878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
864878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
865878ed226SJulian Elischer 		return (FAILED);
866878ed226SJulian Elischer 	}
867878ed226SJulian Elischer 
868878ed226SJulian Elischer 	return (OK);
869878ed226SJulian Elischer } /* hci_write_authentication_enable */
870878ed226SJulian Elischer 
871878ed226SJulian Elischer /* Send Read_Encryption_Mode command to the unit */
872878ed226SJulian Elischer static int
873878ed226SJulian Elischer hci_read_encryption_mode(int s, int argc, char **argv)
874878ed226SJulian Elischer {
875878ed226SJulian Elischer 	ng_hci_read_encryption_mode_rp	rp;
876878ed226SJulian Elischer 	int				n;
877878ed226SJulian Elischer 
878878ed226SJulian Elischer 	n = sizeof(rp);
879878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
880878ed226SJulian Elischer 			NG_HCI_OCF_READ_ENCRYPTION_MODE),
881878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
882878ed226SJulian Elischer 		return (ERROR);
883878ed226SJulian Elischer 
884878ed226SJulian Elischer 	if (rp.status != 0x00) {
885878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
886878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
887878ed226SJulian Elischer 		return (FAILED);
888878ed226SJulian Elischer 	}
889878ed226SJulian Elischer 
890878ed226SJulian Elischer 	fprintf(stdout, "Encryption mode: %s [%#02x]\n",
891878ed226SJulian Elischer 		hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
892878ed226SJulian Elischer 
893878ed226SJulian Elischer 	return (OK);
894878ed226SJulian Elischer } /* hci_read_encryption_mode */
895878ed226SJulian Elischer 
896878ed226SJulian Elischer /* Send Write_Encryption_Mode command to the unit */
897878ed226SJulian Elischer static int
898878ed226SJulian Elischer hci_write_encryption_mode(int s, int argc, char **argv)
899878ed226SJulian Elischer {
900878ed226SJulian Elischer 	ng_hci_write_encryption_mode_cp	cp;
901878ed226SJulian Elischer 	ng_hci_write_encryption_mode_rp	rp;
902878ed226SJulian Elischer 	int				n;
903878ed226SJulian Elischer 
904878ed226SJulian Elischer 	/* parse command parameters */
905878ed226SJulian Elischer 	switch (argc) {
906878ed226SJulian Elischer 	case 1:
907878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
908878ed226SJulian Elischer 			return (USAGE);
909878ed226SJulian Elischer 
910079a8a3eSMaksim Yevmenkin 		cp.encryption_mode = (uint8_t) n;
911878ed226SJulian Elischer 		break;
912878ed226SJulian Elischer 
913878ed226SJulian Elischer 	default:
914878ed226SJulian Elischer 		return (USAGE);
915878ed226SJulian Elischer 	}
916878ed226SJulian Elischer 
917878ed226SJulian Elischer 	/* send command */
918878ed226SJulian Elischer 	n = sizeof(rp);
919878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
920878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
921878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
922878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
923878ed226SJulian Elischer 		return (ERROR);
924878ed226SJulian Elischer 
925878ed226SJulian Elischer 	if (rp.status != 0x00) {
926878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
927878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
928878ed226SJulian Elischer 		return (FAILED);
929878ed226SJulian Elischer 	}
930878ed226SJulian Elischer 
931878ed226SJulian Elischer 	return (OK);
932878ed226SJulian Elischer } /* hci_write_encryption_mode */
933878ed226SJulian Elischer 
934878ed226SJulian Elischer /* Send Read_Class_Of_Device command to the unit */
935878ed226SJulian Elischer static int
936878ed226SJulian Elischer hci_read_class_of_device(int s, int argc, char **argv)
937878ed226SJulian Elischer {
938878ed226SJulian Elischer 	ng_hci_read_unit_class_rp	rp;
939878ed226SJulian Elischer 	int				n;
940878ed226SJulian Elischer 
941878ed226SJulian Elischer 	n = sizeof(rp);
942878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
943878ed226SJulian Elischer 			NG_HCI_OCF_READ_UNIT_CLASS),
944878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
945878ed226SJulian Elischer 		return (ERROR);
946878ed226SJulian Elischer 
947878ed226SJulian Elischer 	if (rp.status != 0x00) {
948878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
949878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
950878ed226SJulian Elischer 		return (FAILED);
951878ed226SJulian Elischer 	}
952878ed226SJulian Elischer 
953878ed226SJulian Elischer 	fprintf(stdout, "Class: %02x:%02x:%02x\n",
954878ed226SJulian Elischer 		rp.uclass[2], rp.uclass[1], rp.uclass[0]);
955878ed226SJulian Elischer 
956878ed226SJulian Elischer 	return (0);
957878ed226SJulian Elischer } /* hci_read_class_of_device */
958878ed226SJulian Elischer 
959878ed226SJulian Elischer /* Send Write_Class_Of_Device command to the unit */
960878ed226SJulian Elischer static int
961878ed226SJulian Elischer hci_write_class_of_device(int s, int argc, char **argv)
962878ed226SJulian Elischer {
963878ed226SJulian Elischer 	ng_hci_write_unit_class_cp	cp;
964878ed226SJulian Elischer 	ng_hci_write_unit_class_rp	rp;
965878ed226SJulian Elischer 	int				n0, n1, n2;
966878ed226SJulian Elischer 
967878ed226SJulian Elischer 	/* parse command parameters */
968878ed226SJulian Elischer 	switch (argc) {
969878ed226SJulian Elischer 	case 1:
970878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
971878ed226SJulian Elischer 			return (USAGE);
972878ed226SJulian Elischer 
973878ed226SJulian Elischer 		cp.uclass[0] = (n0 & 0xff);
974878ed226SJulian Elischer 		cp.uclass[1] = (n1 & 0xff);
975878ed226SJulian Elischer 		cp.uclass[2] = (n2 & 0xff);
976878ed226SJulian Elischer 		break;
977878ed226SJulian Elischer 
978878ed226SJulian Elischer 	default:
979878ed226SJulian Elischer 		return (USAGE);
980878ed226SJulian Elischer 	}
981878ed226SJulian Elischer 
982878ed226SJulian Elischer 	/* send command */
983878ed226SJulian Elischer 	n0 = sizeof(rp);
984878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
985878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_UNIT_CLASS),
986878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
987878ed226SJulian Elischer 			(char *) &rp, &n0) == ERROR)
988878ed226SJulian Elischer 		return (ERROR);
989878ed226SJulian Elischer 
990878ed226SJulian Elischer 	if (rp.status != 0x00) {
991878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
992878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
993878ed226SJulian Elischer 		return (FAILED);
994878ed226SJulian Elischer 	}
995878ed226SJulian Elischer 
996878ed226SJulian Elischer 	return (OK);
997878ed226SJulian Elischer } /* hci_write_class_of_device */
998878ed226SJulian Elischer 
999878ed226SJulian Elischer /* Send Read_Voice_Settings command to the unit */
1000878ed226SJulian Elischer static int
1001878ed226SJulian Elischer hci_read_voice_settings(int s, int argc, char **argv)
1002878ed226SJulian Elischer {
1003878ed226SJulian Elischer 	ng_hci_read_voice_settings_rp	rp;
1004878ed226SJulian Elischer 	int				n,
1005878ed226SJulian Elischer 					input_coding,
1006878ed226SJulian Elischer 					input_data_format,
1007878ed226SJulian Elischer 					input_sample_size;
1008878ed226SJulian Elischer 
1009878ed226SJulian Elischer 	n = sizeof(rp);
1010878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1011878ed226SJulian Elischer 			NG_HCI_OCF_READ_VOICE_SETTINGS),
1012878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1013878ed226SJulian Elischer 		return (ERROR);
1014878ed226SJulian Elischer 
1015878ed226SJulian Elischer 	if (rp.status != 0x00) {
1016878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1017878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1018878ed226SJulian Elischer 		return (FAILED);
1019878ed226SJulian Elischer 	}
1020878ed226SJulian Elischer 
1021878ed226SJulian Elischer 	rp.settings = le16toh(rp.settings);
1022878ed226SJulian Elischer 
1023878ed226SJulian Elischer 	input_coding      = (rp.settings & 0x0300) >> 8;
1024878ed226SJulian Elischer 	input_data_format = (rp.settings & 0x00c0) >> 6;
1025878ed226SJulian Elischer 	input_sample_size = (rp.settings & 0x0020) >> 5;
1026878ed226SJulian Elischer 
1027878ed226SJulian Elischer 	fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1028878ed226SJulian Elischer 	fprintf(stdout, "Input coding: %s [%d]\n",
1029878ed226SJulian Elischer 		hci_coding2str(input_coding), input_coding);
1030878ed226SJulian Elischer 	fprintf(stdout, "Input data format: %s [%d]\n",
1031878ed226SJulian Elischer 		hci_vdata2str(input_data_format), input_data_format);
1032878ed226SJulian Elischer 
1033878ed226SJulian Elischer 	if (input_coding == 0x00) /* Only for Linear PCM */
1034878ed226SJulian Elischer 		fprintf(stdout, "Input sample size: %d bit [%d]\n",
1035878ed226SJulian Elischer 			input_sample_size? 16 : 8, input_sample_size);
1036878ed226SJulian Elischer 
1037878ed226SJulian Elischer 	return (OK);
1038878ed226SJulian Elischer } /* hci_read_voice_settings */
1039878ed226SJulian Elischer 
1040878ed226SJulian Elischer /* Send Write_Voice_Settings command to the unit */
1041878ed226SJulian Elischer static int
1042878ed226SJulian Elischer hci_write_voice_settings(int s, int argc, char **argv)
1043878ed226SJulian Elischer {
1044878ed226SJulian Elischer 	ng_hci_write_voice_settings_cp	cp;
1045878ed226SJulian Elischer 	ng_hci_write_voice_settings_rp	rp;
1046878ed226SJulian Elischer 	int				n;
1047878ed226SJulian Elischer 
1048878ed226SJulian Elischer 	/* parse command parameters */
1049878ed226SJulian Elischer 	switch (argc) {
1050878ed226SJulian Elischer 	case 1:
1051878ed226SJulian Elischer 		if (sscanf(argv[0], "%x", &n) != 1)
1052878ed226SJulian Elischer 			return (USAGE);
1053878ed226SJulian Elischer 
1054079a8a3eSMaksim Yevmenkin 		cp.settings = (uint16_t) n;
1055878ed226SJulian Elischer 		cp.settings = htole16(cp.settings);
1056878ed226SJulian Elischer 		break;
1057878ed226SJulian Elischer 
1058878ed226SJulian Elischer 	default:
1059878ed226SJulian Elischer 		return (USAGE);
1060878ed226SJulian Elischer 	}
1061878ed226SJulian Elischer 
1062878ed226SJulian Elischer 	/* send command */
1063878ed226SJulian Elischer 	n = sizeof(rp);
1064878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1065878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1066878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1067878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1068878ed226SJulian Elischer 		return (ERROR);
1069878ed226SJulian Elischer 
1070878ed226SJulian Elischer 	if (rp.status != 0x00) {
1071878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1072878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1073878ed226SJulian Elischer 		return (FAILED);
1074878ed226SJulian Elischer 	}
1075878ed226SJulian Elischer 
1076878ed226SJulian Elischer 	return (OK);
1077878ed226SJulian Elischer } /* hci_write_voice_settings */
1078878ed226SJulian Elischer 
1079878ed226SJulian Elischer /* Send Read_Number_Broadcast_Restransmissions */
1080878ed226SJulian Elischer static int
1081878ed226SJulian Elischer hci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1082878ed226SJulian Elischer {
1083878ed226SJulian Elischer 	ng_hci_read_num_broadcast_retrans_rp	rp;
1084878ed226SJulian Elischer 	int					n;
1085878ed226SJulian Elischer 
1086878ed226SJulian Elischer 	n = sizeof(rp);
1087878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1088878ed226SJulian Elischer 			NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1089878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1090878ed226SJulian Elischer 		return (ERROR);
1091878ed226SJulian Elischer 
1092878ed226SJulian Elischer 	if (rp.status != 0x00) {
1093878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1094878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1095878ed226SJulian Elischer 		return (FAILED);
1096878ed226SJulian Elischer 	}
1097878ed226SJulian Elischer 
1098878ed226SJulian Elischer 	fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1099878ed226SJulian Elischer 		rp.counter);
1100878ed226SJulian Elischer 
1101878ed226SJulian Elischer 	return (OK);
1102878ed226SJulian Elischer } /* hci_read_number_broadcast_retransmissions */
1103878ed226SJulian Elischer 
1104878ed226SJulian Elischer /* Send Write_Number_Broadcast_Restransmissions */
1105878ed226SJulian Elischer static int
1106878ed226SJulian Elischer hci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1107878ed226SJulian Elischer {
1108878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_cp	cp;
1109878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_rp	rp;
1110878ed226SJulian Elischer 	int					n;
1111878ed226SJulian Elischer 
1112878ed226SJulian Elischer 	/* parse command parameters */
1113878ed226SJulian Elischer 	switch (argc) {
1114878ed226SJulian Elischer 	case 1:
1115878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1116878ed226SJulian Elischer 			return (USAGE);
1117878ed226SJulian Elischer 
1118079a8a3eSMaksim Yevmenkin 		cp.counter = (uint8_t) n;
1119878ed226SJulian Elischer 		break;
1120878ed226SJulian Elischer 
1121878ed226SJulian Elischer 	default:
1122878ed226SJulian Elischer 		return (USAGE);
1123878ed226SJulian Elischer 	}
1124878ed226SJulian Elischer 
1125878ed226SJulian Elischer 	/* send command */
1126878ed226SJulian Elischer 	n = sizeof(rp);
1127878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1128878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1129878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1130878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1131878ed226SJulian Elischer 		return (ERROR);
1132878ed226SJulian Elischer 
1133878ed226SJulian Elischer 	if (rp.status != 0x00) {
1134878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1135878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1136878ed226SJulian Elischer 		return (FAILED);
1137878ed226SJulian Elischer 	}
1138878ed226SJulian Elischer 
1139878ed226SJulian Elischer 	return (OK);
1140878ed226SJulian Elischer } /* hci_write_number_broadcast_retransmissions */
1141878ed226SJulian Elischer 
1142878ed226SJulian Elischer /* Send Read_Hold_Mode_Activity command to the unit */
1143878ed226SJulian Elischer static int
1144878ed226SJulian Elischer hci_read_hold_mode_activity(int s, int argc, char **argv)
1145878ed226SJulian Elischer {
1146878ed226SJulian Elischer 	ng_hci_read_hold_mode_activity_rp	rp;
1147878ed226SJulian Elischer 	int					n;
1148878ed226SJulian Elischer 	char					buffer[1024];
1149878ed226SJulian Elischer 
1150878ed226SJulian Elischer 	n = sizeof(rp);
1151878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1152878ed226SJulian Elischer 			NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1153878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1154878ed226SJulian Elischer 		return (ERROR);
1155878ed226SJulian Elischer 
1156878ed226SJulian Elischer 	if (rp.status != 0x00) {
1157878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1158878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1159878ed226SJulian Elischer 		return (FAILED);
1160878ed226SJulian Elischer 	}
1161878ed226SJulian Elischer 
1162878ed226SJulian Elischer 	fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1163878ed226SJulian Elischer 	if (rp.hold_mode_activity == 0)
1164878ed226SJulian Elischer 		fprintf(stdout, "Maintain current Power State");
1165878ed226SJulian Elischer 	else
1166878ed226SJulian Elischer 		fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1167878ed226SJulian Elischer 				buffer, sizeof(buffer)));
1168878ed226SJulian Elischer 
1169878ed226SJulian Elischer 	fprintf(stdout, "\n");
1170878ed226SJulian Elischer 
1171878ed226SJulian Elischer 	return (OK);
1172878ed226SJulian Elischer } /* hci_read_hold_mode_activity */
1173878ed226SJulian Elischer 
1174878ed226SJulian Elischer /* Send Write_Hold_Mode_Activity command to the unit */
1175878ed226SJulian Elischer static int
1176878ed226SJulian Elischer hci_write_hold_mode_activity(int s, int argc, char **argv)
1177878ed226SJulian Elischer {
1178878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_cp	cp;
1179878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_rp	rp;
1180878ed226SJulian Elischer 	int					n;
1181878ed226SJulian Elischer 
1182878ed226SJulian Elischer 	/* parse command parameters */
1183878ed226SJulian Elischer 	switch (argc) {
1184878ed226SJulian Elischer 	case 1:
1185878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1186878ed226SJulian Elischer 			return (USAGE);
1187878ed226SJulian Elischer 
1188079a8a3eSMaksim Yevmenkin 		cp.hold_mode_activity = (uint8_t) n;
1189878ed226SJulian Elischer 		break;
1190878ed226SJulian Elischer 
1191878ed226SJulian Elischer 	default:
1192878ed226SJulian Elischer 		return (USAGE);
1193878ed226SJulian Elischer 	}
1194878ed226SJulian Elischer 
1195878ed226SJulian Elischer 	/* send command */
1196878ed226SJulian Elischer 	n = sizeof(rp);
1197878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1198878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1199878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1200878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1201878ed226SJulian Elischer 		return (ERROR);
1202878ed226SJulian Elischer 
1203878ed226SJulian Elischer 	if (rp.status != 0x00) {
1204878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1205878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1206878ed226SJulian Elischer 		return (FAILED);
1207878ed226SJulian Elischer 	}
1208878ed226SJulian Elischer 
1209878ed226SJulian Elischer 	return (OK);
1210878ed226SJulian Elischer } /* hci_write_hold_mode_activity */
1211878ed226SJulian Elischer 
1212878ed226SJulian Elischer /* Send Read_SCO_Flow_Control_Enable command to the unit */
1213878ed226SJulian Elischer static int
1214878ed226SJulian Elischer hci_read_sco_flow_control_enable(int s, int argc, char **argv)
1215878ed226SJulian Elischer {
1216878ed226SJulian Elischer 	ng_hci_read_sco_flow_control_rp	rp;
1217878ed226SJulian Elischer 	int				n;
1218878ed226SJulian Elischer 
1219878ed226SJulian Elischer 	n = sizeof(rp);
1220878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1221878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1222878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1223878ed226SJulian Elischer 		return (ERROR);
1224878ed226SJulian Elischer 
1225878ed226SJulian Elischer 	if (rp.status != 0x00) {
1226878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1227878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1228878ed226SJulian Elischer 		return (FAILED);
1229878ed226SJulian Elischer 	}
1230878ed226SJulian Elischer 
1231878ed226SJulian Elischer 	fprintf(stdout, "SCO flow control %s [%d]\n",
1232878ed226SJulian Elischer 		rp.flow_control? "enabled" : "disabled", rp.flow_control);
1233878ed226SJulian Elischer 
1234878ed226SJulian Elischer 	return (OK);
1235878ed226SJulian Elischer } /* hci_read_sco_flow_control_enable */
1236878ed226SJulian Elischer 
1237878ed226SJulian Elischer /* Send Write_SCO_Flow_Control_Enable command to the unit */
1238878ed226SJulian Elischer static int
1239878ed226SJulian Elischer hci_write_sco_flow_control_enable(int s, int argc, char **argv)
1240878ed226SJulian Elischer {
1241878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_cp	cp;
1242878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_rp	rp;
1243878ed226SJulian Elischer 	int					n;
1244878ed226SJulian Elischer 
1245878ed226SJulian Elischer 	/* parse command parameters */
1246878ed226SJulian Elischer 	switch (argc) {
1247878ed226SJulian Elischer 	case 1:
1248878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1249878ed226SJulian Elischer 			return (USAGE);
1250878ed226SJulian Elischer 
1251079a8a3eSMaksim Yevmenkin 		cp.flow_control = (uint8_t) n;
1252878ed226SJulian Elischer 		break;
1253878ed226SJulian Elischer 
1254878ed226SJulian Elischer 	default:
1255878ed226SJulian Elischer 		return (USAGE);
1256878ed226SJulian Elischer 	}
1257878ed226SJulian Elischer 
1258878ed226SJulian Elischer 	/* send command */
1259878ed226SJulian Elischer 	n = sizeof(rp);
1260878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1261878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1262878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1263878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1264878ed226SJulian Elischer 		return (ERROR);
1265878ed226SJulian Elischer 
1266878ed226SJulian Elischer 	if (rp.status != 0x00) {
1267878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1268878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1269878ed226SJulian Elischer 		return (FAILED);
1270878ed226SJulian Elischer 	}
1271878ed226SJulian Elischer 
1272878ed226SJulian Elischer 	return (OK);
1273878ed226SJulian Elischer } /* hci_write_sco_flow_control_enable */
1274878ed226SJulian Elischer 
1275878ed226SJulian Elischer /* Send Read_Link_Supervision_Timeout command to the unit */
1276878ed226SJulian Elischer static int
1277878ed226SJulian Elischer hci_read_link_supervision_timeout(int s, int argc, char **argv)
1278878ed226SJulian Elischer {
1279878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_cp	cp;
1280878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_rp	rp;
1281878ed226SJulian Elischer 	int					n;
1282878ed226SJulian Elischer 
1283878ed226SJulian Elischer 	switch (argc) {
1284878ed226SJulian Elischer 	case 1:
1285878ed226SJulian Elischer 		/* connection handle */
1286878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1287878ed226SJulian Elischer 			return (USAGE);
1288878ed226SJulian Elischer 
1289079a8a3eSMaksim Yevmenkin 		cp.con_handle = (uint16_t) (n & 0x0fff);
1290878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1291878ed226SJulian Elischer 		break;
1292878ed226SJulian Elischer 
1293878ed226SJulian Elischer 	default:
1294878ed226SJulian Elischer 		return (USAGE);
1295878ed226SJulian Elischer 	}
1296878ed226SJulian Elischer 
1297878ed226SJulian Elischer 	/* send command */
1298878ed226SJulian Elischer 	n = sizeof(rp);
1299878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1300878ed226SJulian Elischer 			NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1301878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1302878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1303878ed226SJulian Elischer 		return (ERROR);
1304878ed226SJulian Elischer 
1305878ed226SJulian Elischer 	if (rp.status != 0x00) {
1306878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1307878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1308878ed226SJulian Elischer 		return (FAILED);
1309878ed226SJulian Elischer 	}
1310878ed226SJulian Elischer 
1311878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
1312878ed226SJulian Elischer 
1313878ed226SJulian Elischer 	fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1314878ed226SJulian Elischer 	fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1315878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
1316878ed226SJulian Elischer 
1317878ed226SJulian Elischer 	return (OK);
1318878ed226SJulian Elischer } /* hci_read_link_supervision_timeout */
1319878ed226SJulian Elischer 
1320878ed226SJulian Elischer /* Send Write_Link_Supervision_Timeout command to the unit */
1321878ed226SJulian Elischer static int
1322878ed226SJulian Elischer hci_write_link_supervision_timeout(int s, int argc, char **argv)
1323878ed226SJulian Elischer {
1324878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_cp	cp;
1325878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_rp	rp;
1326878ed226SJulian Elischer 	int					n;
1327878ed226SJulian Elischer 
1328878ed226SJulian Elischer 	switch (argc) {
1329878ed226SJulian Elischer 	case 2:
1330878ed226SJulian Elischer 		/* connection handle */
1331878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1332878ed226SJulian Elischer 			return (USAGE);
1333878ed226SJulian Elischer 
1334079a8a3eSMaksim Yevmenkin 		cp.con_handle = (uint16_t) (n & 0x0fff);
1335878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1336878ed226SJulian Elischer 
1337878ed226SJulian Elischer 		/* link supervision timeout */
13389e84f80bSMaksim Yevmenkin 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xffff)
1339878ed226SJulian Elischer 			return (USAGE);
1340878ed226SJulian Elischer 
1341079a8a3eSMaksim Yevmenkin 		cp.timeout = (uint16_t) (n & 0x0fff);
1342878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
1343878ed226SJulian Elischer 		break;
1344878ed226SJulian Elischer 
1345878ed226SJulian Elischer 	default:
1346878ed226SJulian Elischer 		return (USAGE);
1347878ed226SJulian Elischer 	}
1348878ed226SJulian Elischer 
1349878ed226SJulian Elischer 	/* send command */
1350878ed226SJulian Elischer 	n = sizeof(rp);
1351878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1352878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1353878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1354878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1355878ed226SJulian Elischer 		return (ERROR);
1356878ed226SJulian Elischer 
1357878ed226SJulian Elischer 	if (rp.status != 0x00) {
1358878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1359878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1360878ed226SJulian Elischer 		return (FAILED);
1361878ed226SJulian Elischer 	}
1362878ed226SJulian Elischer 
1363878ed226SJulian Elischer 	return (OK);
1364878ed226SJulian Elischer } /* hci_write_link_supervision_timeout */
1365878ed226SJulian Elischer 
13660986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Period_Mode command to the unit */
13670986ab12SMaksim Yevmenkin static int
13680986ab12SMaksim Yevmenkin hci_read_page_scan_period_mode(int s, int argc, char **argv)
13690986ab12SMaksim Yevmenkin {
13700986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_period_rp	rp;
13710986ab12SMaksim Yevmenkin 	int				n;
13720986ab12SMaksim Yevmenkin 
13730986ab12SMaksim Yevmenkin 	n = sizeof(rp);
13740986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
13750986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN_PERIOD),
13760986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
13770986ab12SMaksim Yevmenkin 		return (ERROR);
13780986ab12SMaksim Yevmenkin 
13790986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
13800986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
13810986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
13820986ab12SMaksim Yevmenkin 		return (FAILED);
13830986ab12SMaksim Yevmenkin 	}
13840986ab12SMaksim Yevmenkin 
13850986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan period mode: %#02x\n",
13860986ab12SMaksim Yevmenkin 		rp.page_scan_period_mode);
13870986ab12SMaksim Yevmenkin 
13880986ab12SMaksim Yevmenkin 	return (OK);
13890986ab12SMaksim Yevmenkin } /* hci_read_page_scan_period_mode */
13900986ab12SMaksim Yevmenkin 
13910986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Period_Mode command to the unit */
13920986ab12SMaksim Yevmenkin static int
13930986ab12SMaksim Yevmenkin hci_write_page_scan_period_mode(int s, int argc, char **argv)
13940986ab12SMaksim Yevmenkin {
13950986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_cp	cp;
13960986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_rp	rp;
13970986ab12SMaksim Yevmenkin 	int					n;
13980986ab12SMaksim Yevmenkin 
13990986ab12SMaksim Yevmenkin 	/* parse command arguments */
14000986ab12SMaksim Yevmenkin 	switch (argc) {
14010986ab12SMaksim Yevmenkin 	case 1:
14020986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
14030986ab12SMaksim Yevmenkin 			return (USAGE);
14040986ab12SMaksim Yevmenkin 
14050986ab12SMaksim Yevmenkin 		cp.page_scan_period_mode = (n & 0xff);
14060986ab12SMaksim Yevmenkin 		break;
14070986ab12SMaksim Yevmenkin 
14080986ab12SMaksim Yevmenkin 	default:
14090986ab12SMaksim Yevmenkin 		return (USAGE);
14100986ab12SMaksim Yevmenkin 	}
14110986ab12SMaksim Yevmenkin 
14120986ab12SMaksim Yevmenkin 	/* send command */
14130986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14140986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14150986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN_PERIOD),
14160986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14170986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14180986ab12SMaksim Yevmenkin 		return (ERROR);
14190986ab12SMaksim Yevmenkin 
14200986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14210986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14220986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14230986ab12SMaksim Yevmenkin 		return (FAILED);
14240986ab12SMaksim Yevmenkin 	}
14250986ab12SMaksim Yevmenkin 
14260986ab12SMaksim Yevmenkin 	return (OK);
14270986ab12SMaksim Yevmenkin } /* hci_write_page_scan_period_mode */
14280986ab12SMaksim Yevmenkin 
14290986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Mode command to the unit */
14300986ab12SMaksim Yevmenkin static int
14310986ab12SMaksim Yevmenkin hci_read_page_scan_mode(int s, int argc, char **argv)
14320986ab12SMaksim Yevmenkin {
14330986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_rp	rp;
14340986ab12SMaksim Yevmenkin 	int				n;
14350986ab12SMaksim Yevmenkin 
14360986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14370986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14380986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN),
14390986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14400986ab12SMaksim Yevmenkin 		return (ERROR);
14410986ab12SMaksim Yevmenkin 
14420986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14430986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14440986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14450986ab12SMaksim Yevmenkin 		return (FAILED);
14460986ab12SMaksim Yevmenkin 	}
14470986ab12SMaksim Yevmenkin 
14480986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan mode: %#02x\n", rp.page_scan_mode);
14490986ab12SMaksim Yevmenkin 
14500986ab12SMaksim Yevmenkin 	return (OK);
14510986ab12SMaksim Yevmenkin } /* hci_read_page_scan_mode */
14520986ab12SMaksim Yevmenkin 
14530986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Mode command to the unit */
14540986ab12SMaksim Yevmenkin static int
14550986ab12SMaksim Yevmenkin hci_write_page_scan_mode(int s, int argc, char **argv)
14560986ab12SMaksim Yevmenkin {
14570986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_cp	cp;
14580986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_rp	rp;
14590986ab12SMaksim Yevmenkin 	int				n;
14600986ab12SMaksim Yevmenkin 
14610986ab12SMaksim Yevmenkin 	/* parse command arguments */
14620986ab12SMaksim Yevmenkin 	switch (argc) {
14630986ab12SMaksim Yevmenkin 	case 1:
14640986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
14650986ab12SMaksim Yevmenkin 			return (USAGE);
14660986ab12SMaksim Yevmenkin 
14670986ab12SMaksim Yevmenkin 		cp.page_scan_mode = (n & 0xff);
14680986ab12SMaksim Yevmenkin 		break;
14690986ab12SMaksim Yevmenkin 
14700986ab12SMaksim Yevmenkin 	default:
14710986ab12SMaksim Yevmenkin 		return (USAGE);
14720986ab12SMaksim Yevmenkin 	}
14730986ab12SMaksim Yevmenkin 
14740986ab12SMaksim Yevmenkin 	/* send command */
14750986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14760986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14770986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN),
14780986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14790986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14800986ab12SMaksim Yevmenkin 		return (ERROR);
14810986ab12SMaksim Yevmenkin 
14820986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14830986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14840986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14850986ab12SMaksim Yevmenkin 		return (FAILED);
14860986ab12SMaksim Yevmenkin 	}
14870986ab12SMaksim Yevmenkin 
14880986ab12SMaksim Yevmenkin 	return (OK);
14890986ab12SMaksim Yevmenkin } /* hci_write_page_scan_mode */
14900986ab12SMaksim Yevmenkin 
1491878ed226SJulian Elischer struct hci_command	host_controller_baseband_commands[] = {
1492878ed226SJulian Elischer {
1493878ed226SJulian Elischer "reset",
1494878ed226SJulian Elischer "\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1495878ed226SJulian Elischer "After the reset is completed, the current operational state will be lost,\n" \
1496878ed226SJulian Elischer "the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1497878ed226SJulian Elischer "automatically revert to the default values for the parameters for which\n" \
1498878ed226SJulian Elischer "default values are defined in the specification.",
1499878ed226SJulian Elischer &hci_reset
1500878ed226SJulian Elischer },
1501878ed226SJulian Elischer {
1502878ed226SJulian Elischer "read_pin_type",
1503878ed226SJulian Elischer "\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1504878ed226SJulian Elischer "Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1505878ed226SJulian Elischer "code.",
1506878ed226SJulian Elischer &hci_read_pin_type
1507878ed226SJulian Elischer },
1508878ed226SJulian Elischer {
1509878ed226SJulian Elischer "write_pin_type <pin_type>",
1510878ed226SJulian Elischer "\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1511878ed226SJulian Elischer "Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1512878ed226SJulian Elischer "code.\n\n" \
1513878ed226SJulian Elischer "\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1514878ed226SJulian Elischer &hci_write_pin_type
1515878ed226SJulian Elischer },
1516878ed226SJulian Elischer {
15172aa65cf7SMaksim Yevmenkin "read_stored_link_key [<BD_ADDR>]",
1518878ed226SJulian Elischer "\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1519878ed226SJulian Elischer "more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1520878ed226SJulian Elischer "Controller can store a limited number of link keys for other Bluetooth\n" \
1521878ed226SJulian Elischer "devices.\n\n" \
15222aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1523878ed226SJulian Elischer &hci_read_stored_link_key
1524878ed226SJulian Elischer },
1525878ed226SJulian Elischer {
15262aa65cf7SMaksim Yevmenkin "write_stored_link_key <BD_ADDR> <key>",
1527878ed226SJulian Elischer "\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1528878ed226SJulian Elischer "or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1529878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1530878ed226SJulian Elischer "Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1531878ed226SJulian Elischer "Host Controller then no additional link keys will be stored.\n\n" \
15322aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name\n" \
1533878ed226SJulian Elischer "\t<key>     - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1534878ed226SJulian Elischer &hci_write_stored_link_key
1535878ed226SJulian Elischer },
1536878ed226SJulian Elischer {
15372aa65cf7SMaksim Yevmenkin "delete_stored_link_key [<BD_ADDR>]",
1538878ed226SJulian Elischer "\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1539878ed226SJulian Elischer "or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1540878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1541878ed226SJulian Elischer "Bluetooth devices.\n\n" \
15422aa65cf7SMaksim Yevmenkin "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1543878ed226SJulian Elischer &hci_delete_stored_link_key
1544878ed226SJulian Elischer },
1545878ed226SJulian Elischer {
1546878ed226SJulian Elischer "change_local_name <name>",
1547878ed226SJulian Elischer "\nThe Change_Local_Name command provides the ability to modify the user\n" \
1548878ed226SJulian Elischer "friendly name for the Bluetooth unit.\n\n" \
1549878ed226SJulian Elischer "\t<name> - string",
1550878ed226SJulian Elischer &hci_change_local_name
1551878ed226SJulian Elischer },
1552878ed226SJulian Elischer {
1553878ed226SJulian Elischer "read_local_name",
1554878ed226SJulian Elischer "\nThe Read_Local_Name command provides the ability to read the\n" \
1555878ed226SJulian Elischer "stored user-friendly name for the Bluetooth unit.",
1556878ed226SJulian Elischer &hci_read_local_name
1557878ed226SJulian Elischer },
1558878ed226SJulian Elischer {
1559878ed226SJulian Elischer "read_connection_accept_timeout",
1560878ed226SJulian Elischer "\nThis command will read the value for the Connection_Accept_Timeout\n" \
1561878ed226SJulian Elischer "configuration parameter. The Connection_Accept_Timeout configuration\n" \
1562878ed226SJulian Elischer "parameter allows the Bluetooth hardware to automatically deny a\n" \
1563878ed226SJulian Elischer "connection request after a specified time period has occurred and\n" \
1564878ed226SJulian Elischer "the new connection is not accepted. Connection Accept Timeout\n" \
1565878ed226SJulian Elischer "measured in Number of Baseband slots.",
1566878ed226SJulian Elischer &hci_read_connection_accept_timeout
1567878ed226SJulian Elischer },
1568878ed226SJulian Elischer {
1569878ed226SJulian Elischer "write_connection_accept_timeout <timeout>",
1570878ed226SJulian Elischer "\nThis command will write the value for the Connection_Accept_Timeout\n" \
1571878ed226SJulian Elischer "configuration parameter.\n\n" \
1572878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1573878ed226SJulian Elischer &hci_write_connection_accept_timeout
1574878ed226SJulian Elischer },
1575878ed226SJulian Elischer {
1576878ed226SJulian Elischer "read_page_timeout",
1577878ed226SJulian Elischer "\nThis command will read the value for the Page_Timeout configuration\n" \
1578878ed226SJulian Elischer "parameter. The Page_Timeout configuration parameter defines the\n" \
1579878ed226SJulian Elischer "maximum time the local Link Manager will wait for a baseband page\n" \
1580878ed226SJulian Elischer "response from the remote unit at a locally initiated connection\n" \
1581878ed226SJulian Elischer "attempt. Page Timeout measured in Number of Baseband slots.",
1582878ed226SJulian Elischer &hci_read_page_timeout
1583878ed226SJulian Elischer },
1584878ed226SJulian Elischer {
1585878ed226SJulian Elischer "write_page_timeout <timeout>",
1586878ed226SJulian Elischer "\nThis command will write the value for the Page_Timeout configuration\n" \
1587878ed226SJulian Elischer "parameter.\n\n" \
1588878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1589878ed226SJulian Elischer &hci_write_page_timeout
1590878ed226SJulian Elischer },
1591878ed226SJulian Elischer {
1592878ed226SJulian Elischer "read_scan_enable",
1593878ed226SJulian Elischer "\nThis command will read the value for the Scan_Enable parameter. The\n" \
1594878ed226SJulian Elischer "Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1595878ed226SJulian Elischer "will periodically scan for page attempts and/or inquiry requests\n" \
1596878ed226SJulian Elischer "from other Bluetooth unit.\n\n" \
1597878ed226SJulian Elischer "\t0x00 - No Scans enabled.\n" \
1598878ed226SJulian Elischer "\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1599878ed226SJulian Elischer "\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1600878ed226SJulian Elischer "\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1601878ed226SJulian Elischer &hci_read_scan_enable
1602878ed226SJulian Elischer },
1603878ed226SJulian Elischer {
1604878ed226SJulian Elischer "write_scan_enable <scan_enable>",
1605878ed226SJulian Elischer "\nThis command will write the value for the Scan_Enable parameter.\n" \
1606878ed226SJulian Elischer "The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1607878ed226SJulian Elischer "unit will periodically scan for page attempts and/or inquiry\n" \
1608878ed226SJulian Elischer "requests from other Bluetooth unit.\n\n" \
1609878ed226SJulian Elischer "\t<scan_enable> - dd;\n" \
1610878ed226SJulian Elischer "\t0 - No Scans enabled.\n" \
1611878ed226SJulian Elischer "\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1612878ed226SJulian Elischer "\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1613878ed226SJulian Elischer "\t3 - Inquiry Scan enabled. Page Scan enabled.",
1614878ed226SJulian Elischer &hci_write_scan_enable
1615878ed226SJulian Elischer },
1616878ed226SJulian Elischer {
1617878ed226SJulian Elischer "read_page_scan_activity",
1618878ed226SJulian Elischer "\nThis command will read the value for Page_Scan_Activity configuration\n" \
1619878ed226SJulian Elischer "parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1620878ed226SJulian Elischer "amount of time between consecutive page scans. This time interval is \n" \
1621878ed226SJulian Elischer "defined from when the Host Controller started its last page scan until\n" \
1622878ed226SJulian Elischer "it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1623878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. The\n" \
1624878ed226SJulian Elischer "Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1625878ed226SJulian Elischer &hci_read_page_scan_activity
1626878ed226SJulian Elischer },
1627878ed226SJulian Elischer {
1628878ed226SJulian Elischer "write_page_scan_activity interval(dddd) window(dddd)",
1629878ed226SJulian Elischer "\nThis command will write the value for Page_Scan_Activity configuration\n" \
1630878ed226SJulian Elischer "parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1631878ed226SJulian Elischer "amount of time between consecutive page scans. This is defined as the time\n" \
1632878ed226SJulian Elischer "interval from when the Host Controller started its last page scan until it\n" \
1633878ed226SJulian Elischer "begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1634878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. \n" \
1635878ed226SJulian Elischer "The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1636f76b3199SUlrich Spörlein "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
163745360108SStefan Farfeleder "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1638878ed226SJulian Elischer &hci_write_page_scan_activity
1639878ed226SJulian Elischer },
1640878ed226SJulian Elischer {
1641878ed226SJulian Elischer "read_inquiry_scan_activity",
1642878ed226SJulian Elischer "\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1643878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1644878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1645878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1646878ed226SJulian Elischer "until it begins the next inquiry scan.",
1647878ed226SJulian Elischer &hci_read_inquiry_scan_activity
1648878ed226SJulian Elischer },
1649878ed226SJulian Elischer {
1650878ed226SJulian Elischer "write_inquiry_scan_activity interval(dddd) window(dddd)",
1651878ed226SJulian Elischer "\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1652878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1653878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1654878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1655878ed226SJulian Elischer "until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1656878ed226SJulian Elischer "parameter defines the amount of time for the duration of the inquiry scan.\n" \
1657878ed226SJulian Elischer "The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1658f76b3199SUlrich Spörlein "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
165945360108SStefan Farfeleder "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1660878ed226SJulian Elischer &hci_write_inquiry_scan_activity
1661878ed226SJulian Elischer },
1662878ed226SJulian Elischer {
1663878ed226SJulian Elischer "read_authentication_enable",
1664878ed226SJulian Elischer "\nThis command will read the value for the Authentication_Enable parameter.\n"\
1665878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires\n"\
1666878ed226SJulian Elischer "to authenticate the remote unit at connection setup (between the\n" \
1667878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n"\
1668878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1669878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1670878ed226SJulian Elischer "authenticate the other unit.",
1671878ed226SJulian Elischer &hci_read_authentication_enable
1672878ed226SJulian Elischer },
1673878ed226SJulian Elischer {
1674878ed226SJulian Elischer "write_authentication_enable enable(0|1)",
1675878ed226SJulian Elischer "\nThis command will write the value for the Authentication_Enable parameter.\n"\
1676878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires to\n"\
1677878ed226SJulian Elischer "authenticate the remote unit at connection setup (between the\n" \
1678878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1679878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1680878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1681878ed226SJulian Elischer "authenticate the other unit.",
1682878ed226SJulian Elischer &hci_write_authentication_enable
1683878ed226SJulian Elischer },
1684878ed226SJulian Elischer {
1685878ed226SJulian Elischer "read_encryption_mode",
1686878ed226SJulian Elischer "\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1687878ed226SJulian Elischer "Encryption_Mode parameter controls if the local unit requires encryption\n" \
1688878ed226SJulian Elischer "to the remote unit at connection setup (between the Create_Connection\n" \
1689878ed226SJulian Elischer "command or acceptance of an incoming ACL connection and the corresponding\n" \
1690878ed226SJulian Elischer "Connection Complete event). At connection setup, only the unit(s) with\n" \
1691878ed226SJulian Elischer "the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1692878ed226SJulian Elischer "enabled will try to encrypt the connection to the other unit.\n\n" \
1693878ed226SJulian Elischer "\t<encryption_mode>:\n" \
1694878ed226SJulian Elischer "\t0x00 - Encryption disabled.\n" \
1695878ed226SJulian Elischer "\t0x01 - Encryption only for point-to-point packets.\n" \
1696878ed226SJulian Elischer "\t0x02 - Encryption for both point-to-point and broadcast packets.",
1697878ed226SJulian Elischer &hci_read_encryption_mode
1698878ed226SJulian Elischer },
1699878ed226SJulian Elischer {
1700878ed226SJulian Elischer "write_encryption_mode mode(0|1|2)",
1701878ed226SJulian Elischer "\tThis command will write the value for the Encryption_Mode parameter.\n" \
1702878ed226SJulian Elischer "The Encryption_Mode parameter controls if the local unit requires\n" \
1703878ed226SJulian Elischer "encryption to the remote unit at connection setup (between the\n" \
1704878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1705878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup,\n" \
1706878ed226SJulian Elischer "only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1707878ed226SJulian Elischer "Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1708878ed226SJulian Elischer "the other unit.\n\n" \
1709878ed226SJulian Elischer "\t<encryption_mode> (dd)\n" \
1710878ed226SJulian Elischer "\t0 - Encryption disabled.\n" \
1711878ed226SJulian Elischer "\t1 - Encryption only for point-to-point packets.\n" \
1712878ed226SJulian Elischer "\t2 - Encryption for both point-to-point and broadcast packets.",
1713878ed226SJulian Elischer &hci_write_encryption_mode
1714878ed226SJulian Elischer },
1715878ed226SJulian Elischer {
1716878ed226SJulian Elischer "read_class_of_device",
1717878ed226SJulian Elischer "\nThis command will read the value for the Class_of_Device parameter.\n" \
1718878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of\n" \
1719878ed226SJulian Elischer "the local unit to other units.",
1720878ed226SJulian Elischer &hci_read_class_of_device
1721878ed226SJulian Elischer },
1722878ed226SJulian Elischer {
1723878ed226SJulian Elischer "write_class_of_device class(xx:xx:xx)",
1724878ed226SJulian Elischer "\nThis command will write the value for the Class_of_Device parameter.\n" \
1725878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of \n" \
1726878ed226SJulian Elischer "the local unit to other units.\n\n" \
1727878ed226SJulian Elischer "\t<class> (xx:xx:xx) - class of device",
1728878ed226SJulian Elischer &hci_write_class_of_device
1729878ed226SJulian Elischer },
1730878ed226SJulian Elischer {
1731878ed226SJulian Elischer "read_voice_settings",
1732878ed226SJulian Elischer "\nThis command will read the values for the Voice_Setting parameter.\n" \
1733878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1734878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1735878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1736878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1737878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.",
1738878ed226SJulian Elischer &hci_read_voice_settings
1739878ed226SJulian Elischer },
1740878ed226SJulian Elischer {
1741878ed226SJulian Elischer "write_voice_settings settings(xxxx)",
1742878ed226SJulian Elischer "\nThis command will write the values for the Voice_Setting parameter.\n" \
1743878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1744878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1745878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1746878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1747878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.\n\n" \
1748878ed226SJulian Elischer "\t<voice_settings> (xxxx) - voice settings",
1749878ed226SJulian Elischer &hci_write_voice_settings
1750878ed226SJulian Elischer },
1751878ed226SJulian Elischer {
1752878ed226SJulian Elischer "read_number_broadcast_retransmissions",
1753878ed226SJulian Elischer "\nThis command will read the unit's parameter value for the Number of\n" \
1754878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1755878ed226SJulian Elischer "unreliable.",
1756878ed226SJulian Elischer &hci_read_number_broadcast_retransmissions
1757878ed226SJulian Elischer },
1758878ed226SJulian Elischer {
1759878ed226SJulian Elischer "write_number_broadcast_retransmissions count(dd)",
1760878ed226SJulian Elischer "\nThis command will write the unit's parameter value for the Number of\n" \
1761878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1762878ed226SJulian Elischer "unreliable.\n\n" \
1763878ed226SJulian Elischer "\t<count> (dd) - number of broadcast retransimissions",
1764878ed226SJulian Elischer &hci_write_number_broadcast_retransmissions
1765878ed226SJulian Elischer },
1766878ed226SJulian Elischer {
1767878ed226SJulian Elischer "read_hold_mode_activity",
1768878ed226SJulian Elischer "\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1769878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1770878ed226SJulian Elischer "be suspended when the unit is in hold mode.",
1771878ed226SJulian Elischer &hci_read_hold_mode_activity
1772878ed226SJulian Elischer },
1773878ed226SJulian Elischer {
1774878ed226SJulian Elischer "write_hold_mode_activity settings(0|1|2|4)",
1775878ed226SJulian Elischer "\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1776878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1777878ed226SJulian Elischer "be suspended when the unit is in hold mode.\n\n" \
1778878ed226SJulian Elischer "\t<settings> (dd) - bit mask:\n" \
1779878ed226SJulian Elischer "\t0 - Maintain current Power State. Default\n" \
1780878ed226SJulian Elischer "\t1 - Suspend Page Scan.\n" \
1781878ed226SJulian Elischer "\t2 - Suspend Inquiry Scan.\n" \
1782878ed226SJulian Elischer "\t4 - Suspend Periodic Inquiries.",
1783878ed226SJulian Elischer &hci_write_hold_mode_activity
1784878ed226SJulian Elischer },
1785878ed226SJulian Elischer {
1786878ed226SJulian Elischer "read_sco_flow_control_enable",
1787878ed226SJulian Elischer "\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1788878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1789878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1790878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1791878ed226SJulian Elischer "disable SCO flow control.",
1792878ed226SJulian Elischer &hci_read_sco_flow_control_enable
1793878ed226SJulian Elischer },
1794878ed226SJulian Elischer {
1795878ed226SJulian Elischer "write_sco_flow_control_enable enable(0|1)",
1796878ed226SJulian Elischer "\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1797878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1798878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1799878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1800878ed226SJulian Elischer "disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1801878ed226SJulian Elischer "changed if no connections exist.",
1802878ed226SJulian Elischer &hci_write_sco_flow_control_enable
1803878ed226SJulian Elischer },
1804878ed226SJulian Elischer {
1805878ed226SJulian Elischer "read_link_supervision_timeout <connection_handle>",
1806878ed226SJulian Elischer "\nThis command will read the value for the Link_Supervision_Timeout\n" \
1807878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1808878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1809878ed226SJulian Elischer "reason, no Baseband packets are received from that Connection Handle for a\n" \
1810878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n"
1811878ed226SJulian Elischer "disconnected.\n\n" \
1812878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n",
1813878ed226SJulian Elischer &hci_read_link_supervision_timeout
1814878ed226SJulian Elischer },
1815878ed226SJulian Elischer {
1816878ed226SJulian Elischer "write_link_supervision_timeout <connection_handle> <timeout>",
1817878ed226SJulian Elischer "\nThis command will write the value for the Link_Supervision_Timeout\n" \
1818878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1819878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1820878ed226SJulian Elischer "reason, no Baseband packets are received from that connection handle for a\n" \
1821878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n" \
1822878ed226SJulian Elischer "disconnected.\n\n" \
1823878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n" \
1824878ed226SJulian Elischer "\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1825878ed226SJulian Elischer &hci_write_link_supervision_timeout
1826878ed226SJulian Elischer },
18270986ab12SMaksim Yevmenkin {
18280986ab12SMaksim Yevmenkin "read_page_scan_period_mode",
18290986ab12SMaksim Yevmenkin "\nThis command is used to read the mandatory Page_Scan_Period_Mode of the\n" \
18300986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
18310986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
18320986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
18330986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
18340986ab12SMaksim Yevmenkin "following page scans.",
18350986ab12SMaksim Yevmenkin &hci_read_page_scan_period_mode
18360986ab12SMaksim Yevmenkin },
18370986ab12SMaksim Yevmenkin {
18380986ab12SMaksim Yevmenkin "write_page_scan_period_mode <page_scan_period_mode>",
18390986ab12SMaksim Yevmenkin "\nThis command is used to write the mandatory Page_Scan_Period_Mode of the\n" \
18400986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
18410986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
18420986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
18430986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
18440986ab12SMaksim Yevmenkin "following page scans.\n\n" \
18450986ab12SMaksim Yevmenkin "\t<page_scan_period_mode> - dd; page scan period mode:\n" \
18460986ab12SMaksim Yevmenkin "\t0x00 - P0 (Default)\n" \
18470986ab12SMaksim Yevmenkin "\t0x01 - P1\n" \
18480986ab12SMaksim Yevmenkin "\t0x02 - P2",
18490986ab12SMaksim Yevmenkin &hci_write_page_scan_period_mode
18500986ab12SMaksim Yevmenkin },
18510986ab12SMaksim Yevmenkin {
18520986ab12SMaksim Yevmenkin "read_page_scan_mode",
18530986ab12SMaksim Yevmenkin "\nThis command is used to read the default page scan mode of the local\n" \
18540986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
18550986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently one mandatory page scan\n"\
18560986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n" \
18570986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
18580986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.",
18590986ab12SMaksim Yevmenkin &hci_read_page_scan_mode
18600986ab12SMaksim Yevmenkin },
18610986ab12SMaksim Yevmenkin {
18620986ab12SMaksim Yevmenkin "write_page_scan_mode <page_scan_mode>",
18630986ab12SMaksim Yevmenkin "\nThis command is used to write the default page scan mode of the local\n" \
18640986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
18650986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently, one mandatory page scan\n"\
18660986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n"\
18670986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
18680986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.\n\n" \
18690986ab12SMaksim Yevmenkin "\t<page_scan_mode> - dd; page scan mode:\n" \
18700986ab12SMaksim Yevmenkin "\t0x00 - Mandatory Page Scan Mode (Default)\n" \
18710986ab12SMaksim Yevmenkin "\t0x01 - Optional Page Scan Mode I\n" \
18720986ab12SMaksim Yevmenkin "\t0x02 - Optional Page Scan Mode II\n" \
18730986ab12SMaksim Yevmenkin "\t0x03 - Optional Page Scan Mode III",
18740986ab12SMaksim Yevmenkin &hci_write_page_scan_mode
18750986ab12SMaksim Yevmenkin },
1876878ed226SJulian Elischer { NULL, }
1877878ed226SJulian Elischer };
1878878ed226SJulian Elischer 
1879