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