You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2020/05/14 12:17:59 UTC

[incubator-nuttx] 01/05: drivers: wireless: Add support for getsockname() to gs2200m

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/incubator-nuttx.git

commit 21c588b126079cb61a1b8c946d38b6a73cfcbfc8
Author: Masayuki Ishikawa <ma...@gmail.com>
AuthorDate: Thu May 14 08:10:04 2020 +0900

    drivers: wireless: Add support for getsockname() to gs2200m
    
    Signed-off-by: Masayuki Ishikawa <Ma...@jp.sony.com>
---
 drivers/wireless/gs2200m.c       | 126 ++++++++++++++++++++++++++++++++++++++-
 include/nuttx/wireless/gs2200m.h |   8 +++
 include/nuttx/wireless/ioctl.h   |   2 +-
 3 files changed, 134 insertions(+), 2 deletions(-)

diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c
index d666c56..6ced941 100644
--- a/drivers/wireless/gs2200m.c
+++ b/drivers/wireless/gs2200m.c
@@ -82,7 +82,7 @@
 #define GS2200MWORK LPWORK
 
 #define SPI_MAXFREQ  CONFIG_WL_GS2200M_SPI_FREQUENCY
-#define NRESPMSG     8
+#define NRESPMSG     (16 + 2)
 
 #define MAX_PKT_LEN  1500
 #define MAX_NOTIF_Q  16
@@ -2015,6 +2015,86 @@ static enum pkt_type_e gs2200m_get_version(FAR struct gs2200m_dev_s *dev)
 #endif
 
 /****************************************************************************
+ * Name: gs2200m_get_cstatus
+ ****************************************************************************/
+
+static enum pkt_type_e gs2200m_get_cstatus(FAR struct gs2200m_dev_s *dev,
+                                           FAR struct gs2200m_name_msg *msg)
+{
+  struct pkt_dat_s pkt_dat;
+  enum pkt_type_e   r;
+  char cmd[16];
+  int i;
+
+  snprintf(cmd, sizeof(cmd), "AT+CID=?\r\n");
+
+  /* Initialize pkt_dat and send */
+
+  memset(&pkt_dat, 0, sizeof(pkt_dat));
+  r = gs2200m_send_cmd(dev, cmd, &pkt_dat);
+
+  if (r != TYPE_OK || pkt_dat.n <= 2)
+    {
+      wlinfo("+++ error: r=%d pkt_dat.msg[0]=%s \n",
+             r, pkt_dat.msg[0]);
+
+      goto errout;
+    }
+
+  /* Find cid in the connection status */
+
+  for (i = 1; i < pkt_dat.n - 2; i++)
+    {
+      int  n;
+      char c;
+      int  a[4];
+      int  p[2];
+      char type[8];
+      char mode[8];
+      memset(type, 0, sizeof(type));
+      memset(mode, 0, sizeof(mode));
+      n = sscanf(pkt_dat.msg[i], "%c %7s %6s %d %d %d.%d.%d.%d",
+                 &c, type, mode, &p[0], &p[1],
+                 &a[0], &a[1], &a[2], &a[3]);
+      ASSERT(9 == n);
+
+      wlinfo("[%d]: %c %s %s %d %d %d.%d.%d.%d \n",
+             i, c, type, mode, p[0], p[1],
+             a[0], a[1], a[2], a[3]);
+
+      if (c == msg->cid)
+        {
+          /* Set family,  port and address (remote only) */
+
+          msg->addr.sin_family = AF_INET;
+
+          if (msg->local)
+            {
+              msg->addr.sin_port = htons(p[0]);
+            }
+          else
+            {
+              char addr[20];
+              msg->addr.sin_port = htons(p[1]);
+              snprintf(addr, sizeof(addr),
+                       "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
+              inet_aton(addr, &msg->addr.sin_addr);
+            }
+
+          goto errout;
+        }
+    }
+
+  /* Not found */
+
+  r = TYPE_UNMATCH;
+
+errout:
+  _release_pkt_dat(&pkt_dat);
+  return r;
+}
+
+/****************************************************************************
  * Name: gs2200m_ioctl_bind
  ****************************************************************************/
 
@@ -2529,6 +2609,41 @@ static int gs2200m_ioctl_ifreq(FAR struct gs2200m_dev_s *dev,
 }
 
 /****************************************************************************
+ * Name: gs2200m_ioctl_name
+ ****************************************************************************/
+
+static int gs2200m_ioctl_name(FAR struct gs2200m_dev_s *dev,
+                              FAR struct gs2200m_name_msg *msg)
+{
+  enum pkt_type_e r;
+  int ret = 0;
+
+  /* Obtain connection status */
+
+  r = gs2200m_get_cstatus(dev, msg);
+
+  if (r != TYPE_OK)
+    {
+      ret = -EINVAL;
+      goto errout;
+    }
+
+  if (msg->local)
+    {
+      /* Copy local address from net_dev */
+
+      memcpy(&msg->addr.sin_addr,
+             &dev->net_dev.d_ipaddr,
+             sizeof(msg->addr.sin_addr)
+             );
+    }
+
+errout:
+
+  return ret;
+}
+
+/****************************************************************************
  * Name: gs2200m_ioctl
  ****************************************************************************/
 
@@ -2640,6 +2755,15 @@ static int gs2200m_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
           break;
         }
 
+      case GS2200M_IOC_NAME:
+        {
+          struct gs2200m_name_msg *msg =
+            (struct gs2200m_name_msg *)arg;
+
+          ret = gs2200m_ioctl_name(dev, msg);
+          break;
+        }
+
       default:
         DEBUGPANIC();
         break;
diff --git a/include/nuttx/wireless/gs2200m.h b/include/nuttx/wireless/gs2200m.h
index a9d43c3..9b570eb 100644
--- a/include/nuttx/wireless/gs2200m.h
+++ b/include/nuttx/wireless/gs2200m.h
@@ -71,6 +71,7 @@ extern "C"
 #define GS2200M_IOC_ACCEPT   _WLCIOC(GS2200M_FIRST + 5)
 #define GS2200M_IOC_ASSOC    _WLCIOC(GS2200M_FIRST + 6)
 #define GS2200M_IOC_IFREQ    _WLCIOC(GS2200M_FIRST + 7)
+#define GS2200M_IOC_NAME     _WLCIOC(GS2200M_FIRST + 8)
 
 /* NOTE: do not forget to update include/nuttx/wireless/ioctl.h */
 
@@ -137,6 +138,13 @@ struct gs2200m_ifreq_msg
   struct ifreq ifr;
 };
 
+struct gs2200m_name_msg
+{
+  struct sockaddr_in addr;
+  bool        local;
+  char        cid;
+};
+
 struct gs2200m_lower_s
 {
   int  (*attach)(xcpt_t handler, FAR void *arg);
diff --git a/include/nuttx/wireless/ioctl.h b/include/nuttx/wireless/ioctl.h
index 14f9ae4..eddd4b7 100644
--- a/include/nuttx/wireless/ioctl.h
+++ b/include/nuttx/wireless/ioctl.h
@@ -100,7 +100,7 @@
 /* See include/nuttx/wireless/gs2200m.h */
 
 #define GS2200M_FIRST       (SX127X_FIRST + SX127X_NCMDS)
-#define GS2200M_NCMDS       8
+#define GS2200M_NCMDS       9
 
 /************************************************************************************
  * Public Types