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 <[email protected]> AuthorDate: Thu May 14 08:10:04 2020 +0900 drivers: wireless: Add support for getsockname() to gs2200m Signed-off-by: Masayuki Ishikawa <[email protected]> --- 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
