You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/11/01 02:14:25 UTC
(nuttx) 01/02: usrsock_rpmsg_server: Save iov and remain per endpoint
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 52fddb1f121dbbbae5a15a74019ec5581411923e
Author: Zhe Weng <we...@xiaomi.com>
AuthorDate: Mon Sep 11 11:57:53 2023 +0800
usrsock_rpmsg_server: Save iov and remain per endpoint
Then we may support multiple endpoints with sendto working correctly.
Signed-off-by: Zhe Weng <we...@xiaomi.com>
---
drivers/usrsock/usrsock_rpmsg_server.c | 75 +++++++++++++++++++---------------
1 file changed, 42 insertions(+), 33 deletions(-)
diff --git a/drivers/usrsock/usrsock_rpmsg_server.c b/drivers/usrsock/usrsock_rpmsg_server.c
index e97faaca5c..218a80aaf9 100644
--- a/drivers/usrsock/usrsock_rpmsg_server.c
+++ b/drivers/usrsock/usrsock_rpmsg_server.c
@@ -48,13 +48,18 @@
struct usrsock_rpmsg_s
{
rmutex_t mutex;
- ssize_t remain;
- struct iovec iov[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
struct socket socks[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
FAR struct rpmsg_endpoint *epts[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
struct pollfd pfds[CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS];
};
+struct usrsock_rpmsg_ept_s
+{
+ struct rpmsg_endpoint ept;
+ struct iovec iov[CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC];
+ ssize_t remain;
+};
+
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
@@ -380,37 +385,39 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
uint32_t src, FAR void *priv_)
{
FAR struct usrsock_request_sendto_s *req;
+ FAR struct usrsock_rpmsg_ept_s *uept =
+ (FAR struct usrsock_rpmsg_ept_s *)ept;
FAR struct usrsock_rpmsg_s *priv = priv_;
uint16_t events = 0;
ssize_t ret = -EBADF;
int retr;
int i;
- if (priv->remain > 0)
+ if (uept->remain > 0)
{
size_t hlen;
struct msghdr msg =
{
};
- priv->remain -= len;
+ uept->remain -= len;
- if (!priv->iov[0].iov_base)
+ if (!uept->iov[0].iov_base)
{
/* Maybe error occurred previously, skip processing. */
return 0;
}
- req = priv->iov[0].iov_base;
+ req = uept->iov[0].iov_base;
hlen = sizeof(*req) + req->addrlen;
for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
{
- if (!priv->iov[i].iov_base)
+ if (!uept->iov[i].iov_base)
{
- priv->iov[i].iov_base = data;
- priv->iov[i].iov_len = len;
+ uept->iov[i].iov_base = data;
+ uept->iov[i].iov_len = len;
rpmsg_hold_rx_buffer(ept, data);
break;
}
@@ -418,7 +425,7 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
/* Partial packet ? continue to fetch */
- if (priv->remain > 0)
+ if (uept->remain > 0)
{
/* We've used the last I/O vector, cannot continue. */
@@ -431,7 +438,7 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
return 0;
}
- else if (priv->remain < 0)
+ else if (uept->remain < 0)
{
ret = -EINVAL;
goto out;
@@ -439,20 +446,20 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
/* Skip the sendto header from I/O vector */
- priv->iov[0].iov_base = (FAR char *)priv->iov[0].iov_base + hlen;
- priv->iov[0].iov_len -= hlen;
+ uept->iov[0].iov_base = (FAR char *)uept->iov[0].iov_base + hlen;
+ uept->iov[0].iov_len -= hlen;
msg.msg_name = req->addrlen ? (FAR void *)(req + 1) : NULL;
msg.msg_namelen = req->addrlen;
- msg.msg_iov = priv->iov;
+ msg.msg_iov = uept->iov;
msg.msg_iovlen = i + 1;
ret = psock_sendmsg(&priv->socks[req->usockid], &msg, req->flags);
/* Recover the I/O vector */
- priv->iov[0].iov_base = (FAR char *)priv->iov[0].iov_base - hlen;
- priv->iov[0].iov_len += hlen;
+ uept->iov[0].iov_base = (FAR char *)uept->iov[0].iov_base - hlen;
+ uept->iov[0].iov_len += hlen;
}
else
{
@@ -461,12 +468,12 @@ static int usrsock_rpmsg_sendto_handler(FAR struct rpmsg_endpoint *ept,
if (req->usockid >= 0 &&
req->usockid < CONFIG_NET_USRSOCK_RPMSG_SERVER_NSOCKS)
{
- priv->remain = sizeof(*req) + req->addrlen + req->buflen - len;
- if (priv->remain > 0)
+ uept->remain = sizeof(*req) + req->addrlen + req->buflen - len;
+ if (uept->remain > 0)
{
#if CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC >= 2
- priv->iov[0].iov_base = data;
- priv->iov[0].iov_len = len;
+ uept->iov[0].iov_base = data;
+ uept->iov[0].iov_len = len;
rpmsg_hold_rx_buffer(ept, data);
return 0;
@@ -500,18 +507,18 @@ out:
priv->pfds[req->usockid].events | POLLOUT);
}
- if (priv->iov[0].iov_base)
+ if (uept->iov[0].iov_base)
{
for (i = 0; i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC; i++)
{
- if (priv->iov[i].iov_base == NULL)
+ if (uept->iov[i].iov_base == NULL)
{
break;
}
- rpmsg_release_rx_buffer(ept, priv->iov[i].iov_base);
- priv->iov[i].iov_base = NULL;
- priv->iov[i].iov_len = 0;
+ rpmsg_release_rx_buffer(ept, uept->iov[i].iov_base);
+ uept->iov[i].iov_base = NULL;
+ uept->iov[i].iov_len = 0;
}
}
@@ -980,28 +987,28 @@ static void usrsock_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
uint32_t dest)
{
FAR struct usrsock_rpmsg_s *priv = priv_;
- FAR struct rpmsg_endpoint *ept;
+ FAR struct usrsock_rpmsg_ept_s *uept;
int ret;
- ept = kmm_zalloc(sizeof(struct rpmsg_endpoint));
- if (!ept)
+ uept = kmm_zalloc(sizeof(*uept));
+ if (!uept)
{
return;
}
- ept->priv = priv;
+ uept->ept.priv = priv;
- ret = rpmsg_create_ept(ept, rdev, USRSOCK_RPMSG_EPT_NAME,
+ ret = rpmsg_create_ept(&uept->ept, rdev, USRSOCK_RPMSG_EPT_NAME,
RPMSG_ADDR_ANY, dest,
usrsock_rpmsg_ept_cb, usrsock_rpmsg_ns_unbind);
if (ret < 0)
{
- kmm_free(ept);
+ kmm_free(uept);
return;
}
#ifdef CONFIG_NETDB_DNSCLIENT
- dns_register_notify(usrsock_rpmsg_send_dns_event, ept);
+ dns_register_notify(usrsock_rpmsg_send_dns_event, &uept->ept);
#endif
}
@@ -1040,9 +1047,11 @@ static int usrsock_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *priv_)
{
FAR struct usrsock_request_common_s *common = data;
+ FAR struct usrsock_rpmsg_ept_s *uept =
+ (FAR struct usrsock_rpmsg_ept_s *)ept;
FAR struct usrsock_rpmsg_s *priv = priv_;
- if (priv->remain > 0)
+ if (uept->remain > 0)
{
return usrsock_rpmsg_sendto_handler(ept, data, len, src, priv);
}