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