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