From 2790ce5357bb52dcade2ee0add38e90b392a0a03 Mon Sep 17 00:00:00 2001 From: zmq810150896 <50894086+zmq810150896@users.noreply.github.com> Date: Wed, 6 Dec 2023 13:51:13 +0800 Subject: [PATCH] Updated issues related to uds capacity and eventfd macro redefinition (#8329) --- components/libc/posix/io/eventfd/eventfd.c | 12 ++-- components/lwp/lwp_syscall.c | 9 ++- components/net/sal/include/sal_msg.h | 74 ++++++++++++++++++++++ components/net/sal/include/sal_socket.h | 30 ++++++--- components/net/sal/socket/net_sockets.c | 2 - components/net/sal/src/sal_socket.c | 10 +-- 6 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 components/net/sal/include/sal_msg.h diff --git a/components/libc/posix/io/eventfd/eventfd.c b/components/libc/posix/io/eventfd/eventfd.c index ec3a88ba47..81e3a830ae 100644 --- a/components/libc/posix/io/eventfd/eventfd.c +++ b/components/libc/posix/io/eventfd/eventfd.c @@ -25,7 +25,7 @@ #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) -#define ULLONG_MAX (~0ULL) +#define EFD_ULLONG_MAX (~0ULL) #define EVENTFD_MUTEX_NAME "eventfd" @@ -84,10 +84,10 @@ static int eventfd_poll(struct dfs_file *file, struct rt_pollreq *req) if (count > 0) events |= POLLIN; - if (count == ULLONG_MAX) + if (count == EFD_ULLONG_MAX) events |= POLLERR; - if ((ULLONG_MAX - 1) > count) + if ((EFD_ULLONG_MAX - 1) > count) events |= POLLOUT; return events; @@ -161,14 +161,14 @@ static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t coun counter_num = *(rt_uint64_t *)buf; - if (counter_num == ULLONG_MAX) + if (counter_num == EFD_ULLONG_MAX) return -EINVAL; ret = -EAGAIN; rt_mutex_take(&ctx->lock, RT_WAITING_FOREVER); - if ((ULLONG_MAX - ctx->count) > counter_num) + if ((EFD_ULLONG_MAX - ctx->count) > counter_num) { ret = sizeof(counter_num); } @@ -176,7 +176,7 @@ static ssize_t eventfd_write(struct dfs_file *file, const void *buf, size_t coun { for (;;) { - if ((ULLONG_MAX - ctx->count) >= counter_num) + if ((EFD_ULLONG_MAX - ctx->count) >= counter_num) { ret = sizeof(counter_num); break; diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 44c2bafc8e..aeced80e6f 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -3293,7 +3293,6 @@ sysret_t sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namele rt_err_t ret = 0; struct sockaddr sa; struct musl_sockaddr kname; - struct sockaddr_un addr_un; rt_uint16_t family = 0; if (!lwp_user_accessable((void *)name, namelen)) @@ -3302,16 +3301,16 @@ sysret_t sys_bind(int socket, const struct musl_sockaddr *name, socklen_t namele } lwp_get_from_user(&family, (void *)name, 2); - if (family == AF_UNIX) + if ((family == AF_UNIX) || (family == AF_NETLINK)) { - if (!lwp_user_accessable((void *)name, sizeof(struct sockaddr_un))) + if (!lwp_user_accessable((void *)name, sizeof(struct sockaddr))) { return -EFAULT; } - lwp_get_from_user(&addr_un, (void *)name, sizeof(struct sockaddr_un)); + lwp_get_from_user(&sa, (void *)name, sizeof(struct sockaddr)); - ret = bind(socket, (struct sockaddr *)(&addr_un), namelen); + ret = bind(socket, &sa, namelen); } else { diff --git a/components/net/sal/include/sal_msg.h b/components/net/sal/include/sal_msg.h new file mode 100644 index 0000000000..2a2cff1d0b --- /dev/null +++ b/components/net/sal/include/sal_msg.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-12-06 zmq810150896 The first version. + */ +#ifndef __SAL_MSG_H__ +#define __SAL_MSG_H__ +#include + +/* message frame */ +struct msg_buf +{ + void *parm; /* Parameters for message detection */ + void *buf; /* Data to be sent */ + rt_size_t length; /* Data length */ + void *control_data; /* Additional data to send the message */ + rt_size_t data_len; /* Additional data length */ + int msg_type; /* message type */ + int data_type; /* Addittional data length */ + int msg_level; + int *fd; /* Pass the array used by fd */ + rt_slist_t msg_next; /* Next message */ + rt_slist_t msg_node; /* sendmsg is used to send multiple messages at the same time */ +}; + +/* Remaining message */ +struct last_buf +{ + void *buf; /* Data to be sent */ + rt_size_t length; /* Data length */ + rt_size_t offset; /* Data Offset */ + struct msg_buf *msg; +}; + +/* sock */ +struct unix_sock +{ + rt_uint8_t len; + int flags; + uint8_t family; /* protocol */ + char path[108]; /* file name */ + struct unix_conn *conn; /* connecting processing */ + rt_wqueue_t wq_head; /* Waiting queue head */ + rt_atomic_t listen_num; /* Maximum listening quantity */ + rt_atomic_t conn_counter; /* connected num */ + struct rt_mutex sock_lock; + rt_slist_t wait_conn_head; + struct last_buf pbuf; +}; + +struct unix_conn +{ + int state; /* connect state */ + int type; + int proto; + + rt_uint32_t send_timeout; + rt_uint32_t recv_timeout; + rt_wqueue_t wq_read_head; + rt_wqueue_t wq_confirm; + struct rt_mutex conn_lock; + rt_slist_t msg_head; /* message head */ + rt_slist_t conn_node; + struct unix_sock *sock; + struct unix_sock *ser_sock; + struct unix_conn *correl_conn; /* Information about the other party */ + int (* conn_callback)(struct unix_conn *conn); /* The callback function that establishes the connection */ +}; + +#endif diff --git a/components/net/sal/include/sal_socket.h b/components/net/sal/include/sal_socket.h index bd795a8a32..e7086a1b93 100644 --- a/components/net/sal/include/sal_socket.h +++ b/components/net/sal/include/sal_socket.h @@ -48,17 +48,17 @@ typedef uint16_t in_port_t; #define SO_KEEPALIVE 0x0008 /* keep connections alive */ #define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ -#define SO_PASSCRED 16 -#define SO_PEERCRED 17 +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 #define SO_BINDTODEVICE 25 #define SO_ATTACH_FILTER 26 #define SO_DETACH_FILTER 27 -#define SO_SNDBUFFORCE 32 -#define SO_RCVBUFFORCE 33 -#define SO_PROTOCOL 38 -#define SO_DOMAIN 39 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_PROTOCOL 38 +#define SO_DOMAIN 39 /* Additional options, not kept in so_options */ #define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ @@ -81,7 +81,7 @@ typedef uint16_t in_port_t; #define SO_NO_CHECK 0x100a /* don't create UDP checksum */ /* Level number for (get/set)sockopt() to apply to socket itself */ -#define SOL_SOCKET 0xfff /* options for socket level */ +#define SOL_SOCKET 0xfff /* options for socket level */ #define SOL_NETLINK 270 #define AF_UNSPEC 0 @@ -118,7 +118,7 @@ typedef uint16_t in_port_t; #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ #define MSG_MORE 0x10 /* Sender will send more */ -/* LWIPPTP_SWREQ_0036 */ + #define MSG_ERRQUEUE 0x2000 /* Fetch message from error queue */ #define MSG_CONFIRM 0x0800 /* Confirm path validity */ @@ -169,8 +169,8 @@ typedef struct ip_mreq #define IPTOS_PREC_ROUTINE 0x00 #define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */ -#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */ -#define SCM_SECURITY 0x03 /* rw: security label */ +#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */ +#define SCM_SECURITY 0x03 /* rw: security label */ /* Options for shatdown type */ #ifndef SHUT_RD @@ -229,6 +229,16 @@ struct sockaddr_storage #endif /* NETDEV_IPV6 */ }; +#ifdef RT_USING_MUSLLIBC +#ifndef __DEFINED_struct_iovec +struct iovec +{ + void *iov_base; + size_t iov_len; +}; +#endif +#endif + struct msghdr { void *msg_name; diff --git a/components/net/sal/socket/net_sockets.c b/components/net/sal/socket/net_sockets.c index 28e96b1795..63de88e870 100644 --- a/components/net/sal/socket/net_sockets.c +++ b/components/net/sal/socket/net_sockets.c @@ -168,7 +168,6 @@ int recv(int s, void *mem, size_t len, int flags) } RTM_EXPORT(recv); -/* LWIPPTP_SWREQ_0036 */ int sendmsg(int s, const struct msghdr *message, int flags) { int socket = dfs_net_getsocket(s); @@ -177,7 +176,6 @@ int sendmsg(int s, const struct msghdr *message, int flags) } RTM_EXPORT(sendmsg); -/* LWIPPTP_SWREQ_0036 */ int recvmsg(int s, struct msghdr *message, int flags) { int socket = dfs_net_getsocket(s); diff --git a/components/net/sal/src/sal_socket.c b/components/net/sal/src/sal_socket.c index c0bbe02468..63009b8ca2 100644 --- a/components/net/sal/src/sal_socket.c +++ b/components/net/sal/src/sal_socket.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2022, RT-Thread Development Team + * Copyright (c) 2006-2023, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -34,10 +34,6 @@ #include #endif -#if defined(RT_USING_DFS_V2) && defined(SAL_USING_AF_UNIX) -#include -#endif - /* check system workqueue stack size */ #if defined(SAL_INTERNET_CHECK) && RT_SYSTEM_WORKQUEUE_STACKSIZE < 1536 #error "The system workqueue stack size must more than 1536 bytes" @@ -65,7 +61,7 @@ struct sal_netdev_res_table struct ifconf { - int ifc_len; /* Size of buffer. */ + int ifc_len; /* Size of buffer. */ union { char* ifcu_buf; @@ -1158,7 +1154,7 @@ int sal_closesocket(int socket) #define ARPHRD_ETHER 1 /* Ethernet 10/100Mbps. */ #define ARPHRD_LOOPBACK 772 /* Loopback device. */ -#define IFF_UP 0x1 +#define IFF_UP 0x1 #define IFF_RUNNING 0x40 #define IFF_NOARP 0x80