From ef23beca7c2692ff8aac1dac77303d855b690905 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 6 Apr 2018 09:43:29 -0600 Subject: [PATCH] apps/wireless/bluetooth/btsak: Update for changes made to IOCTL commands. --- wireless/bluetooth/btsak/btsak_advertise.c | 55 +++++++++++++--------- wireless/bluetooth/btsak/btsak_scan.c | 49 +++++++++---------- wireless/bluetooth/btsak/btsak_security.c | 17 +++---- 3 files changed, 68 insertions(+), 53 deletions(-) diff --git a/wireless/bluetooth/btsak/btsak_advertise.c b/wireless/bluetooth/btsak/btsak_advertise.c index c95e218b3..5778e7dff 100644 --- a/wireless/bluetooth/btsak/btsak_advertise.c +++ b/wireless/bluetooth/btsak/btsak_advertise.c @@ -84,14 +84,16 @@ static void btsak_advertise_showusage(FAR const char *progname, * Name: btsak_cmd_advertisestart * * Description: - * Scan start command + * Advertise start command * ****************************************************************************/ static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd, int argc, FAR char *argv[]) { - struct bt_advertisestart_s start; + struct btreq_s start; + struct bt_eir_s ad[2]; /* Data for advertisement packets */ + struct bt_eir_s sd[2]; /* Data for scan response packets */ int sockfd; int ret; @@ -119,29 +121,39 @@ static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd, * request additional information about the pallet. */ - memset(&start, 0, sizeof(struct bt_advertisestart_s)); - strncpy(start.as_name, btsak->ifname, HCI_DEVNAME_SIZE); + /* The data for advertisement and response packets are provided as arrays + * terminated by an entry with len=2. + * + * REVISIT: To be useful for anything other than testing, there must + * be some mechanism to specify the advertise and response data. + */ - start.as_type = BT_LE_ADV_IND; + memset(&ad, 0, 2 * sizeof(struct bt_eir_s)); + ad[0].len = 2; + ad[0].type = BT_EIR_FLAGS; + ad[0].data[0] = BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR; - start.as_ad.len = 2; - start.as_ad.type = BT_EIR_FLAGS; - start.as_ad.data[0] = BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR; + memset(&sd, 0, 2 * sizeof(struct bt_eir_s)); + sd[1].len = sizeof("btsak"); + sd[1].type = BT_EIR_NAME_COMPLETE; + strcpy((FAR char *)sd[1].data, "btsak"); - start.as_sd.len = sizeof("btsak"); - start.as_sd.type = BT_EIR_NAME_COMPLETE; - strcpy((FAR char *)start.as_sd.data, "btsak"); + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); + btreq.btr_advtype = BT_LE_ADV_IND; + btreq.btr_advad = ad; + btreq.btr_advsd = sd; /* Perform the IOCTL to start advertising */ sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_ADVERTISESTART, - (unsigned long)((uintptr_t)&start)); + ret = ioctl(sockfd, SIOCBTADVSTART, + (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_ADVERTISESTART) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTADVSTART) failed: %d\n", errno); } } @@ -153,29 +165,30 @@ static void btsak_cmd_advertisestart(FAR struct btsak_s *btsak, FAR char *cmd, * Name: btsak_cmd_advertisestop * * Description: - * Scan stop command + * Advertise stop command * ****************************************************************************/ static void btsak_cmd_advertisestop(FAR struct btsak_s *btsak, FAR char *cmd, - int argc, FAR char *argv[]) + int argc, FAR char *argv[]) { - struct bt_advertisestop_s stop; + struct btreq_s btreq; int sockfd; int ret; /* Perform the IOCTL to stop advertising */ - strncpy(stop.at_name, btsak->ifname, HCI_DEVNAME_SIZE); + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_ADVERTISESTOP, - (unsigned long)((uintptr_t)&stop)); + ret = ioctl(sockfd, SIOCBTADVSTOP, + (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_ADVERTISESTOP) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTADVSTOP) failed: %d\n", errno); } } diff --git a/wireless/bluetooth/btsak/btsak_scan.c b/wireless/bluetooth/btsak/btsak_scan.c index 69e551c68..0bed07b41 100644 --- a/wireless/bluetooth/btsak/btsak_scan.c +++ b/wireless/bluetooth/btsak/btsak_scan.c @@ -91,21 +91,24 @@ static void btsak_scan_showusage(FAR const char *progname, static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd, int argc, FAR char *argv[]) { - struct bt_scanstart_s start; + struct btreq_s btreq; int argind; int sockfd; int ret; + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); + /* Check if an option was provided */ argind = 1; - start.ss_dupenable = false; + btreq.btr_dupenable = false; if (argc > 1) { if (strcmp(argv[argind], "-d") == 0) { - start.ss_dupenable = true; + btreq.btr_dupenable = true; } else { @@ -117,16 +120,14 @@ static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd, /* Perform the IOCTL to start scanning */ - strncpy(start.ss_name, btsak->ifname, HCI_DEVNAME_SIZE); - sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_SCANSTART, - (unsigned long)((uintptr_t)&start)); + ret = ioctl(sockfd, SIOCBTSCANSTART, + (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANSTART) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTSCANSTART) failed: %d\n", errno); } } @@ -145,27 +146,26 @@ static void btsak_cmd_scanstart(FAR struct btsak_s *btsak, FAR char *cmd, static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd, int argc, FAR char *argv[]) { - union - { - struct bt_scanresult_s result; - uint8_t b[SIZEOF_BT_SCANRESULT_S(5)]; - } u; + struct btreq_s btreq; + struct bt_scanresponse_s result[5]; int sockfd; int ret; /* Perform the IOCTL to get the scan results so far */ - strncpy(u.result.sr_name, btsak->ifname, HCI_DEVNAME_SIZE); - u.result.sr_nrsp = 5; + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); + btreq->btr_nrsp = 5; + btreq.btr_rsp = result; sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_SCANGET, - (unsigned long)((uintptr_t)&u.result)); + ret = ioctl(sockfd, SIOCBTSCANGET, + (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANGET) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTSCANGET) failed: %d\n", errno); } @@ -181,7 +181,7 @@ static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd, printf("Scan result:\n"); for (i = 0; i < u.result.sr_nrsp; i++) { - rsp = &u.result.sr_rsp[i]; + rsp = &result[i]; printf("%d.\tname: %s\n", rsp->sr_name); printf("\taddr: " "%02x:%02x:%02x:%02x:%02x:%02x type: %d\n", @@ -221,22 +221,23 @@ static void btsak_cmd_scanget(FAR struct btsak_s *btsak, FAR char *cmd, static void btsak_cmd_scanstop(FAR struct btsak_s *btsak, FAR char *cmd, int argc, FAR char *argv[]) { - struct bt_scanstop_s stop; + struct btreq_s btreq; int sockfd; int ret; /* Perform the IOCTL to stop scanning and flush any buffered responses. */ - strncpy(stop.st_name, btsak->ifname, HCI_DEVNAME_SIZE); + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_SCANSTOP, - (unsigned long)((uintptr_t)&stop)); + ret = ioctl(sockfd, SIOCBTSCANSTOP, + (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_SCANSTOP) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTSCANSTOP) failed: %d\n", errno); } } diff --git a/wireless/bluetooth/btsak/btsak_security.c b/wireless/bluetooth/btsak/btsak_security.c index 34dba3618..03034b10b 100644 --- a/wireless/bluetooth/btsak/btsak_security.c +++ b/wireless/bluetooth/btsak/btsak_security.c @@ -126,7 +126,7 @@ static void btsak_security_showusage(FAR const char *progname, void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) { - struct bt_security_s sec; + struct btreq_s btreq; int sockfd; int ret; @@ -153,7 +153,10 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) /* The first argument must be an address of the form xx:xx:xx:xx:xx:xx */ - ret = btsak_str2addr(argv[1], sec.se_addr.val); + memset(&btreq, 0, sizeof(struct bt_advertisebtreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); + + ret = btsak_str2addr(argv[1], btreq.btr_secaddr.val); if (ret < 0) { fprintf(stderr, "ERROR: Invalid address string: %s/n", argv[1]); @@ -162,7 +165,7 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) /* The second address is the address type, either "public" or "random" */ - ret = btsak_str2addrtype(argv[2], &sec.se_addr.type); + ret = btsak_str2addrtype(argv[2], &btreq.btr_secaddr.type); if (ret < 0) { fprintf(stderr, "ERROR: Invalid address type: %s/n", argv[2]); @@ -171,19 +174,17 @@ void btsak_cmd_security(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) /* The third argument is the security level */ - ret = btsak_str2seclevel(argv[3], &sec.se_level); + ret = btsak_str2seclevel(argv[3], &btreq.btr_seclevel); /* Perform the IOCTL to stop advertising */ - strncpy(sec.se_name, btsak->ifname, HCI_DEVNAME_SIZE); - sockfd = btsak_socket(btsak); if (sockfd >= 0) { - ret = ioctl(sockfd, SIOCBT_SECURITY, (unsigned long)((uintptr_t)&sec)); + ret = ioctl(sockfd, SIOCBTSECURITY, (unsigned long)((uintptr_t)&btreq)); if (ret < 0) { - fprintf(stderr, "ERROR: ioctl(SIOCBT_SECURITY) failed: %d\n", + fprintf(stderr, "ERROR: ioctl(SIOCBTSECURITY) failed: %d\n", errno); } }