Source-Changes-HG archive

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

[src/trunk]: src/usr.sbin/btconfig use the bt_dev(3) api instead of rolling o...



details:   https://anonhg.NetBSD.org/src/rev/290ade21059d
branches:  trunk
changeset: 748001:290ade21059d
user:      plunky <plunky%NetBSD.org@localhost>
date:      Thu Oct 08 19:50:03 2009 +0000

description:
use the bt_dev(3) api instead of rolling our own inquiry and
request functions

diffstat:

 usr.sbin/btconfig/btconfig.c |  271 +++++++++++-------------------------------
 1 files changed, 70 insertions(+), 201 deletions(-)

diffs (truncated from 395 to 300 lines):

diff -r f4e1e9407ce0 -r 290ade21059d usr.sbin/btconfig/btconfig.c
--- a/usr.sbin/btconfig/btconfig.c      Thu Oct 08 19:31:41 2009 +0000
+++ b/usr.sbin/btconfig/btconfig.c      Thu Oct 08 19:50:03 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: btconfig.c,v 1.20 2009/10/08 19:31:41 plunky Exp $ */
+/* $NetBSD: btconfig.c,v 1.21 2009/10/08 19:50:03 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.20 2009/10/08 19:31:41 plunky Exp $");
+__RCSID("$NetBSD: btconfig.c,v 1.21 2009/10/08 19:50:03 plunky Exp $");
 
 #include <sys/ioctl.h>
 #include <sys/param.h>
@@ -48,15 +48,6 @@
 #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 *);
@@ -74,13 +65,12 @@
 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);
-#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)
+void save_value(uint16_t, void *, size_t);
+void load_value(uint16_t, void *, size_t);
 
 #define MAX_STR_SIZE   0xff
 
@@ -152,7 +142,7 @@
 int opt_rssi = 0;                      /* inquiry_with_rssi (obsolete flag) */
 int opt_imode = 0;                     /* inquiry mode */
 int opt_inquiry = 0;
-#define INQUIRY_LENGTH         10      /* about 12 seconds */
+#define INQUIRY_LENGTH         10      /* seconds */
 #define INQUIRY_MAX_RESPONSES  10
 const char *imodes[] = { "std", "rssi", "ext", NULL };
 
@@ -391,88 +381,53 @@
 }
 
 /*
- * 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.
+ * basic HCI request wrapper with error check
  */
 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)
 {
-       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");
+       struct bt_devreq req;
 
-       ep = (hci_event_hdr_t *)msg;
-       for(;;) {
-               if (recv(hci, msg, sizeof(msg), 0) < 0) {
-                       if (errno == EAGAIN || errno == EINTR)
-                               continue;
+       req.opcode = opcode;
+       req.event = event;
+       req.cparam = cbuf;
+       req.clen = clen;
+       req.rparam = rbuf;
+       req.rlen = rlen;
 
-                       err(EXIT_FAILURE, "HCI Recv");
-               }
+       if (bt_devreq(hci, &req, 10) == -1)
+               err(EXIT_FAILURE, "cmd (%02x|%03x)",
+                   HCI_OGF(opcode), HCI_OCF(opcode));
 
-               if (ep->event == HCI_EVENT_COMMAND_STATUS) {
-                       hci_command_status_ep *cs;
-
-                       cs = (hci_command_status_ep *)(ep + 1);
-                       if (cs->opcode != opcode)
-                               continue;
+       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 (cs->status)
-                               errx(EXIT_FAILURE,
-                                   "HCI cmd (%4.4x) failed (status %d)",
-                                   opcode, cs->status);
-
-                       if (event == 0)
-                               break;
+/*
+ * 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];
 
-                       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;
+       hci_req(opcode, 0, cbuf, clen, buf, sizeof(buf));
+}
 
-                       if (rbuf == NULL)
-                               break;
-
-                       ptr = (uint8_t *)(cc + 1);
-                       if (*ptr)
-                               errx(EXIT_FAILURE,
-                                   "HCI cmd (%4.4x) failed (status %d)",
-                                   opcode, *ptr);
+/*
+ * 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];
 
-                       memcpy(rbuf, ++ptr, rlen);
-                       break;
-               }
-
-               if (ep->event == event) {
-                       if (rbuf == NULL)
-                               break;
-
-                       memcpy(rbuf, (ep + 1), rlen);
-                       break;
-               }
-       }
+       hci_req(opcode, 0, NULL, 0, buf, sizeof(buf));
+       memcpy(rbuf, buf + 1, rlen);
 }
 
 int
@@ -520,7 +475,7 @@
        }
 
        if (opt_reset) {
-               hci_cmd(HCI_CMD_RESET, NULL, 0);
+               hci_req(HCI_CMD_RESET, 0, NULL, 0, NULL, 0);
 
                btr.btr_flags |= BTF_INIT;
                if (ioctl(hci, SIOCSBTFLAGS, &btr) < 0)
@@ -531,9 +486,9 @@
                 * 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);
+               hci_req(HCI_CMD_READ_BDADDR, 0, NULL, 0, NULL, 0);
+               hci_req(HCI_CMD_READ_BUFFER_SIZE, 0, NULL, 0, NULL, 0);
+               hci_req(HCI_CMD_READ_LOCAL_FEATURES, 0, NULL, 0, NULL, 0);
 
                if (set_unit(SIOCGBTINFO) < 0)
                        err(EXIT_FAILURE, "%s", btr.btr_name);
@@ -790,15 +745,17 @@
        if ((buf[7] & HCI_LMP_EXTENDED_FEATURES) == 0) {
                print_features("\tfeatures:", 0, buf);
        } else {
-               buf[0] = 0;
+               hci_read_local_extended_features_rp rp;
+
+               rp.page = 0;
 
                do {
                        hci_req(HCI_CMD_READ_LOCAL_EXTENDED_FEATURES, 0,
-                               buf, 1,
-                               buf, HCI_FEATURES_SIZE + 2);
+                           &rp.page, sizeof(rp.page), &rp, sizeof(rp));
 
-                       print_features("\tfeatures page#%d:", buf[0], buf + 2);
-               } while (buf[0]++ < buf[1]);
+                       print_features("\tfeatures (page %d):",
+                           rp.page, rp.features);
+               } while (rp.page++ < rp.max_page);
        }
 }
 
@@ -1122,15 +1079,13 @@
 }
 
 void
-print_result(int num, struct result *r, int rssi)
+print_result(int num, struct bt_devinquiry *r)
 {
        hci_remote_name_req_cp ncp;
        hci_remote_name_req_compl_ep nep;
        struct hostent *hp;
 
-       printf("%3d: bdaddr %s",
-                       num,
-                       bt_ntoa(&r->bdaddr, NULL));
+       printf("%3d: bdaddr %s", num, bt_ntoa(&r->bdaddr, NULL));
 
        hp = bt_gethostbyaddr((const char *)&r->bdaddr, sizeof(bdaddr_t), AF_BLUETOOTH);
        if (hp != NULL)
@@ -1140,7 +1095,7 @@
 
        memset(&ncp, 0, sizeof(ncp));
        bdaddr_copy(&ncp.bdaddr, &r->bdaddr);
-       ncp.page_scan_rep_mode = r->page_scan_rep_mode;
+       ncp.page_scan_rep_mode = r->pscan_rep_mode;
        ncp.clock_offset = r->clock_offset;
 
        hci_req(HCI_CMD_REMOTE_NAME_REQ,
@@ -1149,25 +1104,18 @@
                &nep, sizeof(nep));
 
        printf("   : name \"%s\"\n", nep.name);
-       print_class("   : class", r->uclass);
-       printf("   : page scan rep mode 0x%02x\n", r->page_scan_rep_mode);
+       print_class("   : class", r->dev_class);
+       printf("   : page scan rep mode 0x%02x\n", r->pscan_rep_mode);
        printf("   : clock offset %d\n", le16toh(r->clock_offset));
-
-       if (rssi)
-               printf("   : rssi %d\n", r->rssi);
-
+       printf("   : rssi %d\n", r->rssi);
        printf("\n");
 }
 
 void
 do_inquiry(void)
 {
-       uint8_t buf[HCI_EVENT_PKT_SIZE];
-       struct result result[INQUIRY_MAX_RESPONSES];
-       hci_inquiry_cp inq;
-       struct hci_filter f;
-       hci_event_hdr_t *hh;
-       int i, j, num, rssi;
+       struct bt_devinquiry *result;
+       int i, num;
 
        if (opt_inquiry == 0)
                return;
@@ -1175,97 +1123,18 @@
        printf("Device Discovery from device: %s ...", btr.btr_name);
        fflush(stdout);
 
-       memset(&f, 0, sizeof(f));
-       hci_filter_set(HCI_EVENT_COMMAND_STATUS, &f);
-       hci_filter_set(HCI_EVENT_COMMAND_COMPL, &f);
-       hci_filter_set(HCI_EVENT_INQUIRY_RESULT, &f);
-       hci_filter_set(HCI_EVENT_RSSI_RESULT, &f);
-       hci_filter_set(HCI_EVENT_INQUIRY_COMPL, &f);
-       hci_filter_set(HCI_EVENT_REMOTE_NAME_REQ_COMPL, &f);



Home | Main Index | Thread Index | Old Index