drivers: wireless: Add support for getsockname() to gs2200m
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
parent
c86258c9a0
commit
21c588b126
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user