From c3bc27ded2e357ecd5d9d3dfea71ba396c4a0cd2 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 29 Jun 2017 11:21:45 -0600 Subject: [PATCH 1/3] system/telnet: Fix a copy-paste error in conditional compilation. --- system/telnet/telnet_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/telnet/telnet_client.c b/system/telnet/telnet_client.c index 41f41791b..42e27289c 100644 --- a/system/telnet/telnet_client.c +++ b/system/telnet/telnet_client.c @@ -332,7 +332,7 @@ int telnet_main(int argc, char *argv[]) memset(&local, 0, sizeof(local)); -#ifdef CONFIG_EXAMPLES_NETTEST_IPv6 +#ifdef CONFIG_NET_IPv6 addrlen = sizeof(struct sockaddr_in6); family = AF_INET6; @@ -343,7 +343,7 @@ int telnet_main(int argc, char *argv[]) ret = inet_pton(AF_INET6, argv[1], server.ipv6.sin6_addr.s6_addr); if (ret < 0) #endif -#ifdef CONFIG_EXAMPLES_NETTEST_IPv +#ifdef CONFIG_NET_IPv4 { addrlen = sizeof(struct sockaddr_in); family = AF_INET; From 352d141f8c068b7fc66f9c6399cb4f293a01ce0d Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 29 Jun 2017 12:11:12 -0600 Subject: [PATCH 2/3] i8sak: Need to increment the next_saddr after each successful association. --- wireless/ieee802154/i8sak/i8sak_acceptassoc.c | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_acceptassoc.c b/wireless/ieee802154/i8sak/i8sak_acceptassoc.c index 949ca0dc6..27350311b 100644 --- a/wireless/ieee802154/i8sak/i8sak_acceptassoc.c +++ b/wireless/ieee802154/i8sak/i8sak_acceptassoc.c @@ -39,12 +39,15 @@ ****************************************************************************/ #include + +#include #include #include #include -#include #include -#include +#include +#include + #include #include "i8sak.h" @@ -57,7 +60,8 @@ * Private Function Prototypes ****************************************************************************/ -static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg); +static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, + FAR void *arg); /**************************************************************************** * Public Functions @@ -70,10 +74,12 @@ static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void * * Start accepting association requests. ****************************************************************************/ -void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) +void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, + FAR char *argv[]) { struct wpanlistener_eventfilter_s filter; - bool acceptall = true; /* start off assuming we are going to allow all connections */ + bool acceptall = true; /* Start off assuming we are going to allow all + * connections */ int option; int optcnt; int fd; @@ -91,14 +97,17 @@ void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[] " -e = only accept requests from eaddr\n" "Note: No option accepts all requests\n" , argv[0]); + /* Must manually reset optind if we are going to exit early */ optind = -1; return; + case 'e': /* Accept only this extended address */ i8sak_str2eaddr(optarg, &i8sak->ep.eaddr[0]); acceptall = false; break; + case ':': fprintf(stderr, "ERROR: missing argument\n"); @@ -106,6 +115,7 @@ void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[] optind = -1; i8sak_cmd_error(i8sak); /* This exits for us */ + case '?': fprintf(stderr, "ERROR: invalid argument\n"); @@ -140,7 +150,8 @@ void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[] &filter, (FAR void *)i8sak, !i8sak->acceptall); } -static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg) +static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, + FAR void *arg) { FAR struct i8sak_s *i8sak = (FAR struct i8sak_s *)arg; struct ieee802154_assoc_resp_s assocresp; @@ -159,7 +170,21 @@ static void acceptassoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void * if (IEEE802154_EADDRCMP(notif->u.assocind.devaddr, i8sak->ep.eaddr)) { + /* Assign the short address */ + IEEE802154_SADDRCOPY(assocresp.assocsaddr, i8sak->next_saddr); + + /* Select a short address for the next association */ + + i8sak->next_saddr[0]++; + if (i8sak->next_saddr[0] == 0) + { + /* Handle the carry */ + + i8sak->next_saddr[1]++; + DEBUGASSERT(i8sak->next_saddr[1] != 0); + } + assocresp.status = IEEE802154_STATUS_SUCCESS; printf("i8sak: accepting association request\n"); } From 75f29d9ddc979ec477ae6e831d76350d55af457c Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Thu, 29 Jun 2017 13:30:07 -0600 Subject: [PATCH 3/3] i8sak: Add a option to retry on failures to the assoc command. --- wireless/ieee802154/i8sak/i8sak.h | 1 + wireless/ieee802154/i8sak/i8sak_assoc.c | 141 ++++++++++++++++++------ wireless/ieee802154/i8sak/i8sak_main.c | 2 +- 3 files changed, 110 insertions(+), 34 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak.h b/wireless/ieee802154/i8sak/i8sak.h index cb1eeb3e5..3ea211b76 100644 --- a/wireless/ieee802154/i8sak/i8sak.h +++ b/wireless/ieee802154/i8sak/i8sak.h @@ -143,6 +143,7 @@ struct i8sak_s pid_t daemon_pid; FAR char devname[I8SAK_MAX_DEVNAME]; struct wpanlistener_s wpanlistener; + int result; int fd; sem_t exclsem; /* For synchronizing access to the signaling semaphore */ diff --git a/wireless/ieee802154/i8sak/i8sak_assoc.c b/wireless/ieee802154/i8sak/i8sak_assoc.c index d8ef39b41..d06ff0bf4 100644 --- a/wireless/ieee802154/i8sak/i8sak_assoc.c +++ b/wireless/ieee802154/i8sak/i8sak_assoc.c @@ -44,12 +44,15 @@ ****************************************************************************/ #include + +#include #include #include +#include #include #include #include -#include + #include #include "i8sak.h" @@ -80,6 +83,9 @@ 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; + bool retry = false; + int maxretries = 0; + int retrycnt; int fd; int option; int optcnt; @@ -98,15 +104,16 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) } optcnt = 0; - while ((option = getopt(argc, argv, ":hr:s:e:")) != ERROR) + while ((option = getopt(argc, argv, ":hr:s:e:w:")) != ERROR) { optcnt++; switch (option) { case 'h': fprintf(stderr, "Requests association with endpoint\n" - "Usage: %s [-h]\n" + "Usage: %s [-h] [-w \n" " -h = this help menu\n" + " -w = wait and retry on failure\n" " -r = use scan result index\n" , argv[0]); @@ -114,12 +121,14 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) optind = -1; return; + case 'r': resindex = i8sak_str2luint8(optarg); if (resindex >= i8sak->npandesc) { fprintf(stderr, "ERROR: missing argument\n"); + /* Must manually reset optind if we are going to exit early */ optind = -1; @@ -147,8 +156,16 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak->ep.mode = IEEE802154_ADDRMODE_EXTENDED; break; + case 'w': + /* Wait and retry if we fail to associate */ + + retry = true; + maxretries = atoi(optarg); + break; + case ':': fprintf(stderr, "ERROR: missing argument\n"); + /* Must manually reset optind if we are going to exit early */ optind = -1; @@ -156,6 +173,7 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) case '?': fprintf(stderr, "ERROR: unknown argument\n"); + /* Must manually reset optind if we are going to exit early */ optind = -1; @@ -179,43 +197,98 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) i8sak_cmd_error(i8sak); } - /* Register new callback for receiving the association notifications */ + /* Register new callback for receiving the association notifications. */ memset(&filter, 0, sizeof(struct wpanlistener_eventfilter_s)); filter.confevents.assoc = true; - wpanlistener_add_eventreceiver(&i8sak->wpanlistener, assoc_eventcb, &filter, - (FAR void *)i8sak, true); + wpanlistener_add_eventreceiver(&i8sak->wpanlistener, assoc_eventcb, + &filter, (FAR void *)i8sak, false); - printf("i8sak: issuing ASSOC. request\n"); + /* Loop for the specified retry count if the association fails. + */ - assocreq.chan = i8sak->chan; - assocreq.chpage = i8sak->chpage; - - memcpy(&assocreq.coordaddr, &i8sak->ep, sizeof(struct ieee802154_addr_s)); - - assocreq.capabilities.devtype = 0; - assocreq.capabilities.powersource = 1; - assocreq.capabilities.rxonidle = 1; - assocreq.capabilities.security = 0; - assocreq.capabilities.allocaddr = 1; - - ieee802154_assoc_req(fd, &assocreq); - - close(fd); - - /* Wait here, the event listener will notify us if the correct event occurs */ - - i8sak->assoc = true; - - ret = sem_wait(&i8sak->sigsem); - sem_post(&i8sak->exclsem); - if (ret != OK) + retrycnt = 0; + for (; ; ) { - i8sak->assoc = false; - printf("i8sak: test cancelled\n"); - i8sak_cmd_error(i8sak); + printf("i8sak: issuing ASSOC. request %d\n", retrycnt + 1); + + /* Issue association request */ + + assocreq.chan = i8sak->chan; + assocreq.chpage = i8sak->chpage; + + memcpy(&assocreq.coordaddr, &i8sak->ep, + sizeof(struct ieee802154_addr_s)); + + assocreq.capabilities.devtype = 0; + assocreq.capabilities.powersource = 1; + assocreq.capabilities.rxonidle = 1; + assocreq.capabilities.security = 0; + assocreq.capabilities.allocaddr = 1; + + ieee802154_assoc_req(fd, &assocreq); + + /* Wait for the assocconf event */ + + i8sak->assoc = true; + i8sak->result = -EBUSY; + + ret = sem_wait(&i8sak->sigsem); + sem_post(&i8sak->exclsem); + if (ret != OK) + { + i8sak->assoc = false; + printf("i8sak: test cancelled\n"); + i8sak_cmd_error(i8sak); + break; + } + + /* Check if the association was successful */ + + if (i8sak->result == OK) + { + /* Break out and return if the association was successful. */ + + break; + } + + /* Not successful .. were we asked to retry in the event of an + * association failure? + */ + + if (!retry) + { + /* No retries... break out now with the failed association */ + + break; + } + + /* A retry count of zero means to retry forever. Otherwise, + * abort as soon as the maximum number of retries have been + * performed. + */ + + if (maxretries > 0 && retrycnt >= maxretries) + { + /* Max retry count exceeded -- break out now with a failed + * association. + */ + + break; + } + + /* Otherwise, wait a bit and try again */ + + sleep(2); + retrycnt++; } + + /* Clean up and return */ + + (void)wpanlistener_remove_eventreceiver(&i8sak->wpanlistener, + assoc_eventcb); + close(fd); } /**************************************************************************** @@ -229,16 +302,18 @@ static void assoc_eventcb(FAR struct ieee802154_notif_s *notif, FAR void *arg) if (notif->u.assocconf.status == IEEE802154_STATUS_SUCCESS) { printf("i8sak: ASSOC.request succeeded\n"); + i8sak->result = OK; } else { printf("i8sak: ASSOC.request failed: %s\n", IEEE802154_STATUS_STRING[notif->u.assocconf.status]); + i8sak->result = -EAGAIN; } if (i8sak->assoc) { - sem_post(&i8sak->sigsem); i8sak->assoc = false; + sem_post(&i8sak->sigsem); } } diff --git a/wireless/ieee802154/i8sak/i8sak_main.c b/wireless/ieee802154/i8sak/i8sak_main.c index 4d74de876..789bdbcce 100644 --- a/wireless/ieee802154/i8sak/i8sak_main.c +++ b/wireless/ieee802154/i8sak/i8sak_main.c @@ -734,7 +734,7 @@ static int i8sak_showusage(FAR const char *progname, int exitcode) " startpan [-h]\n" " acceptassoc [-h|e ]\n" " scan [-h|p|a|e] minch-maxch\n" - " assoc [-h] []\n" + " assoc [-h] [-w ] []\n" " tx [-h|d] \n" " poll [-h]\n" " blaster [-h|q|f |p ]\n"