Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/sys {send,recv}mmsg glue



details:   https://anonhg.NetBSD.org/src/rev/83f5fdc54aa6
branches:  trunk
changeset: 779845:83f5fdc54aa6
user:      christos <christos%NetBSD.org@localhost>
date:      Fri Jun 22 18:28:38 2012 +0000

description:
{send,recv}mmsg glue

diffstat:

 lib/libc/sys/Makefile.inc |  12 +++---
 lib/libc/sys/recv.2       |  81 +++++++++++++++++++++++++++++++++++++++++++---
 lib/libc/sys/send.2       |  74 +++++++++++++++++++++++++++++++++++++-----
 3 files changed, 146 insertions(+), 21 deletions(-)

diffs (truncated from 310 to 300 lines):

diff -r 4817cd0ed417 -r 83f5fdc54aa6 lib/libc/sys/Makefile.inc
--- a/lib/libc/sys/Makefile.inc Fri Jun 22 18:27:25 2012 +0000
+++ b/lib/libc/sys/Makefile.inc Fri Jun 22 18:28:38 2012 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile.inc,v 1.214 2012/03/08 21:59:28 joerg Exp $
+#      $NetBSD: Makefile.inc,v 1.215 2012/06/22 18:28:38 christos Exp $
 #      @(#)Makefile.inc        8.3 (Berkeley) 10/24/94
 
 # sys sources
@@ -117,11 +117,11 @@
                __posix_chown.S __posix_fchown.S __posix_lchown.S \
                __posix_rename.S profil.S \
        __quotactl.S \
-       rasctl.S readlinkat.S reboot.S recvfrom.S recvmsg.S rename.S \
+       rasctl.S readlinkat.S reboot.S recvfrom.S recvmmsg.S recvmsg.S rename.S \
                renameat.S revoke.S rmdir.S \
        semconfig.S semget.S semop.S \
-               sendmsg.S sendto.S setegid.S setcontext.S seteuid.S setgid.S \
-               setgroups.S __setitimer50.S __setlogin.S setpgid.S \
+               sendmmsg.S sendmsg.S sendto.S setegid.S setcontext.S seteuid.S \
+               setgid.S setgroups.S __setitimer50.S __setlogin.S setpgid.S \
                setpriority.S \
                setregid.S setreuid.S setrlimit.S setsid.S setsockopt.S \
                setuid.S __shmctl50.S shmdt.S shmget.S shutdown.S \
@@ -305,9 +305,9 @@
 MLINKS+=pmc_control.2 pmc_get_info.2
 MLINKS+=poll.2 pollts.2
 MLINKS+=read.2 readv.2 read.2 pread.2 read.2 preadv.2
-MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2
+MLINKS+=recv.2 recvfrom.2 recv.2 recvmsg.2 recv.2 recvmmsg.2
 MLINKS+=select.2 pselect.2
-MLINKS+=send.2 sendmsg.2 send.2 sendto.2
+MLINKS+=send.2 sendmsg.2 send.2 sendto.2 send.2 sendmmsg.2
 MLINKS+=setpgid.2 setpgrp.2
 MLINKS+=setuid.2 setegid.2 setuid.2 seteuid.2 setuid.2 setgid.2
 MLINKS+=shmat.2 shmdt.2
diff -r 4817cd0ed417 -r 83f5fdc54aa6 lib/libc/sys/recv.2
--- a/lib/libc/sys/recv.2       Fri Jun 22 18:27:25 2012 +0000
+++ b/lib/libc/sys/recv.2       Fri Jun 22 18:28:38 2012 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: recv.2,v 1.31 2012/02/01 13:30:42 wiz Exp $
+.\"    $NetBSD: recv.2,v 1.32 2012/06/22 18:28:38 christos Exp $
 .\"
 .\" Copyright (c) 1983, 1990, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -35,7 +35,8 @@
 .Sh NAME
 .Nm recv ,
 .Nm recvfrom ,
-.Nm recvmsg
+.Nm recvmsg ,
+.Nm recvmmsg
 .Nd receive a message from a socket
 .Sh LIBRARY
 .Lb libc
@@ -47,10 +48,13 @@
 .Fn recvfrom "int s" "void * restrict buf" "size_t len" "int flags" "struct sockaddr * restrict from" "socklen_t * restrict fromlen"
 .Ft ssize_t
 .Fn recvmsg "int s" "struct msghdr *msg" "int flags"
+.Ft int
+.Fn recvmmsg "int s" "struct mmsghdr *mmsg" "unsigned int vlen" "unsigned int flags" "struct timespec *timeout"
 .Sh DESCRIPTION
-.Fn recvfrom
+.Fn recvfrom ,
+.Fn recvmsg
 and
-.Fn recvmsg
+.FN recvmmsg
 are used to receive messages from a socket,
 and may be used to receive data on a socket whether or not
 it is connection-oriented.
@@ -67,6 +71,50 @@
 address stored there.
 .Pp
 The
+.Fn recvmmsg
+call be used to receive multiple messages in the same call using an array of
+.Fa mmsghdr
+elements with the following form, as defined in
+.Ao Pa sys/socket.h Ac :
+.Pp 
+.Bd -literal
+struct mmsghdr {
+       struct msghdr   msg_hdr;        /* the message to be sent */
+       unsigned int    msg_len;        /* number of bytes received */
+};
+.Ed
+.Pp
+The 
+.Fa msg_len
+member contains the number of bytes received for each
+.Fa msg_hdr
+member.
+The array has
+.Fa vlen
+elements, which is limited to
+.Dv 1024 .
+If there is an error, a number fewer than
+.Fa vlen
+may be returned, and the error may be retrieved using
+.Xr getsockopt 2
+with
+.Dv SO_ERROR .
+If the flag
+.Dv MSG_WAITFORONE
+is set in
+.Fa flags
+then the
+.Fn recvmmsg
+call will wait for one message, and set
+.Dv MSG_DONTWAIT
+for the rest.
+If the
+.Fa timeout
+parameter is not NULL, then
+.Fn recvmmsg
+will return if that time is exceeded.
+.Pp
+The
 .Fn recv
 call is normally used only on a
 .Em connected
@@ -79,8 +127,14 @@
 parameter.
 As it is redundant, it may not be supported in future releases.
 .Pp
-All three routines return the length of the message on successful
+.Fn recv ,
+.Fn recvfrom
+and
+.Fn recvmsg
+routines return the length of the message on successful
 completion.
+.Fn recvmmsg
+returns the number of messages received.
 If a message is too long to fit in the supplied buffer,
 excess bytes may be discarded depending on the type of socket
 the message is received from (see
@@ -231,10 +285,19 @@
 .Dv MSG_OOB
 is returned to indicate that expedited or out-of-band data were received.
 .Sh RETURN VALUES
-These calls return the number of bytes received, or \-1
+The 
+.Fn recv ,
+.Fn recvfrom
+and
+.Fn recvmsg
+calls return the number of bytes received, or \-1
 if an error occurred.
 For connected sockets whose remote peer was shut down,
 0 is returned when no more data is available.
+The
+.Fn recvmmsg
+calls return the number of messages received, or \-1
+if an error occurred.
 .Sh ERRORS
 The calls fail if:
 .Bl -tag -width Er
@@ -292,3 +355,9 @@
 .Fn recv
 function call appeared in
 .Bx 4.2 .
+The
+.Fn recvmmsg
+function call appeared on
+.Lx 2.6.32
+and
+.Nx 7 .
diff -r 4817cd0ed417 -r 83f5fdc54aa6 lib/libc/sys/send.2
--- a/lib/libc/sys/send.2       Fri Jun 22 18:27:25 2012 +0000
+++ b/lib/libc/sys/send.2       Fri Jun 22 18:28:38 2012 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: send.2,v 1.27 2008/05/09 15:52:50 christos Exp $
+.\"    $NetBSD: send.2,v 1.28 2012/06/22 18:28:38 christos Exp $
 .\"
 .\" Copyright (c) 1983, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -29,13 +29,14 @@
 .\"
 .\"     @(#)send.2     8.2 (Berkeley) 2/21/94
 .\"
-.Dd May 9, 2008
+.Dd June 7, 2012
 .Dt SEND 2
 .Os
 .Sh NAME
 .Nm send ,
 .Nm sendto ,
-.Nm sendmsg
+.Nm sendmsg ,
+.Nm sendmmsg
 .Nd send a message from a socket
 .Sh LIBRARY
 .Lb libc
@@ -47,21 +48,55 @@
 .Fn sendto "int s" "const void *msg" "size_t len" "int flags" "const struct sockaddr *to" "socklen_t tolen"
 .Ft ssize_t
 .Fn sendmsg "int s" "const struct msghdr *msg" "int flags"
+.Ft int
+.Fn sendmmsg "int s" "struct mmsghdr *mmsg" "unsigned int vlen" "unsigned int flags"
 .Sh DESCRIPTION
 .Fn send ,
 .Fn sendto ,
+.Fn sendmsg ,
 and
-.Fn sendmsg
+.Fn sendmmsg
 are used to transmit a message to another socket.
 .Fn send
 may be used only when the socket is in a
 .Em connected
 state, while
-.Fn sendto
+.Fn sendto ,
+.Fn sendmsg
 and
-.Fn sendmsg
+.Fn sendmmsg
 may be used at any time.
 .Pp
+The
+.Fn sendmmsg
+call be used to send multiple messages in the same call using an array of
+.Fa mmsghdr
+elements with the following form, as defined in
+.Ao Pa sys/socket.h Ac :
+.Pp 
+.Bd -literal
+struct mmsghdr {
+       struct msghdr   msg_hdr;        /* the message to be sent */
+       unsigned int    msg_len;        /* number of bytes transmitted */
+};
+.Ed
+.Pp
+The 
+.Fa msg_len
+member contains the number of bytes sent for each
+.Fa msg_hdr
+member.
+The array has
+.Fa vlen
+elements, which is limited to
+.Dv 1024 .
+If there is an error, a number fewer than
+.Fa vlen
+may be returned, and the error may be retrieved using
+.Xr getsockopt 2
+with
+.Dv SO_ERROR .
+.Pp
 The address of the target is given by
 .Fa to
 with
@@ -90,6 +125,9 @@
 .Xr poll 2
 call may be used to determine when it is possible to
 send more data.
+Unfortunately this does not work when the interface queue which is used to
+send the message is full, and the call returns
+.Er ENOBUFS .
 .Pp
 The
 .Fa flags
@@ -139,13 +177,23 @@
 generation when writing a socket that
 may be closed.
 .Sh RETURN VALUES
-The call returns the number of characters sent, or \-1
-if an error occurred.
-.Sh ERRORS
+The 
 .Fn send ,
 .Fn sendto ,
 and
 .Fn sendmsg
+calls return the number of characters sent, or \-1
+if an error occurred.
+The
+.Fn sendmmsg
+call returns the number of messages sent, or \-1
+if an error occured.
+.Sh ERRORS
+.Fn send ,
+.Fn sendto ,
+.Fn sendmsg ,
+and
+.Fn sendmmsg
 fail if:
 .Bl -tag -width Er
 .It Bq Er EBADF
@@ -196,6 +244,8 @@
 .El
 .Pp
 .Fn sendmsg
+and
+.Fn sendmmsg
 will also fail if:
 .Bl -tag -width Er
 .It Bq Er EMSGSIZE



Home | Main Index | Thread Index | Old Index