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