From 2407ca5de6c0f3233eafed6a26cd2ffd45e23bfc Mon Sep 17 00:00:00 2001 From: quanzhao Date: Mon, 28 Dec 2020 16:05:10 +0800 Subject: [PATCH] Complete the conversion of socket options. --- components/lwp/lwp_syscall.c | 295 ++++++++++++++++++++++++----------- 1 file changed, 205 insertions(+), 90 deletions(-) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index 47b2828558..b16bff284b 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -83,117 +83,232 @@ static void kmem_put(void *kptr) #define INTF_SOL_SOCKET 1 #define IMPL_SOL_SOCKET 0xFFF -/* socket option name */ -#define INTF_SO_REUSEADDR 2 -#define INTF_SO_KEEPALIVE 9 +#define INTF_IPPROTO_IP 0 +#define IMPL_IPPROTO_IP 0 + +#define INTF_IPPROTO_TCP 6 +#define IMPL_IPPROTO_TCP 6 + +#define INTF_IPPROTO_IPV6 41 +#define IMPL_IPPROTO_IPV6 41 + +/* SOL_SOCKET option names */ #define INTF_SO_BROADCAST 6 +#define INTF_SO_KEEPALIVE 9 +#define INTF_SO_REUSEADDR 2 +#define INTF_SO_TYPE 3 +#define INTF_SO_ERROR 4 +#define INTF_SO_SNDTIMEO 21 +#define INTF_SO_RCVTIMEO 20 +#define INTF_SO_RCVBUF 8 +#define INTF_SO_LINGER 13 +#define INTF_SO_NO_CHECK 11 #define INTF_SO_ACCEPTCONN 30 #define INTF_SO_DONTROUTE 5 -#define INTF_SO_LINGER 13 #define INTF_SO_OOBINLINE 10 #define INTF_SO_REUSEPORT 15 #define INTF_SO_SNDBUF 7 -#define INTF_SO_RCVBUF 8 #define INTF_SO_SNDLOWAT 19 #define INTF_SO_RCVLOWAT 18 -#define INTF_SO_SNDTIMEO 21 -#define INTF_SO_RCVTIMEO 20 -#define INTF_SO_ERROR 4 -#define INTF_SO_TYPE 3 -#define INTF_SO_NO_CHECK 11 -#define IMPL_SO_REUSEADDR 0x0004 -#define IMPL_SO_KEEPALIVE 0x0008 #define IMPL_SO_BROADCAST 0x0020 +#define IMPL_SO_KEEPALIVE 0x0008 +#define IMPL_SO_REUSEADDR 0x0004 +#define IMPL_SO_TYPE 0x1008 +#define IMPL_SO_ERROR 0x1007 +#define IMPL_SO_SNDTIMEO 0x1005 +#define IMPL_SO_RCVTIMEO 0x1006 +#define IMPL_SO_RCVBUF 0x1002 +#define IMPL_SO_LINGER 0x0080 +#define IMPL_SO_NO_CHECK 0x100a #define IMPL_SO_ACCEPTCONN 0x0002 #define IMPL_SO_DONTROUTE 0x0010 -#define IMPL_SO_LINGER 0x0080 #define IMPL_SO_OOBINLINE 0x0100 #define IMPL_SO_REUSEPORT 0x0200 #define IMPL_SO_SNDBUF 0x1001 -#define IMPL_SO_RCVBUF 0x1002 #define IMPL_SO_SNDLOWAT 0x1003 #define IMPL_SO_RCVLOWAT 0x1004 -#define IMPL_SO_SNDTIMEO 0x1005 -#define IMPL_SO_RCVTIMEO 0x1006 -#define IMPL_SO_ERROR 0x1007 -#define IMPL_SO_TYPE 0x1008 -#define IMPL_SO_NO_CHECK 0x100a + +/* IPPROTO_IP option names */ +#define INTF_IP_TTL 2 +#define INTF_IP_TOS 1 +#define INTF_IP_MULTICAST_TTL 33 +#define INTF_IP_MULTICAST_IF 32 +#define INTF_IP_MULTICAST_LOOP 34 +#define INTF_IP_ADD_MEMBERSHIP 35 +#define INTF_IP_DROP_MEMBERSHIP 36 + +#define IMPL_IP_TTL 2 +#define IMPL_IP_TOS 1 +#define IMPL_IP_MULTICAST_TTL 5 +#define IMPL_IP_MULTICAST_IF 6 +#define IMPL_IP_MULTICAST_LOOP 7 +#define IMPL_IP_ADD_MEMBERSHIP 3 +#define IMPL_IP_DROP_MEMBERSHIP 4 + +/* IPPROTO_TCP option names */ +#define INTF_TCP_NODELAY 1 +#define INTF_TCP_KEEPALIVE 9 +#define INTF_TCP_KEEPIDLE 4 +#define INTF_TCP_KEEPINTVL 5 +#define INTF_TCP_KEEPCNT 6 + +#define IMPL_TCP_NODELAY 0x01 +#define IMPL_TCP_KEEPALIVE 0x02 +#define IMPL_TCP_KEEPIDLE 0x03 +#define IMPL_TCP_KEEPINTVL 0x04 +#define IMPL_TCP_KEEPCNT 0x05 + +/* IPPROTO_IPV6 option names */ +#define INTF_IPV6_V6ONLY 26 +#define IMPL_IPV6_V6ONLY 27 static void convert_sockopt(int *level, int *optname) { - switch (*level) - { - case INTF_SOL_SOCKET: - *level = IMPL_SOL_SOCKET; - break; - default: - break; - } - - switch (*optname) - { - case INTF_SO_REUSEADDR: - *optname = IMPL_SO_REUSEADDR; - break; - case INTF_SO_KEEPALIVE: - *optname = IMPL_SO_KEEPALIVE; - break; - case INTF_SO_BROADCAST: - *optname = IMPL_SO_BROADCAST; - break; - case INTF_SO_ACCEPTCONN: - *optname = IMPL_SO_ACCEPTCONN; - break; - case INTF_SO_DONTROUTE: - *optname = IMPL_SO_DONTROUTE; - break; - case INTF_SO_LINGER: - *optname = IMPL_SO_LINGER; - break; - case INTF_SO_OOBINLINE: - *optname = IMPL_SO_OOBINLINE; - break; - case INTF_SO_REUSEPORT: - *optname = IMPL_SO_REUSEPORT; - break; - case INTF_SO_SNDBUF: - *optname = IMPL_SO_SNDBUF; - break; - case INTF_SO_RCVBUF: - *optname = IMPL_SO_RCVBUF; - break; - case INTF_SO_SNDLOWAT: - *optname = IMPL_SO_SNDLOWAT; - break; - case INTF_SO_RCVLOWAT: - *optname = IMPL_SO_RCVLOWAT; - break; - case INTF_SO_SNDTIMEO: - *optname = IMPL_SO_SNDTIMEO; - break; - case INTF_SO_RCVTIMEO: - *optname = IMPL_SO_RCVTIMEO; - break; - case INTF_SO_ERROR: - *optname = IMPL_SO_ERROR; - break; - case INTF_SO_TYPE: - *optname = IMPL_SO_TYPE; - break; - case INTF_SO_NO_CHECK: - *optname = IMPL_SO_NO_CHECK; - break; - - /* - * SO_DONTLINGER (*level = ((int)(~SO_LINGER))), - * SO_USELOOPBACK (*level = 0x0040) and - * SO_CONTIMEO (*level = 0x1009) are not supported for now. - */ - default: - *optname = 0; - break; + if (*level == INTF_SOL_SOCKET) + { + *level = IMPL_SOL_SOCKET; + + switch (*optname) + { + case INTF_SO_REUSEADDR: + *optname = IMPL_SO_REUSEADDR; + break; + case INTF_SO_KEEPALIVE: + *optname = IMPL_SO_KEEPALIVE; + break; + case INTF_SO_BROADCAST: + *optname = IMPL_SO_BROADCAST; + break; + case INTF_SO_ACCEPTCONN: + *optname = IMPL_SO_ACCEPTCONN; + break; + case INTF_SO_DONTROUTE: + *optname = IMPL_SO_DONTROUTE; + break; + case INTF_SO_LINGER: + *optname = IMPL_SO_LINGER; + break; + case INTF_SO_OOBINLINE: + *optname = IMPL_SO_OOBINLINE; + break; + case INTF_SO_REUSEPORT: + *optname = IMPL_SO_REUSEPORT; + break; + case INTF_SO_SNDBUF: + *optname = IMPL_SO_SNDBUF; + break; + case INTF_SO_RCVBUF: + *optname = IMPL_SO_RCVBUF; + break; + case INTF_SO_SNDLOWAT: + *optname = IMPL_SO_SNDLOWAT; + break; + case INTF_SO_RCVLOWAT: + *optname = IMPL_SO_RCVLOWAT; + break; + case INTF_SO_SNDTIMEO: + *optname = IMPL_SO_SNDTIMEO; + break; + case INTF_SO_RCVTIMEO: + *optname = IMPL_SO_RCVTIMEO; + break; + case INTF_SO_ERROR: + *optname = IMPL_SO_ERROR; + break; + case INTF_SO_TYPE: + *optname = IMPL_SO_TYPE; + break; + case INTF_SO_NO_CHECK: + *optname = IMPL_SO_NO_CHECK; + break; + + /* + * SO_DONTLINGER (*level = ((int)(~SO_LINGER))), + * SO_USELOOPBACK (*level = 0x0040) and + * SO_CONTIMEO (*level = 0x1009) are not supported for now. + */ + default: + *optname = 0; + break; + } + return; } + + if (*level == INTF_IPPROTO_IP) + { + *level = IMPL_IPPROTO_IP; + + switch (*optname) + { + case INTF_IP_TTL: + *optname = IMPL_IP_TTL; + break; + case INTF_IP_TOS: + *optname = IMPL_IP_TOS; + break; + case INTF_IP_MULTICAST_TTL: + *optname = IMPL_IP_MULTICAST_TTL; + break; + case INTF_IP_MULTICAST_IF: + *optname = IMPL_IP_MULTICAST_IF; + break; + case INTF_IP_MULTICAST_LOOP: + *optname = IMPL_IP_MULTICAST_LOOP; + break; + case INTF_IP_ADD_MEMBERSHIP: + *optname = IMPL_IP_ADD_MEMBERSHIP; + break; + case INTF_IP_DROP_MEMBERSHIP: + *optname = IMPL_IP_DROP_MEMBERSHIP; + break; + default: + break; + } + } + + if (*level == INTF_IPPROTO_TCP) + { + *level = IMPL_IPPROTO_TCP; + + switch (*optname) + { + case INTF_TCP_NODELAY: + *optname = IMPL_TCP_NODELAY; + break; + case INTF_TCP_KEEPALIVE: + *optname = IMPL_TCP_KEEPALIVE; + break; + case INTF_TCP_KEEPIDLE: + *optname = IMPL_TCP_KEEPIDLE; + break; + case INTF_TCP_KEEPINTVL: + *optname = IMPL_TCP_KEEPINTVL; + break; + case INTF_TCP_KEEPCNT: + *optname = IMPL_TCP_KEEPCNT; + break; + default: + break; + } + return; + } + + if (*level == INTF_IPPROTO_IPV6) + { + *level = IMPL_IPPROTO_IPV6; + + switch (*optname) + { + case INTF_IPV6_V6ONLY: + *optname = IMPL_IPV6_V6ONLY; + break; + default: + break; + } + return; + } + } static void sockaddr_tolwip(const struct musl_sockaddr *std, struct sockaddr *lwip) -- Gitee