xref: /freebsd/lib/libc/net/sctp_recvmsg.3 (revision a812392203d7c4c3f0db9d8a0f3391374c49c71f)
1.\" Copyright (c) 1983, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.\" $FreeBSD$
29.\"
30.Dd August 13, 2007
31.Dt SCTP_RECVMSG 3
32.Os
33.Sh NAME
34.Nm sctp_recvmsg
35.Nd receive a message from an SCTP socket
36.Sh LIBRARY
37.Lb libc
38.Sh SYNOPSIS
39.In sys/types.h
40.In sys/socket.h
41.In netinet/sctp.h
42.Ft ssize_t
43.Fo sctp_recvmsg
44.Fa "int s" "void *msg" "size_t len" "struct sockaddr * restrict from"
45.Fa "socklen_t * restrict fromlen" "struct sctp_sndrcvinfo *sinfo" "int *flags"
46.Fc
47.Sh DESCRIPTION
48The
49.Fn sctp_recvmsg
50system call
51is used to receive a message from another SCTP endpoint.
52The
53.Fn sctp_recvmsg
54call is used by one-to-one (SOCK_STREAM) type sockets after a
55successful
56.Fn connect
57call or after the application has performed a
58.Fn listen
59followed by a successful
60.Fn accept .
61For a one-to-many (SOCK_SEQPACKET) type socket, an endpoint may call
62.Fn sctp_recvmsg
63after having implicitly started an association via one
64of the send calls including
65.Fn sctp_sendmsg ,
66.Fn sendto
67and
68.Fn sendmsg .
69Or, an application may also receive a message after having
70called
71.Fn listen
72with a positive backlog to enable the reception of new associations.
73.Pp
74The address of the sender is held in the
75.Fa from
76argument with
77.Fa fromlen
78specifying its size.
79At the completion of a successful
80.Fn sctp_recvmsg
81call
82.Fa from
83will hold the address of the peer and
84.Fa fromlen
85will hold the length of that address.
86Note that
87the address is bounded by the initial value of
88.Fa fromlen
89which is used as an in/out variable.
90.Pp
91The length of the message
92.Fa msg
93to be received is bounded by
94.Fa len .
95If the message is too long to fit in the users
96receive buffer, then the
97.Fa flags
98argument will
99.Em not
100have the
101.Dv MSG_EOF
102flag applied.
103If the message is a complete message then
104the
105.Fa flags
106argument will have
107.Dv MSG_EOF
108set.
109Locally detected errors are
110indicated by a return value of -1 with
111.Va errno
112set accordingly.
113The
114.Fa flags
115argument may also hold the value
116.Dv MSG_NOTIFICATION .
117When this
118occurs it indicates that the message received is
119.Em not
120from
121the peer endpoint, but instead is a notification from the
122SCTP stack (see
123.Xr sctp 4
124for more details).
125Note that no notifications are ever
126given unless the user subscribes to such notifications using
127the
128.Dv SCTP_EVENTS
129socket option.
130.Pp
131If no messages are available at the socket then
132.Fn sctp_recvmsg
133normally blocks on the reception of a message or NOTIFICATION, unless the
134socket has been placed in non-blocking I/O mode.
135The
136.Xr select 2
137system call may be used to determine when it is possible to
138receive a message.
139.Pp
140The
141.Fa sinfo
142argument is defined as follows.
143.Bd -literal
144struct sctp_sndrcvinfo {
145	uint16_t sinfo_stream;  /* Stream arriving on */
146	uint16_t sinfo_ssn;     /* Stream Sequence Number */
147	uint16_t sinfo_flags;   /* Flags on the incoming message */
148	uint32_t sinfo_ppid;    /* The ppid field */
149	uint32_t sinfo_context; /* context field */
150	uint32_t sinfo_timetolive; /* not used by sctp_recvmsg */
151	uint32_t sinfo_tsn;        /* The transport sequence number */
152	uint32_t sinfo_cumtsn;     /* The cumulative acknowledgment point  */
153	sctp_assoc_t sinfo_assoc_id; /* The association id of the peer */
154};
155.Ed
156.Pp
157The
158.Fa sinfo->sinfo_ppid
159field is an opaque 32 bit value that is passed transparently
160through the stack from the peer endpoint.
161Note that the stack passes this value without regard to byte
162order.
163.Pp
164The
165.Fa sinfo->sinfo_flags
166field may include the following:
167.Bd -literal
168#define SCTP_UNORDERED 	  0x0400	/* Message is un-ordered */
169.Ed
170.Pp
171The
172.Dv SCTP_UNORDERED
173flag is used to specify that the message arrived with no
174specific order and was delivered to the peer application
175as soon as possible.
176When this flag is absent the message
177was delivered in order within the stream it was received.
178.Pp
179The
180.Fa sinfo->sinfo_stream
181field is the SCTP stream that the message was received on.
182Streams in SCTP are reliable (or partially reliable) flows of ordered
183messages.
184.Pp
185The
186.Fa sinfo->sinfo_context
187field is used only if the local application set an association level
188context with the
189.Dv SCTP_CONTEXT
190socket option.
191Optionally a user process can use this value to index some application
192specific data structure for all data coming from a specific
193association.
194.Pp
195The
196.Fa sinfo->sinfo_ssn
197field will hold the stream sequence number assigned
198by the peer endpoint if the message is
199.Em not
200unordered.
201For unordered messages this field holds an undefined value.
202.Pp
203The
204.Fa sinfo->sinfo_tsn
205field holds a transport sequence number (TSN) that was assigned
206to this message by the peer endpoint.
207For messages that fit in or less
208than the path MTU this will be the only TSN assigned.
209Note that for messages that span multiple TSNs this
210value will be one of the TSNs that was used on the
211message.
212.Pp
213The
214.Fa sinfo->sinfo_cumtsn
215field holds the current cumulative acknowledgment point of
216the transport association.
217Note that this may be larger
218or smaller than the TSN assigned to the message itself.
219.Pp
220The
221.Fa sinfo->sinfo_assoc_id
222is the unique association identification that was assigned
223to the association.
224For one-to-many (SOCK_SEQPACKET) type
225sockets this value can be used to send data to the peer without
226the use of an address field.
227It is also quite useful in
228setting various socket options on the specific association
229(see
230.Xr sctp 4 ) .
231.Pp
232The
233.Fa sinfo->info_timetolive
234field is not used by
235.Fn sctp_recvmsg .
236.Sh RETURN VALUES
237The call returns the number of bytes received, or -1
238if an error occurred.
239.Sh ERRORS
240The
241.Fn sctp_recvmsg
242system call
243fails if:
244.Bl -tag -width Er
245.It Bq Er EBADF
246An invalid descriptor was specified.
247.It Bq Er ENOTSOCK
248The argument
249.Fa s
250is not a socket.
251.It Bq Er EFAULT
252An invalid user space address was specified for an argument.
253.It Bq Er EMSGSIZE
254The socket requires that message be sent atomically,
255and the size of the message to be sent made this impossible.
256.It Bq Er EAGAIN
257The socket is marked non-blocking and the requested operation
258would block.
259.It Bq Er ENOBUFS
260The system was unable to allocate an internal buffer.
261The operation may succeed when buffers become available.
262.It Bq Er ENOBUFS
263The output queue for a network interface was full.
264This generally indicates that the interface has stopped sending,
265but may be caused by transient congestion.
266.It Bq Er EHOSTUNREACH
267The remote host was unreachable.
268.It Bq Er ENOTCONN
269On a one-to-one style socket no association exists.
270.It Bq Er ECONNRESET
271An abort was received by the stack while the user was
272attempting to send data to the peer.
273.It Bq Er ENOENT
274On a one to many style socket no address is specified
275so that the association cannot be located or the
276SCTP_ABORT flag was specified on a non-existing association.
277.It Bq Er EPIPE
278The socket is unable to send anymore data
279.Dv ( SBS_CANTSENDMORE
280has been set on the socket).
281This typically means that the socket
282is not connected and is a one-to-one style socket.
283.El
284.Sh SEE ALSO
285.Xr getsockopt 2 ,
286.Xr recv 2 ,
287.Xr select 2 ,
288.Xr setsockopt 2 ,
289.Xr socket 2 ,
290.Xr write 2 ,
291.Xr sctp_send 3 ,
292.Xr sctp_sendmsg 3 ,
293.Xr sendmsg 3 ,
294.Xr sctp 4
295