host_controller_baseband.c revision 281210
1107120Sjulian/*
2107120Sjulian * host_controller_baseband.c
3107120Sjulian *
4107120Sjulian * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5107120Sjulian * All rights reserved.
6107120Sjulian *
7107120Sjulian * Redistribution and use in source and binary forms, with or without
8107120Sjulian * modification, are permitted provided that the following conditions
9107120Sjulian * are met:
10107120Sjulian * 1. Redistributions of source code must retain the above copyright
11107120Sjulian *    notice, this list of conditions and the following disclaimer.
12107120Sjulian * 2. Redistributions in binary form must reproduce the above copyright
13107120Sjulian *    notice, this list of conditions and the following disclaimer in the
14107120Sjulian *    documentation and/or other materials provided with the distribution.
15107120Sjulian *
16107120Sjulian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17107120Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18107120Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19107120Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20107120Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21107120Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22107120Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23107120Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24107120Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25107120Sjulian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26107120Sjulian * SUCH DAMAGE.
27107120Sjulian *
28121054Semax * $Id: host_controller_baseband.c,v 1.4 2003/08/18 19:19:53 max Exp $
29107120Sjulian * $FreeBSD: head/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c 281210 2015-04-07 16:48:23Z takawata $
30107120Sjulian */
31107120Sjulian
32281210Stakawata#define L2CAP_SOCKET_CHECKED
33121054Semax#include <bluetooth.h>
34107120Sjulian#include <errno.h>
35107120Sjulian#include <stdio.h>
36107120Sjulian#include <string.h>
37107120Sjulian#include "hccontrol.h"
38107120Sjulian
39107120Sjulian/* Convert hex ASCII to int4 */
40107120Sjulianstatic int
41107120Sjulianhci_hexa2int4(const char *a)
42107120Sjulian{
43107120Sjulian	if ('0' <= *a && *a <= '9')
44107120Sjulian		return (*a - '0');
45107120Sjulian
46107120Sjulian	if ('A' <= *a && *a <= 'F')
47107120Sjulian		return (*a - 'A' + 0xa);
48107120Sjulian
49107120Sjulian	if ('a' <= *a && *a <= 'f')
50107120Sjulian		return (*a - 'a' + 0xa);
51107120Sjulian
52107120Sjulian	return (-1);
53107120Sjulian}
54107120Sjulian
55107120Sjulian/* Convert hex ASCII to int8 */
56107120Sjulianstatic int
57107120Sjulianhci_hexa2int8(const char *a)
58107120Sjulian{
59107120Sjulian	int	hi = hci_hexa2int4(a);
60107120Sjulian	int	lo = hci_hexa2int4(a + 1);
61107120Sjulian
62107120Sjulian	if (hi < 0 || lo < 0)
63107120Sjulian		return (-1);
64107120Sjulian
65107120Sjulian	return ((hi << 4) | lo);
66107120Sjulian}
67107120Sjulian
68128079Semax/* Convert ascii hex string to the uint8_t[] */
69107120Sjulianstatic int
70128079Semaxhci_hexstring2array(char const *s, uint8_t *a, int asize)
71107120Sjulian{
72107120Sjulian	int	i, l, b;
73107120Sjulian
74107120Sjulian	l = strlen(s) / 2;
75107120Sjulian	if (l > asize)
76107120Sjulian		l = asize;
77107120Sjulian
78107120Sjulian	for (i = 0; i < l; i++) {
79107120Sjulian		b = hci_hexa2int8(s + i * 2);
80107120Sjulian		if (b < 0)
81107120Sjulian			return (-1);
82107120Sjulian
83107120Sjulian		a[i] = (b & 0xff);
84107120Sjulian	}
85107120Sjulian
86107120Sjulian	return (0);
87107120Sjulian}
88107120Sjulian
89107120Sjulian/* Send RESET to the unit */
90107120Sjulianstatic int
91107120Sjulianhci_reset(int s, int argc, char **argv)
92107120Sjulian{
93107120Sjulian	ng_hci_status_rp	rp;
94107120Sjulian	int			n;
95107120Sjulian
96107120Sjulian	n = sizeof(rp);
97107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
98107120Sjulian			NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
99107120Sjulian		return (ERROR);
100107120Sjulian
101107120Sjulian	if (rp.status != 0x00) {
102107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
103107120Sjulian			hci_status2str(rp.status), rp.status);
104107120Sjulian		return (FAILED);
105107120Sjulian	}
106107120Sjulian
107107120Sjulian	return (OK);
108107120Sjulian} /* hci_reset */
109107120Sjulian
110107120Sjulian/* Send Read_PIN_Type command to the unit */
111107120Sjulianstatic int
112107120Sjulianhci_read_pin_type(int s, int argc, char **argv)
113107120Sjulian{
114107120Sjulian	ng_hci_read_pin_type_rp	rp;
115107120Sjulian	int			n;
116107120Sjulian
117107120Sjulian	n = sizeof(rp);
118107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
119107120Sjulian			NG_HCI_OCF_READ_PIN_TYPE),
120107120Sjulian			(char *) &rp, &n) == ERROR)
121107120Sjulian		return (ERROR);
122107120Sjulian
123107120Sjulian	if (rp.status != 0x00) {
124107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
125107120Sjulian			hci_status2str(rp.status), rp.status);
126107120Sjulian		return (FAILED);
127107120Sjulian	}
128107120Sjulian
129107120Sjulian	fprintf(stdout, "PIN type: %s [%#02x]\n",
130107120Sjulian			hci_pin2str(rp.pin_type), rp.pin_type);
131107120Sjulian
132107120Sjulian	return (OK);
133107120Sjulian} /* hci_read_pin_type */
134107120Sjulian
135107120Sjulian/* Send Write_PIN_Type command to the unit */
136107120Sjulianstatic int
137107120Sjulianhci_write_pin_type(int s, int argc, char **argv)
138107120Sjulian{
139107120Sjulian	ng_hci_write_pin_type_cp	cp;
140107120Sjulian	ng_hci_write_pin_type_rp	rp;
141107120Sjulian	int				n;
142107120Sjulian
143107120Sjulian	/* parse command parameters */
144107120Sjulian	switch (argc) {
145107120Sjulian	case 1:
146107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
147107120Sjulian			return (USAGE);
148107120Sjulian
149128079Semax		cp.pin_type = (uint8_t) n;
150107120Sjulian		break;
151107120Sjulian
152107120Sjulian	default:
153107120Sjulian		return (USAGE);
154107120Sjulian	}
155107120Sjulian
156107120Sjulian	/* send command */
157107120Sjulian	n = sizeof(rp);
158107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
159107120Sjulian			NG_HCI_OCF_WRITE_PIN_TYPE),
160107120Sjulian			(char const *) &cp, sizeof(cp),
161107120Sjulian			(char *) &rp , &n) ==  ERROR)
162107120Sjulian		return (ERROR);
163107120Sjulian
164107120Sjulian	if (rp.status != 0x00) {
165107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
166107120Sjulian			hci_status2str(rp.status), rp.status);
167107120Sjulian		return (FAILED);
168107120Sjulian	}
169107120Sjulian
170107120Sjulian	return (OK);
171107120Sjulian} /* hci_write_pin_type */
172107120Sjulian
173107120Sjulian/* Send Read_Stored_Link_Key command to the unit */
174107120Sjulianstatic int
175107120Sjulianhci_read_stored_link_key(int s, int argc, char **argv)
176107120Sjulian{
177107120Sjulian	struct {
178107120Sjulian		ng_hci_cmd_pkt_t			hdr;
179107120Sjulian		ng_hci_read_stored_link_key_cp		cp;
180107120Sjulian	} __attribute__ ((packed))			cmd;
181107120Sjulian
182107120Sjulian	struct {
183107120Sjulian		ng_hci_event_pkt_t			hdr;
184107120Sjulian		union {
185107120Sjulian			ng_hci_command_compl_ep		cc;
186107120Sjulian			ng_hci_return_link_keys_ep	key;
187128079Semax			uint8_t				b[NG_HCI_EVENT_PKT_SIZE];
188107120Sjulian		}					ep;
189107120Sjulian	} __attribute__ ((packed))			event;
190107120Sjulian
191121054Semax	int						n, n1;
192107120Sjulian
193107120Sjulian	/* Send command */
194107120Sjulian	memset(&cmd, 0, sizeof(cmd));
195107120Sjulian	cmd.hdr.type = NG_HCI_CMD_PKT;
196107120Sjulian	cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
197107120Sjulian				NG_HCI_OCF_READ_STORED_LINK_KEY));
198107120Sjulian	cmd.hdr.length = sizeof(cmd.cp);
199107120Sjulian
200107120Sjulian	switch (argc) {
201107120Sjulian	case 1:
202107120Sjulian		/* parse BD_ADDR */
203121054Semax		if (!bt_aton(argv[0], &cmd.cp.bdaddr)) {
204121054Semax			struct hostent	*he = NULL;
205107120Sjulian
206121054Semax			if ((he = bt_gethostbyname(argv[0])) == NULL)
207121054Semax				return (USAGE);
208121054Semax
209121054Semax			memcpy(&cmd.cp.bdaddr, he->h_addr, sizeof(cmd.cp.bdaddr));
210121054Semax		}
211107120Sjulian		break;
212107120Sjulian
213107120Sjulian	default:
214107120Sjulian		cmd.cp.read_all = 1;
215107120Sjulian		break;
216107120Sjulian	}
217107120Sjulian
218107120Sjulian	if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
219107120Sjulian		return (ERROR);
220107120Sjulian
221107120Sjulian	/* Receive events */
222107120Sjulianagain:
223107120Sjulian	memset(&event, 0, sizeof(event));
224107120Sjulian	n = sizeof(event);
225107120Sjulian	if (hci_recv(s, (char *) &event, &n) != OK)
226107120Sjulian		return (ERROR);
227107120Sjulian
228107120Sjulian	if (n <= sizeof(event.hdr)) {
229107120Sjulian		errno = EMSGSIZE;
230107120Sjulian		return (ERROR);
231107120Sjulian	}
232107120Sjulian
233107120Sjulian	if (event.hdr.type != NG_HCI_EVENT_PKT) {
234107120Sjulian		errno = EIO;
235107120Sjulian		return (ERROR);
236107120Sjulian	}
237107120Sjulian
238107120Sjulian	/* Parse event */
239107120Sjulian	switch (event.hdr.event) {
240107120Sjulian	case NG_HCI_EVENT_COMMAND_COMPL: {
241107120Sjulian		ng_hci_read_stored_link_key_rp	*rp = NULL;
242107120Sjulian
243107120Sjulian		if (event.ep.cc.opcode == 0x0000 ||
244107120Sjulian		    event.ep.cc.opcode != cmd.hdr.opcode)
245107120Sjulian			goto again;
246107120Sjulian
247107120Sjulian		rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b +
248107120Sjulian				sizeof(event.ep.cc));
249107120Sjulian
250107120Sjulian		fprintf(stdout, "Complete: Status: %s [%#x]\n",
251107120Sjulian				hci_status2str(rp->status), rp->status);
252107120Sjulian		fprintf(stdout, "Maximum Number of keys: %d\n",
253107120Sjulian				le16toh(rp->max_num_keys));
254107120Sjulian		fprintf(stdout, "Number of keys read: %d\n",
255107120Sjulian				le16toh(rp->num_keys_read));
256107120Sjulian		} break;
257107120Sjulian
258107120Sjulian	case NG_HCI_EVENT_RETURN_LINK_KEYS: {
259107120Sjulian		struct _key {
260107120Sjulian			bdaddr_t	bdaddr;
261128079Semax			uint8_t		key[NG_HCI_KEY_SIZE];
262107120Sjulian		} __attribute__ ((packed))	*k = NULL;
263107120Sjulian
264107120Sjulian		fprintf(stdout, "Event: Number of keys: %d\n",
265107120Sjulian			event.ep.key.num_keys);
266107120Sjulian
267107120Sjulian		k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
268107120Sjulian		for (n = 0; n < event.ep.key.num_keys; n++) {
269121054Semax			fprintf(stdout, "\t%d: %s ",
270121054Semax				n + 1, hci_bdaddr2str(&k->bdaddr));
271107120Sjulian
272121054Semax			for (n1 = 0; n1 < sizeof(k->key); n1++)
273121054Semax				fprintf(stdout, "%02x", k->key[n1]);
274107120Sjulian			fprintf(stdout, "\n");
275107120Sjulian
276107120Sjulian			k ++;
277107120Sjulian		}
278107120Sjulian
279107120Sjulian		goto again;
280107120Sjulian
281107120Sjulian		} break;
282107120Sjulian
283107120Sjulian	default:
284107120Sjulian		goto again;
285107120Sjulian	}
286107120Sjulian
287107120Sjulian	return (OK);
288107120Sjulian} /* hci_read_store_link_key */
289107120Sjulian
290107120Sjulian/* Send Write_Stored_Link_Key command to the unit */
291107120Sjulianstatic int
292107120Sjulianhci_write_stored_link_key(int s, int argc, char **argv)
293107120Sjulian{
294107120Sjulian	struct {
295107120Sjulian		ng_hci_write_stored_link_key_cp	p;
296107120Sjulian		bdaddr_t			bdaddr;
297128079Semax		uint8_t				key[NG_HCI_KEY_SIZE];
298107120Sjulian	}					cp;
299107120Sjulian	ng_hci_write_stored_link_key_rp		rp;
300121054Semax	int32_t					n;
301107120Sjulian
302107120Sjulian	memset(&cp, 0, sizeof(cp));
303107120Sjulian
304107120Sjulian	switch (argc) {
305107120Sjulian	case 2:
306107120Sjulian		cp.p.num_keys_write = 1;
307107120Sjulian
308107120Sjulian		/* parse BD_ADDR */
309121054Semax		if (!bt_aton(argv[0], &cp.bdaddr)) {
310121054Semax			struct hostent	*he = NULL;
311107120Sjulian
312121054Semax			if ((he = bt_gethostbyname(argv[0])) == NULL)
313121054Semax				return (USAGE);
314107120Sjulian
315121054Semax			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
316121054Semax		}
317121054Semax
318107120Sjulian		/* parse key */
319107120Sjulian		if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
320107120Sjulian			return (USAGE);
321107120Sjulian		break;
322107120Sjulian
323107120Sjulian	default:
324107120Sjulian		return (USAGE);
325107120Sjulian	}
326107120Sjulian
327107120Sjulian	/* send command */
328107120Sjulian	n = sizeof(rp);
329107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
330107120Sjulian			NG_HCI_OCF_WRITE_STORED_LINK_KEY),
331107120Sjulian			(char const *) &cp, sizeof(cp),
332107120Sjulian			(char *) &rp, &n) == ERROR)
333107120Sjulian		return (ERROR);
334107120Sjulian
335107120Sjulian	if (rp.status != 0x00) {
336107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
337107120Sjulian			hci_status2str(rp.status), rp.status);
338107120Sjulian		return (FAILED);
339107120Sjulian	}
340107120Sjulian
341107120Sjulian	fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
342107120Sjulian
343107120Sjulian	return (OK);
344107120Sjulian} /* hci_write_stored_link_key */
345107120Sjulian
346107120Sjulian
347107120Sjulian/* Send Delete_Stored_Link_Key command to the unit */
348107120Sjulianstatic int
349107120Sjulianhci_delete_stored_link_key(int s, int argc, char **argv)
350107120Sjulian{
351107120Sjulian	ng_hci_delete_stored_link_key_cp	cp;
352107120Sjulian	ng_hci_delete_stored_link_key_rp	rp;
353121054Semax	int32_t					n;
354107120Sjulian
355107120Sjulian	memset(&cp, 0, sizeof(cp));
356107120Sjulian
357107120Sjulian	switch (argc) {
358107120Sjulian	case 1:
359107120Sjulian		/* parse BD_ADDR */
360121054Semax		if (!bt_aton(argv[0], &cp.bdaddr)) {
361121054Semax			struct hostent	*he = NULL;
362107120Sjulian
363121054Semax			if ((he = bt_gethostbyname(argv[0])) == NULL)
364121054Semax				return (USAGE);
365121054Semax
366121054Semax			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
367121054Semax		}
368107120Sjulian		break;
369107120Sjulian
370107120Sjulian	default:
371107120Sjulian		cp.delete_all = 1;
372107120Sjulian		break;
373107120Sjulian	}
374107120Sjulian
375107120Sjulian	/* send command */
376107120Sjulian	n = sizeof(cp);
377107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
378107120Sjulian			NG_HCI_OCF_DELETE_STORED_LINK_KEY),
379107120Sjulian			(char const *) &cp, sizeof(cp),
380107120Sjulian			(char *) &rp, &n) == ERROR)
381107120Sjulian		return (ERROR);
382107120Sjulian
383107120Sjulian	if (rp.status != 0x00) {
384107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
385107120Sjulian			hci_status2str(rp.status), rp.status);
386107120Sjulian		return (FAILED);
387107120Sjulian	}
388107120Sjulian
389107120Sjulian	fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
390107120Sjulian
391107120Sjulian	return (OK);
392107120Sjulian} /* hci_delete_stored_link_key */
393107120Sjulian
394107120Sjulian/* Send Change_Local_Name command to the unit */
395107120Sjulianstatic int
396107120Sjulianhci_change_local_name(int s, int argc, char **argv)
397107120Sjulian{
398107120Sjulian	ng_hci_change_local_name_cp	cp;
399107120Sjulian	ng_hci_change_local_name_rp	rp;
400107120Sjulian	int				n;
401107120Sjulian
402107120Sjulian	/* parse command parameters */
403107120Sjulian	switch (argc) {
404107120Sjulian	case 1:
405107120Sjulian		snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
406107120Sjulian		break;
407107120Sjulian
408107120Sjulian	default:
409107120Sjulian		return (USAGE);
410107120Sjulian	}
411107120Sjulian
412107120Sjulian	/* send command */
413107120Sjulian	n = sizeof(rp);
414107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
415107120Sjulian			NG_HCI_OCF_CHANGE_LOCAL_NAME),
416107120Sjulian			(char const *) &cp, sizeof(cp),
417107120Sjulian			(char *) &rp, &n) == ERROR)
418107120Sjulian		return (ERROR);
419107120Sjulian
420107120Sjulian	if (rp.status != 0x00) {
421107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
422107120Sjulian			hci_status2str(rp.status), rp.status);
423107120Sjulian		return (FAILED);
424107120Sjulian	}
425107120Sjulian
426107120Sjulian	return (OK);
427107120Sjulian} /* hci_change_local_name */
428107120Sjulian
429107120Sjulian/* Send Read_Local_Name command to the unit */
430107120Sjulianstatic int
431107120Sjulianhci_read_local_name(int s, int argc, char **argv)
432107120Sjulian{
433107120Sjulian	ng_hci_read_local_name_rp	rp;
434107120Sjulian	int				n;
435107120Sjulian
436107120Sjulian	n = sizeof(rp);
437107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
438107120Sjulian			NG_HCI_OCF_READ_LOCAL_NAME),
439107120Sjulian			(char *) &rp, &n) == ERROR)
440107120Sjulian		return (ERROR);
441107120Sjulian
442107120Sjulian	if (rp.status != 0x00) {
443107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
444107120Sjulian			hci_status2str(rp.status), rp.status);
445107120Sjulian		return (FAILED);
446107120Sjulian	}
447107120Sjulian
448107120Sjulian	fprintf(stdout, "Local name: %s\n", rp.name);
449107120Sjulian
450107120Sjulian	return (OK);
451107120Sjulian} /* hci_read_local_name */
452107120Sjulian
453107120Sjulian/* Send Read_Connection_Accept_Timeout to the unit */
454107120Sjulianstatic int
455107120Sjulianhci_read_connection_accept_timeout(int s, int argc, char **argv)
456107120Sjulian{
457107120Sjulian	ng_hci_read_con_accept_timo_rp	rp;
458107120Sjulian	int				n;
459107120Sjulian
460107120Sjulian	n = sizeof(rp);
461107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
462107120Sjulian			NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
463107120Sjulian			(char *) &rp, &n) == ERROR)
464107120Sjulian		return (ERROR);
465107120Sjulian
466107120Sjulian	if (rp.status != 0x00) {
467107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
468107120Sjulian			hci_status2str(rp.status), rp.status);
469107120Sjulian		return (FAILED);
470107120Sjulian	}
471107120Sjulian
472107120Sjulian	rp.timeout = le16toh(rp.timeout);
473107120Sjulian	fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
474107120Sjulian			rp.timeout * 0.625, rp.timeout);
475107120Sjulian
476107120Sjulian	return (OK);
477107120Sjulian} /* hci_read_connection_accept_timeout */
478107120Sjulian
479107120Sjulian/* Send Write_Connection_Accept_Timeout to the unit */
480107120Sjulianstatic int
481107120Sjulianhci_write_connection_accept_timeout(int s, int argc, char **argv)
482107120Sjulian{
483107120Sjulian	ng_hci_write_con_accept_timo_cp	cp;
484107120Sjulian	ng_hci_write_con_accept_timo_rp	rp;
485107120Sjulian	int				n;
486107120Sjulian
487107120Sjulian	/* parse command parameters */
488107120Sjulian	switch (argc) {
489107120Sjulian	case 1:
490107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
491107120Sjulian			return (USAGE);
492107120Sjulian
493128079Semax		cp.timeout = (uint16_t) n;
494107120Sjulian		cp.timeout = htole16(cp.timeout);
495107120Sjulian		break;
496107120Sjulian
497107120Sjulian	default:
498107120Sjulian		return (USAGE);
499107120Sjulian	}
500107120Sjulian
501107120Sjulian	/* send command */
502107120Sjulian	n = sizeof(rp);
503107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
504107120Sjulian			NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
505107120Sjulian			(char const *) &cp, sizeof(cp),
506107120Sjulian			(char *) &rp, &n) == ERROR)
507107120Sjulian		return (ERROR);
508107120Sjulian
509107120Sjulian	if (rp.status != 0x00) {
510107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
511107120Sjulian			hci_status2str(rp.status), rp.status);
512107120Sjulian		return (FAILED);
513107120Sjulian	}
514107120Sjulian
515107120Sjulian	return (OK);
516107120Sjulian} /* hci_write_connection_accept_timeout */
517107120Sjulian
518107120Sjulian/* Send Read_Page_Timeout command to the unit */
519107120Sjulianstatic int
520107120Sjulianhci_read_page_timeout(int s, int argc, char **argv)
521107120Sjulian{
522107120Sjulian	ng_hci_read_page_timo_rp	rp;
523107120Sjulian	int				n;
524107120Sjulian
525107120Sjulian	n = sizeof(rp);
526107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
527107120Sjulian			NG_HCI_OCF_READ_PAGE_TIMO),
528107120Sjulian			(char *) &rp, &n) == ERROR)
529107120Sjulian		return (ERROR);
530107120Sjulian
531107120Sjulian	if (rp.status != 0x00) {
532107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
533107120Sjulian			hci_status2str(rp.status), rp.status);
534107120Sjulian		return (FAILED);
535107120Sjulian	}
536107120Sjulian
537107120Sjulian	rp.timeout = le16toh(rp.timeout);
538107120Sjulian	fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
539107120Sjulian		rp.timeout * 0.625, rp.timeout);
540107120Sjulian
541107120Sjulian	return (OK);
542107120Sjulian} /* hci_read_page_timeoout */
543107120Sjulian
544107120Sjulian/* Send Write_Page_Timeout command to the unit */
545107120Sjulianstatic int
546107120Sjulianhci_write_page_timeout(int s, int argc, char **argv)
547107120Sjulian{
548107120Sjulian	ng_hci_write_page_timo_cp	cp;
549107120Sjulian	ng_hci_write_page_timo_rp	rp;
550107120Sjulian	int				n;
551107120Sjulian
552107120Sjulian	/* parse command parameters */
553107120Sjulian	switch (argc) {
554107120Sjulian	case 1:
555107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
556107120Sjulian			return (USAGE);
557107120Sjulian
558128079Semax		cp.timeout = (uint16_t) n;
559107120Sjulian		cp.timeout = htole16(cp.timeout);
560107120Sjulian		break;
561107120Sjulian
562107120Sjulian	default:
563107120Sjulian		return (USAGE);
564107120Sjulian	}
565107120Sjulian
566107120Sjulian	/* send command */
567107120Sjulian	n = sizeof(rp);
568107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
569107120Sjulian			NG_HCI_OCF_WRITE_PAGE_TIMO),
570107120Sjulian			(char const *) &cp, sizeof(cp),
571107120Sjulian			(char *) &rp, &n) == ERROR)
572107120Sjulian		return (ERROR);
573107120Sjulian
574107120Sjulian	if (rp.status != 0x00) {
575107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
576107120Sjulian			hci_status2str(rp.status), rp.status);
577107120Sjulian		return (FAILED);
578107120Sjulian	}
579107120Sjulian
580107120Sjulian	return (OK);
581107120Sjulian} /* hci_write_page_timeout */
582107120Sjulian
583107120Sjulian/* Send Read_Scan_Enable command to the unit */
584107120Sjulianstatic int
585107120Sjulianhci_read_scan_enable(int s, int argc, char **argv)
586107120Sjulian{
587107120Sjulian	ng_hci_read_scan_enable_rp	rp;
588107120Sjulian	int				n;
589107120Sjulian
590107120Sjulian	n = sizeof(rp);
591107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
592107120Sjulian			NG_HCI_OCF_READ_SCAN_ENABLE),
593107120Sjulian			(char *) &rp, &n) == ERROR)
594107120Sjulian		return (ERROR);
595107120Sjulian
596107120Sjulian	if (rp.status != 0x00) {
597107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
598107120Sjulian			hci_status2str(rp.status), rp.status);
599107120Sjulian		return (FAILED);
600107120Sjulian	}
601107120Sjulian
602107120Sjulian	fprintf(stdout, "Scan enable: %s [%#02x]\n",
603107120Sjulian		hci_scan2str(rp.scan_enable), rp.scan_enable);
604107120Sjulian
605107120Sjulian	return (OK);
606107120Sjulian} /* hci_read_scan_enable */
607107120Sjulian
608107120Sjulian/* Send Write_Scan_Enable command to the unit */
609107120Sjulianstatic int
610107120Sjulianhci_write_scan_enable(int s, int argc, char **argv)
611107120Sjulian{
612107120Sjulian	ng_hci_write_scan_enable_cp	cp;
613107120Sjulian	ng_hci_write_scan_enable_rp	rp;
614107120Sjulian	int				n;
615107120Sjulian
616107120Sjulian	/* parse command parameters */
617107120Sjulian	switch (argc) {
618107120Sjulian	case 1:
619107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
620107120Sjulian			return (USAGE);
621107120Sjulian
622128079Semax		cp.scan_enable = (uint8_t) n;
623107120Sjulian		break;
624107120Sjulian
625107120Sjulian	default:
626107120Sjulian		return (USAGE);
627107120Sjulian	}
628107120Sjulian
629107120Sjulian	n = sizeof(rp);
630107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
631107120Sjulian			NG_HCI_OCF_WRITE_SCAN_ENABLE),
632107120Sjulian			(char const *) &cp, sizeof(cp),
633107120Sjulian			(char *) &rp, &n) == ERROR)
634107120Sjulian		return (ERROR);
635107120Sjulian
636107120Sjulian	if (rp.status != 0x00) {
637107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
638107120Sjulian			hci_status2str(rp.status), rp.status);
639107120Sjulian		return (FAILED);
640107120Sjulian	}
641107120Sjulian
642107120Sjulian	return (OK);
643107120Sjulian} /* hci_write_scan_enable */
644107120Sjulian
645107120Sjulian/* Send Read_Page_Scan_Activity command to the unit */
646107120Sjulianstatic int
647107120Sjulianhci_read_page_scan_activity(int s, int argc, char **argv)
648107120Sjulian{
649107120Sjulian	ng_hci_read_page_scan_activity_rp	rp;
650107120Sjulian	int					n;
651107120Sjulian
652107120Sjulian	n = sizeof(rp);
653107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
654107120Sjulian			NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
655107120Sjulian			(char *) &rp, &n) == ERROR)
656107120Sjulian		return (ERROR);
657107120Sjulian
658107120Sjulian	if (rp.status != 0x00) {
659107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
660107120Sjulian			hci_status2str(rp.status), rp.status);
661107120Sjulian		return (FAILED);
662107120Sjulian	}
663107120Sjulian
664107120Sjulian	rp.page_scan_interval = le16toh(rp.page_scan_interval);
665107120Sjulian	rp.page_scan_window = le16toh(rp.page_scan_window);
666107120Sjulian
667107120Sjulian	fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
668107120Sjulian		rp.page_scan_interval * 0.625, rp.page_scan_interval);
669107120Sjulian	fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
670107120Sjulian		rp.page_scan_window * 0.625, rp.page_scan_window);
671107120Sjulian
672107120Sjulian	return (OK);
673107120Sjulian} /* hci_read_page_scan_activity */
674107120Sjulian
675107120Sjulian/* Send Write_Page_Scan_Activity command to the unit */
676107120Sjulianstatic int
677107120Sjulianhci_write_page_scan_activity(int s, int argc, char **argv)
678107120Sjulian{
679107120Sjulian	ng_hci_write_page_scan_activity_cp	cp;
680107120Sjulian	ng_hci_write_page_scan_activity_rp	rp;
681107120Sjulian	int					n;
682107120Sjulian
683107120Sjulian	/* parse command parameters */
684107120Sjulian	switch (argc) {
685107120Sjulian	case 2:
686107120Sjulian		/* page scan interval */
687107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
688107120Sjulian			return (USAGE);
689107120Sjulian
690128079Semax		cp.page_scan_interval = (uint16_t) n;
691107120Sjulian
692107120Sjulian		/* page scan window */
693131216Semax		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
694107120Sjulian			return (USAGE);
695107120Sjulian
696128079Semax		cp.page_scan_window = (uint16_t) n;
697107120Sjulian
698107120Sjulian		if (cp.page_scan_window > cp.page_scan_interval)
699107120Sjulian			return (USAGE);
700107120Sjulian
701107120Sjulian		cp.page_scan_interval = htole16(cp.page_scan_interval);
702107120Sjulian		cp.page_scan_window = htole16(cp.page_scan_window);
703107120Sjulian		break;
704107120Sjulian
705107120Sjulian	default:
706107120Sjulian		return (USAGE);
707107120Sjulian	}
708107120Sjulian
709107120Sjulian	/* send command */
710107120Sjulian	n = sizeof(rp);
711107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
712107120Sjulian			NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
713107120Sjulian			(char const *) &cp, sizeof(cp),
714107120Sjulian			(char *) &rp, &n) == ERROR)
715107120Sjulian		return (ERROR);
716107120Sjulian
717107120Sjulian	if (rp.status != 0x00) {
718107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
719107120Sjulian			hci_status2str(rp.status), rp.status);
720107120Sjulian		return (FAILED);
721107120Sjulian	}
722107120Sjulian
723107120Sjulian	return (OK);
724107120Sjulian} /* hci_write_page_scan_activity */
725107120Sjulian
726107120Sjulian/* Send Read_Inquiry_Scan_Activity command to the unit */
727107120Sjulianstatic int
728107120Sjulianhci_read_inquiry_scan_activity(int s, int argc, char **argv)
729107120Sjulian{
730107120Sjulian	ng_hci_read_inquiry_scan_activity_rp	rp;
731107120Sjulian	int					n;
732107120Sjulian
733107120Sjulian	n = sizeof(rp);
734107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
735107120Sjulian			NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
736107120Sjulian			(char *) &rp, &n) == ERROR)
737107120Sjulian		return (ERROR);
738107120Sjulian
739107120Sjulian	if (rp.status != 0x00) {
740107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
741107120Sjulian			hci_status2str(rp.status), rp.status);
742107120Sjulian		return (FAILED);
743107120Sjulian	}
744107120Sjulian
745107120Sjulian	rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
746107120Sjulian	rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
747107120Sjulian
748107120Sjulian	fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
749107120Sjulian		rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
750107120Sjulian	fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
751107120Sjulian		rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
752107120Sjulian
753107120Sjulian	return (OK);
754107120Sjulian} /* hci_read_inquiry_scan_activity */
755107120Sjulian
756107120Sjulian/* Send Write_Inquiry_Scan_Activity command to the unit */
757107120Sjulianstatic int
758107120Sjulianhci_write_inquiry_scan_activity(int s, int argc, char **argv)
759107120Sjulian{
760107120Sjulian	ng_hci_write_inquiry_scan_activity_cp	cp;
761107120Sjulian	ng_hci_write_inquiry_scan_activity_rp	rp;
762107120Sjulian	int					n;
763107120Sjulian
764107120Sjulian	/* parse command parameters */
765107120Sjulian	switch (argc) {
766107120Sjulian	case 2:
767107120Sjulian		/* inquiry scan interval */
768107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
769107120Sjulian			return (USAGE);
770107120Sjulian
771128079Semax		cp.inquiry_scan_interval = (uint16_t) n;
772107120Sjulian
773107120Sjulian		/* inquiry scan window */
774131216Semax		if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
775107120Sjulian			return (USAGE);
776107120Sjulian
777128079Semax		cp.inquiry_scan_window = (uint16_t) n;
778107120Sjulian
779107120Sjulian		if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
780107120Sjulian			return (USAGE);
781107120Sjulian
782107120Sjulian		cp.inquiry_scan_interval =
783107120Sjulian			htole16(cp.inquiry_scan_interval);
784107120Sjulian		cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
785107120Sjulian		break;
786107120Sjulian
787107120Sjulian	default:
788107120Sjulian		return (USAGE);
789107120Sjulian	}
790107120Sjulian
791107120Sjulian	/* send command */
792107120Sjulian	n = sizeof(rp);
793107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
794107120Sjulian			NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
795107120Sjulian			(char const *) &cp, sizeof(cp),
796107120Sjulian			(char *) &rp, &n) == ERROR)
797107120Sjulian		return (ERROR);
798107120Sjulian
799107120Sjulian	if (rp.status != 0x00) {
800107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
801107120Sjulian			hci_status2str(rp.status), rp.status);
802107120Sjulian		return (FAILED);
803107120Sjulian	}
804107120Sjulian
805107120Sjulian	return (OK);
806107120Sjulian} /* hci_write_inquiry_scan_activity */
807107120Sjulian
808107120Sjulian/* Send Read_Authentication_Enable command to the unit */
809107120Sjulianstatic int
810107120Sjulianhci_read_authentication_enable(int s, int argc, char **argv)
811107120Sjulian{
812107120Sjulian	ng_hci_read_auth_enable_rp	rp;
813107120Sjulian	int				n;
814107120Sjulian
815107120Sjulian	n = sizeof(rp);
816107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
817107120Sjulian			NG_HCI_OCF_READ_AUTH_ENABLE),
818107120Sjulian			(char *) &rp, &n) == ERROR)
819107120Sjulian		return (ERROR);
820107120Sjulian
821107120Sjulian	if (rp.status != 0x00) {
822107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
823107120Sjulian			hci_status2str(rp.status), rp.status);
824107120Sjulian		return (FAILED);
825107120Sjulian	}
826107120Sjulian
827107120Sjulian	fprintf(stdout, "Authentication Enable: %s [%d]\n",
828107120Sjulian		rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
829107120Sjulian
830107120Sjulian	return (OK);
831107120Sjulian} /* hci_read_authentication_enable */
832107120Sjulian
833107120Sjulian/* Send Write_Authentication_Enable command to the unit */
834107120Sjulianstatic int
835107120Sjulianhci_write_authentication_enable(int s, int argc, char **argv)
836107120Sjulian{
837107120Sjulian	ng_hci_write_auth_enable_cp	cp;
838107120Sjulian	ng_hci_write_auth_enable_rp	rp;
839107120Sjulian	int				n;
840107120Sjulian
841107120Sjulian	/* parse command parameters */
842107120Sjulian	switch (argc) {
843107120Sjulian	case 1:
844107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
845107120Sjulian			return (USAGE);
846107120Sjulian
847128079Semax		cp.auth_enable = (uint8_t) n;
848107120Sjulian		break;
849107120Sjulian
850107120Sjulian	default:
851107120Sjulian		return (USAGE);
852107120Sjulian	}
853107120Sjulian
854107120Sjulian	/* send command */
855107120Sjulian	n = sizeof(rp);
856107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
857107120Sjulian			NG_HCI_OCF_WRITE_AUTH_ENABLE),
858107120Sjulian			(char const *) &cp, sizeof(cp),
859107120Sjulian			(char *) &rp, &n) == ERROR)
860107120Sjulian		return (ERROR);
861107120Sjulian
862107120Sjulian	if (rp.status != 0x00) {
863107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
864107120Sjulian			hci_status2str(rp.status), rp.status);
865107120Sjulian		return (FAILED);
866107120Sjulian	}
867107120Sjulian
868107120Sjulian	return (OK);
869107120Sjulian} /* hci_write_authentication_enable */
870107120Sjulian
871107120Sjulian/* Send Read_Encryption_Mode command to the unit */
872107120Sjulianstatic int
873107120Sjulianhci_read_encryption_mode(int s, int argc, char **argv)
874107120Sjulian{
875107120Sjulian	ng_hci_read_encryption_mode_rp	rp;
876107120Sjulian	int				n;
877107120Sjulian
878107120Sjulian	n = sizeof(rp);
879107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
880107120Sjulian			NG_HCI_OCF_READ_ENCRYPTION_MODE),
881107120Sjulian			(char *) &rp, &n) == ERROR)
882107120Sjulian		return (ERROR);
883107120Sjulian
884107120Sjulian	if (rp.status != 0x00) {
885107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
886107120Sjulian			hci_status2str(rp.status), rp.status);
887107120Sjulian		return (FAILED);
888107120Sjulian	}
889107120Sjulian
890107120Sjulian	fprintf(stdout, "Encryption mode: %s [%#02x]\n",
891107120Sjulian		hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
892107120Sjulian
893107120Sjulian	return (OK);
894107120Sjulian} /* hci_read_encryption_mode */
895107120Sjulian
896107120Sjulian/* Send Write_Encryption_Mode command to the unit */
897107120Sjulianstatic int
898107120Sjulianhci_write_encryption_mode(int s, int argc, char **argv)
899107120Sjulian{
900107120Sjulian	ng_hci_write_encryption_mode_cp	cp;
901107120Sjulian	ng_hci_write_encryption_mode_rp	rp;
902107120Sjulian	int				n;
903107120Sjulian
904107120Sjulian	/* parse command parameters */
905107120Sjulian	switch (argc) {
906107120Sjulian	case 1:
907107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
908107120Sjulian			return (USAGE);
909107120Sjulian
910128079Semax		cp.encryption_mode = (uint8_t) n;
911107120Sjulian		break;
912107120Sjulian
913107120Sjulian	default:
914107120Sjulian		return (USAGE);
915107120Sjulian	}
916107120Sjulian
917107120Sjulian	/* send command */
918107120Sjulian	n = sizeof(rp);
919107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
920107120Sjulian			NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
921107120Sjulian			(char const *) &cp, sizeof(cp),
922107120Sjulian			(char *) &rp, &n) == ERROR)
923107120Sjulian		return (ERROR);
924107120Sjulian
925107120Sjulian	if (rp.status != 0x00) {
926107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
927107120Sjulian			hci_status2str(rp.status), rp.status);
928107120Sjulian		return (FAILED);
929107120Sjulian	}
930107120Sjulian
931107120Sjulian	return (OK);
932107120Sjulian} /* hci_write_encryption_mode */
933107120Sjulian
934107120Sjulian/* Send Read_Class_Of_Device command to the unit */
935107120Sjulianstatic int
936107120Sjulianhci_read_class_of_device(int s, int argc, char **argv)
937107120Sjulian{
938107120Sjulian	ng_hci_read_unit_class_rp	rp;
939107120Sjulian	int				n;
940107120Sjulian
941107120Sjulian	n = sizeof(rp);
942107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
943107120Sjulian			NG_HCI_OCF_READ_UNIT_CLASS),
944107120Sjulian			(char *) &rp, &n) == ERROR)
945107120Sjulian		return (ERROR);
946107120Sjulian
947107120Sjulian	if (rp.status != 0x00) {
948107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
949107120Sjulian			hci_status2str(rp.status), rp.status);
950107120Sjulian		return (FAILED);
951107120Sjulian	}
952107120Sjulian
953107120Sjulian	fprintf(stdout, "Class: %02x:%02x:%02x\n",
954107120Sjulian		rp.uclass[2], rp.uclass[1], rp.uclass[0]);
955107120Sjulian
956107120Sjulian	return (0);
957107120Sjulian} /* hci_read_class_of_device */
958107120Sjulian
959107120Sjulian/* Send Write_Class_Of_Device command to the unit */
960107120Sjulianstatic int
961107120Sjulianhci_write_class_of_device(int s, int argc, char **argv)
962107120Sjulian{
963107120Sjulian	ng_hci_write_unit_class_cp	cp;
964107120Sjulian	ng_hci_write_unit_class_rp	rp;
965107120Sjulian	int				n0, n1, n2;
966107120Sjulian
967107120Sjulian	/* parse command parameters */
968107120Sjulian	switch (argc) {
969107120Sjulian	case 1:
970107120Sjulian		if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
971107120Sjulian			return (USAGE);
972107120Sjulian
973107120Sjulian		cp.uclass[0] = (n0 & 0xff);
974107120Sjulian		cp.uclass[1] = (n1 & 0xff);
975107120Sjulian		cp.uclass[2] = (n2 & 0xff);
976107120Sjulian		break;
977107120Sjulian
978107120Sjulian	default:
979107120Sjulian		return (USAGE);
980107120Sjulian	}
981107120Sjulian
982107120Sjulian	/* send command */
983107120Sjulian	n0 = sizeof(rp);
984107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
985107120Sjulian			NG_HCI_OCF_WRITE_UNIT_CLASS),
986107120Sjulian			(char const *) &cp, sizeof(cp),
987107120Sjulian			(char *) &rp, &n0) == ERROR)
988107120Sjulian		return (ERROR);
989107120Sjulian
990107120Sjulian	if (rp.status != 0x00) {
991107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
992107120Sjulian			hci_status2str(rp.status), rp.status);
993107120Sjulian		return (FAILED);
994107120Sjulian	}
995107120Sjulian
996107120Sjulian	return (OK);
997107120Sjulian} /* hci_write_class_of_device */
998107120Sjulian
999107120Sjulian/* Send Read_Voice_Settings command to the unit */
1000107120Sjulianstatic int
1001107120Sjulianhci_read_voice_settings(int s, int argc, char **argv)
1002107120Sjulian{
1003107120Sjulian	ng_hci_read_voice_settings_rp	rp;
1004107120Sjulian	int				n,
1005107120Sjulian					input_coding,
1006107120Sjulian					input_data_format,
1007107120Sjulian					input_sample_size;
1008107120Sjulian
1009107120Sjulian	n = sizeof(rp);
1010107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1011107120Sjulian			NG_HCI_OCF_READ_VOICE_SETTINGS),
1012107120Sjulian			(char *) &rp, &n) == ERROR)
1013107120Sjulian		return (ERROR);
1014107120Sjulian
1015107120Sjulian	if (rp.status != 0x00) {
1016107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1017107120Sjulian			hci_status2str(rp.status), rp.status);
1018107120Sjulian		return (FAILED);
1019107120Sjulian	}
1020107120Sjulian
1021107120Sjulian	rp.settings = le16toh(rp.settings);
1022107120Sjulian
1023107120Sjulian	input_coding      = (rp.settings & 0x0300) >> 8;
1024107120Sjulian	input_data_format = (rp.settings & 0x00c0) >> 6;
1025107120Sjulian	input_sample_size = (rp.settings & 0x0020) >> 5;
1026107120Sjulian
1027107120Sjulian	fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1028107120Sjulian	fprintf(stdout, "Input coding: %s [%d]\n",
1029107120Sjulian		hci_coding2str(input_coding), input_coding);
1030107120Sjulian	fprintf(stdout, "Input data format: %s [%d]\n",
1031107120Sjulian		hci_vdata2str(input_data_format), input_data_format);
1032107120Sjulian
1033107120Sjulian	if (input_coding == 0x00) /* Only for Linear PCM */
1034107120Sjulian		fprintf(stdout, "Input sample size: %d bit [%d]\n",
1035107120Sjulian			input_sample_size? 16 : 8, input_sample_size);
1036107120Sjulian
1037107120Sjulian	return (OK);
1038107120Sjulian} /* hci_read_voice_settings */
1039107120Sjulian
1040107120Sjulian/* Send Write_Voice_Settings command to the unit */
1041107120Sjulianstatic int
1042107120Sjulianhci_write_voice_settings(int s, int argc, char **argv)
1043107120Sjulian{
1044107120Sjulian	ng_hci_write_voice_settings_cp	cp;
1045107120Sjulian	ng_hci_write_voice_settings_rp	rp;
1046107120Sjulian	int				n;
1047107120Sjulian
1048107120Sjulian	/* parse command parameters */
1049107120Sjulian	switch (argc) {
1050107120Sjulian	case 1:
1051107120Sjulian		if (sscanf(argv[0], "%x", &n) != 1)
1052107120Sjulian			return (USAGE);
1053107120Sjulian
1054128079Semax		cp.settings = (uint16_t) n;
1055107120Sjulian		cp.settings = htole16(cp.settings);
1056107120Sjulian		break;
1057107120Sjulian
1058107120Sjulian	default:
1059107120Sjulian		return (USAGE);
1060107120Sjulian	}
1061107120Sjulian
1062107120Sjulian	/* send command */
1063107120Sjulian	n = sizeof(rp);
1064107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1065107120Sjulian			NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1066107120Sjulian			(char const *) &cp, sizeof(cp),
1067107120Sjulian			(char *) &rp, &n) == ERROR)
1068107120Sjulian		return (ERROR);
1069107120Sjulian
1070107120Sjulian	if (rp.status != 0x00) {
1071107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1072107120Sjulian			hci_status2str(rp.status), rp.status);
1073107120Sjulian		return (FAILED);
1074107120Sjulian	}
1075107120Sjulian
1076107120Sjulian	return (OK);
1077107120Sjulian} /* hci_write_voice_settings */
1078107120Sjulian
1079107120Sjulian/* Send Read_Number_Broadcast_Restransmissions */
1080107120Sjulianstatic int
1081107120Sjulianhci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1082107120Sjulian{
1083107120Sjulian	ng_hci_read_num_broadcast_retrans_rp	rp;
1084107120Sjulian	int					n;
1085107120Sjulian
1086107120Sjulian	n = sizeof(rp);
1087107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1088107120Sjulian			NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1089107120Sjulian			(char *) &rp, &n) == ERROR)
1090107120Sjulian		return (ERROR);
1091107120Sjulian
1092107120Sjulian	if (rp.status != 0x00) {
1093107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1094107120Sjulian			hci_status2str(rp.status), rp.status);
1095107120Sjulian		return (FAILED);
1096107120Sjulian	}
1097107120Sjulian
1098107120Sjulian	fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1099107120Sjulian		rp.counter);
1100107120Sjulian
1101107120Sjulian	return (OK);
1102107120Sjulian} /* hci_read_number_broadcast_retransmissions */
1103107120Sjulian
1104107120Sjulian/* Send Write_Number_Broadcast_Restransmissions */
1105107120Sjulianstatic int
1106107120Sjulianhci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1107107120Sjulian{
1108107120Sjulian	ng_hci_write_num_broadcast_retrans_cp	cp;
1109107120Sjulian	ng_hci_write_num_broadcast_retrans_rp	rp;
1110107120Sjulian	int					n;
1111107120Sjulian
1112107120Sjulian	/* parse command parameters */
1113107120Sjulian	switch (argc) {
1114107120Sjulian	case 1:
1115107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1116107120Sjulian			return (USAGE);
1117107120Sjulian
1118128079Semax		cp.counter = (uint8_t) n;
1119107120Sjulian		break;
1120107120Sjulian
1121107120Sjulian	default:
1122107120Sjulian		return (USAGE);
1123107120Sjulian	}
1124107120Sjulian
1125107120Sjulian	/* send command */
1126107120Sjulian	n = sizeof(rp);
1127107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1128107120Sjulian			NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1129107120Sjulian			(char const *) &cp, sizeof(cp),
1130107120Sjulian			(char *) &rp, &n) == ERROR)
1131107120Sjulian		return (ERROR);
1132107120Sjulian
1133107120Sjulian	if (rp.status != 0x00) {
1134107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1135107120Sjulian			hci_status2str(rp.status), rp.status);
1136107120Sjulian		return (FAILED);
1137107120Sjulian	}
1138107120Sjulian
1139107120Sjulian	return (OK);
1140107120Sjulian} /* hci_write_number_broadcast_retransmissions */
1141107120Sjulian
1142107120Sjulian/* Send Read_Hold_Mode_Activity command to the unit */
1143107120Sjulianstatic int
1144107120Sjulianhci_read_hold_mode_activity(int s, int argc, char **argv)
1145107120Sjulian{
1146107120Sjulian	ng_hci_read_hold_mode_activity_rp	rp;
1147107120Sjulian	int					n;
1148107120Sjulian	char					buffer[1024];
1149107120Sjulian
1150107120Sjulian	n = sizeof(rp);
1151107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1152107120Sjulian			NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1153107120Sjulian			(char *) &rp, &n) == ERROR)
1154107120Sjulian		return (ERROR);
1155107120Sjulian
1156107120Sjulian	if (rp.status != 0x00) {
1157107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1158107120Sjulian			hci_status2str(rp.status), rp.status);
1159107120Sjulian		return (FAILED);
1160107120Sjulian	}
1161107120Sjulian
1162107120Sjulian	fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1163107120Sjulian	if (rp.hold_mode_activity == 0)
1164107120Sjulian		fprintf(stdout, "Maintain current Power State");
1165107120Sjulian	else
1166107120Sjulian		fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1167107120Sjulian				buffer, sizeof(buffer)));
1168107120Sjulian
1169107120Sjulian	fprintf(stdout, "\n");
1170107120Sjulian
1171107120Sjulian	return (OK);
1172107120Sjulian} /* hci_read_hold_mode_activity */
1173107120Sjulian
1174107120Sjulian/* Send Write_Hold_Mode_Activity command to the unit */
1175107120Sjulianstatic int
1176107120Sjulianhci_write_hold_mode_activity(int s, int argc, char **argv)
1177107120Sjulian{
1178107120Sjulian	ng_hci_write_hold_mode_activity_cp	cp;
1179107120Sjulian	ng_hci_write_hold_mode_activity_rp	rp;
1180107120Sjulian	int					n;
1181107120Sjulian
1182107120Sjulian	/* parse command parameters */
1183107120Sjulian	switch (argc) {
1184107120Sjulian	case 1:
1185107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1186107120Sjulian			return (USAGE);
1187107120Sjulian
1188128079Semax		cp.hold_mode_activity = (uint8_t) n;
1189107120Sjulian		break;
1190107120Sjulian
1191107120Sjulian	default:
1192107120Sjulian		return (USAGE);
1193107120Sjulian	}
1194107120Sjulian
1195107120Sjulian	/* send command */
1196107120Sjulian	n = sizeof(rp);
1197107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1198107120Sjulian			NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1199107120Sjulian			(char const *) &cp, sizeof(cp),
1200107120Sjulian			(char *) &rp, &n) == ERROR)
1201107120Sjulian		return (ERROR);
1202107120Sjulian
1203107120Sjulian	if (rp.status != 0x00) {
1204107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1205107120Sjulian			hci_status2str(rp.status), rp.status);
1206107120Sjulian		return (FAILED);
1207107120Sjulian	}
1208107120Sjulian
1209107120Sjulian	return (OK);
1210107120Sjulian} /* hci_write_hold_mode_activity */
1211107120Sjulian
1212107120Sjulian/* Send Read_SCO_Flow_Control_Enable command to the unit */
1213107120Sjulianstatic int
1214107120Sjulianhci_read_sco_flow_control_enable(int s, int argc, char **argv)
1215107120Sjulian{
1216107120Sjulian	ng_hci_read_sco_flow_control_rp	rp;
1217107120Sjulian	int				n;
1218107120Sjulian
1219107120Sjulian	n = sizeof(rp);
1220107120Sjulian	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1221107120Sjulian			NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1222107120Sjulian			(char *) &rp, &n) == ERROR)
1223107120Sjulian		return (ERROR);
1224107120Sjulian
1225107120Sjulian	if (rp.status != 0x00) {
1226107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1227107120Sjulian			hci_status2str(rp.status), rp.status);
1228107120Sjulian		return (FAILED);
1229107120Sjulian	}
1230107120Sjulian
1231107120Sjulian	fprintf(stdout, "SCO flow control %s [%d]\n",
1232107120Sjulian		rp.flow_control? "enabled" : "disabled", rp.flow_control);
1233107120Sjulian
1234107120Sjulian	return (OK);
1235107120Sjulian} /* hci_read_sco_flow_control_enable */
1236107120Sjulian
1237107120Sjulian/* Send Write_SCO_Flow_Control_Enable command to the unit */
1238107120Sjulianstatic int
1239107120Sjulianhci_write_sco_flow_control_enable(int s, int argc, char **argv)
1240107120Sjulian{
1241107120Sjulian	ng_hci_write_sco_flow_control_cp	cp;
1242107120Sjulian	ng_hci_write_sco_flow_control_rp	rp;
1243107120Sjulian	int					n;
1244107120Sjulian
1245107120Sjulian	/* parse command parameters */
1246107120Sjulian	switch (argc) {
1247107120Sjulian	case 1:
1248107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1249107120Sjulian			return (USAGE);
1250107120Sjulian
1251128079Semax		cp.flow_control = (uint8_t) n;
1252107120Sjulian		break;
1253107120Sjulian
1254107120Sjulian	default:
1255107120Sjulian		return (USAGE);
1256107120Sjulian	}
1257107120Sjulian
1258107120Sjulian	/* send command */
1259107120Sjulian	n = sizeof(rp);
1260107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1261107120Sjulian			NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1262107120Sjulian			(char const *) &cp, sizeof(cp),
1263107120Sjulian			(char *) &rp, &n) == ERROR)
1264107120Sjulian		return (ERROR);
1265107120Sjulian
1266107120Sjulian	if (rp.status != 0x00) {
1267107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1268107120Sjulian			hci_status2str(rp.status), rp.status);
1269107120Sjulian		return (FAILED);
1270107120Sjulian	}
1271107120Sjulian
1272107120Sjulian	return (OK);
1273107120Sjulian} /* hci_write_sco_flow_control_enable */
1274107120Sjulian
1275107120Sjulian/* Send Read_Link_Supervision_Timeout command to the unit */
1276107120Sjulianstatic int
1277107120Sjulianhci_read_link_supervision_timeout(int s, int argc, char **argv)
1278107120Sjulian{
1279107120Sjulian	ng_hci_read_link_supervision_timo_cp	cp;
1280107120Sjulian	ng_hci_read_link_supervision_timo_rp	rp;
1281107120Sjulian	int					n;
1282107120Sjulian
1283107120Sjulian	switch (argc) {
1284107120Sjulian	case 1:
1285107120Sjulian		/* connection handle */
1286107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1287107120Sjulian			return (USAGE);
1288107120Sjulian
1289128079Semax		cp.con_handle = (uint16_t) (n & 0x0fff);
1290107120Sjulian		cp.con_handle = htole16(cp.con_handle);
1291107120Sjulian		break;
1292107120Sjulian
1293107120Sjulian	default:
1294107120Sjulian		return (USAGE);
1295107120Sjulian	}
1296107120Sjulian
1297107120Sjulian	/* send command */
1298107120Sjulian	n = sizeof(rp);
1299107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1300107120Sjulian			NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1301107120Sjulian			(char const *) &cp, sizeof(cp),
1302107120Sjulian			(char *) &rp, &n) == ERROR)
1303107120Sjulian		return (ERROR);
1304107120Sjulian
1305107120Sjulian	if (rp.status != 0x00) {
1306107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1307107120Sjulian			hci_status2str(rp.status), rp.status);
1308107120Sjulian		return (FAILED);
1309107120Sjulian	}
1310107120Sjulian
1311107120Sjulian	rp.timeout = le16toh(rp.timeout);
1312107120Sjulian
1313107120Sjulian	fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1314107120Sjulian	fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1315107120Sjulian		rp.timeout * 0.625, rp.timeout);
1316107120Sjulian
1317107120Sjulian	return (OK);
1318107120Sjulian} /* hci_read_link_supervision_timeout */
1319107120Sjulian
1320107120Sjulian/* Send Write_Link_Supervision_Timeout command to the unit */
1321107120Sjulianstatic int
1322107120Sjulianhci_write_link_supervision_timeout(int s, int argc, char **argv)
1323107120Sjulian{
1324107120Sjulian	ng_hci_write_link_supervision_timo_cp	cp;
1325107120Sjulian	ng_hci_write_link_supervision_timo_rp	rp;
1326107120Sjulian	int					n;
1327107120Sjulian
1328107120Sjulian	switch (argc) {
1329107120Sjulian	case 2:
1330107120Sjulian		/* connection handle */
1331107120Sjulian		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1332107120Sjulian			return (USAGE);
1333107120Sjulian
1334128079Semax		cp.con_handle = (uint16_t) (n & 0x0fff);
1335107120Sjulian		cp.con_handle = htole16(cp.con_handle);
1336107120Sjulian
1337107120Sjulian		/* link supervision timeout */
1338131216Semax		if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xffff)
1339107120Sjulian			return (USAGE);
1340107120Sjulian
1341128079Semax		cp.timeout = (uint16_t) (n & 0x0fff);
1342107120Sjulian		cp.timeout = htole16(cp.timeout);
1343107120Sjulian		break;
1344107120Sjulian
1345107120Sjulian	default:
1346107120Sjulian		return (USAGE);
1347107120Sjulian	}
1348107120Sjulian
1349107120Sjulian	/* send command */
1350107120Sjulian	n = sizeof(rp);
1351107120Sjulian	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1352107120Sjulian			NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1353107120Sjulian			(char const *) &cp, sizeof(cp),
1354107120Sjulian			(char *) &rp, &n) == ERROR)
1355107120Sjulian		return (ERROR);
1356107120Sjulian
1357107120Sjulian	if (rp.status != 0x00) {
1358107120Sjulian		fprintf(stdout, "Status: %s [%#02x]\n",
1359107120Sjulian			hci_status2str(rp.status), rp.status);
1360107120Sjulian		return (FAILED);
1361107120Sjulian	}
1362107120Sjulian
1363107120Sjulian	return (OK);
1364107120Sjulian} /* hci_write_link_supervision_timeout */
1365107120Sjulian
1366121054Semax/* Send Read_Page_Scan_Period_Mode command to the unit */
1367121054Semaxstatic int
1368121054Semaxhci_read_page_scan_period_mode(int s, int argc, char **argv)
1369121054Semax{
1370121054Semax	ng_hci_read_page_scan_period_rp	rp;
1371121054Semax	int				n;
1372121054Semax
1373121054Semax	n = sizeof(rp);
1374121054Semax	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1375121054Semax			NG_HCI_OCF_READ_PAGE_SCAN_PERIOD),
1376121054Semax			(char *) &rp, &n) == ERROR)
1377121054Semax		return (ERROR);
1378121054Semax
1379121054Semax	if (rp.status != 0x00) {
1380121054Semax		fprintf(stdout, "Status: %s [%#02x]\n",
1381121054Semax			hci_status2str(rp.status), rp.status);
1382121054Semax		return (FAILED);
1383121054Semax	}
1384121054Semax
1385121054Semax	fprintf(stdout, "Page scan period mode: %#02x\n",
1386121054Semax		rp.page_scan_period_mode);
1387121054Semax
1388121054Semax	return (OK);
1389121054Semax} /* hci_read_page_scan_period_mode */
1390121054Semax
1391121054Semax/* Send Write_Page_Scan_Period_Mode command to the unit */
1392121054Semaxstatic int
1393121054Semaxhci_write_page_scan_period_mode(int s, int argc, char **argv)
1394121054Semax{
1395121054Semax	ng_hci_write_page_scan_period_cp	cp;
1396121054Semax	ng_hci_write_page_scan_period_rp	rp;
1397121054Semax	int					n;
1398121054Semax
1399121054Semax	/* parse command arguments */
1400121054Semax	switch (argc) {
1401121054Semax	case 1:
1402121054Semax		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
1403121054Semax			return (USAGE);
1404121054Semax
1405121054Semax		cp.page_scan_period_mode = (n & 0xff);
1406121054Semax		break;
1407121054Semax
1408121054Semax	default:
1409121054Semax		return (USAGE);
1410121054Semax	}
1411121054Semax
1412121054Semax	/* send command */
1413121054Semax	n = sizeof(rp);
1414121054Semax	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1415121054Semax			NG_HCI_OCF_WRITE_PAGE_SCAN_PERIOD),
1416121054Semax			(char const *) &cp, sizeof(cp),
1417121054Semax			(char *) &rp, &n) == ERROR)
1418121054Semax		return (ERROR);
1419121054Semax
1420121054Semax	if (rp.status != 0x00) {
1421121054Semax		fprintf(stdout, "Status: %s [%#02x]\n",
1422121054Semax			hci_status2str(rp.status), rp.status);
1423121054Semax		return (FAILED);
1424121054Semax	}
1425121054Semax
1426121054Semax	return (OK);
1427121054Semax} /* hci_write_page_scan_period_mode */
1428121054Semax
1429121054Semax/* Send Read_Page_Scan_Mode command to the unit */
1430121054Semaxstatic int
1431121054Semaxhci_read_page_scan_mode(int s, int argc, char **argv)
1432121054Semax{
1433121054Semax	ng_hci_read_page_scan_rp	rp;
1434121054Semax	int				n;
1435121054Semax
1436121054Semax	n = sizeof(rp);
1437121054Semax	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1438121054Semax			NG_HCI_OCF_READ_PAGE_SCAN),
1439121054Semax			(char *) &rp, &n) == ERROR)
1440121054Semax		return (ERROR);
1441121054Semax
1442121054Semax	if (rp.status != 0x00) {
1443121054Semax		fprintf(stdout, "Status: %s [%#02x]\n",
1444121054Semax			hci_status2str(rp.status), rp.status);
1445121054Semax		return (FAILED);
1446121054Semax	}
1447121054Semax
1448121054Semax	fprintf(stdout, "Page scan mode: %#02x\n", rp.page_scan_mode);
1449121054Semax
1450121054Semax	return (OK);
1451121054Semax} /* hci_read_page_scan_mode */
1452121054Semax
1453121054Semax/* Send Write_Page_Scan_Mode command to the unit */
1454121054Semaxstatic int
1455121054Semaxhci_write_page_scan_mode(int s, int argc, char **argv)
1456121054Semax{
1457121054Semax	ng_hci_write_page_scan_cp	cp;
1458121054Semax	ng_hci_write_page_scan_rp	rp;
1459121054Semax	int				n;
1460121054Semax
1461121054Semax	/* parse command arguments */
1462121054Semax	switch (argc) {
1463121054Semax	case 1:
1464121054Semax		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
1465121054Semax			return (USAGE);
1466121054Semax
1467121054Semax		cp.page_scan_mode = (n & 0xff);
1468121054Semax		break;
1469121054Semax
1470121054Semax	default:
1471121054Semax		return (USAGE);
1472121054Semax	}
1473121054Semax
1474121054Semax	/* send command */
1475121054Semax	n = sizeof(rp);
1476121054Semax	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1477121054Semax			NG_HCI_OCF_WRITE_PAGE_SCAN),
1478121054Semax			(char const *) &cp, sizeof(cp),
1479121054Semax			(char *) &rp, &n) == ERROR)
1480121054Semax		return (ERROR);
1481121054Semax
1482121054Semax	if (rp.status != 0x00) {
1483121054Semax		fprintf(stdout, "Status: %s [%#02x]\n",
1484121054Semax			hci_status2str(rp.status), rp.status);
1485121054Semax		return (FAILED);
1486121054Semax	}
1487121054Semax
1488121054Semax	return (OK);
1489121054Semax} /* hci_write_page_scan_mode */
1490121054Semax
1491107120Sjulianstruct hci_command	host_controller_baseband_commands[] = {
1492107120Sjulian{
1493107120Sjulian"reset",
1494107120Sjulian"\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1495107120Sjulian"After the reset is completed, the current operational state will be lost,\n" \
1496107120Sjulian"the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1497107120Sjulian"automatically revert to the default values for the parameters for which\n" \
1498107120Sjulian"default values are defined in the specification.",
1499107120Sjulian&hci_reset
1500107120Sjulian},
1501107120Sjulian{
1502107120Sjulian"read_pin_type",
1503107120Sjulian"\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1504107120Sjulian"Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1505107120Sjulian"code.",
1506107120Sjulian&hci_read_pin_type
1507107120Sjulian},
1508107120Sjulian{
1509107120Sjulian"write_pin_type <pin_type>",
1510107120Sjulian"\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1511107120Sjulian"Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1512107120Sjulian"code.\n\n" \
1513107120Sjulian"\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1514107120Sjulian&hci_write_pin_type
1515107120Sjulian},
1516107120Sjulian{
1517133178Semax"read_stored_link_key [<BD_ADDR>]",
1518107120Sjulian"\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1519107120Sjulian"more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1520107120Sjulian"Controller can store a limited number of link keys for other Bluetooth\n" \
1521107120Sjulian"devices.\n\n" \
1522133178Semax"\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1523107120Sjulian&hci_read_stored_link_key
1524107120Sjulian},
1525107120Sjulian{
1526133178Semax"write_stored_link_key <BD_ADDR> <key>",
1527107120Sjulian"\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1528107120Sjulian"or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1529107120Sjulian"Bluetooth Host Controller can store a limited number of link keys for other\n"\
1530107120Sjulian"Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1531107120Sjulian"Host Controller then no additional link keys will be stored.\n\n" \
1532133178Semax"\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name\n" \
1533133178Semax"\t<key>     - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1534107120Sjulian&hci_write_stored_link_key
1535107120Sjulian},
1536107120Sjulian{
1537133178Semax"delete_stored_link_key [<BD_ADDR>]",
1538107120Sjulian"\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1539107120Sjulian"or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1540107120Sjulian"Bluetooth Host Controller can store a limited number of link keys for other\n"\
1541107120Sjulian"Bluetooth devices.\n\n" \
1542133178Semax"\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1543107120Sjulian&hci_delete_stored_link_key
1544107120Sjulian},
1545107120Sjulian{
1546107120Sjulian"change_local_name <name>",
1547107120Sjulian"\nThe Change_Local_Name command provides the ability to modify the user\n" \
1548107120Sjulian"friendly name for the Bluetooth unit.\n\n" \
1549107120Sjulian"\t<name> - string",
1550107120Sjulian&hci_change_local_name
1551107120Sjulian},
1552107120Sjulian{
1553107120Sjulian"read_local_name",
1554107120Sjulian"\nThe Read_Local_Name command provides the ability to read the\n" \
1555107120Sjulian"stored user-friendly name for the Bluetooth unit.",
1556107120Sjulian&hci_read_local_name
1557107120Sjulian},
1558107120Sjulian{
1559107120Sjulian"read_connection_accept_timeout",
1560107120Sjulian"\nThis command will read the value for the Connection_Accept_Timeout\n" \
1561107120Sjulian"configuration parameter. The Connection_Accept_Timeout configuration\n" \
1562107120Sjulian"parameter allows the Bluetooth hardware to automatically deny a\n" \
1563107120Sjulian"connection request after a specified time period has occurred and\n" \
1564107120Sjulian"the new connection is not accepted. Connection Accept Timeout\n" \
1565107120Sjulian"measured in Number of Baseband slots.",
1566107120Sjulian&hci_read_connection_accept_timeout
1567107120Sjulian},
1568107120Sjulian{
1569107120Sjulian"write_connection_accept_timeout <timeout>",
1570107120Sjulian"\nThis command will write the value for the Connection_Accept_Timeout\n" \
1571107120Sjulian"configuration parameter.\n\n" \
1572107120Sjulian"\t<timeout> - dddd; measured in number of baseband slots.",
1573107120Sjulian&hci_write_connection_accept_timeout
1574107120Sjulian},
1575107120Sjulian{
1576107120Sjulian"read_page_timeout",
1577107120Sjulian"\nThis command will read the value for the Page_Timeout configuration\n" \
1578107120Sjulian"parameter. The Page_Timeout configuration parameter defines the\n" \
1579107120Sjulian"maximum time the local Link Manager will wait for a baseband page\n" \
1580107120Sjulian"response from the remote unit at a locally initiated connection\n" \
1581107120Sjulian"attempt. Page Timeout measured in Number of Baseband slots.",
1582107120Sjulian&hci_read_page_timeout
1583107120Sjulian},
1584107120Sjulian{
1585107120Sjulian"write_page_timeout <timeout>",
1586107120Sjulian"\nThis command will write the value for the Page_Timeout configuration\n" \
1587107120Sjulian"parameter.\n\n" \
1588107120Sjulian"\t<timeout> - dddd; measured in number of baseband slots.",
1589107120Sjulian&hci_write_page_timeout
1590107120Sjulian},
1591107120Sjulian{
1592107120Sjulian"read_scan_enable",
1593107120Sjulian"\nThis command will read the value for the Scan_Enable parameter. The\n" \
1594107120Sjulian"Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1595107120Sjulian"will periodically scan for page attempts and/or inquiry requests\n" \
1596107120Sjulian"from other Bluetooth unit.\n\n" \
1597107120Sjulian"\t0x00 - No Scans enabled.\n" \
1598107120Sjulian"\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1599107120Sjulian"\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1600107120Sjulian"\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1601107120Sjulian&hci_read_scan_enable
1602107120Sjulian},
1603107120Sjulian{
1604107120Sjulian"write_scan_enable <scan_enable>",
1605107120Sjulian"\nThis command will write the value for the Scan_Enable parameter.\n" \
1606107120Sjulian"The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1607107120Sjulian"unit will periodically scan for page attempts and/or inquiry\n" \
1608107120Sjulian"requests from other Bluetooth unit.\n\n" \
1609107120Sjulian"\t<scan_enable> - dd;\n" \
1610107120Sjulian"\t0 - No Scans enabled.\n" \
1611107120Sjulian"\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1612107120Sjulian"\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1613107120Sjulian"\t3 - Inquiry Scan enabled. Page Scan enabled.",
1614107120Sjulian&hci_write_scan_enable
1615107120Sjulian},
1616107120Sjulian{
1617107120Sjulian"read_page_scan_activity",
1618107120Sjulian"\nThis command will read the value for Page_Scan_Activity configuration\n" \
1619107120Sjulian"parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1620107120Sjulian"amount of time between consecutive page scans. This time interval is \n" \
1621107120Sjulian"defined from when the Host Controller started its last page scan until\n" \
1622107120Sjulian"it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1623107120Sjulian"defines the amount of time for the duration of the page scan. The\n" \
1624107120Sjulian"Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1625107120Sjulian&hci_read_page_scan_activity
1626107120Sjulian},
1627107120Sjulian{
1628107120Sjulian"write_page_scan_activity interval(dddd) window(dddd)",
1629107120Sjulian"\nThis command will write the value for Page_Scan_Activity configuration\n" \
1630107120Sjulian"parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1631107120Sjulian"amount of time between consecutive page scans. This is defined as the time\n" \
1632107120Sjulian"interval from when the Host Controller started its last page scan until it\n" \
1633107120Sjulian"begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1634107120Sjulian"defines the amount of time for the duration of the page scan. \n" \
1635107120Sjulian"The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1636228976Suqs"\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
1637229075Sstefanf"\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1638107120Sjulian&hci_write_page_scan_activity
1639107120Sjulian},
1640107120Sjulian{
1641107120Sjulian"read_inquiry_scan_activity",
1642107120Sjulian"\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1643107120Sjulian"parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1644107120Sjulian"amount of time between consecutive inquiry scans. This is defined as the\n" \
1645107120Sjulian"time interval from when the Host Controller started its last inquiry scan\n" \
1646107120Sjulian"until it begins the next inquiry scan.",
1647107120Sjulian&hci_read_inquiry_scan_activity
1648107120Sjulian},
1649107120Sjulian{
1650107120Sjulian"write_inquiry_scan_activity interval(dddd) window(dddd)",
1651107120Sjulian"\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1652107120Sjulian"parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1653107120Sjulian"amount of time between consecutive inquiry scans. This is defined as the\n" \
1654107120Sjulian"time interval from when the Host Controller started its last inquiry scan\n" \
1655107120Sjulian"until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1656107120Sjulian"parameter defines the amount of time for the duration of the inquiry scan.\n" \
1657107120Sjulian"The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1658228976Suqs"\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
1659229075Sstefanf"\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1660107120Sjulian&hci_write_inquiry_scan_activity
1661107120Sjulian},
1662107120Sjulian{
1663107120Sjulian"read_authentication_enable",
1664107120Sjulian"\nThis command will read the value for the Authentication_Enable parameter.\n"\
1665107120Sjulian"The Authentication_Enable parameter controls if the local unit requires\n"\
1666107120Sjulian"to authenticate the remote unit at connection setup (between the\n" \
1667107120Sjulian"Create_Connection command or acceptance of an incoming ACL connection\n"\
1668107120Sjulian"and the corresponding Connection Complete event). At connection setup, only\n"\
1669107120Sjulian"the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1670107120Sjulian"authenticate the other unit.",
1671107120Sjulian&hci_read_authentication_enable
1672107120Sjulian},
1673107120Sjulian{
1674107120Sjulian"write_authentication_enable enable(0|1)",
1675107120Sjulian"\nThis command will write the value for the Authentication_Enable parameter.\n"\
1676107120Sjulian"The Authentication_Enable parameter controls if the local unit requires to\n"\
1677107120Sjulian"authenticate the remote unit at connection setup (between the\n" \
1678107120Sjulian"Create_Connection command or acceptance of an incoming ACL connection\n" \
1679107120Sjulian"and the corresponding Connection Complete event). At connection setup, only\n"\
1680107120Sjulian"the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1681107120Sjulian"authenticate the other unit.",
1682107120Sjulian&hci_write_authentication_enable
1683107120Sjulian},
1684107120Sjulian{
1685107120Sjulian"read_encryption_mode",
1686107120Sjulian"\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1687107120Sjulian"Encryption_Mode parameter controls if the local unit requires encryption\n" \
1688107120Sjulian"to the remote unit at connection setup (between the Create_Connection\n" \
1689107120Sjulian"command or acceptance of an incoming ACL connection and the corresponding\n" \
1690107120Sjulian"Connection Complete event). At connection setup, only the unit(s) with\n" \
1691107120Sjulian"the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1692107120Sjulian"enabled will try to encrypt the connection to the other unit.\n\n" \
1693107120Sjulian"\t<encryption_mode>:\n" \
1694107120Sjulian"\t0x00 - Encryption disabled.\n" \
1695107120Sjulian"\t0x01 - Encryption only for point-to-point packets.\n" \
1696107120Sjulian"\t0x02 - Encryption for both point-to-point and broadcast packets.",
1697107120Sjulian&hci_read_encryption_mode
1698107120Sjulian},
1699107120Sjulian{
1700107120Sjulian"write_encryption_mode mode(0|1|2)",
1701107120Sjulian"\tThis command will write the value for the Encryption_Mode parameter.\n" \
1702107120Sjulian"The Encryption_Mode parameter controls if the local unit requires\n" \
1703107120Sjulian"encryption to the remote unit at connection setup (between the\n" \
1704107120Sjulian"Create_Connection command or acceptance of an incoming ACL connection\n" \
1705107120Sjulian"and the corresponding Connection Complete event). At connection setup,\n" \
1706107120Sjulian"only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1707107120Sjulian"Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1708107120Sjulian"the other unit.\n\n" \
1709107120Sjulian"\t<encryption_mode> (dd)\n" \
1710107120Sjulian"\t0 - Encryption disabled.\n" \
1711107120Sjulian"\t1 - Encryption only for point-to-point packets.\n" \
1712107120Sjulian"\t2 - Encryption for both point-to-point and broadcast packets.",
1713107120Sjulian&hci_write_encryption_mode
1714107120Sjulian},
1715107120Sjulian{
1716107120Sjulian"read_class_of_device",
1717107120Sjulian"\nThis command will read the value for the Class_of_Device parameter.\n" \
1718107120Sjulian"The Class_of_Device parameter is used to indicate the capabilities of\n" \
1719107120Sjulian"the local unit to other units.",
1720107120Sjulian&hci_read_class_of_device
1721107120Sjulian},
1722107120Sjulian{
1723107120Sjulian"write_class_of_device class(xx:xx:xx)",
1724107120Sjulian"\nThis command will write the value for the Class_of_Device parameter.\n" \
1725107120Sjulian"The Class_of_Device parameter is used to indicate the capabilities of \n" \
1726107120Sjulian"the local unit to other units.\n\n" \
1727107120Sjulian"\t<class> (xx:xx:xx) - class of device",
1728107120Sjulian&hci_write_class_of_device
1729107120Sjulian},
1730107120Sjulian{
1731107120Sjulian"read_voice_settings",
1732107120Sjulian"\nThis command will read the values for the Voice_Setting parameter.\n" \
1733107120Sjulian"The Voice_Setting parameter controls all the various settings for voice\n" \
1734107120Sjulian"connections. These settings apply to all voice connections, and cannot be\n" \
1735107120Sjulian"set for individual voice connections. The Voice_Setting parameter controls\n" \
1736107120Sjulian"the configuration for voice connections: Input Coding, Air coding format,\n" \
1737107120Sjulian"input data format, Input sample size, and linear PCM parameter.",
1738107120Sjulian&hci_read_voice_settings
1739107120Sjulian},
1740107120Sjulian{
1741107120Sjulian"write_voice_settings settings(xxxx)",
1742107120Sjulian"\nThis command will write the values for the Voice_Setting parameter.\n" \
1743107120Sjulian"The Voice_Setting parameter controls all the various settings for voice\n" \
1744107120Sjulian"connections. These settings apply to all voice connections, and cannot be\n" \
1745107120Sjulian"set for individual voice connections. The Voice_Setting parameter controls\n" \
1746107120Sjulian"the configuration for voice connections: Input Coding, Air coding format,\n" \
1747107120Sjulian"input data format, Input sample size, and linear PCM parameter.\n\n" \
1748107120Sjulian"\t<voice_settings> (xxxx) - voice settings",
1749107120Sjulian&hci_write_voice_settings
1750107120Sjulian},
1751107120Sjulian{
1752107120Sjulian"read_number_broadcast_retransmissions",
1753107120Sjulian"\nThis command will read the unit's parameter value for the Number of\n" \
1754107120Sjulian"Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1755107120Sjulian"unreliable.",
1756107120Sjulian&hci_read_number_broadcast_retransmissions
1757107120Sjulian},
1758107120Sjulian{
1759107120Sjulian"write_number_broadcast_retransmissions count(dd)",
1760107120Sjulian"\nThis command will write the unit's parameter value for the Number of\n" \
1761107120Sjulian"Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1762107120Sjulian"unreliable.\n\n" \
1763107120Sjulian"\t<count> (dd) - number of broadcast retransimissions",
1764107120Sjulian&hci_write_number_broadcast_retransmissions
1765107120Sjulian},
1766107120Sjulian{
1767107120Sjulian"read_hold_mode_activity",
1768107120Sjulian"\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1769107120Sjulian"The Hold_Mode_Activity value is used to determine what activities should\n" \
1770107120Sjulian"be suspended when the unit is in hold mode.",
1771107120Sjulian&hci_read_hold_mode_activity
1772107120Sjulian},
1773107120Sjulian{
1774107120Sjulian"write_hold_mode_activity settings(0|1|2|4)",
1775107120Sjulian"\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1776107120Sjulian"The Hold_Mode_Activity value is used to determine what activities should\n" \
1777107120Sjulian"be suspended when the unit is in hold mode.\n\n" \
1778107120Sjulian"\t<settings> (dd) - bit mask:\n" \
1779107120Sjulian"\t0 - Maintain current Power State. Default\n" \
1780107120Sjulian"\t1 - Suspend Page Scan.\n" \
1781107120Sjulian"\t2 - Suspend Inquiry Scan.\n" \
1782107120Sjulian"\t4 - Suspend Periodic Inquiries.",
1783107120Sjulian&hci_write_hold_mode_activity
1784107120Sjulian},
1785107120Sjulian{
1786107120Sjulian"read_sco_flow_control_enable",
1787107120Sjulian"\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1788107120Sjulian"the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1789107120Sjulian"decide if the Host Controller will send Number Of Completed Packets events\n" \
1790107120Sjulian"for SCO Connection Handles. This setting allows the Host to enable and\n" \
1791107120Sjulian"disable SCO flow control.",
1792107120Sjulian&hci_read_sco_flow_control_enable
1793107120Sjulian},
1794107120Sjulian{
1795107120Sjulian"write_sco_flow_control_enable enable(0|1)",
1796107120Sjulian"\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1797107120Sjulian"the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1798107120Sjulian"decide if the Host Controller will send Number Of Completed Packets events\n" \
1799107120Sjulian"for SCO Connection Handles. This setting allows the Host to enable and\n" \
1800107120Sjulian"disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1801107120Sjulian"changed if no connections exist.",
1802107120Sjulian&hci_write_sco_flow_control_enable
1803107120Sjulian},
1804107120Sjulian{
1805107120Sjulian"read_link_supervision_timeout <connection_handle>",
1806107120Sjulian"\nThis command will read the value for the Link_Supervision_Timeout\n" \
1807107120Sjulian"parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1808107120Sjulian"by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1809107120Sjulian"reason, no Baseband packets are received from that Connection Handle for a\n" \
1810107120Sjulian"duration longer than the Link_Supervision_Timeout, the connection is\n"
1811107120Sjulian"disconnected.\n\n" \
1812107120Sjulian"\t<connection_handle> - dddd; connection handle\n",
1813107120Sjulian&hci_read_link_supervision_timeout
1814107120Sjulian},
1815107120Sjulian{
1816107120Sjulian"write_link_supervision_timeout <connection_handle> <timeout>",
1817107120Sjulian"\nThis command will write the value for the Link_Supervision_Timeout\n" \
1818107120Sjulian"parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1819107120Sjulian"by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1820107120Sjulian"reason, no Baseband packets are received from that connection handle for a\n" \
1821107120Sjulian"duration longer than the Link_Supervision_Timeout, the connection is\n" \
1822107120Sjulian"disconnected.\n\n" \
1823107120Sjulian"\t<connection_handle> - dddd; connection handle\n" \
1824107120Sjulian"\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1825107120Sjulian&hci_write_link_supervision_timeout
1826107120Sjulian},
1827121054Semax{
1828121054Semax"read_page_scan_period_mode",
1829121054Semax"\nThis command is used to read the mandatory Page_Scan_Period_Mode of the\n" \
1830121054Semax"local Bluetooth device. Every time an inquiry response message is sent, the\n"\
1831121054Semax"Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
1832121054Semax"is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
1833121054Semax"expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
1834121054Semax"following page scans.",
1835121054Semax&hci_read_page_scan_period_mode
1836121054Semax},
1837121054Semax{
1838121054Semax"write_page_scan_period_mode <page_scan_period_mode>",
1839121054Semax"\nThis command is used to write the mandatory Page_Scan_Period_Mode of the\n" \
1840121054Semax"local Bluetooth device. Every time an inquiry response message is sent, the\n"\
1841121054Semax"Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
1842121054Semax"is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
1843121054Semax"expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
1844121054Semax"following page scans.\n\n" \
1845121054Semax"\t<page_scan_period_mode> - dd; page scan period mode:\n" \
1846121054Semax"\t0x00 - P0 (Default)\n" \
1847121054Semax"\t0x01 - P1\n" \
1848121054Semax"\t0x02 - P2",
1849121054Semax&hci_write_page_scan_period_mode
1850121054Semax},
1851121054Semax{
1852121054Semax"read_page_scan_mode",
1853121054Semax"\nThis command is used to read the default page scan mode of the local\n" \
1854121054Semax"Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
1855121054Semax"that is used for the default page scan. Currently one mandatory page scan\n"\
1856121054Semax"mode and three optional page scan modes are defined. Following an inquiry\n" \
1857121054Semax"response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
1858121054Semax"mandatory page scan mode must be applied.",
1859121054Semax&hci_read_page_scan_mode
1860121054Semax},
1861121054Semax{
1862121054Semax"write_page_scan_mode <page_scan_mode>",
1863121054Semax"\nThis command is used to write the default page scan mode of the local\n" \
1864121054Semax"Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
1865121054Semax"that is used for the default page scan. Currently, one mandatory page scan\n"\
1866121054Semax"mode and three optional page scan modes are defined. Following an inquiry\n"\
1867121054Semax"response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
1868121054Semax"mandatory page scan mode must be applied.\n\n" \
1869121054Semax"\t<page_scan_mode> - dd; page scan mode:\n" \
1870121054Semax"\t0x00 - Mandatory Page Scan Mode (Default)\n" \
1871121054Semax"\t0x01 - Optional Page Scan Mode I\n" \
1872121054Semax"\t0x02 - Optional Page Scan Mode II\n" \
1873121054Semax"\t0x03 - Optional Page Scan Mode III",
1874121054Semax&hci_write_page_scan_mode
1875121054Semax},
1876107120Sjulian{ NULL, }
1877107120Sjulian};
1878107120Sjulian
1879