This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
commit 45c0d58baaee99f40fec42388730c082b0e60443 Author: raiden00pl <[email protected]> AuthorDate: Thu Oct 22 17:47:04 2026 +0200 wireless/ieee802154/i8sak: fix the event receivers Each acceptassoc added a receiver and a daemon user, the receivers ran out after three calls: replace the previous one. assoc and poll waited forever for a confirm when their receiver could not be registered. The event thread needs a SIGINT handler, an ignored signal does not break it out of MAC802154IOC_GET_EVENT. Assisted-by: Claude Code Signed-off-by: raiden00pl <[email protected]> --- wireless/ieee802154/i8sak/i8sak_acceptassoc.c | 7 +++++++ wireless/ieee802154/i8sak/i8sak_assoc.c | 9 ++++++++- wireless/ieee802154/i8sak/i8sak_events.c | 24 +++++++++++++++++++++--- wireless/ieee802154/i8sak/i8sak_poll.c | 8 +++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/wireless/ieee802154/i8sak/i8sak_acceptassoc.c b/wireless/ieee802154/i8sak/i8sak_acceptassoc.c index df0546184..0f3d9c77b 100644 --- a/wireless/ieee802154/i8sak/i8sak_acceptassoc.c +++ b/wireless/ieee802154/i8sak/i8sak_acceptassoc.c @@ -147,6 +147,13 @@ void i8sak_acceptassoc_cmd(FAR struct i8sak_s *i8sak, int argc, i8sak_requestdaemon(i8sak); + /* Replace the receiver of a previous acceptassoc */ + + if (i8sak_eventlistener_removereceiver(i8sak, acceptassoc_eventcb) == OK) + { + i8sak_releasedaemon(i8sak); + } + /* Register new callback for receiving the association notifications */ memset(&filter, 0, sizeof(struct i8sak_eventfilter_s)); diff --git a/wireless/ieee802154/i8sak/i8sak_assoc.c b/wireless/ieee802154/i8sak/i8sak_assoc.c index a9abda227..ef59b4066 100644 --- a/wireless/ieee802154/i8sak/i8sak_assoc.c +++ b/wireless/ieee802154/i8sak/i8sak_assoc.c @@ -210,7 +210,14 @@ void i8sak_assoc_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) memset(&filter, 0, sizeof(struct i8sak_eventfilter_s)); filter.confevents.assoc = true; - i8sak_eventlistener_addreceiver(i8sak, assoc_eventcb, &filter, false); + ret = i8sak_eventlistener_addreceiver(i8sak, assoc_eventcb, &filter, + false); + if (ret < 0) + { + i8sak_releasedaemon(i8sak); + close(fd); + return; + } /* Loop for the specified retry count if the association fails. */ diff --git a/wireless/ieee802154/i8sak/i8sak_events.c b/wireless/ieee802154/i8sak/i8sak_events.c index 33b49a768..cae0cc098 100644 --- a/wireless/ieee802154/i8sak/i8sak_events.c +++ b/wireless/ieee802154/i8sak/i8sak_events.c @@ -32,6 +32,7 @@ #include <unistd.h> #include <string.h> #include <errno.h> +#include <signal.h> #include <fcntl.h> #include <net/if.h> #include <nuttx/fs/ioctl.h> @@ -50,6 +51,22 @@ * Private Functions ****************************************************************************/ +#ifdef CONFIG_ENABLE_ALL_SIGNALS +/**************************************************************************** + * Name: i8sak_eventthread_wakeup + * + * Description: + * An empty handler for SIGINT. i8sak_eventlistener_stop() sends SIGINT + * to break the event thread out of MAC802154IOC_GET_EVENT; an ignored + * signal does not interrupt it. + * + ****************************************************************************/ + +static void i8sak_eventthread_wakeup(int signo) +{ +} +#endif + /**************************************************************************** * Name: i8sak_eventthread * @@ -72,6 +89,8 @@ static pthread_addr_t i8sak_eventthread(pthread_addr_t arg) #ifdef CONFIG_DISABLE_ALL_SIGNALS pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); +#elif defined(CONFIG_ENABLE_ALL_SIGNALS) + signal(SIGINT, i8sak_eventthread_wakeup); #endif if (i8sak->mode == I8SAK_MODE_CHAR) @@ -269,7 +288,7 @@ int i8sak_eventlistener_stop(FAR struct i8sak_s *i8sak) #ifdef CONFIG_DISABLE_ALL_SIGNALS pthread_cancel(i8sak->eventlistener_threadid); #else - pthread_kill(i8sak->eventlistener_threadid, 2); + pthread_kill(i8sak->eventlistener_threadid, SIGINT); #endif ret = pthread_join(i8sak->eventlistener_threadid, &value); @@ -409,6 +428,5 @@ int i8sak_eventlistener_removereceiver(FAR struct i8sak_s *i8sak, } sem_post(&i8sak->eventsem); - fprintf(stderr, "failed to remove receiver"); - return ERROR; + return -ENOENT; } diff --git a/wireless/ieee802154/i8sak/i8sak_poll.c b/wireless/ieee802154/i8sak/i8sak_poll.c index 832c98cca..4161db7b8 100644 --- a/wireless/ieee802154/i8sak/i8sak_poll.c +++ b/wireless/ieee802154/i8sak/i8sak_poll.c @@ -105,7 +105,13 @@ void i8sak_poll_cmd(FAR struct i8sak_s *i8sak, int argc, FAR char *argv[]) memset(&eventfilter, 0, sizeof(struct i8sak_eventfilter_s)); eventfilter.confevents.poll = true; - i8sak_eventlistener_addreceiver(i8sak, poll_eventcb, &eventfilter, true); + ret = i8sak_eventlistener_addreceiver(i8sak, poll_eventcb, &eventfilter, + true); + if (ret < 0) + { + i8sak_releasedaemon(i8sak); + return; + } memcpy(&pollreq.coordaddr, &i8sak->ep_addr, sizeof(struct ieee802154_addr_s));
