[incubator-nuttx-apps] 03/04: wireless: gs2200m: Implement getpeername_request()

2020-10-30 Thread aguettouche
This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch releases/10.0
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit c69bc30ff64543522b1528fe72a4794896a0fe03
Author: Masayuki Ishikawa 
AuthorDate: Mon Oct 12 11:47:57 2020 +0900

wireless: gs2200m: Implement getpeername_request()

Summary:
- This commit adds getperrname_request() to gs2200m_main.c

Impact:
- Affects gs2200m only
- Need to update nuttx as well

Testing:
- Tested with spresense:wifi
- Modify telnetd and add getpeername() to show a client address

Signed-off-by: Masayuki Ishikawa 
---
 wireless/gs2200m/gs2200m_main.c | 79 +++--
 1 file changed, 76 insertions(+), 3 deletions(-)

diff --git a/wireless/gs2200m/gs2200m_main.c b/wireless/gs2200m/gs2200m_main.c
index 116b06a..28010ed 100644
--- a/wireless/gs2200m/gs2200m_main.c
+++ b/wireless/gs2200m/gs2200m_main.c
@@ -1412,14 +1412,87 @@ err_out:
 }
 
 /
- * Name: getsockname_request
+ * Name: getpeername_request
  /
 
 static int getpeername_request(int fd, FAR struct gs2200m_s *priv,
FAR void *hdrbuf)
 {
-  DEBUGASSERT(false);
-  return -ENOSYS;
+  FAR struct usrsock_request_getpeername_s *req = hdrbuf;
+  struct usrsock_message_datareq_ack_s resp;
+  FAR struct usock_s *usock;
+  int ret = 0;
+
+  DEBUGASSERT(priv);
+  DEBUGASSERT(req);
+
+  gs2200m_printf("%s: called  \n", __func__);
+
+  /* Check if this socket exists. */
+
+  usock = gs2200m_socket_get(priv, req->usockid);
+
+  if (!usock)
+{
+  ret = -EBADFD;
+  goto prepare;
+}
+
+  if (CONNECTED != usock->state)
+{
+  ret = -ENOTCONN;
+}
+
+prepare:
+
+  /* Prepare response. */
+
+  memset(&resp, 0, sizeof(resp));
+  resp.reqack.xid = req->head.xid;
+  resp.reqack.head.msgid = USRSOCK_MESSAGE_RESPONSE_DATA_ACK;
+  resp.reqack.head.flags = 0;
+  resp.reqack.result = ret;
+
+  if (0 == ret)
+{
+  resp.valuelen_nontrunc = sizeof(usock->raddr);
+  resp.valuelen = resp.valuelen_nontrunc;
+
+  if (resp.valuelen > req->max_addrlen)
+{
+  resp.valuelen = req->max_addrlen;
+}
+}
+  else
+{
+  resp.valuelen_nontrunc = 0;
+  resp.valuelen = 0;
+}
+
+  /* Send response. */
+
+  ret = _write_to_usock(fd, &resp, sizeof(resp));
+
+  if (0 > ret)
+{
+  goto err_out;
+}
+
+  if (resp.valuelen > 0)
+{
+  /* Send address (value) */
+
+  ret = _write_to_usock(fd, &usock->raddr, resp.valuelen);
+
+  if (0 > ret)
+{
+  goto err_out;
+}
+}
+
+err_out:
+  gs2200m_printf("%s: end \n", __func__);
+  return ret;
 }
 
 /



[incubator-nuttx-apps] 03/04: wireless: gs2200m: Implement getpeername_request()

2020-10-26 Thread jerpelea
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-apps.git

commit b71c5f8cb1870c6c19f0111e69dbc9a31ce0f692
Author: Masayuki Ishikawa 
AuthorDate: Mon Oct 12 11:47:57 2020 +0900

wireless: gs2200m: Implement getpeername_request()

Summary:
- This commit adds getperrname_request() to gs2200m_main.c

Impact:
- Affects gs2200m only
- Need to update nuttx as well

Testing:
- Tested with spresense:wifi
- Modify telnetd and add getpeername() to show a client address

Signed-off-by: Masayuki Ishikawa 
---
 wireless/gs2200m/gs2200m_main.c | 79 +++--
 1 file changed, 76 insertions(+), 3 deletions(-)

diff --git a/wireless/gs2200m/gs2200m_main.c b/wireless/gs2200m/gs2200m_main.c
index b95be57..ff45c25 100644
--- a/wireless/gs2200m/gs2200m_main.c
+++ b/wireless/gs2200m/gs2200m_main.c
@@ -1415,14 +1415,87 @@ err_out:
 }
 
 /
- * Name: getsockname_request
+ * Name: getpeername_request
  /
 
 static int getpeername_request(int fd, FAR struct gs2200m_s *priv,
FAR void *hdrbuf)
 {
-  DEBUGASSERT(false);
-  return -ENOSYS;
+  FAR struct usrsock_request_getpeername_s *req = hdrbuf;
+  struct usrsock_message_datareq_ack_s resp;
+  FAR struct usock_s *usock;
+  int ret = 0;
+
+  DEBUGASSERT(priv);
+  DEBUGASSERT(req);
+
+  gs2200m_printf("%s: called  \n", __func__);
+
+  /* Check if this socket exists. */
+
+  usock = gs2200m_socket_get(priv, req->usockid);
+
+  if (!usock)
+{
+  ret = -EBADFD;
+  goto prepare;
+}
+
+  if (CONNECTED != usock->state)
+{
+  ret = -ENOTCONN;
+}
+
+prepare:
+
+  /* Prepare response. */
+
+  memset(&resp, 0, sizeof(resp));
+  resp.reqack.xid = req->head.xid;
+  resp.reqack.head.msgid = USRSOCK_MESSAGE_RESPONSE_DATA_ACK;
+  resp.reqack.head.flags = 0;
+  resp.reqack.result = ret;
+
+  if (0 == ret)
+{
+  resp.valuelen_nontrunc = sizeof(usock->raddr);
+  resp.valuelen = resp.valuelen_nontrunc;
+
+  if (resp.valuelen > req->max_addrlen)
+{
+  resp.valuelen = req->max_addrlen;
+}
+}
+  else
+{
+  resp.valuelen_nontrunc = 0;
+  resp.valuelen = 0;
+}
+
+  /* Send response. */
+
+  ret = _write_to_usock(fd, &resp, sizeof(resp));
+
+  if (0 > ret)
+{
+  goto err_out;
+}
+
+  if (resp.valuelen > 0)
+{
+  /* Send address (value) */
+
+  ret = _write_to_usock(fd, &usock->raddr, resp.valuelen);
+
+  if (0 > ret)
+{
+  goto err_out;
+}
+}
+
+err_out:
+  gs2200m_printf("%s: end \n", __func__);
+  return ret;
 }
 
 /