From d2f75467b5edd2d36f3070e85ad72f1a7d819e51 Mon Sep 17 00:00:00 2001 From: SPRESENSE <41312067+SPRESENSE@users.noreply.github.com> Date: Wed, 22 Jul 2020 17:20:32 +0900 Subject: [PATCH] net/usrsock: Add flags to sendto/recvfrom in usrsock Add flags argument into sendto() and recvfrom() APIs for MSG_* flags can handling in the daemon. However, MSG_DONTWAIT should process in usrsock, so it unnecessary to pass to the daemon like O_NONBLOCK. --- include/nuttx/net/usrsock.h | 2 ++ net/usrsock/usrsock_recvfrom.c | 12 +++++++++--- net/usrsock/usrsock_sendto.c | 9 +++++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/nuttx/net/usrsock.h b/include/nuttx/net/usrsock.h index ddf07d3ffc1..166026d062f 100644 --- a/include/nuttx/net/usrsock.h +++ b/include/nuttx/net/usrsock.h @@ -168,6 +168,7 @@ begin_packed_struct struct usrsock_request_sendto_s struct usrsock_request_common_s head; int16_t usockid; + int32_t flags; uint16_t addrlen; uint16_t buflen; } end_packed_struct; @@ -177,6 +178,7 @@ begin_packed_struct struct usrsock_request_recvfrom_s struct usrsock_request_common_s head; int16_t usockid; + int32_t flags; uint16_t max_buflen; uint16_t max_addrlen; } end_packed_struct; diff --git a/net/usrsock/usrsock_recvfrom.c b/net/usrsock/usrsock_recvfrom.c index 8f7d51e4d9f..588ada77d9b 100644 --- a/net/usrsock/usrsock_recvfrom.c +++ b/net/usrsock/usrsock_recvfrom.c @@ -159,8 +159,9 @@ static uint16_t recvfrom_event(FAR struct net_driver_s *dev, * Name: do_recvfrom_request ****************************************************************************/ -static int do_recvfrom_request(FAR struct usrsock_conn_s *conn, size_t buflen, - socklen_t addrlen) +static int do_recvfrom_request(FAR struct usrsock_conn_s *conn, + size_t buflen, socklen_t addrlen, + int32_t flags) { struct usrsock_request_recvfrom_s req = { @@ -182,6 +183,7 @@ static int do_recvfrom_request(FAR struct usrsock_conn_s *conn, size_t buflen, req.head.reqid = USRSOCK_REQUEST_RECVFROM; req.usockid = conn->usockid; + req.flags = flags; req.max_addrlen = addrlen; req.max_buflen = buflen; @@ -397,9 +399,13 @@ ssize_t usrsock_recvfrom(FAR struct socket *psock, FAR void *buf, size_t len, usrsock_setup_datain(conn, inbufs, ARRAY_SIZE(inbufs)); + /* MSG_DONTWAIT is only use in usrsock. */ + + flags &= ~MSG_DONTWAIT; + /* Request user-space daemon to close socket. */ - ret = do_recvfrom_request(conn, len, addrlen); + ret = do_recvfrom_request(conn, len, addrlen, flags); if (ret >= 0) { /* Wait for completion of request. */ diff --git a/net/usrsock/usrsock_sendto.c b/net/usrsock/usrsock_sendto.c index 16d3708799e..400f788d1d9 100644 --- a/net/usrsock/usrsock_sendto.c +++ b/net/usrsock/usrsock_sendto.c @@ -150,7 +150,7 @@ static uint16_t sendto_event(FAR struct net_driver_s *dev, FAR void *pvconn, static int do_sendto_request(FAR struct usrsock_conn_s *conn, FAR const void *buf, size_t buflen, FAR const struct sockaddr *addr, - socklen_t addrlen) + socklen_t addrlen, int32_t flags) { struct usrsock_request_sendto_s req = { @@ -172,6 +172,7 @@ static int do_sendto_request(FAR struct usrsock_conn_s *conn, req.head.reqid = USRSOCK_REQUEST_SENDTO; req.usockid = conn->usockid; + req.flags = flags; req.addrlen = addrlen; req.buflen = buflen; @@ -376,9 +377,13 @@ ssize_t usrsock_sendto(FAR struct socket *psock, FAR const void *buf, goto errout_unlock; } + /* MSG_DONTWAIT is only use in usrsock. */ + + flags &= ~MSG_DONTWAIT; + /* Request user-space daemon to close socket. */ - ret = do_sendto_request(conn, buf, len, to, tolen); + ret = do_sendto_request(conn, buf, len, to, tolen, flags); if (ret >= 0) { /* Wait for completion of request. */