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/Kconfig b/wireless/ieee802154/i8sak/Kconfig index d74fddd74..ac3381a59 100644 --- a/wireless/ieee802154/i8sak/Kconfig +++ b/wireless/ieee802154/i8sak/Kconfig @@ -31,5 +31,9 @@ config IEEE802154_I8SAK_STACKSIZE int "i8sak stack size" default 2048 +config IEEE802154_I8SAK_CHNUM + int "default channel" + default 11 + endif diff --git a/wireless/ieee802154/i8sak/Makefile b/wireless/ieee802154/i8sak/Makefile index d24344887..572b96870 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 i8sak_regdump.c CSRCS += wpanlistener.c MAINSRC = i8sak_main.c diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index 3ea211b76..37b31e957 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -103,10 +103,10 @@ #define PRINT_COORDEADDR(eaddr) \ printf(" Coordinator EADDR: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", \ - eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5], eaddr[6], eaddr[7]); + eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5], eaddr[6], eaddr[7]) #define PRINT_COORDSADDR(saddr) \ - printf(" Coordinator SADDR: %02X:%02X\n", saddr[0], saddr[1]); + printf(" Coordinator SADDR: %02X:%02X\n", saddr[0], saddr[1]) /**************************************************************************** * Public Types @@ -193,6 +193,8 @@ 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[]); +void i8sak_regdump_cmd (FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]); /**************************************************************************** * Inline Functions diff --git a/wireless/ieee802154/i8sak/i8sak_assoc.c b/wireless/ieee802154/i8sak/i8sak_assoc.c index d06ff0bf4..5f1c3ac1c 100644 --- a/wireless/ieee802154/i8sak/i8sak_assoc.c +++ b/wireless/ieee802154/i8sak/i8sak_assoc.c @@ -83,6 +83,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) struct ieee802154_assoc_req_s assocreq; struct wpanlistener_eventfilter_s filter; FAR struct ieee802154_pandesc_s *pandesc; + struct ieee802154_set_req_s setreq; bool retry = false; int maxretries = 0; int retrycnt; @@ -92,6 +93,9 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) int ret; uint8_t resindex; + setreq.attr = IEEE802154_ATTR_MAC_RESPONSE_WAIT_TIME; + setreq.attrval.mac.resp_waittime = 32; + /* If the addresses has never been automatically or manually set before, set * it assuming that we are the default device address and the endpoint is the * default PAN Coordinator address. This is actually the way the i8sak settings @@ -104,7 +108,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) } optcnt = 0; - while ((option = getopt(argc, argv, ":hr:s:e:w:")) != ERROR) + while ((option = getopt(argc, argv, ":hr:s:e:w:t:")) != ERROR) { optcnt++; switch (option) @@ -115,6 +119,9 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) " -h = this help menu\n" " -w = wait and retry on failure\n" " -r = use scan result index\n" + " -s = coordinator short address" + " -e = coordinator ext address" + " -t = response wait time" , argv[0]); /* Must manually reset optind if we are going to exit early */ @@ -143,7 +150,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) break; case 's': - /* Parse extended address and put it into the i8sak instance */ + /* Parse short address and put it into the i8sak instance */ i8sak_str2saddr(optarg, i8sak->ep.saddr); i8sak->ep.mode= IEEE802154_ADDRMODE_SHORT; @@ -155,6 +162,12 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_str2eaddr(optarg, i8sak->ep.eaddr); i8sak->ep.mode = IEEE802154_ADDRMODE_EXTENDED; break; + + case 't': + /* Parse wait time and set the paremeter in the request */ + + setreq.attrval.mac.resp_waittime = i8sak_str2luint8(optarg); + break; case 'w': /* Wait and retry if we fail to associate */ @@ -197,6 +210,8 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } + ieee802154_set_req(fd, &setreq); + /* Register new callback for receiving the association notifications. */ memset(&filter, 0, sizeof(struct wpanlistener_eventfilter_s)); diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 789bdbcce..054e65fc3 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -111,6 +111,8 @@ 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}, + {"regdump", (CODE void *)i8sak_regdump_cmd}, }; #define NCOMMANDS (sizeof(g_i8sak_commands) / sizeof(struct i8sak_command_s)) @@ -149,14 +151,14 @@ int i8sak_tx(FAR struct i8sak_s *i8sak, int fd) /* Set an application defined handle */ - tx.meta.msdu_handle = i8sak->msdu_handle++; + tx.meta.handle = i8sak->msdu_handle++; /* This is a normal transaction, no special handling */ - tx.meta.msdu_flags.ack_tx = 0; - tx.meta.msdu_flags.gts_tx = 0; + tx.meta.flags.ackreq = 1; + tx.meta.flags.usegts = 0; - tx.meta.msdu_flags.indirect_tx = i8sak->indirect; + tx.meta.flags.indirect = i8sak->indirect; if (i8sak->indirect) { @@ -177,7 +179,7 @@ int i8sak_tx(FAR struct i8sak_s *i8sak, int fd) tx.meta.ranging = IEEE802154_NON_RANGING; - tx.meta.srcaddr_mode = IEEE802154_ADDRMODE_SHORT; + tx.meta.srcmode = IEEE802154_ADDRMODE_SHORT; memcpy(&tx.meta.destaddr, &i8sak->ep, sizeof(struct ieee802154_addr_s)); /* Each byte is represented by 2 chars */ @@ -528,23 +530,24 @@ static void i8sak_switch_instance(FAR char *devname) } sq_addlast((FAR sq_entry_t *)i8sak, &g_i8sak_instances); + + /* Update our "sticky" i8sak instance. Must come before call to setup so that + * the shared active global i8sak is correct. + */ + + g_activei8sak = i8sak; + + if (i8sak_setup(i8sak, devname) < 0) + { + exit(EXIT_FAILURE); + } } - - /* Update our "sticky" i8sak instance. Must come before call to setup so that - * the shared active global i8sak is correct. - */ - - g_activei8sak = i8sak; - - if (!g_activei8sak_set) + else { - g_activei8sak_set = true; + g_activei8sak = i8sak; } - if (i8sak_setup(i8sak, devname) < 0) - { - exit(EXIT_FAILURE); - } + g_activei8sak_set = true; } static int i8sak_setup(FAR struct i8sak_s *i8sak, FAR const char *devname) @@ -741,6 +744,8 @@ 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" + " regdump [-h]\n" , progname); exit(exitcode); } diff --git a/wireless/ieee802154/i8sak/i8sak_regdump.c b/wireless/ieee802154/i8sak/i8sak_regdump.c new file mode 100644 index 000000000..5233b9c8b --- /dev/null +++ b/wireless/ieee802154/i8sak/i8sak_regdump.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * apps/wireless/ieee802154/i8sak/i8sak_regdump.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_regdump_cmd + * + * Description : + * Print register information of radio device + ****************************************************************************/ + +void i8sak_regdump_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) +{ + struct ieee802154_get_req_s req; + int option; + int fd; + + while ((option = getopt(argc, argv, ":h")) != ERROR) + { + switch (option) + { + case 'h': + fprintf(stderr, "Prints reg info of radio device\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); + } + + req.attr = IEEE802154_ATTR_RADIO_REGDUMP; + ieee802154_get_req(fd, &req); + + close(fd); +} 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_scan.c b/wireless/ieee802154/i8sak/i8sak_scan.c index 069949f33..0be136ccd 100644 --- a/wireless/ieee802154/i8sak/i8sak_scan.c +++ b/wireless/ieee802154/i8sak/i8sak_scan.c @@ -142,7 +142,7 @@ void i8sak_scan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } - scan.duration = 5; + scan.duration = 7; scan.chpage = i8sak->chpage; /* Parse channel list */ diff --git a/wireless/ieee802154/i8sak/i8sak_startpan.c b/wireless/ieee802154/i8sak/i8sak_startpan.c index 1f45a534b..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 */ @@ -194,7 +192,7 @@ void i8sak_startpan_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) if (beaconenabled) { - startreq.beaconorder = 6; + startreq.beaconorder = 8; startreq.superframeorder = 5; } else diff --git a/wireless/ieee802154/i8sak/i8sak_tx.c b/wireless/ieee802154/i8sak/i8sak_tx.c index d60668f86..179542a07 100644 --- a/wireless/ieee802154/i8sak/i8sak_tx.c +++ b/wireless/ieee802154/i8sak/i8sak_tx.c @@ -197,8 +197,7 @@ void i8sak_tx_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) wpanlistener_add_eventreceiver(&i8sak->wpanlistener, tx_eventcb, &eventfilter, (FAR void *)i8sak, true); - - ret = i8sak_tx(i8sak,fd); + ret = i8sak_tx(i8sak, fd); if (ret < 0) { fprintf(stderr, "ERROR: Failed to transmit packet\n"); diff --git a/wireless/ieee802154/i8sak/wpanlistener.c b/wireless/ieee802154/i8sak/wpanlistener.c index 4fdd344ba..eeaa60622 100644 --- a/wireless/ieee802154/i8sak/wpanlistener.c +++ b/wireless/ieee802154/i8sak/wpanlistener.c @@ -742,7 +742,7 @@ static pthread_addr_t wpanlistener_eventthread(pthread_addr_t arg) } if (notif.notiftype == IEEE802154_NOTIFY_IND_BEACONNOTIFY && - receiver->filter.indevents.beaconnotify) + receiver->filter.indevents.beacon) { receiver->cb(¬if, receiver->arg); diff --git a/wireless/ieee802154/i8sak/wpanlistener.h b/wireless/ieee802154/i8sak/wpanlistener.h index 5d1ee14aa..26a2bd707 100644 --- a/wireless/ieee802154/i8sak/wpanlistener.h +++ b/wireless/ieee802154/i8sak/wpanlistener.h @@ -84,7 +84,7 @@ struct wpanlistener_eventfilter_s { uint32_t assoc : 1; uint32_t disassoc : 1; - uint32_t beaconnotify : 1; + uint32_t beacon : 1; uint32_t commstatus : 1; uint32_t gts : 1; uint32_t orphan : 1; 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;