xref: /freebsd/lib/libc/net/sctp_recvmsg.3 (revision b28624fde638caadd4a89f50c9b7e7da0f98c4d2)
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. All advertising materials mentioning features or use of this software
13.\"    must display the following acknowledgement:
14.\"	This product includes software developed by the University of
15.\"	California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\" $FreeBSD$
33.\"
34.Dd December 15, 2006
35.Dt SCTP_RECVMSG 3
36.Os
37.Sh NAME
38.Nm sctp_recvmsg
39.Nd send a message from an SCTP socket
40.Sh LIBRARY
41.Lb libc
42.Sh SYNOPSIS
43.In sys/types.h
44.In sys/socket.h
45.In netinet/sctp.h
46.Ft ssize_t
47.Fo sctp_recvmsg
48.Fa "int s" "void *msg" "size_t len" "struct sockaddr * restrict from"
49.Fa "socklen_t * restrict fromlen" "struct sctp_sndrcvinfo *sinfo" "int *flags"
50.Fc
51.Sh DESCRIPTION
52The
53.Fn sctp_recvmsg
54system call
55is used to receive a message from another SCTP endpoint.
56The
57.Fn sctp_recvmsg
58call is used by one-to-one (SOCK_STREAM) type sockets after a
59successful
60.Fn connect
61call or after the application has performed a
62.Fn listen
63followed by a sucessful
64.Fn accept
65For a one-to-many (SOCK_SEQPACKET) type socket, an endpoint may call
66.Fn sctp_recvmsg
67after having implicitly started an association via one
68of the send calls including
69.Fn sctp_sendmsg
70.Fn sendto
71and
72.Fn sendmsg .
73Or, an application may also receive a message after having
74called
75.Fn listen
76with a postive backlog to enable the reception of new associations.
77.Pp
78The address of the sender is held in the
79.Fa from
80argument with
81.Fa fromlen
82specifying its size.
83At the completion of a successful
84.Fn sctp_recvmsg
85call
86.Fa from
87will hold the address of the peer and
88.Fa fromlen
89will hold the length of that address.
90Note that
91the address is bounded by the inital value of
92.Fa fromlen
93which is used as an in/out variable.
94.Pp
95The length of the message
96.Fa msg
97to be received is bounded by
98.Fa len .
99If the message is too long to fit in the users
100receive buffer, then the
101.Fa flags
102argument will NOT have the
103.Dv MSG_EOF
104flag applied.
105If the message is a complete message then
106the
107.Fa flags
108argument will have
109.Dv MSG_EOF
110set.
111Locally detected errors are
112indicated by a return value of -1 with
113.Va errno
114set accordingly.
115The
116.Fa flags
117argument may also hold the value
118.Dv MSG_NOTIFICATION .
119When this
120occurs this indicates that the message received is NOT from
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	u_int16_t sinfo_stream;  /* Stream arriving on */
146	u_int16_t sinfo_ssn;     /* Stream Sequence Number */
147	u_int16_t sinfo_flags;   /* Flags on the incoming message */
148	u_int32_t sinfo_ppid;    /* The ppid field */
149	u_int32_t sinfo_context; /* context field */
150	u_int32_t sinfo_timetolive; /* not used by sctp_recvmsg */
151	u_int32_t sinfo_tsn;        /* The transport sequence number */
152	u_int32_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
159is 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
179.Fa sinfo->sinfo_stream
180is the SCTP stream that the message was received on.
181Streams in SCTP are reliable (or partially reliable) flows of ordered
182messages.
183.Pp
184The
185.Fa sinfo->sinfo_context
186field is used only if the local application set an association level
187context with the
188.Dv SCTP_CONTEXT
189socket option.
190Optionally a user process can use this value to index some application
191specific data structure for all data coming from a specific
192association.
193.Pp
194The
195.Fa sinfo->sinfo_ssn
196will hold the stream sequence number assigned
197by the peer endpoint if the message is NOT unordered.
198For unordered messages this field holds an undefined value.
199.Pp
200The
201.Fa sinfo->sinfo_tsn
202holds a transport sequence number (TSN) that was assigned
203to this message by the peer endpoint.
204For messages that fit in or less
205than the path MTU this will be the only TSN assigned.
206Note that for messages that span multiple TSN's this
207value will be one of the TSN's that was used on the
208message.
209.Pp
210The
211.Fa sinfo->sinfo_cumtsn
212holds the current cumulative acknowledgment point of
213the transport association.
214Note that this may be larger
215or smaller than the TSN assigned to the message itself.
216.Pp
217The
218.Fa sinfo->sinfo_assoc_id
219is the unique association identification that was assigned
220to the association.
221For one-to-many (SOCK_SEQPACKET) type
222sockets this value can be used to send data to the peer without
223the use of an address field.
224It is also quite useful in
225setting various socket options on the specific association
226(see
227.Xr sctp 4
228).
229.Pp
230The
231.Fa sinfo->info_timetolive
232field is not used by
233.Fa sctp_recvmsg .
234.Sh RETURN VALUES
235The call returns the number of characters sent, or -1
236if an error occurred.
237.Sh ERRORS
238The
239.Fn sctp_recvmsg
240system call
241fails if:
242.Bl -tag -width Er
243.It Bq Er EBADF
244An invalid descriptor was specified.
245.It Bq Er ENOTSOCK
246The argument
247.Fa s
248is not a socket.
249.It Bq Er EFAULT
250An invalid user space address was specified for an argument.
251.It Bq Er EMSGSIZE
252The socket requires that message be sent atomically,
253and the size of the message to be sent made this impossible.
254.It Bq Er EAGAIN
255The socket is marked non-blocking and the requested operation
256would block.
257.It Bq Er ENOBUFS
258The system was unable to allocate an internal buffer.
259The operation may succeed when buffers become available.
260.It Bq Er ENOBUFS
261The output queue for a network interface was full.
262This generally indicates that the interface has stopped sending,
263but may be caused by transient congestion.
264.It Bq Er EHOSTUNREACH
265The remote host was unreachable.
266.It Bq Er ENOTCON
267On a one-to-one style socket no association exists.
268.It Bq Er ECONNRESET
269An abort was received by the stack while the user was
270attempting to send data to the peer.
271.It Bq Er ENOENT
272On a one to many style socket no address is specified
273so that the association cannot be located or the
274SCTP_ABORT flag was specified on a non-existing association.
275.It Bq Er EPIPE
276The socket is unable to send anymore data
277.Dv ( SBS_CANTSENDMORE
278has been set on the socket).
279This typically means that the socket
280is not connected and is a one-to-one style socket.
281.El
282.Sh SEE ALSO
283.Xr recv 2 ,
284.Xr select 2 ,
285.Xr socket 2 ,
286.Xr write 2 ,
287.Xr getsockopt 2 ,
288.Xr setsockopt 2 ,
289.Xr sctp_send 3 ,
290.Xr sctp_sendmsg 3 ,
291.Xr sendmsg 3 ,
292.Xr sctp 4
293