mirror of
https://github.com/apache/nuttx.git
synced 2026-06-05 15:43:28 +08:00
net/rpmsg: add multi-iov support
N/A Add multi-iov support for rpmsg sockets Change-Id: I188e41972be2942799fd06d4b530e292125fbf33 Signed-off-by: Peter Bee <bijunda1@xiaomi.com>
This commit is contained in:
committed by
Gustavo Henrique Nihei
parent
663104a2e9
commit
b10905015a
+57
-19
@@ -862,13 +862,26 @@ errout:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t rpmsg_socket_get_iovlen(FAR const struct iovec *buf,
|
||||||
|
size_t iovcnt)
|
||||||
|
{
|
||||||
|
uint32_t len = 0;
|
||||||
|
while (iovcnt--)
|
||||||
|
{
|
||||||
|
len += (buf++)->iov_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
||||||
FAR const void *buf,
|
FAR const struct iovec *buf,
|
||||||
size_t len)
|
size_t iovcnt)
|
||||||
{
|
{
|
||||||
FAR struct rpmsg_socket_conn_s *conn = psock->s_conn;
|
FAR struct rpmsg_socket_conn_s *conn = psock->s_conn;
|
||||||
FAR const char *cur = buf;
|
uint32_t len = rpmsg_socket_get_iovlen(buf, iovcnt);
|
||||||
size_t written = 0;
|
uint32_t written = 0;
|
||||||
|
uint32_t offset = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
rpmsg_socket_lock(&conn->sendlock);
|
rpmsg_socket_lock(&conn->sendlock);
|
||||||
@@ -877,6 +890,7 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
|||||||
{
|
{
|
||||||
uint32_t block = MIN(len - written, rpmsg_socket_get_space(conn));
|
uint32_t block = MIN(len - written, rpmsg_socket_get_space(conn));
|
||||||
FAR struct rpmsg_socket_data_s *msg;
|
FAR struct rpmsg_socket_data_s *msg;
|
||||||
|
uint32_t block_written = 0;
|
||||||
uint32_t ipcsize;
|
uint32_t ipcsize;
|
||||||
|
|
||||||
if (block == 0)
|
if (block == 0)
|
||||||
@@ -918,7 +932,20 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
|||||||
msg->cmd = RPMSG_SOCKET_CMD_DATA;
|
msg->cmd = RPMSG_SOCKET_CMD_DATA;
|
||||||
msg->pos = conn->recvpos;
|
msg->pos = conn->recvpos;
|
||||||
msg->len = block;
|
msg->len = block;
|
||||||
memcpy(msg->data, cur, block);
|
while (block_written < block)
|
||||||
|
{
|
||||||
|
uint32_t chunk = MIN(block - block_written, buf->iov_len - offset);
|
||||||
|
memcpy(msg->data + block_written,
|
||||||
|
(FAR const char *)buf->iov_base + offset, chunk);
|
||||||
|
offset += chunk;
|
||||||
|
if (offset == buf->iov_len)
|
||||||
|
{
|
||||||
|
buf++;
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
block_written += chunk;
|
||||||
|
}
|
||||||
|
|
||||||
conn->lastpos = conn->recvpos;
|
conn->lastpos = conn->recvpos;
|
||||||
conn->sendpos += msg->len;
|
conn->sendpos += msg->len;
|
||||||
@@ -930,7 +957,6 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
written += block;
|
written += block;
|
||||||
cur += block;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rpmsg_socket_unlock(&conn->sendlock);
|
rpmsg_socket_unlock(&conn->sendlock);
|
||||||
@@ -939,12 +965,16 @@ static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
|
static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
|
||||||
FAR const void *buf, size_t len)
|
FAR const struct iovec *buf,
|
||||||
|
size_t iovcnt)
|
||||||
{
|
{
|
||||||
FAR struct rpmsg_socket_conn_s *conn = psock->s_conn;
|
FAR struct rpmsg_socket_conn_s *conn = psock->s_conn;
|
||||||
FAR struct rpmsg_socket_data_s *msg;
|
FAR struct rpmsg_socket_data_s *msg;
|
||||||
|
uint32_t len = rpmsg_socket_get_iovlen(buf, iovcnt);
|
||||||
uint32_t total = len + sizeof(*msg) + sizeof(uint32_t);
|
uint32_t total = len + sizeof(*msg) + sizeof(uint32_t);
|
||||||
|
uint32_t written = 0;
|
||||||
uint32_t ipcsize;
|
uint32_t ipcsize;
|
||||||
|
char *msgpos;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (total > conn->sendsize)
|
if (total > conn->sendsize)
|
||||||
@@ -991,7 +1021,7 @@ static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
|
|||||||
if (total > ipcsize)
|
if (total > ipcsize)
|
||||||
{
|
{
|
||||||
total = ipcsize;
|
total = ipcsize;
|
||||||
len = ipcsize - sizeof(*msg) + sizeof(uint32_t);
|
len = ipcsize - sizeof(*msg) - sizeof(uint32_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SOCK_DGRAM need write len to buffer */
|
/* SOCK_DGRAM need write len to buffer */
|
||||||
@@ -1000,7 +1030,22 @@ static ssize_t rpmsg_socket_send_single(FAR struct socket *psock,
|
|||||||
msg->pos = conn->recvpos;
|
msg->pos = conn->recvpos;
|
||||||
msg->len = len;
|
msg->len = len;
|
||||||
memcpy(msg->data, &len, sizeof(uint32_t));
|
memcpy(msg->data, &len, sizeof(uint32_t));
|
||||||
memcpy(msg->data + sizeof(uint32_t), buf, len);
|
msgpos = msg->data + sizeof(uint32_t);
|
||||||
|
while (written < len)
|
||||||
|
{
|
||||||
|
if (len - written < buf->iov_len)
|
||||||
|
{
|
||||||
|
memcpy(msgpos, buf->iov_base, len - written);
|
||||||
|
written = len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(msgpos, buf->iov_base, buf->iov_len);
|
||||||
|
written += buf->iov_len;
|
||||||
|
msgpos += buf->iov_len;
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conn->lastpos = conn->recvpos;
|
conn->lastpos = conn->recvpos;
|
||||||
conn->sendpos += len + sizeof(uint32_t);
|
conn->sendpos += len + sizeof(uint32_t);
|
||||||
@@ -1037,19 +1082,12 @@ static ssize_t rpmsg_socket_send_internal(FAR struct socket *psock,
|
|||||||
static ssize_t rpmsg_socket_sendmsg(FAR struct socket *psock,
|
static ssize_t rpmsg_socket_sendmsg(FAR struct socket *psock,
|
||||||
FAR struct msghdr *msg, int flags)
|
FAR struct msghdr *msg, int flags)
|
||||||
{
|
{
|
||||||
const FAR void *buf = msg->msg_iov->iov_base;
|
FAR const struct iovec *buf = msg->msg_iov;
|
||||||
size_t len = msg->msg_iov->iov_len;
|
size_t len = msg->msg_iovlen;
|
||||||
const FAR struct sockaddr *to = msg->msg_name;
|
FAR const struct sockaddr *to = msg->msg_name;
|
||||||
socklen_t tolen = msg->msg_namelen;
|
socklen_t tolen = msg->msg_namelen;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
/* Validity check, only single iov supported */
|
|
||||||
|
|
||||||
if (msg->msg_iovlen != 1)
|
|
||||||
{
|
|
||||||
return -ENOTSUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_SS_ISCONNECTED(psock->s_flags))
|
if (!_SS_ISCONNECTED(psock->s_flags))
|
||||||
{
|
{
|
||||||
if (to == NULL)
|
if (to == NULL)
|
||||||
|
|||||||
Reference in New Issue
Block a user