drivers: wireless: Add support for getsockname() to gs2200m

Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
Masayuki Ishikawa 2020-05-14 08:10:04 +09:00 committed by Alin Jerpelea
parent c86258c9a0
commit 21c588b126
3 changed files with 134 additions and 2 deletions

View File

@ -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
@ -2014,6 +2014,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
****************************************************************************/
@ -2528,6 +2608,41 @@ static int gs2200m_ioctl_ifreq(FAR struct gs2200m_dev_s *dev,
return ret;
}
/****************************************************************************
* 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;

View File

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

View File

@ -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