From 6e15fafa20066634a58d412b259b117a47ca46d1 Mon Sep 17 00:00:00 2001 From: Guo Ren Date: Wed, 27 Sep 2017 13:31:35 +0800 Subject: recvmmsg/sendmmsg: add recvmmsg sendmmsg support. The recvmmsg and sendmmsg is very important for UDP stream application. If we only use recvmsg for UDP stream, it will only copy one mtu size of data in a syscall. And recvmmsg copy as many as you want in a syscall. So recvmmsg is more efficient,and some applications will depends on the recvmmsg and sendmmsg, eg: UDP media stream player. Signed-off-by: Guo Ren --- libc/inet/Makefile.in | 3 ++- libc/inet/recvmmsg.c | 8 ++++++++ libc/inet/sendmmsg.c | 8 ++++++++ libc/inet/socketcalls.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 libc/inet/recvmmsg.c create mode 100644 libc/inet/sendmmsg.c (limited to 'libc') diff --git a/libc/inet/Makefile.in b/libc/inet/Makefile.in index 332e70e53..bed76c30c 100644 --- a/libc/inet/Makefile.in +++ b/libc/inet/Makefile.in @@ -47,7 +47,8 @@ CSRC-$(UCLIBC_HAS_RESOLVER_SUPPORT) += \ socketcalls_CSRC-y += \ accept.c bind.c connect.c getpeername.c getsockname.c \ getsockopt.c listen.c recv.c recvfrom.c recvmsg.c send.c sendmsg.c \ - sendto.c setsockopt.c shutdown.c socket.c socketpair.c + sendto.c setsockopt.c shutdown.c socket.c socketpair.c \ + recvmmsg.c sendmmsg.c socketcalls_CSRC-$(UCLIBC_LINUX_SPECIFIC) += accept4.c CSRC-$(UCLIBC_HAS_SOCKET) += $(socketcalls_CSRC-y) opensock.c diff --git a/libc/inet/recvmmsg.c b/libc/inet/recvmmsg.c new file mode 100644 index 000000000..003b5a65f --- /dev/null +++ b/libc/inet/recvmmsg.c @@ -0,0 +1,8 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#define L_recvmmsg +#include "socketcalls.c" diff --git a/libc/inet/sendmmsg.c b/libc/inet/sendmmsg.c new file mode 100644 index 000000000..f1557fe2f --- /dev/null +++ b/libc/inet/sendmmsg.c @@ -0,0 +1,8 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#define L_sendmmsg +#include "socketcalls.c" diff --git a/libc/inet/socketcalls.c b/libc/inet/socketcalls.c index 1fef8100b..cb281407e 100644 --- a/libc/inet/socketcalls.c +++ b/libc/inet/socketcalls.c @@ -29,6 +29,8 @@ #define SYS_SENDMSG 16 #define SYS_RECVMSG 17 #define SYS_ACCEPT4 18 +#define SYS_RECVMMSG 19 +#define SYS_SENDMMSG 20 #endif /* exposed on x86 since Linux commit 9dea5dc921b5f4045a18c63eb92e84dc274d17eb */ @@ -283,6 +285,30 @@ CANCELLABLE_SYSCALL(ssize_t, recvmsg, (int sockfd, struct msghdr *msg, int flags lt_libc_hidden(recvmsg) #endif +#ifdef L_recvmmsg +static ssize_t __NC(recvmmsg)(int sockfd, struct mmsghdr *msg, size_t vlen, + int flags, struct timespec *tmo) +{ +# ifdef __NR_recvmmsg + return (ssize_t)INLINE_SYSCALL(recvmmsg, 5, sockfd, msg, vlen, flags, tmo); +# else + unsigned long args[5]; + + args[0] = sockfd; + args[1] = (unsigned long) msg; + args[2] = vlen; + args[3] = flags; + args[4] = (unsigned long) tmo; + return (ssize_t)__socketcall(SYS_RECVMMSG, args); +# endif +} +CANCELLABLE_SYSCALL(ssize_t, recvmmsg, + (int sockfd, struct mmsghdr *msg, size_t vlen, int flags, + struct timespec *tmo), + (sockfd, msg, vlen, flags, tmo)) +lt_libc_hidden(recvmmsg) +#endif + #ifdef L_send static ssize_t __NC(send)(int sockfd, const void *buffer, size_t len, int flags) { @@ -324,6 +350,28 @@ CANCELLABLE_SYSCALL(ssize_t, sendmsg, (int sockfd, const struct msghdr *msg, int lt_libc_hidden(sendmsg) #endif +#ifdef L_sendmmsg +static ssize_t __NC(sendmmsg)(int sockfd, struct mmsghdr *msg, size_t vlen, + int flags) +{ +# ifdef __NR_sendmmsg + return (ssize_t)INLINE_SYSCALL(sendmmsg, 4, sockfd, msg, vlen, flags); +# else + unsigned long args[4]; + + args[0] = sockfd; + args[1] = (unsigned long) msg; + args[2] = vlen; + args[3] = flags; + return (ssize_t)__socketcall(SYS_SENDMMSG, args); +# endif +} +CANCELLABLE_SYSCALL(ssize_t, sendmmsg, + (int sockfd, struct mmsghdr *msg, size_t vlen, int flags), + (sockfd, msg, vlen, flags)) +lt_libc_hidden(sendmmsg) +#endif + #ifdef L_sendto ssize_t __NC(sendto)(int sockfd, const void *buffer, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) -- cgit v1.2.3