From 84940171645c4610b059a2b809dbe8f8ea678015 Mon Sep 17 00:00:00 2001 From: Anthony Merlino Date: Sat, 1 Jul 2017 17:13:32 -0400 Subject: [PATCH] i8sak: Adds reset command to reset the MAC layer --- include/wireless/ieee802154.h | 2 +- wireless/ieee802154/i8sak/Makefile | 1 + wireless/ieee802154/i8sak/i8sak.h | 1 + wireless/ieee802154/i8sak/i8sak_main.c | 2 + wireless/ieee802154/i8sak/i8sak_reset.c | 111 ++++++++++++++++++ wireless/ieee802154/i8sak/i8sak_startpan.c | 4 +- .../ieee802154/libmac/ieee802154_resetreq.c | 9 +- 7 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 wireless/ieee802154/i8sak/i8sak_reset.c diff --git a/include/wireless/ieee802154.h b/include/wireless/ieee802154.h index da84dcfcd..3ba410fd2 100644 --- a/include/wireless/ieee802154.h +++ b/include/wireless/ieee802154.h @@ -68,7 +68,7 @@ int ieee802154_get_req(int fd, FAR struct ieee802154_get_req_s *req); int ieee802154_gts_req(int fd, FAR struct ieee802154_gts_req_s *req); int ieee802154_orphan_resp(int fd, FAR struct ieee802154_orphan_resp_s *resp); -int ieee802154_reset_req(int fd, FAR struct ieee802154_reset_req_s *req); +int ieee802154_reset_req(int fd, bool resetattr); int ieee802154_rxenable_req(int fd, FAR struct ieee802154_rxenable_req_s *req); int ieee802154_scan_req(int fd, FAR struct ieee802154_scan_req_s *req); diff --git a/wireless/ieee802154/i8sak/Makefile b/wireless/ieee802154/i8sak/Makefile index d24344887..2b4e61b14 100644 --- a/wireless/ieee802154/i8sak/Makefile +++ b/wireless/ieee802154/i8sak/Makefile @@ -49,6 +49,7 @@ STACKSIZE = 4096 ASRCS = CSRCS = i8sak_acceptassoc.c i8sak_assoc.c i8sak_scan.c i8sak_blaster.c i8sak_poll.c CSRCS += i8sak_sniffer.c i8sak_startpan.c i8sak_tx.c i8sak_chan.c i8sak_coordinfo.c +CSRCS += i8sak_reset.c CSRCS += wpanlistener.c MAINSRC = i8sak_main.c diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index 3ea211b76..c3ae6033f 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -193,6 +193,7 @@ void i8sak_sniffer_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[ void i8sak_blaster_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_chan_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); void i8sak_coordinfo_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); +void i8sak_reset_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); /**************************************************************************** * Inline Functions diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 872e3c5e5..9f309c4db 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -111,6 +111,7 @@ static const struct i8sak_command_s g_i8sak_commands[] = {"blaster", (CODE void *)i8sak_blaster_cmd}, {"chan", (CODE void *)i8sak_chan_cmd}, {"coordinfo", (CODE void *)i8sak_coordinfo_cmd}, + {"reset", (CODE void *)i8sak_reset_cmd}, }; #define NCOMMANDS (sizeof(g_i8sak_commands) / sizeof(struct i8sak_command_s)) @@ -742,6 +743,7 @@ static int i8sak_showusage(FAR const char *progname, int exitcode) " sniffer [-h|q]\n" " chan [-h|g] []\n" " coordinfo [-h|a|e|s]\n" + " reset [-h]\n" , progname); exit(exitcode); } diff --git a/wireless/ieee802154/i8sak/i8sak_reset.c b/wireless/ieee802154/i8sak/i8sak_reset.c new file mode 100644 index 000000000..4b415481b --- /dev/null +++ b/wireless/ieee802154/i8sak/i8sak_reset.c @@ -0,0 +1,111 @@ +/**************************************************************************** + * apps/wireless/ieee802154/i8sak/i8sak_reset.c + * IEEE 802.15.4 Swiss Army Knife + * + * Copyright (C) 2017 Verge Inc. All rights reserved. + * Author: Anthony Merlino + * + * 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 "i8sak.h" + +#include +#include +#include "wireless/ieee802154.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name : i8sak_reset_cmd + * + * Description : + * Reset the MAC layer + ****************************************************************************/ + +void i8sak_reset_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) +{ + int option; + int fd; + + while ((option = getopt(argc, argv, ":h")) != ERROR) + { + switch (option) + { + case 'h': + fprintf(stderr, "Resets the MAC layer\n" + "Usage: %s [-h]\n" + " -h = this help menu\n" + , argv[0]); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + return; + + case ':': + fprintf(stderr, "ERROR: missing argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + case '?': + fprintf(stderr, "ERROR: unknown argument\n"); + /* Must manually reset optind if we are going to exit early */ + + optind = -1; + i8sak_cmd_error(i8sak); /* This exits for us */ + } + } + + fd = open(i8sak->devname, O_RDWR); + if (fd < 0) + { + printf("cannot open %s, errno=%d\n", i8sak->devname, errno); + i8sak_cmd_error(i8sak); + } + + ieee802154_reset_req(fd, true); + + close(fd); +} diff --git a/wireless/ieee802154/i8sak/i8sak_startpan.c b/wireless/ieee802154/i8sak/i8sak_startpan.c index 2c48c463e..2e1d59bca 100644 --- a/wireless/ieee802154/i8sak/i8sak_startpan.c +++ b/wireless/ieee802154/i8sak/i8sak_startpan.c @@ -71,7 +71,6 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) { - struct ieee802154_reset_req_s resetreq; struct ieee802154_start_req_s startreq; bool beaconenabled = false; int option; @@ -120,8 +119,7 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) /* Reset the MAC layer */ printf("\ni8sak: resetting MAC layer\n"); - resetreq.rst_pibattr = true; - ieee802154_reset_req(fd, &resetreq); + ieee802154_reset_req(fd, true); /* Make sure receiver is always on */ diff --git a/wireless/ieee802154/libmac/ieee802154_resetreq.c b/wireless/ieee802154/libmac/ieee802154_resetreq.c index e5f970112..33c62e2b9 100644 --- a/wireless/ieee802154/libmac/ieee802154_resetreq.c +++ b/wireless/ieee802154/libmac/ieee802154_resetreq.c @@ -53,11 +53,14 @@ * Public Functions ****************************************************************************/ -int ieee802154_reset_req(int fd, FAR struct ieee802154_reset_req_s *req) -{ +int ieee802154_reset_req(int fd, bool resetattr) +{ + FAR struct ieee802154_reset_req_s req; int ret; - ret = ioctl(fd, MAC802154IOC_MLME_RESET_REQUEST, (unsigned long)((uintptr_t)req)); + req.resetattr = resetattr; + + ret = ioctl(fd, MAC802154IOC_MLME_RESET_REQUEST, (unsigned long)((uintptr_t)&req)); if (ret < 0) { ret = -errno;