diff --git a/wireless/bluetooth/btsak/Makefile b/wireless/bluetooth/btsak/Makefile index 65c6df2d7..814198bf8 100644 --- a/wireless/bluetooth/btsak/Makefile +++ b/wireless/bluetooth/btsak/Makefile @@ -39,8 +39,8 @@ # Bluetooth SAK (swiss army knife ) ASRCS = -CSRCS = btsak_advertise.c btsak_gatt.c btsak_info.c btsak_scan.c -CSRCS += btsak_security.c +CSRCS = btsak_advertise.c btsak_features.c btsak_gatt.c btsak_info.c +CSRCS += btsak_scan.c btsak_security.c MAINSRC = btsak_main.c # Application info diff --git a/wireless/bluetooth/btsak/btsak.h b/wireless/bluetooth/btsak/btsak.h index b2e064f81..e3ee4a8a1 100644 --- a/wireless/bluetooth/btsak/btsak.h +++ b/wireless/bluetooth/btsak/btsak.h @@ -243,6 +243,8 @@ void btsak_gatt_showusage(FAR const char *progname, FAR const char *cmd, ****************************************************************************/ void btsak_cmd_info(FAR struct btsak_s *btsak, int argc, FAR char *argv[]); +void btsak_cmd_features(FAR struct btsak_s *btsak, int argc, + FAR char *argv[]); void btsak_cmd_scan(FAR struct btsak_s *btsak, int argc, FAR char *argv[]); void btsak_cmd_advertise(FAR struct btsak_s *btsak, int argc, FAR char *argv[]); diff --git a/wireless/bluetooth/btsak/btsak_features.c b/wireless/bluetooth/btsak/btsak_features.c new file mode 100644 index 000000000..c91eb1ee3 --- /dev/null +++ b/wireless/bluetooth/btsak/btsak_features.c @@ -0,0 +1,158 @@ +/**************************************************************************** + * apps/wireless/bluetooth/btsak/btsak_features.c + * Bluetooth Swiss Army Knife -- Info + * + * Copyright (C) 2018 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Based loosely on the i8sak IEEE 802.15.4 program by Anthony Merlino and + * Sebastien Lorquet. Commands inspired for btshell example in the + * Intel/Zephyr Arduino 101 package (BSD license). + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "btsak.h" + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: btsak_features_showusage + * + * Description: + * Show usage of the security command + * + ****************************************************************************/ + +static void btsak_features_showusage(FAR const char *progname, + FAR const char *cmd, int exitcode) +{ + fprintf(stderr, "%s:\tShow Bluetooth device features\n", cmd); + fprintf(stderr, "Usage:\n\n"); + fprintf(stderr, "\t%s %s [-h] [le]\n\n", + progname, cmd); + fprintf(stderr, "Where\n"); + fprintf(stderr, "\tSelects LE features (vs BR/EDR features)\n"); + exit(exitcode); +} + +/**************************************************************************** + * Public functions + ****************************************************************************/ + +/**************************************************************************** + * Name: btsak_cmd_features + * + * Description: + * security command + * + ****************************************************************************/ + +void btsak_cmd_features(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) +{ + struct btreq_s btreq; + int sockfd; + int cmd; + int ret; + + /* Check for help or LE options */ + + cmd = SIOCGBTFEAT; + + if (argc > 1) + { + if (strcmp(argv[1], "-h") == 0) + { + btsak_features_showusage(btsak->progname, argv[0], EXIT_SUCCESS); + } + else if (strcmp(argv[1], "le") == 0) + { + cmd = SIOCGBTLEFEAT; + } + } + + /* Perform the IOCTL to stop advertising */ + + memset(&btreq, 0, sizeof(struct btreq_s)); + strncpy(btreq.btr_name, btsak->ifname, HCI_DEVNAME_SIZE); + + sockfd = btsak_socket(btsak); + if (sockfd >= 0) + { + ret = ioctl(sockfd, cmd, (unsigned long)((uintptr_t)&btreq)); + if (ret < 0) + { + fprintf(stderr, "ERROR: ioctl(%04x) failed: %d\n", + cmd, errno); + } + else + { + printf("Page 0:\n"); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features0[0], btreq.btr_features0[1], + btreq.btr_features0[1], btreq.btr_features0[3]); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features0[5], btreq.btr_features0[5], + btreq.btr_features0[6], btreq.btr_features0[7]); + printf("Page 1:\n"); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features1[0], btreq.btr_features1[1], + btreq.btr_features1[1], btreq.btr_features1[3]); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features1[5], btreq.btr_features1[5], + btreq.btr_features1[6], btreq.btr_features1[7]); + printf("Page 2:\n"); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features2[0], btreq.btr_features2[1], + btreq.btr_features2[1], btreq.btr_features2[3]); + printf("\t%08x %08x %08x %08x\n", + btreq.btr_features2[5], btreq.btr_features2[5], + btreq.btr_features2[6], btreq.btr_features2[7]); + } + } + + close(sockfd); +} diff --git a/wireless/bluetooth/btsak/btsak_info.c b/wireless/bluetooth/btsak/btsak_info.c index 807676a5d..aded541c0 100644 --- a/wireless/bluetooth/btsak/btsak_info.c +++ b/wireless/bluetooth/btsak/btsak_info.c @@ -70,45 +70,10 @@ static void btsak_info_showusage(FAR const char *progname, FAR const char *cmd, int exitcode) { - fprintf(stderr, "%s:\tEnable security (encryption) for a connection:\n", - cmd); - fprintf(stderr, - "\tIf device is paired, key encryption will be enabled. If the link\n"); - fprintf(stderr, - "\tis already encrypted with sufficiently strong key this function\n"); - fprintf(stderr, - "\tdoes nothing.\n\n"); - fprintf(stderr, - "\tIf the device is not paired pairing will be initiated. If the device\n"); - fprintf(stderr, - "\tis paired and keys are too weak but input output capabilities allow\n"); - fprintf(stderr, - "\tfor strong enough keys pairing will be initiated.\n\n"); - fprintf(stderr, - "\tThis function may return error if required level of security is not\n"); - fprintf(stderr, - "\tpossible to achieve due to local or remote device limitation (eg input\n"); - fprintf(stderr, - "\toutput capabilities).\n\n"); + fprintf(stderr, "%s:\tShow Bluetooth device information\n", cmd); fprintf(stderr, "Usage:\n\n"); - fprintf(stderr, "\t%s %s [-h] \n", + fprintf(stderr, "\t%s %s [-h]\n", progname, cmd); - fprintf(stderr, - "\nWhere:\n\n"); - fprintf(stderr, - "\t\t- The 6-byte address of the connected peer\n"); - fprintf(stderr, - "\t\t- Either \"public\" or \"random\"\n"); - fprintf(stderr, - "\t\t- Security level, on of:\n\n"); - fprintf(stderr, - "\t\tlow\t- No encryption and no authentication\n"); - fprintf(stderr, - "\t\tmedium\t- Encryption and no authentication (no MITM)\n"); - fprintf(stderr, - "\t\thigh\t- Encryption and authentication (MITM)\n"); - fprintf(stderr, - "\t\tfips\t- Authenticated LE secure connections and encryption\n"); exit(exitcode); } diff --git a/wireless/bluetooth/btsak/btsak_main.c b/wireless/bluetooth/btsak/btsak_main.c index 653f1ea48..0ba1039da 100644 --- a/wireless/bluetooth/btsak/btsak_main.c +++ b/wireless/bluetooth/btsak/btsak_main.c @@ -87,7 +87,11 @@ static const struct btsak_command_s g_btsak_commands[] = }, {"info", (CODE void *)btsak_cmd_info, - NULL + "[-h]" + }, + {"features", + (CODE void *)btsak_cmd_features, + "[-h] [le]" }, {"scan", (CODE void *)btsak_cmd_scan, diff --git a/wireless/bluetooth/btsak/btsak_scan.c b/wireless/bluetooth/btsak/btsak_scan.c index de0ee4166..7ee4f2ee2 100644 --- a/wireless/bluetooth/btsak/btsak_scan.c +++ b/wireless/bluetooth/btsak/btsak_scan.c @@ -73,7 +73,7 @@ static void btsak_scan_showusage(FAR const char *progname, fprintf(stderr, "\t%s %s [-h] \n", progname, cmd); fprintf(stderr, "\nWhere the options do the following:\n\n"); - fprintf(stderr, "\tstart\t- Starts scanning. The -d option enabled duplicate\n"); + fprintf(stderr, "\tstart\t- Starts scanning. The -d option enables duplicate\n"); fprintf(stderr, "\t\t filtering.\n"); fprintf(stderr, "\tget\t - Shows new accumulated scan results\n"); fprintf(stderr, "\tstop\t- Stops scanning\n");