]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/bluetooth/hccontrol/host_controller_baseband.c
Integrate tools/regression/mqueue into the FreeBSD test suite as
[FreeBSD/FreeBSD.git] / usr.sbin / bluetooth / hccontrol / host_controller_baseband.c
1 /*
2  * host_controller_baseband.c
3  *
4  * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $Id: host_controller_baseband.c,v 1.4 2003/08/18 19:19:53 max Exp $
29  * $FreeBSD$
30  */
31
32 #define L2CAP_SOCKET_CHECKED
33 #include <bluetooth.h>
34 #include <errno.h>
35 #include <stdio.h>
36 #include <string.h>
37 #include "hccontrol.h"
38
39 /* Convert hex ASCII to int4 */
40 static int
41 hci_hexa2int4(const char *a)
42 {
43         if ('0' <= *a && *a <= '9')
44                 return (*a - '0');
45
46         if ('A' <= *a && *a <= 'F')
47                 return (*a - 'A' + 0xa);
48
49         if ('a' <= *a && *a <= 'f')
50                 return (*a - 'a' + 0xa);
51
52         return (-1);
53 }
54
55 /* Convert hex ASCII to int8 */
56 static int
57 hci_hexa2int8(const char *a)
58 {
59         int     hi = hci_hexa2int4(a);
60         int     lo = hci_hexa2int4(a + 1);
61
62         if (hi < 0 || lo < 0)
63                 return (-1);
64
65         return ((hi << 4) | lo);
66 }
67
68 /* Convert ascii hex string to the uint8_t[] */
69 static int
70 hci_hexstring2array(char const *s, uint8_t *a, int asize)
71 {
72         int     i, l, b;
73
74         l = strlen(s) / 2;
75         if (l > asize)
76                 l = asize;
77
78         for (i = 0; i < l; i++) {
79                 b = hci_hexa2int8(s + i * 2);
80                 if (b < 0)
81                         return (-1);
82
83                 a[i] = (b & 0xff);
84         }
85
86         return (0);
87 }
88
89 /* Send RESET to the unit */
90 static int
91 hci_reset(int s, int argc, char **argv)
92 {
93         ng_hci_status_rp        rp;
94         int                     n;
95
96         n = sizeof(rp);
97         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
98                         NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
99                 return (ERROR);
100
101         if (rp.status != 0x00) {
102                 fprintf(stdout, "Status: %s [%#02x]\n",
103                         hci_status2str(rp.status), rp.status);
104                 return (FAILED);
105         }
106
107         return (OK);
108 } /* hci_reset */
109
110 /* Send Read_PIN_Type command to the unit */
111 static int
112 hci_read_pin_type(int s, int argc, char **argv)
113 {
114         ng_hci_read_pin_type_rp rp;
115         int                     n;
116
117         n = sizeof(rp);
118         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
119                         NG_HCI_OCF_READ_PIN_TYPE),
120                         (char *) &rp, &n) == ERROR)
121                 return (ERROR);
122
123         if (rp.status != 0x00) {
124                 fprintf(stdout, "Status: %s [%#02x]\n", 
125                         hci_status2str(rp.status), rp.status);
126                 return (FAILED);
127         }
128
129         fprintf(stdout, "PIN type: %s [%#02x]\n",
130                         hci_pin2str(rp.pin_type), rp.pin_type);
131
132         return (OK);
133 } /* hci_read_pin_type */
134
135 /* Send Write_PIN_Type command to the unit */
136 static int
137 hci_write_pin_type(int s, int argc, char **argv)
138 {
139         ng_hci_write_pin_type_cp        cp;
140         ng_hci_write_pin_type_rp        rp;
141         int                             n;
142
143         /* parse command parameters */
144         switch (argc) {
145         case 1:
146                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
147                         return (USAGE);
148
149                 cp.pin_type = (uint8_t) n;
150                 break;
151
152         default:
153                 return (USAGE);
154         }
155
156         /* send command */
157         n = sizeof(rp);
158         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
159                         NG_HCI_OCF_WRITE_PIN_TYPE),
160                         (char const *) &cp, sizeof(cp),
161                         (char *) &rp , &n) ==  ERROR)
162                 return (ERROR);
163
164         if (rp.status != 0x00) {
165                 fprintf(stdout, "Status: %s [%#02x]\n", 
166                         hci_status2str(rp.status), rp.status);
167                 return (FAILED);
168         }
169
170         return (OK);
171 } /* hci_write_pin_type */
172
173 /* Send Read_Stored_Link_Key command to the unit */
174 static int
175 hci_read_stored_link_key(int s, int argc, char **argv)
176 {
177         struct {
178                 ng_hci_cmd_pkt_t                        hdr;
179                 ng_hci_read_stored_link_key_cp          cp;
180         } __attribute__ ((packed))                      cmd;
181
182         struct {
183                 ng_hci_event_pkt_t                      hdr;
184                 union {
185                         ng_hci_command_compl_ep         cc;
186                         ng_hci_return_link_keys_ep      key;
187                         uint8_t                         b[NG_HCI_EVENT_PKT_SIZE];
188                 }                                       ep;
189         } __attribute__ ((packed))                      event;
190
191         int                                             n, n1;
192
193         /* Send command */
194         memset(&cmd, 0, sizeof(cmd));
195         cmd.hdr.type = NG_HCI_CMD_PKT;
196         cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
197                                 NG_HCI_OCF_READ_STORED_LINK_KEY));
198         cmd.hdr.length = sizeof(cmd.cp);
199
200         switch (argc) {
201         case 1:
202                 /* parse BD_ADDR */
203                 if (!bt_aton(argv[0], &cmd.cp.bdaddr)) {
204                         struct hostent  *he = NULL;
205
206                         if ((he = bt_gethostbyname(argv[0])) == NULL)
207                                 return (USAGE);
208
209                         memcpy(&cmd.cp.bdaddr, he->h_addr, sizeof(cmd.cp.bdaddr));
210                 }
211                 break;
212
213         default:
214                 cmd.cp.read_all = 1;
215                 break;
216         }
217
218         if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
219                 return (ERROR);
220
221         /* Receive events */
222 again:
223         memset(&event, 0, sizeof(event));
224         n = sizeof(event);
225         if (hci_recv(s, (char *) &event, &n) != OK)
226                 return (ERROR);
227
228         if (n <= sizeof(event.hdr)) {
229                 errno = EMSGSIZE;
230                 return (ERROR);
231         }
232
233         if (event.hdr.type != NG_HCI_EVENT_PKT) {
234                 errno = EIO;
235                 return (ERROR);
236         }
237
238         /* Parse event */
239         switch (event.hdr.event) {
240         case NG_HCI_EVENT_COMMAND_COMPL: {
241                 ng_hci_read_stored_link_key_rp  *rp = NULL;
242
243                 if (event.ep.cc.opcode == 0x0000 ||
244                     event.ep.cc.opcode != cmd.hdr.opcode)
245                         goto again;
246
247                 rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b + 
248                                 sizeof(event.ep.cc));
249
250                 fprintf(stdout, "Complete: Status: %s [%#x]\n", 
251                                 hci_status2str(rp->status), rp->status);
252                 fprintf(stdout, "Maximum Number of keys: %d\n",
253                                 le16toh(rp->max_num_keys));
254                 fprintf(stdout, "Number of keys read: %d\n",
255                                 le16toh(rp->num_keys_read));
256                 } break;
257
258         case NG_HCI_EVENT_RETURN_LINK_KEYS: {
259                 struct _key {
260                         bdaddr_t        bdaddr;
261                         uint8_t         key[NG_HCI_KEY_SIZE];
262                 } __attribute__ ((packed))      *k = NULL;
263
264                 fprintf(stdout, "Event: Number of keys: %d\n",
265                         event.ep.key.num_keys);
266
267                 k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
268                 for (n = 0; n < event.ep.key.num_keys; n++) {
269                         fprintf(stdout, "\t%d: %s ",
270                                 n + 1, hci_bdaddr2str(&k->bdaddr));
271
272                         for (n1 = 0; n1 < sizeof(k->key); n1++)
273                                 fprintf(stdout, "%02x", k->key[n1]);
274                         fprintf(stdout, "\n");
275
276                         k ++;
277                 }
278
279                 goto again;
280
281                 } break;
282
283         default:
284                 goto again;
285         }
286         
287         return (OK);
288 } /* hci_read_store_link_key */
289
290 /* Send Write_Stored_Link_Key command to the unit */
291 static int
292 hci_write_stored_link_key(int s, int argc, char **argv)
293 {
294         struct {
295                 ng_hci_write_stored_link_key_cp p;
296                 bdaddr_t                        bdaddr;
297                 uint8_t                         key[NG_HCI_KEY_SIZE];
298         }                                       cp;
299         ng_hci_write_stored_link_key_rp         rp;
300         int32_t                                 n;
301
302         memset(&cp, 0, sizeof(cp));
303
304         switch (argc) {
305         case 2:
306                 cp.p.num_keys_write = 1;
307
308                 /* parse BD_ADDR */
309                 if (!bt_aton(argv[0], &cp.bdaddr)) {
310                         struct hostent  *he = NULL;
311
312                         if ((he = bt_gethostbyname(argv[0])) == NULL)
313                                 return (USAGE);
314
315                         memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
316                 }
317
318                 /* parse key */
319                 if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
320                         return (USAGE);
321                 break;
322
323         default:
324                 return (USAGE);
325         }
326
327         /* send command */
328         n = sizeof(rp);
329         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
330                         NG_HCI_OCF_WRITE_STORED_LINK_KEY),
331                         (char const *) &cp, sizeof(cp),
332                         (char *) &rp, &n) == ERROR)
333                 return (ERROR);
334
335         if (rp.status != 0x00) {
336                 fprintf(stdout, "Status: %s [%#02x]\n", 
337                         hci_status2str(rp.status), rp.status);
338                 return (FAILED);
339         }
340
341         fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
342
343         return (OK);
344 } /* hci_write_stored_link_key */
345
346
347 /* Send Delete_Stored_Link_Key command to the unit */
348 static int
349 hci_delete_stored_link_key(int s, int argc, char **argv)
350 {
351         ng_hci_delete_stored_link_key_cp        cp;
352         ng_hci_delete_stored_link_key_rp        rp;
353         int32_t                                 n;
354
355         memset(&cp, 0, sizeof(cp));
356
357         switch (argc) {
358         case 1:
359                 /* parse BD_ADDR */
360                 if (!bt_aton(argv[0], &cp.bdaddr)) {
361                         struct hostent  *he = NULL;
362
363                         if ((he = bt_gethostbyname(argv[0])) == NULL)
364                                 return (USAGE);
365
366                         memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
367                 }
368                 break;
369
370         default:
371                 cp.delete_all = 1;
372                 break;
373         }
374
375         /* send command */
376         n = sizeof(cp);
377         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
378                         NG_HCI_OCF_DELETE_STORED_LINK_KEY),
379                         (char const *) &cp, sizeof(cp),
380                         (char *) &rp, &n) == ERROR)
381                 return (ERROR);
382
383         if (rp.status != 0x00) {
384                 fprintf(stdout, "Status: %s [%#02x]\n", 
385                         hci_status2str(rp.status), rp.status);
386                 return (FAILED);
387         }
388
389         fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
390
391         return (OK);
392 } /* hci_delete_stored_link_key */
393
394 /* Send Change_Local_Name command to the unit */
395 static int
396 hci_change_local_name(int s, int argc, char **argv) 
397 {
398         ng_hci_change_local_name_cp     cp;
399         ng_hci_change_local_name_rp     rp;
400         int                             n;
401
402         /* parse command parameters */
403         switch (argc) {
404         case 1:
405                 snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
406                 break;
407
408         default:
409                 return (USAGE);
410         }
411
412         /* send command */
413         n = sizeof(rp);
414         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
415                         NG_HCI_OCF_CHANGE_LOCAL_NAME),
416                         (char const *) &cp, sizeof(cp),
417                         (char *) &rp, &n) == ERROR)
418                 return (ERROR);
419
420         if (rp.status != 0x00) {
421                 fprintf(stdout, "Status: %s [%#02x]\n", 
422                         hci_status2str(rp.status), rp.status);
423                 return (FAILED);
424         }
425
426         return (OK);
427 } /* hci_change_local_name */
428
429 /* Send Read_Local_Name command to the unit */
430 static int
431 hci_read_local_name(int s, int argc, char **argv)
432 {
433         ng_hci_read_local_name_rp       rp;
434         int                             n;
435
436         n = sizeof(rp);
437         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
438                         NG_HCI_OCF_READ_LOCAL_NAME),
439                         (char *) &rp, &n) == ERROR)
440                 return (ERROR);
441
442         if (rp.status != 0x00) {
443                 fprintf(stdout, "Status: %s [%#02x]\n", 
444                         hci_status2str(rp.status), rp.status);
445                 return (FAILED);
446         }
447
448         fprintf(stdout, "Local name: %s\n", rp.name);
449
450         return (OK);
451 } /* hci_read_local_name */
452
453 /* Send Read_Connection_Accept_Timeout to the unit */
454 static int
455 hci_read_connection_accept_timeout(int s, int argc, char **argv)
456 {
457         ng_hci_read_con_accept_timo_rp  rp;
458         int                             n;
459
460         n = sizeof(rp);
461         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
462                         NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
463                         (char *) &rp, &n) == ERROR)
464                 return (ERROR);
465
466         if (rp.status != 0x00) {
467                 fprintf(stdout, "Status: %s [%#02x]\n", 
468                         hci_status2str(rp.status), rp.status);
469                 return (FAILED);
470         }
471
472         rp.timeout = le16toh(rp.timeout);
473         fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
474                         rp.timeout * 0.625, rp.timeout);
475                                         
476         return (OK);
477 } /* hci_read_connection_accept_timeout */
478
479 /* Send Write_Connection_Accept_Timeout to the unit */
480 static int
481 hci_write_connection_accept_timeout(int s, int argc, char **argv)
482 {
483         ng_hci_write_con_accept_timo_cp cp;
484         ng_hci_write_con_accept_timo_rp rp;
485         int                             n;
486
487         /* parse command parameters */
488         switch (argc) {
489         case 1:
490                 if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
491                         return (USAGE);
492
493                 cp.timeout = (uint16_t) n;
494                 cp.timeout = htole16(cp.timeout);
495                 break;
496
497         default:
498                 return (USAGE);
499         }
500
501         /* send command */
502         n = sizeof(rp);
503         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
504                         NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
505                         (char const *) &cp, sizeof(cp), 
506                         (char *) &rp, &n) == ERROR)
507                 return (ERROR);
508
509         if (rp.status != 0x00) {
510                 fprintf(stdout, "Status: %s [%#02x]\n",
511                         hci_status2str(rp.status), rp.status);
512                 return (FAILED);
513         }
514
515         return (OK);
516 } /* hci_write_connection_accept_timeout */
517
518 /* Send Read_Page_Timeout command to the unit */
519 static int
520 hci_read_page_timeout(int s, int argc, char **argv)
521 {
522         ng_hci_read_page_timo_rp        rp;
523         int                             n;
524
525         n = sizeof(rp);
526         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
527                         NG_HCI_OCF_READ_PAGE_TIMO),
528                         (char *) &rp, &n) == ERROR)
529                 return (ERROR);
530
531         if (rp.status != 0x00) {
532                 fprintf(stdout, "Status: %s [%#02x]\n", 
533                         hci_status2str(rp.status), rp.status);
534                 return (FAILED);
535         }
536
537         rp.timeout = le16toh(rp.timeout);
538         fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
539                 rp.timeout * 0.625, rp.timeout);
540
541         return (OK);
542 } /* hci_read_page_timeoout */
543
544 /* Send Write_Page_Timeout command to the unit */
545 static int
546 hci_write_page_timeout(int s, int argc, char **argv)
547 {
548         ng_hci_write_page_timo_cp       cp;
549         ng_hci_write_page_timo_rp       rp;
550         int                             n;
551
552         /* parse command parameters */
553         switch (argc) {
554         case 1:
555                 if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
556                         return (USAGE);
557
558                 cp.timeout = (uint16_t) n;
559                 cp.timeout = htole16(cp.timeout);
560                 break;
561
562         default:
563                 return (USAGE);
564         }
565
566         /* send command */
567         n = sizeof(rp);
568         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
569                         NG_HCI_OCF_WRITE_PAGE_TIMO),
570                         (char const *) &cp, sizeof(cp),
571                         (char *) &rp, &n) == ERROR)
572                 return (ERROR);
573
574         if (rp.status != 0x00) {
575                 fprintf(stdout, "Status: %s [%#02x]\n", 
576                         hci_status2str(rp.status), rp.status);
577                 return (FAILED);
578         }
579
580         return (OK);
581 } /* hci_write_page_timeout */
582
583 /* Send Read_Scan_Enable command to the unit */
584 static int
585 hci_read_scan_enable(int s, int argc, char **argv)
586 {
587         ng_hci_read_scan_enable_rp      rp;
588         int                             n;
589
590         n = sizeof(rp);
591         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
592                         NG_HCI_OCF_READ_SCAN_ENABLE),
593                         (char *) &rp, &n) == ERROR)
594                 return (ERROR);
595
596         if (rp.status != 0x00) {
597                 fprintf(stdout, "Status: %s [%#02x]\n", 
598                         hci_status2str(rp.status), rp.status);
599                 return (FAILED);
600         }
601
602         fprintf(stdout, "Scan enable: %s [%#02x]\n",
603                 hci_scan2str(rp.scan_enable), rp.scan_enable);
604
605         return (OK);
606 } /* hci_read_scan_enable */
607
608 /* Send Write_Scan_Enable command to the unit */
609 static int
610 hci_write_scan_enable(int s, int argc, char **argv)
611 {
612         ng_hci_write_scan_enable_cp     cp;
613         ng_hci_write_scan_enable_rp     rp;
614         int                             n;
615
616         /* parse command parameters */
617         switch (argc) {
618         case 1:
619                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
620                         return (USAGE);
621
622                 cp.scan_enable = (uint8_t) n;
623                 break;
624
625         default:
626                 return (USAGE);
627         }
628
629         n = sizeof(rp);
630         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND, 
631                         NG_HCI_OCF_WRITE_SCAN_ENABLE),
632                         (char const *) &cp, sizeof(cp),
633                         (char *) &rp, &n) == ERROR)
634                 return (ERROR);
635
636         if (rp.status != 0x00) {
637                 fprintf(stdout, "Status: %s [%#02x]\n",
638                         hci_status2str(rp.status), rp.status);
639                 return (FAILED);
640         }
641
642         return (OK);
643 } /* hci_write_scan_enable */
644
645 /* Send Read_Page_Scan_Activity command to the unit */
646 static int
647 hci_read_page_scan_activity(int s, int argc, char **argv)
648 {
649         ng_hci_read_page_scan_activity_rp       rp;
650         int                                     n;
651
652         n = sizeof(rp);
653         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
654                         NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
655                         (char *) &rp, &n) == ERROR)
656                 return (ERROR);
657
658         if (rp.status != 0x00) {
659                 fprintf(stdout, "Status: %s [%#02x]\n",
660                         hci_status2str(rp.status), rp.status);
661                 return (FAILED);
662         }
663
664         rp.page_scan_interval = le16toh(rp.page_scan_interval);
665         rp.page_scan_window = le16toh(rp.page_scan_window);
666
667         fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
668                 rp.page_scan_interval * 0.625, rp.page_scan_interval);
669         fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
670                 rp.page_scan_window * 0.625, rp.page_scan_window);
671
672         return (OK);
673 } /* hci_read_page_scan_activity */
674
675 /* Send Write_Page_Scan_Activity command to the unit */
676 static int
677 hci_write_page_scan_activity(int s, int argc, char **argv)
678 {
679         ng_hci_write_page_scan_activity_cp      cp;
680         ng_hci_write_page_scan_activity_rp      rp;
681         int                                     n;
682
683         /* parse command parameters */
684         switch (argc) {
685         case 2:
686                 /* page scan interval */
687                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
688                         return (USAGE);
689
690                 cp.page_scan_interval = (uint16_t) n;
691
692                 /* page scan window */
693                 if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
694                         return (USAGE);
695
696                 cp.page_scan_window = (uint16_t) n;
697
698                 if (cp.page_scan_window > cp.page_scan_interval)
699                         return (USAGE);
700
701                 cp.page_scan_interval = htole16(cp.page_scan_interval);
702                 cp.page_scan_window = htole16(cp.page_scan_window);
703                 break;
704
705         default:
706                 return (USAGE);
707         }
708
709         /* send command */
710         n = sizeof(rp);
711         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
712                         NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
713                         (char const *) &cp, sizeof(cp),
714                         (char *) &rp, &n) == ERROR)
715                 return (ERROR);
716
717         if (rp.status != 0x00) {
718                 fprintf(stdout, "Status: %s [%#02x]\n", 
719                         hci_status2str(rp.status), rp.status);
720                 return (FAILED);
721         }
722
723         return (OK);
724 } /* hci_write_page_scan_activity */
725
726 /* Send Read_Inquiry_Scan_Activity command to the unit */
727 static int
728 hci_read_inquiry_scan_activity(int s, int argc, char **argv)
729 {
730         ng_hci_read_inquiry_scan_activity_rp    rp;
731         int                                     n;
732
733         n = sizeof(rp);
734         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
735                         NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
736                         (char *) &rp, &n) == ERROR)
737                 return (ERROR);
738
739         if (rp.status != 0x00) {
740                 fprintf(stdout, "Status: %s [%#02x]\n",
741                         hci_status2str(rp.status), rp.status);
742                 return (FAILED);
743         }
744
745         rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
746         rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
747
748         fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
749                 rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
750         fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
751                 rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
752
753         return (OK);
754 } /* hci_read_inquiry_scan_activity */
755
756 /* Send Write_Inquiry_Scan_Activity command to the unit */
757 static int
758 hci_write_inquiry_scan_activity(int s, int argc, char **argv)
759 {
760         ng_hci_write_inquiry_scan_activity_cp   cp;
761         ng_hci_write_inquiry_scan_activity_rp   rp;
762         int                                     n;
763
764         /* parse command parameters */
765         switch (argc) {
766         case 2:
767                 /* inquiry scan interval */
768                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
769                         return (USAGE);
770
771                 cp.inquiry_scan_interval = (uint16_t) n;
772
773                 /* inquiry scan window */
774                 if (sscanf(argv[1], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
775                         return (USAGE);
776
777                 cp.inquiry_scan_window = (uint16_t) n;
778
779                 if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
780                         return (USAGE);
781
782                 cp.inquiry_scan_interval = 
783                         htole16(cp.inquiry_scan_interval);
784                 cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
785                 break;
786
787         default:
788                 return (USAGE);
789         }
790
791         /* send command */
792         n = sizeof(rp);
793         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
794                         NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
795                         (char const *) &cp, sizeof(cp),
796                         (char *) &rp, &n) == ERROR)
797                 return (ERROR);
798
799         if (rp.status != 0x00) {
800                 fprintf(stdout, "Status: %s [%#02x]\n",
801                         hci_status2str(rp.status), rp.status);
802                 return (FAILED);
803         }
804
805         return (OK);
806 } /* hci_write_inquiry_scan_activity */
807
808 /* Send Read_Authentication_Enable command to the unit */
809 static int
810 hci_read_authentication_enable(int s, int argc, char **argv)
811 {
812         ng_hci_read_auth_enable_rp      rp;
813         int                             n;
814
815         n = sizeof(rp);
816         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
817                         NG_HCI_OCF_READ_AUTH_ENABLE),
818                         (char *) &rp, &n) == ERROR)
819                 return (ERROR);
820
821         if (rp.status != 0x00) {
822                 fprintf(stdout, "Status: %s [%#02x]\n",
823                         hci_status2str(rp.status), rp.status);
824                 return (FAILED);
825         }
826
827         fprintf(stdout, "Authentication Enable: %s [%d]\n",
828                 rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
829
830         return (OK);
831 } /* hci_read_authentication_enable */
832
833 /* Send Write_Authentication_Enable command to the unit */
834 static int
835 hci_write_authentication_enable(int s, int argc, char **argv)
836 {
837         ng_hci_write_auth_enable_cp     cp;
838         ng_hci_write_auth_enable_rp     rp;
839         int                             n;
840
841         /* parse command parameters */
842         switch (argc) {
843         case 1:
844                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
845                         return (USAGE);
846
847                 cp.auth_enable = (uint8_t) n;
848                 break;
849
850         default:
851                 return (USAGE);
852         }
853
854         /* send command */
855         n = sizeof(rp);
856         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
857                         NG_HCI_OCF_WRITE_AUTH_ENABLE),
858                         (char const *) &cp, sizeof(cp),
859                         (char *) &rp, &n) == ERROR)
860                 return (ERROR);
861
862         if (rp.status != 0x00) {
863                 fprintf(stdout, "Status: %s [%#02x]\n", 
864                         hci_status2str(rp.status), rp.status);
865                 return (FAILED);
866         }
867
868         return (OK);
869 } /* hci_write_authentication_enable */
870
871 /* Send Read_Encryption_Mode command to the unit */
872 static int
873 hci_read_encryption_mode(int s, int argc, char **argv)
874 {
875         ng_hci_read_encryption_mode_rp  rp;
876         int                             n;
877
878         n = sizeof(rp);
879         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
880                         NG_HCI_OCF_READ_ENCRYPTION_MODE),
881                         (char *) &rp, &n) == ERROR)
882                 return (ERROR);
883
884         if (rp.status != 0x00) {
885                 fprintf(stdout, "Status: %s [%#02x]\n", 
886                         hci_status2str(rp.status), rp.status);
887                 return (FAILED);
888         }
889
890         fprintf(stdout, "Encryption mode: %s [%#02x]\n", 
891                 hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
892
893         return (OK);
894 } /* hci_read_encryption_mode */
895
896 /* Send Write_Encryption_Mode command to the unit */
897 static int
898 hci_write_encryption_mode(int s, int argc, char **argv)
899 {
900         ng_hci_write_encryption_mode_cp cp;
901         ng_hci_write_encryption_mode_rp rp;
902         int                             n;
903
904         /* parse command parameters */
905         switch (argc) {
906         case 1:
907                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
908                         return (USAGE);
909
910                 cp.encryption_mode = (uint8_t) n;
911                 break;
912
913         default:
914                 return (USAGE);
915         }
916
917         /* send command */
918         n = sizeof(rp);
919         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
920                         NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
921                         (char const *) &cp, sizeof(cp),
922                         (char *) &rp, &n) == ERROR)
923                 return (ERROR);
924
925         if (rp.status != 0x00) {
926                 fprintf(stdout, "Status: %s [%#02x]\n", 
927                         hci_status2str(rp.status), rp.status);
928                 return (FAILED);
929         }
930
931         return (OK);
932 } /* hci_write_encryption_mode */
933
934 /* Send Read_Class_Of_Device command to the unit */
935 static int
936 hci_read_class_of_device(int s, int argc, char **argv)
937 {
938         ng_hci_read_unit_class_rp       rp;
939         int                             n;
940
941         n = sizeof(rp);
942         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
943                         NG_HCI_OCF_READ_UNIT_CLASS),
944                         (char *) &rp, &n) == ERROR)
945                 return (ERROR);
946
947         if (rp.status != 0x00) {
948                 fprintf(stdout, "Status: %s [%#02x]\n", 
949                         hci_status2str(rp.status), rp.status);
950                 return (FAILED);
951         }
952
953         fprintf(stdout, "Class: %02x:%02x:%02x\n",
954                 rp.uclass[2], rp.uclass[1], rp.uclass[0]);
955
956         return (0);
957 } /* hci_read_class_of_device */
958
959 /* Send Write_Class_Of_Device command to the unit */
960 static int
961 hci_write_class_of_device(int s, int argc, char **argv)
962 {
963         ng_hci_write_unit_class_cp      cp;
964         ng_hci_write_unit_class_rp      rp;
965         int                             n0, n1, n2;
966
967         /* parse command parameters */
968         switch (argc) {
969         case 1:
970                 if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
971                         return (USAGE);
972
973                 cp.uclass[0] = (n0 & 0xff);
974                 cp.uclass[1] = (n1 & 0xff);
975                 cp.uclass[2] = (n2 & 0xff);
976                 break;
977
978         default:
979                 return (USAGE);
980         }
981
982         /* send command */
983         n0 = sizeof(rp);
984         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
985                         NG_HCI_OCF_WRITE_UNIT_CLASS),
986                         (char const *) &cp, sizeof(cp),
987                         (char *) &rp, &n0) == ERROR)
988                 return (ERROR);
989
990         if (rp.status != 0x00) {
991                 fprintf(stdout, "Status: %s [%#02x]\n", 
992                         hci_status2str(rp.status), rp.status);
993                 return (FAILED);
994         }
995
996         return (OK);
997 } /* hci_write_class_of_device */
998
999 /* Send Read_Voice_Settings command to the unit */
1000 static int
1001 hci_read_voice_settings(int s, int argc, char **argv)
1002 {
1003         ng_hci_read_voice_settings_rp   rp;
1004         int                             n,
1005                                         input_coding,
1006                                         input_data_format,
1007                                         input_sample_size;
1008
1009         n = sizeof(rp);
1010         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1011                         NG_HCI_OCF_READ_VOICE_SETTINGS),
1012                         (char *) &rp, &n) == ERROR)
1013                 return (ERROR);
1014
1015         if (rp.status != 0x00) {
1016                 fprintf(stdout, "Status: %s [%#02x]\n", 
1017                         hci_status2str(rp.status), rp.status);
1018                 return (FAILED);
1019         }
1020
1021         rp.settings = le16toh(rp.settings);
1022
1023         input_coding      = (rp.settings & 0x0300) >> 8;
1024         input_data_format = (rp.settings & 0x00c0) >> 6;
1025         input_sample_size = (rp.settings & 0x0020) >> 5;
1026
1027         fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1028         fprintf(stdout, "Input coding: %s [%d]\n",
1029                 hci_coding2str(input_coding), input_coding);
1030         fprintf(stdout, "Input data format: %s [%d]\n",
1031                 hci_vdata2str(input_data_format), input_data_format);
1032
1033         if (input_coding == 0x00) /* Only for Linear PCM */
1034                 fprintf(stdout, "Input sample size: %d bit [%d]\n",
1035                         input_sample_size? 16 : 8, input_sample_size);
1036
1037         return (OK);
1038 } /* hci_read_voice_settings */
1039
1040 /* Send Write_Voice_Settings command to the unit */
1041 static int
1042 hci_write_voice_settings(int s, int argc, char **argv)
1043 {
1044         ng_hci_write_voice_settings_cp  cp;
1045         ng_hci_write_voice_settings_rp  rp;
1046         int                             n;
1047
1048         /* parse command parameters */
1049         switch (argc) {
1050         case 1:
1051                 if (sscanf(argv[0], "%x", &n) != 1)
1052                         return (USAGE);
1053
1054                 cp.settings = (uint16_t) n;
1055                 cp.settings = htole16(cp.settings);
1056                 break;
1057
1058         default:
1059                 return (USAGE);
1060         }
1061
1062         /* send command */
1063         n = sizeof(rp);
1064         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1065                         NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1066                         (char const *) &cp, sizeof(cp),
1067                         (char *) &rp, &n) == ERROR)
1068                 return (ERROR);
1069
1070         if (rp.status != 0x00) {
1071                 fprintf(stdout, "Status: %s [%#02x]\n", 
1072                         hci_status2str(rp.status), rp.status);
1073                 return (FAILED);
1074         }
1075
1076         return (OK);
1077 } /* hci_write_voice_settings */
1078
1079 /* Send Read_Number_Broadcast_Restransmissions */
1080 static int
1081 hci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1082 {
1083         ng_hci_read_num_broadcast_retrans_rp    rp;
1084         int                                     n;
1085
1086         n = sizeof(rp);
1087         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1088                         NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1089                         (char *) &rp, &n) == ERROR)
1090                 return (ERROR);
1091
1092         if (rp.status != 0x00) {
1093                 fprintf(stdout, "Status: %s [%#02x]\n", 
1094                         hci_status2str(rp.status), rp.status);
1095                 return (FAILED);
1096         }
1097
1098         fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1099                 rp.counter);
1100
1101         return (OK);
1102 } /* hci_read_number_broadcast_retransmissions */
1103
1104 /* Send Write_Number_Broadcast_Restransmissions */
1105 static int
1106 hci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1107 {
1108         ng_hci_write_num_broadcast_retrans_cp   cp;
1109         ng_hci_write_num_broadcast_retrans_rp   rp;
1110         int                                     n;
1111
1112         /* parse command parameters */
1113         switch (argc) {
1114         case 1:
1115                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1116                         return (USAGE);
1117
1118                 cp.counter = (uint8_t) n;
1119                 break;
1120
1121         default:
1122                 return (USAGE);
1123         }
1124
1125         /* send command */
1126         n = sizeof(rp);
1127         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1128                         NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1129                         (char const *) &cp, sizeof(cp),
1130                         (char *) &rp, &n) == ERROR)
1131                 return (ERROR);
1132
1133         if (rp.status != 0x00) {
1134                 fprintf(stdout, "Status: %s [%#02x]\n", 
1135                         hci_status2str(rp.status), rp.status);
1136                 return (FAILED);
1137         }
1138
1139         return (OK);
1140 } /* hci_write_number_broadcast_retransmissions */
1141
1142 /* Send Read_Hold_Mode_Activity command to the unit */
1143 static int
1144 hci_read_hold_mode_activity(int s, int argc, char **argv)
1145 {
1146         ng_hci_read_hold_mode_activity_rp       rp;
1147         int                                     n;
1148         char                                    buffer[1024];
1149
1150         n = sizeof(rp);
1151         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1152                         NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1153                         (char *) &rp, &n) == ERROR)
1154                 return (ERROR);
1155
1156         if (rp.status != 0x00) {
1157                 fprintf(stdout, "Status: %s [%#02x]\n", 
1158                         hci_status2str(rp.status), rp.status);
1159                 return (FAILED);
1160         }
1161
1162         fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1163         if (rp.hold_mode_activity == 0)
1164                 fprintf(stdout, "Maintain current Power State");
1165         else
1166                 fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1167                                 buffer, sizeof(buffer)));
1168
1169         fprintf(stdout, "\n");
1170
1171         return (OK);
1172 } /* hci_read_hold_mode_activity */
1173
1174 /* Send Write_Hold_Mode_Activity command to the unit */
1175 static int
1176 hci_write_hold_mode_activity(int s, int argc, char **argv)
1177 {
1178         ng_hci_write_hold_mode_activity_cp      cp;
1179         ng_hci_write_hold_mode_activity_rp      rp;
1180         int                                     n;
1181
1182         /* parse command parameters */
1183         switch (argc) {
1184         case 1:
1185                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1186                         return (USAGE);
1187
1188                 cp.hold_mode_activity = (uint8_t) n;
1189                 break;
1190
1191         default:
1192                 return (USAGE);
1193         }
1194
1195         /* send command */
1196         n = sizeof(rp);
1197         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1198                         NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1199                         (char const *) &cp, sizeof(cp),
1200                         (char *) &rp, &n) == ERROR)
1201                 return (ERROR);
1202
1203         if (rp.status != 0x00) {
1204                 fprintf(stdout, "Status: %s [%#02x]\n", 
1205                         hci_status2str(rp.status), rp.status);
1206                 return (FAILED);
1207         }
1208
1209         return (OK);
1210 } /* hci_write_hold_mode_activity */
1211
1212 /* Send Read_SCO_Flow_Control_Enable command to the unit */
1213 static int
1214 hci_read_sco_flow_control_enable(int s, int argc, char **argv)
1215 {
1216         ng_hci_read_sco_flow_control_rp rp;
1217         int                             n;
1218
1219         n = sizeof(rp);
1220         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1221                         NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1222                         (char *) &rp, &n) == ERROR)
1223                 return (ERROR);
1224
1225         if (rp.status != 0x00) {
1226                 fprintf(stdout, "Status: %s [%#02x]\n", 
1227                         hci_status2str(rp.status), rp.status);
1228                 return (FAILED);
1229         }
1230
1231         fprintf(stdout, "SCO flow control %s [%d]\n",
1232                 rp.flow_control? "enabled" : "disabled", rp.flow_control);
1233
1234         return (OK);
1235 } /* hci_read_sco_flow_control_enable */
1236
1237 /* Send Write_SCO_Flow_Control_Enable command to the unit */
1238 static int
1239 hci_write_sco_flow_control_enable(int s, int argc, char **argv)
1240 {
1241         ng_hci_write_sco_flow_control_cp        cp;
1242         ng_hci_write_sco_flow_control_rp        rp;
1243         int                                     n;
1244
1245         /* parse command parameters */
1246         switch (argc) {
1247         case 1:
1248                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1249                         return (USAGE);
1250
1251                 cp.flow_control = (uint8_t) n;
1252                 break;
1253
1254         default:
1255                 return (USAGE);
1256         }
1257
1258         /* send command */
1259         n = sizeof(rp);
1260         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1261                         NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1262                         (char const *) &cp, sizeof(cp),
1263                         (char *) &rp, &n) == ERROR)
1264                 return (ERROR);
1265
1266         if (rp.status != 0x00) {
1267                 fprintf(stdout, "Status: %s [%#02x]\n", 
1268                         hci_status2str(rp.status), rp.status);
1269                 return (FAILED);
1270         }
1271
1272         return (OK);
1273 } /* hci_write_sco_flow_control_enable */
1274
1275 /* Send Read_Link_Supervision_Timeout command to the unit */
1276 static int
1277 hci_read_link_supervision_timeout(int s, int argc, char **argv)
1278 {
1279         ng_hci_read_link_supervision_timo_cp    cp;
1280         ng_hci_read_link_supervision_timo_rp    rp;
1281         int                                     n;
1282
1283         switch (argc) {
1284         case 1:
1285                 /* connection handle */
1286                 if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1287                         return (USAGE);
1288
1289                 cp.con_handle = (uint16_t) (n & 0x0fff);
1290                 cp.con_handle = htole16(cp.con_handle);
1291                 break;
1292
1293         default:
1294                 return (USAGE);
1295         }
1296
1297         /* send command */
1298         n = sizeof(rp);
1299         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1300                         NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1301                         (char const *) &cp, sizeof(cp),
1302                         (char *) &rp, &n) == ERROR)
1303                 return (ERROR);
1304
1305         if (rp.status != 0x00) {
1306                 fprintf(stdout, "Status: %s [%#02x]\n", 
1307                         hci_status2str(rp.status), rp.status);
1308                 return (FAILED);
1309         }
1310
1311         rp.timeout = le16toh(rp.timeout);
1312
1313         fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1314         fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1315                 rp.timeout * 0.625, rp.timeout);
1316
1317         return (OK);
1318 } /* hci_read_link_supervision_timeout */
1319
1320 /* Send Write_Link_Supervision_Timeout command to the unit */
1321 static int
1322 hci_write_link_supervision_timeout(int s, int argc, char **argv)
1323 {
1324         ng_hci_write_link_supervision_timo_cp   cp;
1325         ng_hci_write_link_supervision_timo_rp   rp;
1326         int                                     n;
1327
1328         switch (argc) {
1329         case 2:
1330                 /* connection handle */
1331                 if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1332                         return (USAGE);
1333
1334                 cp.con_handle = (uint16_t) (n & 0x0fff);
1335                 cp.con_handle = htole16(cp.con_handle);
1336
1337                 /* link supervision timeout */
1338                 if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xffff)
1339                         return (USAGE);
1340
1341                 cp.timeout = (uint16_t) (n & 0x0fff);
1342                 cp.timeout = htole16(cp.timeout);
1343                 break;
1344
1345         default:
1346                 return (USAGE);
1347         }
1348
1349         /* send command */
1350         n = sizeof(rp);
1351         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1352                         NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1353                         (char const *) &cp, sizeof(cp),
1354                         (char *) &rp, &n) == ERROR)
1355                 return (ERROR);
1356
1357         if (rp.status != 0x00) {
1358                 fprintf(stdout, "Status: %s [%#02x]\n", 
1359                         hci_status2str(rp.status), rp.status);
1360                 return (FAILED);
1361         }
1362
1363         return (OK);
1364 } /* hci_write_link_supervision_timeout */
1365
1366 /* Send Read_Page_Scan_Period_Mode command to the unit */
1367 static int
1368 hci_read_page_scan_period_mode(int s, int argc, char **argv)
1369 {
1370         ng_hci_read_page_scan_period_rp rp;
1371         int                             n;
1372
1373         n = sizeof(rp);
1374         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1375                         NG_HCI_OCF_READ_PAGE_SCAN_PERIOD),
1376                         (char *) &rp, &n) == ERROR)
1377                 return (ERROR);
1378
1379         if (rp.status != 0x00) {
1380                 fprintf(stdout, "Status: %s [%#02x]\n", 
1381                         hci_status2str(rp.status), rp.status);
1382                 return (FAILED);
1383         }
1384
1385         fprintf(stdout, "Page scan period mode: %#02x\n",
1386                 rp.page_scan_period_mode);
1387
1388         return (OK);
1389 } /* hci_read_page_scan_period_mode */
1390
1391 /* Send Write_Page_Scan_Period_Mode command to the unit */
1392 static int
1393 hci_write_page_scan_period_mode(int s, int argc, char **argv)
1394 {
1395         ng_hci_write_page_scan_period_cp        cp;
1396         ng_hci_write_page_scan_period_rp        rp;
1397         int                                     n;
1398
1399         /* parse command arguments */
1400         switch (argc) {
1401         case 1:
1402                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
1403                         return (USAGE);
1404         
1405                 cp.page_scan_period_mode = (n & 0xff);
1406                 break;
1407
1408         default:
1409                 return (USAGE);
1410         }
1411
1412         /* send command */
1413         n = sizeof(rp);
1414         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1415                         NG_HCI_OCF_WRITE_PAGE_SCAN_PERIOD),
1416                         (char const *) &cp, sizeof(cp),
1417                         (char *) &rp, &n) == ERROR)
1418                 return (ERROR);
1419
1420         if (rp.status != 0x00) {
1421                 fprintf(stdout, "Status: %s [%#02x]\n", 
1422                         hci_status2str(rp.status), rp.status);
1423                 return (FAILED);
1424         }
1425
1426         return (OK);
1427 } /* hci_write_page_scan_period_mode */
1428
1429 /* Send Read_Page_Scan_Mode command to the unit */
1430 static int
1431 hci_read_page_scan_mode(int s, int argc, char **argv)
1432 {
1433         ng_hci_read_page_scan_rp        rp;
1434         int                             n;
1435
1436         n = sizeof(rp);
1437         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1438                         NG_HCI_OCF_READ_PAGE_SCAN),
1439                         (char *) &rp, &n) == ERROR)
1440                 return (ERROR);
1441
1442         if (rp.status != 0x00) {
1443                 fprintf(stdout, "Status: %s [%#02x]\n", 
1444                         hci_status2str(rp.status), rp.status);
1445                 return (FAILED);
1446         }
1447
1448         fprintf(stdout, "Page scan mode: %#02x\n", rp.page_scan_mode);
1449
1450         return (OK);
1451 } /* hci_read_page_scan_mode */
1452
1453 /* Send Write_Page_Scan_Mode command to the unit */
1454 static int
1455 hci_write_page_scan_mode(int s, int argc, char **argv)
1456 {
1457         ng_hci_write_page_scan_cp       cp;
1458         ng_hci_write_page_scan_rp       rp;
1459         int                             n;
1460
1461         /* parse command arguments */
1462         switch (argc) {
1463         case 1:
1464                 if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
1465                         return (USAGE);
1466         
1467                 cp.page_scan_mode = (n & 0xff);
1468                 break;
1469
1470         default:
1471                 return (USAGE);
1472         }
1473
1474         /* send command */
1475         n = sizeof(rp);
1476         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1477                         NG_HCI_OCF_WRITE_PAGE_SCAN),
1478                         (char const *) &cp, sizeof(cp),
1479                         (char *) &rp, &n) == ERROR)
1480                 return (ERROR);
1481
1482         if (rp.status != 0x00) {
1483                 fprintf(stdout, "Status: %s [%#02x]\n", 
1484                         hci_status2str(rp.status), rp.status);
1485                 return (FAILED);
1486         }
1487
1488         return (OK);
1489 } /* hci_write_page_scan_mode */
1490
1491 static int
1492 hci_read_le_host_supported_command(int s, int argc, char **argv) 
1493 {
1494         ng_hci_read_le_host_supported_rp rp;
1495         int n;
1496         n = sizeof(rp);
1497         if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1498                         NG_HCI_OCF_READ_LE_HOST_SUPPORTED),
1499                         (char *) &rp, &n) == ERROR)
1500                 return (ERROR);
1501
1502         if (rp.status != 0x00) {
1503                 fprintf(stdout, "Status: %s [%#02x]\n", 
1504                         hci_status2str(rp.status), rp.status);
1505                 return (FAILED);
1506         }
1507
1508         fprintf(stdout, "LE Host support: %#02x\n", rp.le_supported_host);
1509         fprintf(stdout, "Simulateneouse LE Host : %#02x\n", rp.simultaneous_le_host);
1510
1511         return (OK);
1512         
1513 }
1514 static int
1515 hci_write_le_host_supported_command(int s, int argc, char **argv) 
1516 {
1517         ng_hci_write_le_host_supported_cp cp;
1518         ng_hci_write_le_host_supported_rp rp;
1519
1520         int n;
1521
1522         cp.le_supported_host = 0;
1523         cp.simultaneous_le_host = 0;
1524         switch (argc) {
1525         case 2:
1526                 if (sscanf(argv[1], "%d", &n) != 1 || (n != 0 && n != 1)){
1527                         printf("ARGC2: %d\n", n);
1528                         return (USAGE);
1529                 }
1530                 cp.simultaneous_le_host = (n &1);
1531                 
1532         case 1:
1533                 if (sscanf(argv[0], "%d", &n) != 1 || (n != 0 && n != 1)){
1534                         printf("ARGC1: %d\n", n);
1535                         return (USAGE);
1536                 }
1537
1538                 cp.le_supported_host = (n &1);
1539                 break;
1540
1541         default:
1542                 return (USAGE);
1543         }
1544
1545
1546         /* send command */
1547         n = sizeof(rp);
1548         if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1549                         NG_HCI_OCF_WRITE_LE_HOST_SUPPORTED),
1550                         (char const *) &cp, sizeof(cp),
1551                         (char *) &rp, &n) == ERROR)
1552                 return (ERROR);
1553
1554         if (rp.status != 0x00) {
1555                 fprintf(stdout, "Status: %s [%#02x]\n", 
1556                         hci_status2str(rp.status), rp.status);
1557                 return (FAILED);
1558         }
1559
1560         return (OK);
1561 }
1562
1563 struct hci_command      host_controller_baseband_commands[] = {
1564 {
1565 "reset",
1566 "\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1567 "After the reset is completed, the current operational state will be lost,\n" \
1568 "the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1569 "automatically revert to the default values for the parameters for which\n" \
1570 "default values are defined in the specification.",
1571 &hci_reset
1572 },
1573 {
1574 "read_pin_type",
1575 "\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1576 "Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1577 "code.",
1578 &hci_read_pin_type
1579 },
1580 {
1581 "write_pin_type <pin_type>",
1582 "\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1583 "Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1584 "code.\n\n" \
1585 "\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1586 &hci_write_pin_type
1587 },
1588 {
1589 "read_stored_link_key [<BD_ADDR>]",
1590 "\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1591 "more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1592 "Controller can store a limited number of link keys for other Bluetooth\n" \
1593 "devices.\n\n" \
1594 "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1595 &hci_read_stored_link_key
1596 },
1597 {
1598 "write_stored_link_key <BD_ADDR> <key>",
1599 "\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1600 "or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1601 "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1602 "Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1603 "Host Controller then no additional link keys will be stored.\n\n" \
1604 "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name\n" \
1605 "\t<key>     - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1606 &hci_write_stored_link_key
1607 },
1608 {
1609 "delete_stored_link_key [<BD_ADDR>]",
1610 "\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1611 "or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1612 "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1613 "Bluetooth devices.\n\n" \
1614 "\t<BD_ADDR> - xx:xx:xx:xx:xx:xx BD_ADDR or name",
1615 &hci_delete_stored_link_key
1616 },
1617 {
1618 "change_local_name <name>",
1619 "\nThe Change_Local_Name command provides the ability to modify the user\n" \
1620 "friendly name for the Bluetooth unit.\n\n" \
1621 "\t<name> - string",
1622 &hci_change_local_name
1623 },
1624 {
1625 "read_local_name",
1626 "\nThe Read_Local_Name command provides the ability to read the\n" \
1627 "stored user-friendly name for the Bluetooth unit.",
1628 &hci_read_local_name
1629 },
1630 {
1631 "read_connection_accept_timeout",
1632 "\nThis command will read the value for the Connection_Accept_Timeout\n" \
1633 "configuration parameter. The Connection_Accept_Timeout configuration\n" \
1634 "parameter allows the Bluetooth hardware to automatically deny a\n" \
1635 "connection request after a specified time period has occurred and\n" \
1636 "the new connection is not accepted. Connection Accept Timeout\n" \
1637 "measured in Number of Baseband slots.",
1638 &hci_read_connection_accept_timeout
1639 },
1640 {
1641 "write_connection_accept_timeout <timeout>",
1642 "\nThis command will write the value for the Connection_Accept_Timeout\n" \
1643 "configuration parameter.\n\n" \
1644 "\t<timeout> - dddd; measured in number of baseband slots.",
1645 &hci_write_connection_accept_timeout
1646 },
1647 {
1648 "read_page_timeout",
1649 "\nThis command will read the value for the Page_Timeout configuration\n" \
1650 "parameter. The Page_Timeout configuration parameter defines the\n" \
1651 "maximum time the local Link Manager will wait for a baseband page\n" \
1652 "response from the remote unit at a locally initiated connection\n" \
1653 "attempt. Page Timeout measured in Number of Baseband slots.",
1654 &hci_read_page_timeout
1655 },
1656 {
1657 "write_page_timeout <timeout>",
1658 "\nThis command will write the value for the Page_Timeout configuration\n" \
1659 "parameter.\n\n" \
1660 "\t<timeout> - dddd; measured in number of baseband slots.",
1661 &hci_write_page_timeout
1662 },
1663 {
1664 "read_scan_enable",
1665 "\nThis command will read the value for the Scan_Enable parameter. The\n" \
1666 "Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1667 "will periodically scan for page attempts and/or inquiry requests\n" \
1668 "from other Bluetooth unit.\n\n" \
1669 "\t0x00 - No Scans enabled.\n" \
1670 "\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1671 "\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1672 "\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1673 &hci_read_scan_enable
1674 },
1675 {
1676 "write_scan_enable <scan_enable>",
1677 "\nThis command will write the value for the Scan_Enable parameter.\n" \
1678 "The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1679 "unit will periodically scan for page attempts and/or inquiry\n" \
1680 "requests from other Bluetooth unit.\n\n" \
1681 "\t<scan_enable> - dd;\n" \
1682 "\t0 - No Scans enabled.\n" \
1683 "\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1684 "\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1685 "\t3 - Inquiry Scan enabled. Page Scan enabled.",
1686 &hci_write_scan_enable
1687 },
1688 {
1689 "read_page_scan_activity",
1690 "\nThis command will read the value for Page_Scan_Activity configuration\n" \
1691 "parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1692 "amount of time between consecutive page scans. This time interval is \n" \
1693 "defined from when the Host Controller started its last page scan until\n" \
1694 "it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1695 "defines the amount of time for the duration of the page scan. The\n" \
1696 "Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1697 &hci_read_page_scan_activity
1698 },
1699 {
1700 "write_page_scan_activity interval(dddd) window(dddd)",
1701 "\nThis command will write the value for Page_Scan_Activity configuration\n" \
1702 "parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1703 "amount of time between consecutive page scans. This is defined as the time\n" \
1704 "interval from when the Host Controller started its last page scan until it\n" \
1705 "begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1706 "defines the amount of time for the duration of the page scan. \n" \
1707 "The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1708 "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
1709 "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1710 &hci_write_page_scan_activity
1711 },
1712 {
1713 "read_inquiry_scan_activity",
1714 "\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1715 "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1716 "amount of time between consecutive inquiry scans. This is defined as the\n" \
1717 "time interval from when the Host Controller started its last inquiry scan\n" \
1718 "until it begins the next inquiry scan.",
1719 &hci_read_inquiry_scan_activity
1720 },
1721 {
1722 "write_inquiry_scan_activity interval(dddd) window(dddd)",
1723 "\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1724 "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1725 "amount of time between consecutive inquiry scans. This is defined as the\n" \
1726 "time interval from when the Host Controller started its last inquiry scan\n" \
1727 "until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1728 "parameter defines the amount of time for the duration of the inquiry scan.\n" \
1729 "The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1730 "\t<interval> - Range: 0x0012 -- 0x100, Time = N * 0.625 msec\n" \
1731 "\t<window>   - Range: 0x0012 -- 0x100, Time = N * 0.625 msec",
1732 &hci_write_inquiry_scan_activity
1733 },
1734 {
1735 "read_authentication_enable",
1736 "\nThis command will read the value for the Authentication_Enable parameter.\n"\
1737 "The Authentication_Enable parameter controls if the local unit requires\n"\
1738 "to authenticate the remote unit at connection setup (between the\n" \
1739 "Create_Connection command or acceptance of an incoming ACL connection\n"\
1740 "and the corresponding Connection Complete event). At connection setup, only\n"\
1741 "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1742 "authenticate the other unit.",
1743 &hci_read_authentication_enable
1744 },
1745 {
1746 "write_authentication_enable enable(0|1)",
1747 "\nThis command will write the value for the Authentication_Enable parameter.\n"\
1748 "The Authentication_Enable parameter controls if the local unit requires to\n"\
1749 "authenticate the remote unit at connection setup (between the\n" \
1750 "Create_Connection command or acceptance of an incoming ACL connection\n" \
1751 "and the corresponding Connection Complete event). At connection setup, only\n"\
1752 "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1753 "authenticate the other unit.",
1754 &hci_write_authentication_enable
1755 },
1756 {
1757 "read_encryption_mode",
1758 "\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1759 "Encryption_Mode parameter controls if the local unit requires encryption\n" \
1760 "to the remote unit at connection setup (between the Create_Connection\n" \
1761 "command or acceptance of an incoming ACL connection and the corresponding\n" \
1762 "Connection Complete event). At connection setup, only the unit(s) with\n" \
1763 "the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1764 "enabled will try to encrypt the connection to the other unit.\n\n" \
1765 "\t<encryption_mode>:\n" \
1766 "\t0x00 - Encryption disabled.\n" \
1767 "\t0x01 - Encryption only for point-to-point packets.\n" \
1768 "\t0x02 - Encryption for both point-to-point and broadcast packets.",
1769 &hci_read_encryption_mode
1770 },
1771 {
1772 "write_encryption_mode mode(0|1|2)",
1773 "\tThis command will write the value for the Encryption_Mode parameter.\n" \
1774 "The Encryption_Mode parameter controls if the local unit requires\n" \
1775 "encryption to the remote unit at connection setup (between the\n" \
1776 "Create_Connection command or acceptance of an incoming ACL connection\n" \
1777 "and the corresponding Connection Complete event). At connection setup,\n" \
1778 "only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1779 "Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1780 "the other unit.\n\n" \
1781 "\t<encryption_mode> (dd)\n" \
1782 "\t0 - Encryption disabled.\n" \
1783 "\t1 - Encryption only for point-to-point packets.\n" \
1784 "\t2 - Encryption for both point-to-point and broadcast packets.",
1785 &hci_write_encryption_mode
1786 },
1787 {
1788 "read_class_of_device",
1789 "\nThis command will read the value for the Class_of_Device parameter.\n" \
1790 "The Class_of_Device parameter is used to indicate the capabilities of\n" \
1791 "the local unit to other units.",
1792 &hci_read_class_of_device
1793 },
1794 {
1795 "write_class_of_device class(xx:xx:xx)",
1796 "\nThis command will write the value for the Class_of_Device parameter.\n" \
1797 "The Class_of_Device parameter is used to indicate the capabilities of \n" \
1798 "the local unit to other units.\n\n" \
1799 "\t<class> (xx:xx:xx) - class of device",
1800 &hci_write_class_of_device
1801 },
1802 {
1803 "read_voice_settings",
1804 "\nThis command will read the values for the Voice_Setting parameter.\n" \
1805 "The Voice_Setting parameter controls all the various settings for voice\n" \
1806 "connections. These settings apply to all voice connections, and cannot be\n" \
1807 "set for individual voice connections. The Voice_Setting parameter controls\n" \
1808 "the configuration for voice connections: Input Coding, Air coding format,\n" \
1809 "input data format, Input sample size, and linear PCM parameter.",
1810 &hci_read_voice_settings
1811 },
1812 {
1813 "write_voice_settings settings(xxxx)",
1814 "\nThis command will write the values for the Voice_Setting parameter.\n" \
1815 "The Voice_Setting parameter controls all the various settings for voice\n" \
1816 "connections. These settings apply to all voice connections, and cannot be\n" \
1817 "set for individual voice connections. The Voice_Setting parameter controls\n" \
1818 "the configuration for voice connections: Input Coding, Air coding format,\n" \
1819 "input data format, Input sample size, and linear PCM parameter.\n\n" \
1820 "\t<voice_settings> (xxxx) - voice settings",
1821 &hci_write_voice_settings
1822 },
1823 {
1824 "read_number_broadcast_retransmissions",
1825 "\nThis command will read the unit's parameter value for the Number of\n" \
1826 "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1827 "unreliable.",
1828 &hci_read_number_broadcast_retransmissions
1829 },
1830 {
1831 "write_number_broadcast_retransmissions count(dd)",
1832 "\nThis command will write the unit's parameter value for the Number of\n" \
1833 "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1834 "unreliable.\n\n" \
1835 "\t<count> (dd) - number of broadcast retransimissions",
1836 &hci_write_number_broadcast_retransmissions
1837 },
1838 {
1839 "read_hold_mode_activity",
1840 "\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1841 "The Hold_Mode_Activity value is used to determine what activities should\n" \
1842 "be suspended when the unit is in hold mode.",
1843 &hci_read_hold_mode_activity
1844 },
1845 {
1846 "write_hold_mode_activity settings(0|1|2|4)",
1847 "\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1848 "The Hold_Mode_Activity value is used to determine what activities should\n" \
1849 "be suspended when the unit is in hold mode.\n\n" \
1850 "\t<settings> (dd) - bit mask:\n" \
1851 "\t0 - Maintain current Power State. Default\n" \
1852 "\t1 - Suspend Page Scan.\n" \
1853 "\t2 - Suspend Inquiry Scan.\n" \
1854 "\t4 - Suspend Periodic Inquiries.",
1855 &hci_write_hold_mode_activity
1856 },
1857 {
1858 "read_sco_flow_control_enable",
1859 "\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1860 "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1861 "decide if the Host Controller will send Number Of Completed Packets events\n" \
1862 "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1863 "disable SCO flow control.",
1864 &hci_read_sco_flow_control_enable
1865 },
1866 {
1867 "write_sco_flow_control_enable enable(0|1)",
1868 "\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1869 "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1870 "decide if the Host Controller will send Number Of Completed Packets events\n" \
1871 "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1872 "disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1873 "changed if no connections exist.",
1874 &hci_write_sco_flow_control_enable
1875 },
1876 {
1877 "read_link_supervision_timeout <connection_handle>",
1878 "\nThis command will read the value for the Link_Supervision_Timeout\n" \
1879 "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1880 "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1881 "reason, no Baseband packets are received from that Connection Handle for a\n" \
1882 "duration longer than the Link_Supervision_Timeout, the connection is\n"
1883 "disconnected.\n\n" \
1884 "\t<connection_handle> - dddd; connection handle\n",
1885 &hci_read_link_supervision_timeout
1886 },
1887 {
1888 "write_link_supervision_timeout <connection_handle> <timeout>",
1889 "\nThis command will write the value for the Link_Supervision_Timeout\n" \
1890 "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1891 "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1892 "reason, no Baseband packets are received from that connection handle for a\n" \
1893 "duration longer than the Link_Supervision_Timeout, the connection is\n" \
1894 "disconnected.\n\n" \
1895 "\t<connection_handle> - dddd; connection handle\n" \
1896 "\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1897 &hci_write_link_supervision_timeout
1898 },
1899 {
1900 "read_page_scan_period_mode",
1901 "\nThis command is used to read the mandatory Page_Scan_Period_Mode of the\n" \
1902 "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
1903 "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
1904 "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
1905 "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
1906 "following page scans.",
1907 &hci_read_page_scan_period_mode
1908 },
1909 {
1910 "write_page_scan_period_mode <page_scan_period_mode>",
1911 "\nThis command is used to write the mandatory Page_Scan_Period_Mode of the\n" \
1912 "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
1913 "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
1914 "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
1915 "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
1916 "following page scans.\n\n" \
1917 "\t<page_scan_period_mode> - dd; page scan period mode:\n" \
1918 "\t0x00 - P0 (Default)\n" \
1919 "\t0x01 - P1\n" \
1920 "\t0x02 - P2",
1921 &hci_write_page_scan_period_mode
1922 },
1923 {
1924 "read_page_scan_mode",
1925 "\nThis command is used to read the default page scan mode of the local\n" \
1926 "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
1927 "that is used for the default page scan. Currently one mandatory page scan\n"\
1928 "mode and three optional page scan modes are defined. Following an inquiry\n" \
1929 "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
1930 "mandatory page scan mode must be applied.",
1931 &hci_read_page_scan_mode
1932 },
1933 {
1934 "write_page_scan_mode <page_scan_mode>",
1935 "\nThis command is used to write the default page scan mode of the local\n" \
1936 "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
1937 "that is used for the default page scan. Currently, one mandatory page scan\n"\
1938 "mode and three optional page scan modes are defined. Following an inquiry\n"\
1939 "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
1940 "mandatory page scan mode must be applied.\n\n" \
1941 "\t<page_scan_mode> - dd; page scan mode:\n" \
1942 "\t0x00 - Mandatory Page Scan Mode (Default)\n" \
1943 "\t0x01 - Optional Page Scan Mode I\n" \
1944 "\t0x02 - Optional Page Scan Mode II\n" \
1945 "\t0x03 - Optional Page Scan Mode III",
1946 &hci_write_page_scan_mode
1947 },
1948 {
1949 "read_le_host_supported_command",       \
1950 "Read if this host is in le supported mode and stimulatenouse le supported mode",
1951 &hci_read_le_host_supported_command,
1952 },  
1953 {
1954 "write_le_host_supported_command",      \
1955 "write_le_host_supported_command le_host[0|1] stimultajeous_le[0|1]",
1956 &hci_write_le_host_supported_command,
1957 },  
1958
1959 { NULL, }
1960 };
1961