This is an automated email from the ASF dual-hosted git repository.

jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 7de8d0603 wireless/gs2200m: Fix handling of ioctl except 
SIOCDENYINETSOCK
7de8d0603 is described below

commit 7de8d0603f1fd66581927a364b58efca37166e34
Author: SPRESENSE <41312067+sprese...@users.noreply.github.com>
AuthorDate: Tue Feb 28 11:21:01 2023 +0900

    wireless/gs2200m: Fix handling of ioctl except SIOCDENYINETSOCK
    
    When running a dual stack (usrsock daemon and kernel stack),
    ioctl requests that should be handled by the kernel stack are being
    processed by the usrsock daemon. This causes ifconfig and ifup to fail.
    The usrsock daemon that receives an ioctl request that should be
    handled by the kernel stack should reply with ENOTTY.
    Replying with ENOTTY means that the ioctl request can fall back to the
    kernel stack.
---
 wireless/gs2200m/gs2200m_main.c | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/wireless/gs2200m/gs2200m_main.c b/wireless/gs2200m/gs2200m_main.c
index 64cbd2b5c..577d289fa 100644
--- a/wireless/gs2200m/gs2200m_main.c
+++ b/wireless/gs2200m/gs2200m_main.c
@@ -1563,6 +1563,7 @@ static int ioctl_request(int fd, FAR struct gs2200m_s 
*priv,
   struct gs2200m_ifreq_msg imsg;
   uint8_t sock_type;
   bool getreq = false;
+  bool drvreq = true;
   int ret = -EINVAL;
 
   memset(&imsg.ifr, 0, sizeof(imsg.ifr));
@@ -1575,14 +1576,29 @@ static int ioctl_request(int fd, FAR struct gs2200m_s 
*priv,
       case SIOCGIWNWID:
       case SIOCGIWFREQ:
       case SIOCGIWSENS:
-        getreq = true;
+        if (priv->usock_enable)
+          {
+            getreq = true;
+          }
+        else
+          {
+            ret = -ENOTTY;
+            drvreq = false;
+          }
         break;
 
       case SIOCSIFADDR:
       case SIOCSIFDSTADDR:
       case SIOCSIFNETMASK:
-
-        read(fd, &imsg.ifr, sizeof(imsg.ifr));
+        if (priv->usock_enable)
+          {
+            read(fd, &imsg.ifr, sizeof(imsg.ifr));
+          }
+        else
+          {
+            ret = -ENOTTY;
+            drvreq = false;
+          }
         break;
 
       case SIOCDENYINETSOCK:
@@ -1604,11 +1620,19 @@ static int ioctl_request(int fd, FAR struct gs2200m_s 
*priv,
         break;
 
       default:
+        if (!priv->usock_enable)
+          {
+            ret = -ENOTTY;
+            drvreq = false;
+          }
         break;
     }
 
-  imsg.cmd = req->cmd;
-  ret = ioctl(priv->gsfd, GS2200M_IOC_IFREQ, (unsigned long)&imsg);
+  if (drvreq)
+    {
+      imsg.cmd = req->cmd;
+      ret = ioctl(priv->gsfd, GS2200M_IOC_IFREQ, (unsigned long)&imsg);
+    }
 
   if (!getreq)
     {

Reply via email to