[incubator-nuttx-apps] 03/04: wireless: gs2200m: Implement getpeername_request()
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()
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; } /