From 8a2fb2f66cfa8d1032b7936d5bbf99026ba963eb Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 6 Apr 2018 10:40:35 -0600 Subject: [PATCH] apps/wireless/bluetooth/btsak: Add an 'info' command. --- wireless/bluetooth/btsak/Makefile | 5 +- wireless/bluetooth/btsak/btsak.h | 1 + wireless/bluetooth/btsak/btsak_info.c | 177 ++++++++++++++++++++++++++ wireless/bluetooth/btsak/btsak_main.c | 4 + 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 wireless/bluetooth/btsak/btsak_info.c diff --git a/wireless/bluetooth/btsak/Makefile b/wireless/bluetooth/btsak/Makefile index 28656a378..65c6df2d7 100644 --- a/wireless/bluetooth/btsak/Makefile +++ b/wireless/bluetooth/btsak/Makefile @@ -38,8 +38,9 @@ # Bluetooth SAK (swiss army knife ) -ASRCS = -CSRCS = btsak_advertise.c btsak_gatt.c btsak_scan.c btsak_security.c +ASRCS = +CSRCS = btsak_advertise.c btsak_gatt.c btsak_info.c btsak_scan.c +CSRCS += btsak_security.c MAINSRC = btsak_main.c # Application info diff --git a/wireless/bluetooth/btsak/btsak.h b/wireless/bluetooth/btsak/btsak.h index 400198813..b2e064f81 100644 --- a/wireless/bluetooth/btsak/btsak.h +++ b/wireless/bluetooth/btsak/btsak.h @@ -242,6 +242,7 @@ void btsak_gatt_showusage(FAR const char *progname, FAR const char *cmd, * Command handlers ****************************************************************************/ +void btsak_cmd_info(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_info.c b/wireless/bluetooth/btsak/btsak_info.c new file mode 100644 index 000000000..2b9ac46b3 --- /dev/null +++ b/wireless/bluetooth/btsak/btsak_info.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * apps/wireless/bluetooth/btsak/btsak_info.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_info_showusage + * + * Description: + * Show usage of the security command + * + ****************************************************************************/ + +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, "Usage:\n\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); +} + +/**************************************************************************** + * Public functions + ****************************************************************************/ + +/**************************************************************************** + * Name: btsak_cmd_info + * + * Description: + * security command + * + ****************************************************************************/ + +void btsak_cmd_info(FAR struct btsak_s *btsak, int argc, FAR char *argv[]) +{ + struct btreq_s btreq; + int sockfd; + int ret; + + /* Check for help */ + + if (argc > 1 && strcmp(argv[1], "-h") == 0) + { + btsak_info_showusage(btsak->progname, argv[0], EXIT_SUCCESS); + } + + /* Perform the IOCTL to stop advertising */ + + 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, SIOCGBTINFO, (unsigned long)((uintptr_t)&btreq)); + if (ret < 0) + { + fprintf(stderr, "ERROR: ioctl(SIOCGBTINFO) failed: %d\n", + errno); + } + else + { + printf("Device: %s\n", btsak->ifname); + printf("BDAddr: %02x:%02x:%02x:%02x:%02x:%02x\n", + btreq.btr_bdaddr.val[0], btreq.btr_bdaddr.val[1], + btreq.btr_bdaddr.val[2], btreq.btr_bdaddr.val[3], + btreq.btr_bdaddr.val[4], btreq.btr_bdaddr.val[5]); + printf("Flags: %04x\n", btsak.btr_flags); + printf("Free: %u\n", btsak.btr_num_cmd); + printf(" ACL: %u\n", btsak.btri_num_acl); + printf(" SCO: %u\n", btsak.btri_num_sco); + printf("Max:\n"); + printf(" ACL: %u\n", btsak.btr_max_acl); + printf(" SCO: %u\n", btsak.btr_max_sco); + printf("MTU:\n"); + printf(" ACL: %u\n", btsak.btr_acl_mtu); + printf(" SCO: %u\n", btsak.btr_sco_mtu); + printf("Policy: %u\n", btsak.btr_link_policy); + printf("Type: %u\n", btsak.btr_packet_type); + } + } + + close(sockfd); +} diff --git a/wireless/bluetooth/btsak/btsak_main.c b/wireless/bluetooth/btsak/btsak_main.c index 4d3100655..ef608f3e0 100644 --- a/wireless/bluetooth/btsak/btsak_main.c +++ b/wireless/bluetooth/btsak/btsak_main.c @@ -89,6 +89,10 @@ static const struct btsak_command_s g_btsak_commands[] = (CODE void *)btsak_cmd_scan, "[-h] " }, + {"info", + (CODE void *)btsak_cmd_info, + NULL + }, { "advertise", (CODE void *)btsak_cmd_advertise,