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-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 5c822ea4d rpmsgsocket:add rpmsg socket test cases
5c822ea4d is described below
commit 5c822ea4d3a4a8bf548983a6ad9cd7fcefa7894f
Author: mazhuang <[email protected]>
AuthorDate: Wed Nov 13 21:37:35 2024 +0800
rpmsgsocket:add rpmsg socket test cases
Signed-off-by: mazhuang <[email protected]>
---
examples/rpmsgsocket/rpsock_client.c | 163 ++++++++++++++++++++++++++-
examples/rpmsgsocket/rpsock_server.c | 213 ++++++++++++++++++++++++++++++++++-
2 files changed, 371 insertions(+), 5 deletions(-)
diff --git a/examples/rpmsgsocket/rpsock_client.c
b/examples/rpmsgsocket/rpsock_client.c
index 447bf7773..80813404e 100644
--- a/examples/rpmsgsocket/rpsock_client.c
+++ b/examples/rpmsgsocket/rpsock_client.c
@@ -425,7 +425,140 @@ errout_with_buffers:
return -errno;
}
-static int rpsock_dgram_client(FAR char *argv[])
+static int rpsock_stream_conn_multi_times_client(FAR char *argv[], int argc)
+{
+ struct sockaddr_rpmsg myaddr;
+ struct pollfd pfd;
+ size_t sendsize = BUFHEAD;
+ ssize_t act;
+ bool delayflag = false;
+ bool nonblock = false;
+ FAR char *outbuf;
+ FAR char *inbuf;
+ FAR char *tmp;
+ int sockfd;
+ int ret;
+
+ /* Allocate buffers */
+
+ inbuf = malloc(2 * BUFSIZE);
+ outbuf = inbuf + BUFSIZE;
+ if (inbuf == NULL)
+ {
+ printf("client: failed to allocate buffers\n");
+ ret = -ENOMEM;
+ goto errout_with_buffers;
+ }
+
+ /* Create a new rpmsg domain socket */
+
+ if (strcmp(argv[2], "nonblock") == 0)
+ {
+ nonblock = true;
+ }
+
+ if (argc >= 7 && strcmp(argv[6], "delay") == 0)
+ {
+ delayflag = true;
+ }
+
+ printf("client: create socket SOCK_STREAM nonblock %d\n", nonblock);
+
+ if (nonblock)
+ {
+ sockfd = socket(PF_RPMSG, SOCK_STREAM | SOCK_NONBLOCK, 0);
+ }
+ else
+ {
+ sockfd = socket(PF_RPMSG, SOCK_STREAM, 0);
+ }
+
+ if (sockfd < 0)
+ {
+ printf("client socket failure %d\n", errno);
+ goto errout_with_buffers;
+ }
+
+ /* Connect the socket to the server */
+
+ myaddr.rp_family = AF_RPMSG;
+ strlcpy(myaddr.rp_name, argv[3], RPMSG_SOCKET_NAME_SIZE);
+ strlcpy(myaddr.rp_cpu, argv[4], RPMSG_SOCKET_CPU_SIZE);
+
+ printf("client: Connecting to %s,%s...\n", myaddr.rp_cpu, myaddr.rp_name);
+ ret = connect(sockfd, (FAR struct sockaddr *)&myaddr, sizeof(myaddr));
+ if (ret < 0 && errno == EINPROGRESS)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = sockfd;
+ pfd.events = POLLOUT;
+
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("client: poll failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+ }
+ else if (ret < 0)
+ {
+ printf("client: connect failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+
+ printf("client: Connected\n");
+
+ snprintf(outbuf, BUFHEAD, "process%04d, name:%s", getpid(), argv[3]);
+
+ printf("client send data, total len %zu, BUFHEAD %s\n", sendsize, outbuf);
+
+ tmp = outbuf;
+
+ ret = send(sockfd, tmp, sendsize, 0);
+ if (ret < 0)
+ {
+ printf("client: send failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+
+ tmp = inbuf;
+ if (nonblock)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = sockfd;
+ pfd.events = POLLIN;
+
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("client: poll failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+ }
+
+ act = recv(sockfd, tmp, SYNCSIZE, 0);
+ if (act < 0)
+ {
+ printf("client recv data failed %zd\n", act);
+ goto errout_with_socket;
+ }
+
+ printf("client: Terminating\n");
+
+ if (delayflag)
+ {
+ sleep(1);
+ }
+
+errout_with_socket:
+ close(sockfd);
+
+errout_with_buffers:
+ free(inbuf);
+ return -errno;
+}
+
+static int rpsock_dgram_client(char *argv[])
{
struct sockaddr_rpmsg myaddr;
struct rpsock_arg_s args;
@@ -534,10 +667,14 @@ errout_with_buffers:
int main(int argc, FAR char *argv[])
{
+ int times = 0;
+ int ret = 0;
+ int num = 0;
+
if (argc < 4)
{
- printf("Usage: rpsock_client stream/dgram"
- " block/nonblock rp_name rp_cpu\n");
+ printf("Usage: rpsock_client stream/dgram/conn_multi_times/delay"
+ " block/nonblock rp_name rp_cpu times\n");
return -EINVAL;
}
@@ -549,6 +686,26 @@ int main(int argc, FAR char *argv[])
{
return rpsock_dgram_client(argv);
}
+ else if (!strcmp(argv[1], "conn_multi_times"))
+ {
+ if (argc < 6 || atoi(argv[5]) <= 0)
+ {
+ printf("Usage: rpsock_client conn_multi_times"
+ " block/nonblock rp_name rp_cpu times (delay)\n");
+ return -EINVAL;
+ }
+
+ for (times = atoi(argv[5]); times > 0; times--)
+ {
+ printf("client conn_multi_times: %d\n", num++);
+ ret = rpsock_stream_conn_multi_times_client(argv, argc);
+ if (ret < 0 && ret != -EINPROGRESS)
+ {
+ printf("client socket failure %d\n", ret);
+ return ret;
+ }
+ }
+ }
return -EINVAL;
}
diff --git a/examples/rpmsgsocket/rpsock_server.c
b/examples/rpmsgsocket/rpsock_server.c
index 467f4f853..338818630 100644
--- a/examples/rpmsgsocket/rpsock_server.c
+++ b/examples/rpmsgsocket/rpsock_server.c
@@ -269,6 +269,191 @@ errout_with_listensd:
return -errno;
}
+static int rpsock_recv_send_single(FAR struct rpsock_arg_s *args)
+{
+ struct pollfd pfd;
+ ssize_t ret;
+ char buf[255];
+ FAR char *tmp;
+ int snd;
+
+ if (args->nonblock)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = args->fd;
+ pfd.events = POLLIN;
+
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("server poll failed errno %d\n", errno);
+ goto end;
+ }
+ }
+
+ ret = recv(args->fd, buf, sizeof(buf), 0);
+ if (ret == 0 || (ret < 0 && errno == ECONNRESET))
+ {
+ printf("server recv data normal exit\n");
+ goto end;
+ }
+ else if (ret < 0 && errno == EINPROGRESS)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = args->fd;
+ pfd.events = POLLOUT;
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("server: poll failure: %d\n", errno);
+ goto end;
+ }
+ }
+ else if(ret < 0)
+ {
+ printf("server recv data failed ret %zd, errno %d\n", ret, errno);
+ goto end;
+ }
+
+ snd = ret;
+ tmp = buf;
+
+ if (args->nonblock)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = args->fd;
+ pfd.events = POLLOUT;
+
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("server: poll failure: %d\n", errno);
+ goto end;
+ }
+ }
+
+ ret = send(args->fd, tmp, snd, 0);
+ if (ret == 0)
+ {
+ printf("server send data normal exit\n");
+ }
+ else if (ret < 0)
+ {
+ printf("server send data failed errno %d\n", errno);
+ }
+
+end:
+ printf("server Complete ret %zd, errno %d\n", ret, errno);
+ free(args);
+ return -errno;
+}
+
+static int rpsock_stream_multi_times_server(FAR char *argv[])
+{
+ struct sockaddr_rpmsg myaddr;
+ FAR struct rpsock_arg_s *args;
+ struct pollfd pfd;
+ socklen_t addrlen;
+ bool nonblock = false;
+ int fd;
+ int newfd;
+ int ret;
+
+ /* Create a new rpmsg domain socket */
+
+ if (strcmp(argv[2], "nonblock") == 0)
+ {
+ nonblock = true;
+ }
+
+ printf("server: create socket SOCK_STREAM nonblock %d\n", nonblock);
+
+ if (nonblock)
+ {
+ fd = socket(PF_RPMSG, SOCK_STREAM | SOCK_NONBLOCK, 0);
+ }
+ else
+ {
+ fd = socket(PF_RPMSG, SOCK_STREAM, 0);
+ }
+
+ if (fd < 0)
+ {
+ printf("server: socket failure: %d\n", errno);
+ return -errno;
+ }
+
+ /* Bind the socket to a local address */
+
+ myaddr.rp_family = AF_RPMSG;
+ strlcpy(myaddr.rp_name, argv[3], RPMSG_SOCKET_NAME_SIZE);
+ strlcpy(myaddr.rp_cpu, argv[4], RPMSG_SOCKET_CPU_SIZE);
+
+ printf("server: bind cpu %s, name %s ...\n",
+ myaddr.rp_cpu, myaddr.rp_name);
+ ret = bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr));
+ if (ret < 0)
+ {
+ printf("server: bind failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Listen for connections on the bound socket */
+
+ printf("server: listen ...\n");
+ ret = listen(fd, 16);
+ if (ret < 0)
+ {
+ printf("server: listen failure %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ if (nonblock)
+ {
+ memset(&pfd, 0, sizeof(struct pollfd));
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+
+ ret = poll(&pfd, 1, -1);
+ if (ret < 0)
+ {
+ printf("server: poll failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+ }
+
+ printf("server: try accept ...\n");
+ newfd = accept4(fd, (FAR struct sockaddr *)&myaddr, &addrlen,
+ SOCK_CLOEXEC);
+ if (newfd < 0)
+ {
+ printf("server: accept4 failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ printf("server: Connection accepted -- %d\n", newfd);
+
+ args = malloc(sizeof(struct rpsock_arg_s));
+ assert(args);
+
+ args->fd = newfd;
+ args->nonblock = nonblock;
+
+ ret = rpsock_recv_send_single(args);
+ if (ret < 0)
+ {
+ printf("rpsock_recv_send_single failed errno %d\n", errno);
+ }
+
+ printf("server: Terminating\n");
+ close(fd);
+ return 0;
+
+errout_with_listensd:
+ close(fd);
+ return -errno;
+}
+
static int rpsock_dgram_server(int argc, FAR char *argv[])
{
struct sockaddr_rpmsg myaddr;
@@ -366,10 +551,14 @@ static int rpsock_dgram_server(int argc, FAR char *argv[])
int main(int argc, FAR char *argv[])
{
+ int times = 0;
+ int ret = 0;
+ int num = 0;
+
if (argc < 4)
{
- printf("Usage: rpsock_server stream/dgram"
- " block/nonblock rp_name [rp_cpu]\n");
+ printf("Usage: rpsock_server stream/dgram/server_multi_times"
+ " block/nonblock rp_name [rp_cpu] times\n");
return -EINVAL;
}
@@ -381,6 +570,26 @@ int main(int argc, FAR char *argv[])
{
return rpsock_dgram_server(argc, argv);
}
+ else if (!strcmp(argv[1], "server_multi_times"))
+ {
+ if (argc < 6 || atoi(argv[5]) <= 0)
+ {
+ printf("Usage: rpsock_server server_multi_times"
+ " block/nonblock rp_name rp_cpu times\n");
+ return -EINVAL;
+ }
+
+ for (times = atoi(argv[5]); times > 0; times--)
+ {
+ printf("server_multi_times: %d\n", num++);
+ ret = rpsock_stream_multi_times_server(argv);
+ if (ret < 0 && ret != -EINPROGRESS)
+ {
+ printf("server socket failure %d\n", ret);
+ return ret;
+ }
+ }
+ }
return -EINVAL;
}