Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/btconfig revert previous commit



details:   https://anonhg.NetBSD.org/src/rev/85080454f25f
branches:  trunk
changeset: 747999:85080454f25f
user:      plunky <plunky%NetBSD.org@localhost>
date:      Thu Oct 08 19:29:42 2009 +0000

description:
revert previous commit

(bah, I committed the wrong version and there are some other
changes that may not work with current sources)

diffstat:

 usr.sbin/btconfig/btconfig.c |  393 ++++++++++++++++++++++++++++--------------
 1 files changed, 259 insertions(+), 134 deletions(-)

diffs (truncated from 614 to 300 lines):

diff -r c84f5da7e612 -r 85080454f25f usr.sbin/btconfig/btconfig.c
--- a/usr.sbin/btconfig/btconfig.c      Thu Oct 08 19:25:24 2009 +0000
+++ b/usr.sbin/btconfig/btconfig.c      Thu Oct 08 19:29:42 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: btconfig.c,v 1.18 2009/10/08 19:25:24 plunky Exp $ */
+/* $NetBSD: btconfig.c,v 1.19 2009/10/08 19:29:42 plunky Exp $ */
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 __COPYRIGHT("@(#) Copyright (c) 2006 Itronix, Inc.  All rights reserved.");
-__RCSID("$NetBSD: btconfig.c,v 1.18 2009/10/08 19:25:24 plunky Exp $");
+__RCSID("$NetBSD: btconfig.c,v 1.19 2009/10/08 19:29:42 plunky Exp $");
 
 #include <sys/ioctl.h>
 #include <sys/param.h>
@@ -48,6 +48,15 @@
 #include <unistd.h>
 #include <util.h>
 
+/* inquiry results storage */
+struct result {
+       bdaddr_t        bdaddr;
+       uint8_t         page_scan_rep_mode;
+       uint8_t         uclass[HCI_CLASS_SIZE];
+       uint16_t        clock_offset;
+       int8_t          rssi;
+};
+
 int main(int, char *[]);
 void badarg(const char *);
 void badparam(const char *);
@@ -58,19 +67,19 @@
 void print_val(const char *, const char **, int);
 void print_info(int);
 void print_stats(void);
-void print_class(const char *, uint8_t *);
-void print_class0(void);
+void print_class(const char *);
 void print_voice(int);
 void tag(const char *);
 void print_features(const char *, uint8_t, uint8_t *);
 void print_features0(uint8_t *);
 void print_features1(uint8_t *);
-void print_result(int, struct bt_devinquiry *);
 void do_inquiry(void);
+void print_result(int, struct result *, int);
 
 void hci_req(uint16_t, uint8_t , void *, size_t, void *, size_t);
-void save_value(uint16_t, void *, size_t);
-void load_value(uint16_t, void *, size_t);
+#define save_value(opcode, cbuf, clen) hci_req(opcode, 0, cbuf, clen, NULL, 0)
+#define load_value(opcode, rbuf, rlen) hci_req(opcode, 0, NULL, 0, rbuf, rlen)
+#define hci_cmd(opcode, cbuf, clen)    hci_req(opcode, 0, cbuf, clen, NULL, 0)
 
 #define MAX_STR_SIZE   0xff
 
@@ -142,7 +151,7 @@
 int opt_rssi = 0;                      /* inquiry_with_rssi (obsolete flag) */
 int opt_imode = 0;                     /* inquiry mode */
 int opt_inquiry = 0;
-#define INQUIRY_LENGTH         10      /* seconds */
+#define INQUIRY_LENGTH         10      /* about 12 seconds */
 #define INQUIRY_MAX_RESPONSES  10
 const char *imodes[] = { "std", "rssi", "ext", NULL };
 
@@ -381,53 +390,88 @@
 }
 
 /*
- * basic HCI request wrapper with error check
+ * basic HCI cmd request function with argument return.
+ *
+ * Normally, this will return on COMMAND_STATUS or COMMAND_COMPLETE for the given
+ * opcode, but if event is given then it will ignore COMMAND_STATUS (unless error)
+ * and wait for the specified event.
+ *
+ * if rbuf/rlen is given, results will be copied into the result buffer for
+ * COMMAND_COMPLETE/event responses.
  */
 void
-hci_req(uint16_t opcode, uint8_t event, void *cbuf, size_t clen,
-    void *rbuf, size_t rlen)
+hci_req(uint16_t opcode, uint8_t event, void *cbuf, size_t clen, void *rbuf, size_t rlen)
 {
-       struct bt_devreq req;
+       uint8_t msg[sizeof(hci_cmd_hdr_t) + HCI_CMD_PKT_SIZE];
+       hci_event_hdr_t *ep;
+       hci_cmd_hdr_t *cp;
+
+       cp = (hci_cmd_hdr_t *)msg;
+       cp->type = HCI_CMD_PKT;
+       cp->opcode = opcode = htole16(opcode);
+       cp->length = clen = MIN(clen, sizeof(msg) - sizeof(hci_cmd_hdr_t));
+
+       if (clen) memcpy((cp + 1), cbuf, clen);
+
+       if (send(hci, msg, sizeof(hci_cmd_hdr_t) + clen, 0) < 0)
+               err(EXIT_FAILURE, "HCI Send");
 
-       req.opcode = opcode;
-       req.event = event;
-       req.cparam = cbuf;
-       req.clen = clen;
-       req.rparam = rbuf;
-       req.rlen = rlen;
+       ep = (hci_event_hdr_t *)msg;
+       for(;;) {
+               if (recv(hci, msg, sizeof(msg), 0) < 0) {
+                       if (errno == EAGAIN || errno == EINTR)
+                               continue;
 
-       if (bt_devreq(hci, &req, 10) == -1)
-               err(EXIT_FAILURE, "cmd (%02x|%03x)",
-                   HCI_OGF(opcode), HCI_OCF(opcode));
+                       err(EXIT_FAILURE, "HCI Recv");
+               }
 
-       if (event == 0 && rlen > 0 && ((uint8_t *)rbuf)[0] != 0)
-               errx(EXIT_FAILURE, "cmd (%02x|%03x): status 0x%02x",
-                   HCI_OGF(opcode), HCI_OCF(opcode), ((uint8_t *)rbuf)[0]);
-}
+               if (ep->event == HCI_EVENT_COMMAND_STATUS) {
+                       hci_command_status_ep *cs;
+
+                       cs = (hci_command_status_ep *)(ep + 1);
+                       if (cs->opcode != opcode)
+                               continue;
 
-/*
- * write value to device with opcode.
- * provide a small response buffer so that the status can be checked
- */
-void
-save_value(uint16_t opcode, void *cbuf, size_t clen)
-{
-       uint8_t buf[1];
+                       if (cs->status)
+                               errx(EXIT_FAILURE,
+                                   "HCI cmd (%4.4x) failed (status %d)",
+                                   opcode, cs->status);
+
+                       if (event == 0)
+                               break;
 
-       hci_req(opcode, 0, cbuf, clen, buf, sizeof(buf));
-}
+                       continue;
+               }
+
+               if (ep->event == HCI_EVENT_COMMAND_COMPL) {
+                       hci_command_compl_ep *cc;
+                       uint8_t *ptr;
+
+                       cc = (hci_command_compl_ep *)(ep + 1);
+                       if (cc->opcode != opcode)
+                               continue;
 
-/*
- * read value from device with opcode.
- * use our own buffer and only return the value from the response packet
- */
-void
-load_value(uint16_t opcode, void *rbuf, size_t rlen)
-{
-       uint8_t buf[UINT8_MAX];
+                       if (rbuf == NULL)
+                               break;
+
+                       ptr = (uint8_t *)(cc + 1);
+                       if (*ptr)
+                               errx(EXIT_FAILURE,
+                                   "HCI cmd (%4.4x) failed (status %d)",
+                                   opcode, *ptr);
 
-       hci_req(opcode, 0, NULL, 0, buf, sizeof(buf));
-       memcpy(rbuf, buf + 1, rlen);
+                       memcpy(rbuf, ++ptr, rlen);
+                       break;
+               }
+
+               if (ep->event == event) {
+                       if (rbuf == NULL)
+                               break;
+
+                       memcpy(rbuf, (ep + 1), rlen);
+                       break;
+               }
+       }
 }
 
 int
@@ -461,8 +505,11 @@
 config_unit(void)
 {
 
-       if (opt_enable < 0 || opt_reset) {
-               btr.btr_flags &= ~BTF_UP;
+       if (opt_enable) {
+               if (opt_enable > 0)
+                       btr.btr_flags |= BTF_UP;
+               else
+                       btr.btr_flags &= ~BTF_UP;
 
                if (ioctl(hci, SIOCSBTFLAGS, &btr) < 0)
                        err(EXIT_FAILURE, "SIOCSBTFLAGS");
@@ -471,12 +518,22 @@
                        err(EXIT_FAILURE, "%s", btr.btr_name);
        }
 
-       if (opt_enable > 0 || opt_reset) {
-               btr.btr_flags |= BTF_UP;
+       if (opt_reset) {
+               hci_cmd(HCI_CMD_RESET, NULL, 0);
 
+               btr.btr_flags |= BTF_INIT;
                if (ioctl(hci, SIOCSBTFLAGS, &btr) < 0)
                        err(EXIT_FAILURE, "SIOCSBTFLAGS");
 
+               /*
+                * although the reset command will automatically
+                * carry out these commands, we do them manually
+                * just so we can wait for completion.
+                */
+               hci_cmd(HCI_CMD_READ_BDADDR, NULL, 0);
+               hci_cmd(HCI_CMD_READ_BUFFER_SIZE, NULL, 0);
+               hci_cmd(HCI_CMD_READ_LOCAL_FEATURES, NULL, 0);
+
                if (set_unit(SIOCGBTINFO) < 0)
                        err(EXIT_FAILURE, "%s", btr.btr_name);
        }
@@ -656,7 +713,8 @@
        }
 
        load_value(HCI_CMD_READ_UNIT_CLASS, buf, HCI_CLASS_SIZE);
-       print_class("\tclass:", buf);
+       class = (buf[2] << 16) | (buf[1] << 8) | (buf[0]);
+       print_class("\t");
 
        load_value(HCI_CMD_READ_LOCAL_NAME, buf, HCI_UNIT_NAME_SIZE);
        printf("\tname: \"%s\"\n", buf);
@@ -732,17 +790,15 @@
        if ((buf[7] & HCI_LMP_EXTENDED_FEATURES) == 0) {
                print_features("\tfeatures:", 0, buf);
        } else {
-               hci_read_local_extended_features_rp rp;
-
-               rp.page = 0;
+               buf[0] = 0;
 
                do {
                        hci_req(HCI_CMD_READ_LOCAL_EXTENDED_FEATURES, 0,
-                           &rp.page, sizeof(rp.page), &rp, sizeof(rp));
+                               buf, 1,
+                               buf, HCI_FEATURES_SIZE + 2);
 
-                       print_features("\tfeatures (page %d):",
-                           rp.page, rp.features);
-               } while (rp.page++ < rp.max_page);
+                       print_features("\tfeatures page#%d:", buf[0], buf + 2);
+               } while (buf[0]++ < buf[1]);
        }
 }
 
@@ -878,39 +934,30 @@
 }
 
 void
-print_class(const char *str, uint8_t *uclass)
+print_class(const char *str)
 {
-
-       class = (uclass[2] << 16) | (uclass[1] << 8) | uclass[0];
-       width = printf("%s [0x%06x]", str, class);
+       int major, minor;
 
-       switch(__SHIFTOUT(class, __BITS(0, 1))) {
-       case 0: print_class0();         break;
-       default:                        break;
-       }
+       major = (class & 0x1f00) >> 8;
+       minor = (class & 0x00fc) >> 2;
 
-       tag(NULL);
-}
+       width = printf("%sclass: [0x%6.6x]", str, class);
 
-void
-print_class0(void)
-{
-
-       switch (__SHIFTOUT(class, __BITS(8, 12))) {
+       switch (major) {
        case 1: /* Computer */
-               switch (__SHIFTOUT(class, __BITS(2, 7))) {
-               case 1: tag("Desktop workstation");             break;
-               case 2: tag("Server-class computer");           break;
+               switch (minor) {



Home | Main Index | Thread Index | Old Index