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));

Reply via email to