1%
2% Copyright (C) 2012-2015 Irene Ruengeler
3% Copyright (C) 2012-2015 Michael Tuexen
4%
5% All rights reserved.
6%
7% Redistribution and use in source and binary forms, with or without
8% modification, are permitted provided that the following conditions
9% are met:
10% 1. Redistributions of source code must retain the above copyright
11%    notice, this list of conditions and the following disclaimer.
12% 2. Redistributions in binary form must reproduce the above copyright
13%    notice, this list of conditions and the following disclaimer in the
14%    documentation and/or other materials provided with the distribution.
15% 3. Neither the name of the project nor the names of its contributors
16%    may be used to endorse or promote products derived from this software
17%    without specific prior written permission.
18%
19% THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22% ARE DISCLAIMED.	IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23% FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24% DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25% OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26% HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27% LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29% SUCH DAMAGE.
30%
31\documentclass[a4paper]{article}
32%
33\usepackage{longtable}
34%
35\title{Socket API for the SCTP User-land Implementation (usrsctp)}
36\author{I.~R\"ungeler%
37        \thanks{M\"unster University of Applied Sciences,
38                Department of Electrical Engineering
39                and Computer Science,
40                Stegerwaldstr.~39,
41                D-48565 Steinfurt,
42                Germany,
43                \texttt{i.ruengeler@fh-muenster.de}.}
44        \and
45        M.~T\"uxen%
46        \thanks{M\"unster University of Applied Sciences,
47                Department of Electrical Engineering
48                and Computer Science,
49                Stegerwaldstr.~39,
50                D-48565 Steinfurt,
51                Germany,
52                \texttt{tuexen@fh-muenster.de}.}
53}
54%
55\begin{document}
56\setcounter{secnumdepth}{4}
57\setcounter{tocdepth}{4}
58\maketitle
59\tableofcontents
60
61\section{Introduction}
62In this manual the socket API for the SCTP User-land implementation will be described.
63It is based on RFC 6458~\cite{socketAPI}. The main focus of this document is on pointing out
64 the differences to the SCTP Sockets API. For all aspects of the sockets API that are not
65 mentioned in this document, please refer to RFC~6458. Questions about SCTP can hopefully be
66 answered by RFC~4960~\cite{SCTP}.
67
68\section{Getting Started}
69The User-land stack has been tested on FreeBSD 10.0, Ubuntu 11.10, Windows 7, Mac OS X 10.6,
70and MAC OS X 10.7.
71The current version of the User-land stack is provided on \textit{http://sctp.fh-muenster.de/sctp-user-land-stack.html}.
72Download the tarball and untar it in a folder of your choice.
73The tarball contains all the sources to build the libusrsctp, which has to be linked to the object file of an
74example program. In addition there are two applications in the folder \textit{programs} that can be built and run.
75
76\subsection{Building the Library and the Applications}
77\subsubsection{Unix-like Operating Systems}
78In the folder \textit{usrsctp} type
79\begin{verbatim}
80./bootstrap
81./configure
82make
83\end{verbatim}
84Now, the library \textit{libusrsctp.la} has been built in the subdirectory \textit{usrsctplib}, and the example
85programs are ready to run from the subdirectory \textit{programs}.
86
87If you have root privileges or are in the sudoer group, you can install the library in \textit{/usr/local/lib}
88and copy the header file to \textit{/usr/include} with the command
89\begin{verbatim}
90sudo make install
91\end{verbatim}
92
93\subsubsection{Windows}
94On Windows you need a compiler like Microsoft Visual Studio. You can build the library and the
95example programs with the command line tool of the compiler by typing
96\begin{verbatim}
97nmake -f Makefile.nmake
98\end{verbatim}
99in the directory \textit{usrsctp}.
100
101\subsection{Running the Test Programs}
102There are two test programs included, a discard server and a client. You can run both to send data from the
103client to the server. The client reads data from stdin and sends them to the server, which prints the message
104in the terminal and discards it. The sources of the server are also provided in Section~\ref{server} and those
105of the client in Section~\ref{client}.
106
107\subsubsection{Using UDP Encapsulation}
108Both programs can either send data over SCTP directly or use UDP encapsulation, thus encapsulating the
109SCTP packet in a UDP datagram. The first mode works on loopback or in a protected setup without any
110NAT boxes involved. In all other cases it is better to use UDP encapsulation.
111
112The usage of the discard\_server is
113\begin{verbatim}
114discard_server [local_encaps_port remote_encaps_port]
115\end{verbatim}
116For UDP encapsulation the ports have to be specified. The local and remote encapsulation ports can be arbitrarily
117set.
118For example, you can call
119\begin{verbatim}
120./discard_server 11111 22222
121\end{verbatim}
122on a Unix-like OS and
123\begin{verbatim}
124discard_server.exe 11111 22222
125\end{verbatim}
126on Windows.
127
128The client needs two additional parameters, the server's address and its port.
129Its usage is
130\begin{verbatim}
131client remote_addr remote_port [local_port local_encaps_port remote_encaps_port]
132\end{verbatim}
133The remote address is the server's address. If client and server are started on the same machine,
134the loopback address 127.0.0.1 can be used for Unix-like OSs and the local address on Windows.
135The discard port is 9, thus 9 has to be taken as remote port. The encapsulation ports have to
136match those of the server, i.e. the server's local\_encaps\_port is the client's
137remote\_encaps\_port and vice versa. Thus, the client can be started with
138\begin{verbatim}
139./client 127.0.0.1 9 0 22222 11111
140\end{verbatim}
141on a Unix-like OS and
142\begin{verbatim}
143client.exe 192.168.0.1 9 0 22222 11111
144\end{verbatim}
145on Windows provided your local IP address is 192.168.0.1.
146
147\subsubsection{Sending over SCTP}
148To send data over SCTP directly you might need root privileges because raw sockets are used.
149Thus instead of specifying the encapsulation ports you have to start the programs prepending
150\texttt{sudo} or in case of Windows start the program from an administrator console.
151
152\subsubsection{Using the Callback API}
153Instead of asking constantly for new data, a callback API can be used that is triggered by
154SCTP. A callback function has to be registered that will be called whenever data is ready to
155be delivered to the application.
156
157The discard\_server has a flag to switch between the two modi. If  use\_cb is set to 1, the
158callback API will be used. To change the setting, just set the flag and compile the program again.
159
160
161
162
163\section{Basic Operations}
164All system calls start with the prefix \textit{usrsctp\_} to distinguish them from the kernel variants.
165Some of them are changed to account for the different demands in the userland environment.
166
167\subsection{Differences to RFC 6458}
168\subsubsection{usrsctp\_init()}
169Every application has to start with \textit{usrsctp\_init()}. This function calls \textit{sctp\_init()} and reserves
170the memory necessary to administer the data transfer.
171The function prototype is
172\begin{verbatim}
173void
174usrsctp_init(uint16_t udp_port)
175\end{verbatim}
176As it is not always possible to send data directly over SCTP because not all NAT boxes can
177process SCTP packets, the data can be sent over UDP. To encapsulate SCTP into UDP
178a UDP port has to be specified, to which the datagrams can be sent. This local UDP port  is set
179with the parameter \texttt{udp\_port}. The default value is 9899, the standard UDP encapsulation port.
180If UDP encapsulation is not necessary, the UDP port has to be set to 0.
181
182\subsubsection{usrsctp\_finish()}
183At the end of the program \textit{usrsctp\_finish()} should be called to free all the memory that has been
184allocated before.
185The function prototype is
186\begin{verbatim}
187int
188usrsctp_finish(void).
189\end{verbatim}
190The return code is 0 on success and -1 in case of an error.
191
192\subsubsection{usrsctp\_socket()}
193A representation of an SCTP endpoint is a socket. Is it created with \textit{usrsctp\_socket()}.
194The function prototype is:
195\begin{verbatim}
196struct socket *
197usrsctp_socket(int domain,
198               int type,
199               int protocol,
200               int (*receive_cb)(struct socket *sock,
201                                 union sctp_sockstore addr,
202                                 void *data,
203                                 size_t datalen,
204                                 struct sctp_rcvinfo,
205                                 int flags,
206                                 void *ulp_info),
207               int (*send_cb)(struct socket *sock,
208                              uint32_t sb_free,
209                              void *ulp_info),
210               uint32_t sb_threshold,
211               void *ulp_info).
212\end{verbatim}
213The arguments taken from RFC~6458 are:
214\begin{itemize}
215\item domain: PF\_INET or PF\_INET6 can be used.
216\item type: In case of a one-to-many style socket it is SOCK\_SEQPACKET, in case of a one-to-one style
217socket it is SOCK\_STREAM. For an explanation of the differences between the socket types please
218refer to RFC~6458.
219\item protocol: Set IPPROTO\_SCTP.
220\end{itemize}
221
222In usrsctp, a callback API can be used.
223\begin{itemize}
224\item The function pointers of the receive and send callbacks are new arguments to the socket call. If no callback API is used, these must be \textit{NULL}.
225\item The \textit{sb\_threshold} specifies the amount of free space in the send socket buffer before the send function in the application is called. If a send callback function is specified and \textit{sb\_threshold} is 0, the function is called whenever there is room in the send socket buffer.
226\item Additional data may be passed along within the \textit{ulp\_info} parameter. This value will be passed to the \textit{receive\_cb} when it is invoked.
227\end{itemize}
228
229On success \textit{usrsctp\_socket()} returns the pointer to the new socket in the \texttt{struct socket} data type.
230It will be needed in all other system calls. In case of a failure NULL is returned and
231errno is set to the appropriate error code.
232
233\subsubsection{usrsctp\_close()}
234
235The function prototype of \textit{usrsctp\_close()} is
236\begin{verbatim}
237void
238usrsctp_close(struct socket *so).
239 \end{verbatim}
240Thus the only difference is the absence of a return code.
241
242\subsection{Same Functionality as RFC 6458}
243The following functions have the same functionality as their kernel pendants. There prototypes
244are described in the following subsections. For a detailed description please refer to RFC~6458.
245
246\subsubsection{usrsctp\_bind()}
247The function prototype of \textit{usrsctp\_bind()} is
248\begin{verbatim}
249int
250usrsctp_bind(struct socket *so,
251             struct sockaddr *addr,
252             socklen_t addrlen).
253\end{verbatim}
254The arguments are
255\begin{itemize}
256\item so: Pointer to the socket as returned by \textit{usrsctp\_socket()}.
257\item addr: The address structure (struct sockaddr\_in for an IPv4 address
258      or struct sockaddr\_in6 for an IPv6 address).
259\item addrlen: The size of the address structure.
260\end{itemize}
261\textit{usrsctp\_bind()} returns 0 on success and -1 in case of an error.
262
263\subsubsection{usrsctp\_listen()}
264The function prototype of \textit{usrsctp\_listen()} is
265\begin{verbatim}
266int
267usrsctp_listen(struct socket *so,
268               int backlog).
269 \end{verbatim}
270The arguments are
271\begin{itemize}
272\item so: Pointer to the socket as returned by \textit{usrsctp\_socket()}.
273\item backlog: If backlog is non-zero, enable listening, else disable
274      listening.
275\end{itemize}
276\textit{usrsctp\_listen()} returns 0 on success and -1 in case of an error.
277
278\subsubsection{usrsctp\_accept()}
279The function prototype of \textit{usrsctp\_accept()} is
280\begin{verbatim}
281struct socket *
282usrsctp_accept(struct socket *so,
283               struct sockaddr * addr,
284               socklen_t * addrlen).
285 \end{verbatim}
286 The arguments are
287\begin{itemize}
288\item so: Pointer to the socket as returned by \textit{usrsctp\_socket()}.
289\item addr: On return,  the primary address of the peer (struct sockaddr\_in for an IPv4 address or
290      struct sockaddr\_in6 for an IPv6 address).
291\item addrlen: Size of the returned address structure.
292\end{itemize}
293\textit{usrsctp\_accept()} returns the accepted socket on success and NULL in case of an error.
294
295\subsubsection{usrsctp\_connect()}
296The function prototype of \textit{usrsctp\_connect()} is
297\begin{verbatim}
298int
299usrsctp_connect(struct socket *so,
300                struct sockaddr *name,
301                socklen_t addrlen)
302 \end{verbatim}
303The arguments are
304\begin{itemize}
305\item so: Pointer to the socket as returned by \textit{usrsctp\_socket()}.
306 \item name: Address of the peer to connect to (struct sockaddr\_in for an IPv4 address or
307      struct sockaddr\_in6 for an IPv6 address).
308\item addrlen: Size of the peer's address.
309\end{itemize}
310\textit{usrsctp\_connect()} returns 0 on success and -1 in case of an error.
311
312\subsubsection{usrsctp\_shutdown()}
313The function prototype of \textit{usrsctp\_shutdown()} is
314\begin{verbatim}
315int
316usrsctp_shutdown(struct socket *so, int how).
317\end{verbatim}
318The arguments are
319\begin{itemize}
320\item so: Pointer to the socket of the association to be closed.
321\item how: Specifies the type of shutdown.  The values are as follows:
322\begin{itemize}
323\item SHUT\_RD:  Disables further receive operations.  No SCTP protocol
324         action is taken.
325\item SHUT\_WR:  Disables further send operations, and initiates the SCTP
326         shutdown sequence.
327\item SHUT\_RDWR:  Disables further send and receive operations, and
328         initiates the SCTP shutdown sequence.
329\end{itemize}
330\end{itemize}
331\textit{usrsctp\_shutdown()} returns 0 on success and -1 in case of an error.
332
333\section{Sending and Receiving Data}
334Since the publication of RFC~6458 there is only one function for sending and one for receiving
335that is not deprecated. Therefore, only these two are described here.
336
337\subsection{usrsctp\_sendv()}
338The function prototype is
339\begin{verbatim}
340ssize_t
341usrsctp_sendv(struct socket *so,
342              const void *data,
343              size_t len,
344              struct sockaddr *addrs,
345              int addrcnt,
346              void *info,
347              socklen_t infolen,
348              unsigned int infotype,
349              int flags).
350\end{verbatim}
351The arguments are
352\begin{itemize}
353\item so: The socket to send data on.
354\item data: As it is more convenient to send data in a buffer and not a \texttt{struct iovec} data structure, we
355chose to pass the data as a void pointer.
356\item len: Length of the data.
357\item addrs: In this version of usrsctp at most one destination address is supported. In the case of a connected
358socket, the parameter \texttt{addrs} can be set to NULL.
359\item addrcnt: Number of addresses. As at most one address is supported, addrcnt is 0 if addrs is NULL and
3601 otherwise.
361\item info: Additional information for a message is stored in \texttt{void *info}. The data types \texttt{struct~sctp\_sndinfo},
362\texttt{struct~sctp\_prinfo}, and \texttt{struct} \linebreak \texttt{sctp\_sendv\_spa} are supported as defined in
363RFC~6458. Support for \texttt{structsctp\_authinfo} is not implemented yet, therefore, errno is set EINVAL
364and -1 will be returned, if it is used.
365\item infolen: Length of info in bytes.
366\item infotype: Identifies the type of the information provided in info. Possible values are
367SCTP\_SENDV\_NOINFO, SCTP\_SENDV\_SNDINFO, \linebreak SCTP\_SENDV\_PRINFO, SCTP\_SENDV\_SPA.
368For additional information please refer to RFC~6458.
369\item flags: Flags as described in RFC~6458.
370\end{itemize}
371
372\textit{usrsctp\_sendv()} returns the number of bytes sent, or -1 if an error
373occurred.  The variable errno is then set appropriately.
374
375\subsection{usrsctp\_recvv()}
376The function prototype is
377\begin{verbatim}
378ssize_t
379usrsctp_recvv(struct socket *so,
380             void *dbuf,
381             size_t len,
382             struct sockaddr *from,
383             socklen_t * fromlen,
384             void *info,
385             socklen_t *infolen,
386             unsigned int *infotype,
387             int *msg_flags).
388\end{verbatim}
389The arguments are
390\begin{itemize}
391\item so: The socket to receive data on.
392\item dbuf: Analog to \textit{usrsctp\_sendv()} the data is returned in a buffer.
393\item len: Length of the buffer in bytes.
394\item from: A pointer to an address to be filled with the sender of the
395      received message's address.
396\item fromlen: An in/out parameter describing the from length.
397\item info: A pointer to the buffer to hold the attributes of the received
398      message.  The structure type of info is determined by the
399      infotype parameter. The attributes returned in \texttt{info} have to be
400      handled in the same way as specified in RFC~6458.
401\item infolen:  An in/out parameter describing the size of the info buffer.
402\item infotype:  On return, *infotype is set to the type of the info
403      buffer.  The current defined values are SCTP\_RECVV\_NOINFO,
404      SCTP\_RECVV\_RCVINFO, SCTP\_RECVV\_NXTINFO, and
405      SCTP\_RECVV\_RN. A detailed description is given in RFC~6458.
406\item flags: A pointer to an integer to be filled with any message flags
407      (e.g., MSG\_NOTIFICATION).  Note that this field is an in/out
408      parameter.  Options for the receive may also be passed into the
409      value (e.g., MSG\_EOR).  Returning from the call, the flags' value
410      will differ from its original value.
411\end{itemize}
412
413\textit{usrsctp\_recvv()} returns the number of bytes sent, or -1 if an error
414occurred.  The variable errno is then set appropriately.
415
416
417
418\section{Socket Options}
419Socket options are used to change the default behavior of socket calls.
420Their behavior is specified in RFC~6458. The functions to get or set them are
421
422\begin{verbatim}
423int
424usrsctp_getsockopt(struct socket *so,
425                     int level,
426                     int optname,
427                     void *optval,
428                     socklen_t *optlen)
429\end{verbatim}
430and
431\begin{verbatim}
432int
433usrsctp_setsockopt(struct socket *so,
434                     int level,
435                     int optname,
436                     const void *optval,
437                     socklen_t optlen).
438\end{verbatim}
439
440and the arguments are
441\begin{itemize}
442\item so:  The socket of type struct socket.
443\item level:  Set to IPPROTO\_SCTP for all SCTP options.
444\item optname:  The option name as specified in Table~\ref{options}.
445\item optval: The buffer to store the value of the option as specified in the second column of Table~\ref{options}.
446\item optlen:  The size of the buffer (or the length of the option
447      returned in case of \textit{usrsctp\_getsockopt}).
448\end{itemize}
449
450These functions return 0 on success and -1 in case of an error.
451
452\begin{longtable}{|l|l|c|}
453\hline
454{\bfseries Option}&{\bfseries Datatype} &{\bfseries r/w}\tabularnewline
455\endhead
456\hline
457SCTP\_RTOINFO&struct sctp\_rtoinfo&r/w\tabularnewline \hline
458SCTP\_ASSOCINFO&struct sctp\_assocparams&r/w\tabularnewline \hline
459SCTP\_INITMSG&struct sctp\_initmsg&r/w\tabularnewline \hline
460SCTP\_NODELAY&int&r/w\tabularnewline \hline
461SCTP\_AUTOCLOSE&int&r/w\tabularnewline \hline
462SCTP\_PRIMARY\_ADDR&struct sctp\_setprim&r/w\tabularnewline \hline
463SCTP\_ADAPTATION\_LAYER&struct sctp\_setadaptation&r/w\tabularnewline \hline
464SCTP\_DISABLE\_FRAGMENTS&int&r/w\tabularnewline \hline
465SCTP\_PEER\_ADDR\_PARAMS&struct sctp\_paddrparams&r/w\tabularnewline \hline
466SCTP\_I\_WANT\_MAPPED\_V4\_ADDR&int&r/w\tabularnewline \hline
467SCTP\_MAXSEG&struct sctp\_assoc\_value&r/w\tabularnewline \hline
468SCTP\_DELAYED\_SACK&struct sctp\_sack\_info&r/w\tabularnewline \hline
469SCTP\_FRAGMENT\_INTERLEAVE&int&r/w\tabularnewline \hline
470SCTP\_PARTIAL\_DELIVERY\_POINT&int&r/w\tabularnewline \hline
471SCTP\_HMAC\_IDENT&struct sctp\_hmacalgo&r/w\tabularnewline \hline
472SCTP\_AUTH\_ACTIVE\_KEY&struct sctp\_authkeyid&r/w\tabularnewline \hline
473SCTP\_AUTO\_ASCONF&int&r/w\tabularnewline \hline
474SCTP\_MAX\_BURST&struct sctp\_assoc\_value&r/w\tabularnewline \hline
475SCTP\_CONTEXT&struct sctp\_assoc\_value&r/w\tabularnewline \hline
476SCTP\_EXPLICIT\_EOR&int&r/w\tabularnewline \hline
477SCTP\_REUSE\_PORT&int&r/w\tabularnewline \hline
478SCTP\_EVENT&struct sctp\_event&r/w\tabularnewline \hline
479SCTP\_RECVRCVINFO&int&r/w\tabularnewline \hline
480SCTP\_RECVNXTINFO&int&r/w\tabularnewline \hline
481SCTP\_DEFAULT\_SNDINFO&struct sctp\_sndinfo&r/w\tabularnewline \hline
482SCTP\_DEFAULT\_PRINFO&struct sctp\_default\_prinfo&r/w\tabularnewline \hline
483SCTP\_REMOTE\_UDP\_ENCAPS\_PORT&int&r/w\tabularnewline \hline
484SCTP\_ENABLE\_STREAM\_RESET&struct sctp\_assoc\_value&r/w\tabularnewline \hline
485SCTP\_STATUS&struct sctp\_status&r\tabularnewline \hline
486SCTP\_GET\_PEER\_ADDR\_INFO&struct sctp\_paddrinfo&r\tabularnewline \hline
487SCTP\_PEER\_AUTH\_CHUNKS&struct sctp\_authchunks&r\tabularnewline \hline
488SCTP\_LOCAL\_AUTH\_CHUNKS&struct sctp\_authchunks&r\tabularnewline \hline
489SCTP\_GET\_ASSOC\_NUMBER&uint32\_t&r\tabularnewline \hline
490SCTP\_GET\_ASSOC\_ID\_LIST&struct sctp\_assoc\_ids&r\tabularnewline \hline
491SCTP\_RESET\_STREAMS&struct sctp\_reset\_streams&w\tabularnewline \hline
492SCTP\_RESET\_ASSOC&struct sctp\_assoc\_t&w\tabularnewline \hline
493SCTP\_ADD\_STREAMS&struct sctp\_add\_streams&w\tabularnewline \hline
494\caption{Socket Options supported by usrsctp}
495\label{options}
496\end{longtable}
497An overview of the supported options is given in Table~\ref{options}. Their use is described in RFC~6458~\cite{socketAPI}, RFC~6525~\cite{streamReset}, and~\cite{udpencaps}.
498
499\section{Sysctl variables}
500
501In kernel implementations like for instance FreeBSD, it is possible to change parameters
502in the operating system. These parameters are called sysctl variables.
503
504In usrsctp applications can set or retrieve these variables with the functions
505\begin{verbatim}
506void
507usrsctp_sysctl_set_ ## (uint32_t value)
508\end{verbatim}
509and
510\begin{verbatim}
511uint32_t
512usrsctp_sysctl_get_ ## (void)
513\end{verbatim}
514respectively, where \#\# stands for the name of the variable.
515
516In the following paragraphs a short description of the parameters will be given.
517
518\subsection{Manipulate Memory}
519\subsubsection{usrsctp\_sysctl\_set\_sctp\_sendspace()}
520The space of the available send buffer can be changed from its default value of 262,144 bytes
521to a value between 0 and $2^{32}-1$ bytes.
522
523\subsubsection{usrsctp\_sysctl\_set\_sctp\_recvspace()}
524The space of the available receive buffer can be changed from its default value of 262,144 bytes
525to a value between 0 and $2^{32}-1$ bytes.
526
527\subsubsection{usrsctp\_sysctl\_set\_sctp\_hashtblsize()}
528The TCB (Thread Control Block) hash table sizes, i.e. the size of one TCB in the hash table, can be tuned between
5291 and $2^{32}-1$ bytes. The default value is 1,024 bytes. A TCB contains for instance pointers to the socket, the
530endpoint, information about the association and some statistic data.
531
532\subsubsection{usrsctp\_sysctl\_set\_sctp\_pcbtblsize()}
533The PCB (Protocol Control Block) hash table sizes, i.e. the size of one PCB in the hash table, can be tuned between
5341 and $2^{32}-1$ bytes. The default value is 256 bytes. The PCB contains all variables that characterize an endpoint.
535
536\subsubsection{usrsctp\_sysctl\_set\_sctp\_system\_free\_resc\_limit()}
537This parameters tunes the maximum number of cached resources in the system. It can be set between
5380 and $2^{32}-1$. The default value is 1000.
539
540\subsubsection{usrsctp\_sysctl\_set\_sctp\_asoc\_free\_resc\_limit()}
541This parameters tunes the maximum number of cached resources in an association. It can be set between
5420 and $2^{32}-1$. The default value is 10.
543
544\subsubsection{usrsctp\_sysctl\_set\_sctp\_mbuf\_threshold\_count()}
545Data is stored in mbufs. Several mbufs can be chained together. The maximum number of small mbufs in a chain
546can be set with this parameter, before an mbuf cluset is used. The default is 5.
547
548\subsubsection{usrsctp\_sysctl\_set\_sctp\_add\_more\_threshold()}
549TBD
550This parameter configures the threshold below which more space should be added to a socket send buffer.
551The default value is 1452 bytes.
552
553
554\subsection{Configure RTO}
555The retransmission timeout (RTO), i.e. the time that controls the retransmission of messages, has
556several parameters, that can be changed, for example to shorten the time, before a message is
557retransmitted. The range of these parameters is between 0 and $2^{32}-1$~ms.
558
559\subsubsection{usrsctp\_sysctl\_set\_sctp\_rto\_max\_default()}
560The default value for the maximum retransmission timeout in ms is 60,000 (60~secs).
561
562\subsubsection{usrsctp\_sysctl\_set\_sctp\_rto\_min\_default()}
563The default value for the minimum retransmission timeout in ms is 1,000 (1~sec).
564
565\subsubsection{usrsctp\_sysctl\_set\_sctp\_rto\_initial\_default()}
566The default value for the initial retransmission timeout in ms is 3,000 (3~sec). This value is only
567needed before the first calculation of a round trip time took place.
568
569\subsubsection{usrsctp\_sysctl\_set\_sctp\_init\_rto\_max\_default()}
570The default value for the maximum retransmission timeout for an INIT chunk in ms is 60,000 (60~secs).
571
572
573\subsection{Set Timers}
574\subsubsection{usrsctp\_sysctl\_set\_sctp\_valid\_cookie\_life\_default()}
575A cookie has a specified life time. If it expires the cookie is not valid any more and an ABORT is sent.
576The default value in ms is 60,000 (60~secs).
577
578\subsubsection{usrsctp\_sysctl\_set\_sctp\_heartbeat\_interval\_default()}
579Set the default time between two heartbeats. The default is 30,000~ms.
580
581\subsubsection{usrsctp\_sysctl\_set\_sctp\_shutdown\_guard\_time\_default()}
582If a SHUTDOWN is not answered with a SHUTDOWN-ACK while the shutdown guard timer is still
583running, the association will be aborted after the default of 180~secs.
584
585\subsubsection{usrsctp\_sysctl\_set\_sctp\_pmtu\_raise\_time\_default()}
586TBD
587To set the size of the packets to the highest value possible, the maximum transfer unit (MTU)
588of the complete path has to be known. The default time interval for the path mtu discovery
589is 600~secs.
590
591\subsubsection{usrsctp\_sysctl\_set\_sctp\_secret\_lifetime\_default()}
592TBD
593The default secret lifetime of a server is 3600~secs.
594
595\subsubsection{usrsctp\_sysctl\_set\_sctp\_vtag\_time\_wait()}
596TBD
597Vtag time wait time, 0 disables it. Default: 60~secs
598
599
600\subsection{Set Failure Limits}
601Transmissions and retransmissions of messages might fail. To protect the system against too many
602retransmissions, limits have to be defined.
603
604\subsubsection{usrsctp\_sysctl\_set\_sctp\_init\_rtx\_max\_default()}
605The default maximum number of retransmissions of an INIT chunks is 8, before an ABORT is sent.
606
607\subsubsection{usrsctp\_sysctl\_set\_sctp\_assoc\_rtx\_max\_default()}
608This parameter sets the maximum number of failed retransmissions before the association is aborted.
609The default value is 10.
610
611\subsubsection{usrsctp\_sysctl\_set\_sctp\_path\_rtx\_max\_default()}
612This parameter sets the maximum number of path failures before the association is aborted.
613The default value is 5. Notice that the number of paths multiplied by this value should be
614equal to sctp\_assoc\_rtx\_max\_default. That means that the default configuration is good for two
615paths.
616
617\subsubsection{usrsctp\_sysctl\_set\_sctp\_max\_retran\_chunk()}
618The parameter configures how many times an unlucky chunk can be retransmitted before the
619association aborts. The default is set to 30.
620
621\subsubsection{usrsctp\_sysctl\_set\_sctp\_path\_pf\_threshold()}
622TBD
623Default potentially failed threshold. Default: 65535
624
625\subsubsection{usrsctp\_sysctl\_set\_sctp\_abort\_if\_one\_2\_one\_hits\_limit()}
626TBD
627When one-2-one hits qlimit abort. Default: 0
628
629
630\subsection{Control the Sending of SACKs}
631\subsubsection{usrsctp\_sysctl\_set\_sctp\_sack\_freq\_default()}
632The SACK frequency defines the number of packets that are awaited, before a SACK is sent.
633The default value is 2.
634
635\subsubsection{usrsctp\_sysctl\_set\_sctp\_delayed\_sack\_time\_default()}
636As a SACK (Selective Acknowlegment) is sent after every other packet, a timer is set to send a
637SACK in case another packet does not arrive in due time. The default value for this timer is
638200~ms.
639
640\subsubsection{usrsctp\_sysctl\_set\_sctp\_strict\_sacks()}
641TBD
642This is a flag to turn the controlling of the coherence of SACKs on or off. The default value is
6431 (on).
644
645\subsubsection{usrsctp\_sysctl\_set\_sctp\_nr\_sack\_on\_off()}
646If a slow hosts receives data on a lossy link it is possible that its receiver window is full and new
647data can only be accepted if one chunk with a higher TSN (Transmission Sequence Number) that has
648previously been acknowledged is dropped. As a consequence the sender has to store data, even if
649they have been acknowledged in case they have to be retransmitted. If this behavior is not necessary,
650non-renegable SACKs can be turned on.
651By default the use of non-renegable SACKs is turned off.
652
653\subsubsection{usrsctp\_sysctl\_set\_sctp\_enable\_sack\_immediately()}
654In some cases it is not desirable to wait for the SACK timer to expire before a SACK is sent. In these
655cases a bit called SACK-IMMEDIATELY~\cite{sack-imm} can be set to provoke the instant sending of a SACK.
656The default is to turn it off.
657
658\subsubsection{usrsctp\_sysctl\_set\_sctp\_L2\_abc\_variable()}
659TBD
660SCTP ABC max increase per SACK (L). Default: 1
661
662\subsection{Change Max Burst}
663Max burst defines the maximum number of packets that may be sent in one flight.
664
665\subsubsection{usrsctp\_sysctl\_set\_sctp\_max\_burst\_default()}
666The default value for max burst is 0, which means that the number of packets sent as a flight
667is not limited by this parameter, but may be by another one, see the next paragraph.
668
669\subsubsection{usrsctp\_sysctl\_set\_sctp\_use\_cwnd\_based\_maxburst()}
670The use of max burst is based on the size of the congestion window (cwnd).
671This parameter is set by default.
672
673\subsubsection{usrsctp\_sysctl\_set\_sctp\_hb\_maxburst()}
674Heartbeats are mostly used to verify a path. Their number can be limited. The default is 4.
675
676\subsubsection{usrsctp\_sysctl\_set\_sctp\_fr\_max\_burst\_default()}
677In the state of fast retransmission the number of packet bursts can be limited. The default
678value is 4.
679
680
681\subsection{Handle Chunks}
682\subsubsection{usrsctp\_sysctl\_set\_sctp\_peer\_chunk\_oh()}
683In order to keep track of the peer's advertised receiver window, the sender calculates the window by
684subtracting the amount of data sent. Yet, some OSs reduce the receiver window by the real space needed
685to store the data. This parameter sets the additional amount to debit the peer's receiver window per
686chunk sent. The default value is 256, which is the value needed by FreeBSD.
687
688\subsubsection{usrsctp\_sysctl\_set\_sctp\_max\_chunks\_on\_queue()}
689This parameter sets the maximum number of chunks that can be queued per association. The default
690value is 512.
691
692\subsubsection{usrsctp\_sysctl\_set\_sctp\_min\_split\_point()}
693TBD
694The minimum size when splitting a chunk is 2904 bytes by default.
695
696\subsubsection{usrsctp\_sysctl\_set\_sctp\_chunkscale()}
697TBD
698This parameter can be tuned for scaling of number of chunks and messages. The default is10.
699
700\subsubsection{usrsctp\_sysctl\_set\_sctp\_min\_residual()}
701TBD
702This parameter configures the minimum size of the residual data chunk in the second
703part of the split. The default is 1452.
704
705
706\subsection{Calculate RTT}
707The calculation of the round trip time (RTT) depends on several parameters.
708
709\subsubsection{usrsctp\_sysctl\_set\_sctp\_rttvar\_bw()}
710TBD
711Shift amount for bw smoothing on rtt calc. Default: 4
712
713\subsubsection{usrsctp\_sysctl\_set\_sctp\_rttvar\_rtt()}
714TBD
715Shift amount for rtt smoothing on rtt calc. Default: 5
716
717\subsubsection{usrsctp\_sysctl\_set\_sctp\_rttvar\_eqret()}
718TBD
719What to return when rtt and bw are unchanged. Default: 0
720
721
722\subsection{Influence the Congestion Control}
723The congestion control should protect the network against fast senders.
724
725\subsubsection{usrsctp\_sysctl\_set\_sctp\_ecn\_enable}
726Explicit congestion notifications are turned on by default.
727
728\subsubsection{usrsctp\_sysctl\_set\_sctp\_default\_cc\_module()}
729This parameter sets the default algorithm for the congestion control.
730Default is 0, i.e. the one specified in RFC~4960.
731
732\subsubsection{usrsctp\_sysctl\_set\_sctp\_initial\_cwnd()}
733Set the initial congestion window in MTUs. The default is 3.
734
735\subsubsection{usrsctp\_sysctl\_set\_sctp\_use\_dccc\_ecn()}
736TBD
737Enable for RTCC CC datacenter ECN. Default: 1
738
739\subsubsection{usrsctp\_sysctl\_set\_sctp\_steady\_step()}
740TBD
741How many the sames it takes to try step down of cwnd. Default: 20
742
743
744\subsection{Configure AUTH and ADD-IP}
745An important extension of SCTP is the dynamic address reconfiguration~\cite{addip}, also known as
746ADD-IP, which allows the changing of addresses during the lifetime of an association.
747For this feature the AUTH extension~\cite{auth} is necessary.
748
749\subsubsection{usrsctp\_sysctl\_set\_sctp\_auto\_asconf()}
750If SCTP Auto-ASCONF is enabled, the peer is informed automatically when a new address
751is added or removed. This feature is enabled by default.
752
753\subsubsection{usrsctp\_sysctl\_set\_sctp\_multiple\_asconfs()}
754By default the sending of multiple ASCONFs is disabled.
755
756\subsubsection{usrsctp\_sysctl\_set\_sctp\_auth\_disable()}
757The use of AUTH, which is normally turned on, can be disabled by setting this parameter to 1.
758
759\subsubsection{usrsctp\_sysctl\_set\_sctp\_asconf\_auth\_nochk()}
760It is also possible to disable the requirement to use AUTH in conjunction with ADD-IP by setting this parameter
761to 1.
762
763
764\subsection{Concurrent Multipath Transfer (CMT)}
765A prominent feature of SCTP is the possibility to use several addresses for the same association.
766One is the primary path, and the others are needed in case of a path failure. Using CMT the data is sent
767on several paths to enhance the throughput.
768
769\subsubsection{usrsctp\_sysctl\_set\_sctp\_cmt\_on\_off()}
770To turn CMT on, this parameter has to be set to 1.
771
772\subsubsection{usrsctp\_sysctl\_set\_sctp\_cmt\_use\_dac()}
773To use delayed acknowledgments with CMT this parameter has to be set to 1.
774
775\subsubsection{usrsctp\_sysctl\_set\_sctp\_buffer\_splitting()}
776For CMT it makes sense to split the send and receive buffer to have shares for each path.
777By default buffer splitting is turned off.
778
779
780\subsection{Network Address Translation (NAT)}
781To be able to pass NAT boxes, the boxes have to handle SCTP packets in a specific way.
782
783\subsubsection{usrsctp\_sysctl\_set\_sctp\_nat\_friendly()}
784SCTP NAT friendly operation. Default:1
785
786\subsubsection{usrsctp\_sysctl\_set\_sctp\_inits\_include\_nat\_friendly()}
787Enable sending of the nat-friendly SCTP option on INITs. Default: 0
788
789\subsubsection{usrsctp\_sysctl\_set\_sctp\_udp\_tunneling\_port()}
790Set the SCTP/UDP tunneling port. Default: 9899
791
792\subsection{SCTP Mobility}
793\subsubsection{usrsctp\_sysctl\_set\_sctp\_mobility\_base()}
794TBD
795Enable SCTP base mobility. Default: 0
796
797
798\subsubsection{usrsctp\_sysctl\_set\_sctp\_mobility\_fasthandoff()}
799TBD
800Enable SCTP fast handoff. default: 0
801
802
803\subsection{Miscellaneous}
804\subsubsection{usrsctp\_sysctl\_set\_sctp\_no\_csum\_on\_loopback()}
805Calculating the checksum for packets sent on loopback is turned off by default.
806To turn it on, set this parameter to 0.
807
808\subsubsection{usrsctp\_sysctl\_set\_sctp\_nr\_outgoing\_streams\_default()}
809The peer is notified about the number of outgoing streams in the INIT or INIT-ACK chunk.
810The default is 10.
811
812\subsubsection{usrsctp\_sysctl\_set\_sctp\_do\_drain()}
813Determines whether SCTP should respond to the drain calls. Default: 1
814
815\subsubsection{usrsctp\_sysctl\_set\_sctp\_strict\_data\_order()}
816TBD
817Enforce strict data ordering, abort if control inside data. Default: 0
818
819\subsubsection{usrsctp\_sysctl\_set\_sctp\_default\_ss\_module()}
820Set the default stream scheduling module. Implemented modules are:
821SCTP\_SS\_DEFAULT, SCTP\_SS\_ROUND\_ROBIN, SCTP\_SS\_ROUND\_ROBIN\_PACKET,
822SCTP\_SS\_PRIORITY, SCTP\_SS\_FAIR\_BANDWITH, and SCTP\_SS\_FIRST\_COME.
823
824\subsubsection{usrsctp\_sysctl\_set\_sctp\_default\_frag\_interleave()}
825TBD
826Default fragment interleave level. Default: 1
827
828\subsubsection{usrsctp\_sysctl\_set\_sctp\_blackhole()}
829TBD
830Enable SCTP blackholing. Default: 0
831
832\subsubsection{usrsctp\_sysctl\_set\_sctp\_logging\_level()}
833Set the logging level. The default is 0.
834
835
836\subsubsection{usrsctp\_sysctl\_set\_sctp\_debug\_on()}
837Turn debug output on or off. It is disabled by default. To obtain debug output,
838SCTP\_DEBUG has to be set as a compile flag.
839
840
841%The following variables are supported:
842%\begin{longtable}{|l|l|c|}
843%\hline
844%{\bfseries Parameter}&{\bfseries Meaning}&{\bfseries Default Value} \tabularnewline
845%\endhead
846%\hline
847%sctp\_sendspace&Send buffer space&1864135\tabularnewline \hline
848%sctp\_recvspace&Receive buffer space&1864135 \tabularnewline \hline
849%sctp\_hashtblsize&Tunable for TCB hash table sizes&1024 \tabularnewline \hline
850%sctp\_pcbtblsize&Tunable for PCB hash table sizes&256 \tabularnewline \hline
851%sctp\_system\_free\_resc\_limit&Cached resources in the system&1000 \tabularnewline \hline
852%sctp\_asoc\_free\_resc\_limit&Cashed resources in an association&10 \tabularnewline \hline
853%sctp\_rto\_max\_default&Default value for RTO\_max&60000~ms \tabularnewline \hline
854%sctp\_rto\_min\_default&Default value for RTO\_min&1000~ms \tabularnewline \hline
855%sctp\_rto\_initial\_default&Default value for RTO\_initial&3000~ms \tabularnewline \hline
856%sctp\_init\_rto\_max\_default&Default value for the maximum RTO&60000~ms \tabularnewline
857 %                                                  &for sending an INIT& \tabularnewline \hline
858%sctp\_valid\_cookie\_life\_default&Valid cookie life time&60000~ms \tabularnewline \hline
859%sctp\_init\_rtx\_max\_default&Maximum number of INIT retransmissions&8 \tabularnewline \hline
860%sctp\_assoc\_rtx\_max\_default&Maximum number of failed retransmissions&10\tabularnewline
861%						& before the association is aborted&\tabularnewline \hline
862%sctp\_path\_rtx\_max\_default&Maximum number of failed retransmissions&5\tabularnewline
863%						&before a path fails&\tabularnewline \hline
864%sctp\_ecn\_enable&Enabling explicit congestion notifications&1\tabularnewline \hline
865%sctp\_strict\_sacks&Control the coherence of SACKs&1 \tabularnewline \hline
866%sctp\_delayed\_sack\_time\_default&Default delayed SACK timer&200~ms\tabularnewline \hline
867%sctp\_sack\_freq\_default&Default SACK frequency&2 \tabularnewline \hline
868%sctp\_nr\_sack\_on\_off&Turn non-renegable SACKs on or off&0 \tabularnewline \hline
869%sctp\_enable\_sack\_immediately&Enable sending of the SACK-&0 \tabularnewline 						&IMMEDIATELY bit.&\tabularnewline \hline
870%sctp\_no\_csum\_on\_loopback&Enable the compilation of the checksum on&1 \tabularnewline
871%						&packets sent on loopback&\tabularnewline \hline
872%sctp\_peer\_chunk\_oh&Amount to debit peers rwnd per chunk sent&256 \tabularnewline \hline
873%sctp\_max\_burst\_default&Default max burst for SCTP endpoints&0 \tabularnewline \hline
874%sctp\_use\_cwnd\_based\_maxburst&Use max burst based on the size of &1\tabularnewline				%							&the congestion window&\tabularnewline \hline
875%sctp\_hb\_maxburst&Confirmation Heartbeat max burst&4 \tabularnewline \hline
876%sctp\_max\_chunks\_on\_queue&Default max chunks on queue per asoc&512 \tabularnewline \hline
877%sctp\_min\_split\_point&Minimum size when splitting a chunk&2904 \tabularnewline \hline
878%sctp\_chunkscale&Tunable for Scaling of number of chunks and&10\tabularnewline
879%						&messages&\tabularnewline \hline
880%sctp\_mbuf\_threshold\_count&Maximum number of small mbufs in a chain&5\tabularnewline \hline
881%sctp\_heartbeat\_interval\_default&Deafult time between two Heartbeats&30000~ms\tabularnewline \hline
882%sctp\_pmtu\_raise\_time\_default&Default PMTU raise timer&600~secs\tabularnewline \hline
883%sctp\_shutdown\_guard\_time\_default&Default shutdown guard timer&180~secs\tabularnewline \hline
884%sctp\_secret\_lifetime\_default&Default secret lifetime&3600~secs \tabularnewline \hline
885%sctp\_add\_more\_threshold&Threshold when more space should &1452\tabularnewline
886%						&be added to a socket send buffer&\tabularnewline \hline
887%sctp\_nr\_outgoing\_streams\_default&Default number of outgoing streams&10\tabularnewline \hline
888%sctp\_cmt\_on\_off&Turn CMT on or off.&0\tabularnewline \hline
889%sctp\_cmt\_use\_dac&Use delayed acknowledgment for CMT&0\tabularnewline \hline
890%sctp\_fr\_max\_burst\_default&Default max burst for SCTP endpoints when &4\tabularnewline
891%						&fast retransmitting&\tabularnewline \hline
892%sctp\_auto\_asconf&Enable SCTP Auto-ASCONF&1\tabularnewline \hline
893%sctp\_multiple\_asconfs&Enable SCTP Muliple-ASCONFs&0 \tabularnewline \hline
894%sctp\_asconf\_auth\_nochk&Disable SCTP ASCONF AUTH requirement&0\tabularnewline \hline
895%sctp\_auth\_disable&Disable SCTP AUTH function&0\tabularnewline \hline
896%sctp\_nat\_friendly&SCTP NAT friendly operation&1\tabularnewline \hline
897%sctp\_inits\_include\_nat\_friendly&Enable sending of the nat-friendly &0\tabularnewline
898%					&SCTP option on INITs.&\tabularnewline \hline
899%sctp\_udp\_tunneling\_port&Set the SCTP/UDP tunneling port&9899\tabularnewline \hline
900%sctp\_do\_drain&Determines whether SCTP should respond&1\tabularnewline
901%					&to the drain calls&\tabularnewline \hline
902%sctp\_abort\_if\_one\_2\_one\_hits\_limit&When one-2-one hits qlimit abort&0 \tabularnewline \hline
903%sctp\_strict\_data\_order&Enforce strict data ordering, abort if control&0\tabularnewline
904%					&inside data&\tabularnewline \hline
905%sctp\_min\_residual&Minimum residual data chunk in second&1452\tabularnewline
906%					&part of split&\tabularnewline \hline
907%sctp\_max\_retran\_chunk&Maximum times an unlucky chunk can be&30\tabularnewline
908%				& retransmitted before the association aborts&\tabularnewline \hline
909%sctp\_default\_cc\_module&Default congestion control module&0\tabularnewline \hline
910%sctp\_default\_ss\_module&Default stream scheduling module&0 \tabularnewline \hline
911%sctp\_default\_frag\_interleave&Default fragment interleave level&1\tabularnewline \hline
912%sctp\_mobility\_base&Enable SCTP base mobility&0\tabularnewline \hline
913%sctp\_mobility\_fasthandoff&Enable SCTP fast handoff&0\tabularnewline \hline
914%sctp\_L2\_abc\_variable&SCTP ABC max increase per SACK (L)&1\tabularnewline \hline
915%sctp\_vtag\_time\_wait&Vtag time wait time, 0 disables it.&60~secs\tabularnewline \hline
916%sctp\_blackhole&Enable SCTP blackholing&0\tabularnewline \hline
917%sctp\_path\_pf\_threshold&Default potentially failed threshold&65535\tabularnewline \hline
918%sctp\_rttvar\_bw&Shift amount for bw smoothing on rtt calc&4 \tabularnewline \hline
919%sctp\_rttvar\_rtt&Shift amount for rtt smoothing on rtt calc&5 \tabularnewline \hline
920%sctp\_rttvar\_eqret &What to return when rtt and bw are&0\tabularnewline
921%					&unchanged&\tabularnewline \hline
922%sctp\_steady\_step&How many the sames it takes to try step&20\tabularnewline
923%					&down of cwnd&\tabularnewline \hline
924%sctp\_use\_dccc\_ecn&Enable for RTCC CC datacenter ECN&1 \tabularnewline \hline
925%sctp\_buffer\_splitting&Enable send/receive buffer splitting&0 \tabularnewline \hline
926%sctp\_initial\_cwnd&Initial congestion window in MTUs&3\tabularnewline \hline
927%sctp\_logging\_level&Logging level&0 \tabularnewline \hline
928%sctp\_debug\_on&Turns debug output on or off.&0 \tabularnewline \hline
929
930%\caption{Sysctl variables supported by usrsctp}
931%\end{longtable}
932
933\section{Examples}
934\subsection{Discard Server}\label{server}
935\begin{verbatim}
936/*
937 * Copyright (C) 2011-2012 Michael Tuexen
938 *
939 * All rights reserved.
940 *
941 * Redistribution and use in source and binary forms, with or without
942 * modification, are permitted provided that the following conditions
943 * are met:
944 * 1. Redistributions of source code must retain the above copyright
945 *    notice, this list of conditions and the following disclaimer.
946 * 2. Redistributions in binary form must reproduce the above copyright
947 *    notice, this list of conditions and the following disclaimer in the
948 *    documentation and/or other materials provided with the distribution.
949 * 3. Neither the name of the project nor the names of its contributors
950 *    may be used to endorse or promote products derived from this software
951 *    without specific prior written permission.
952 *
953 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
954 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
955 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
956 * ARE DISCLAIMED.	IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
957 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
958 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
959 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
960 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
961 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
962 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
963 * SUCH DAMAGE.
964 */
965
966/*
967 * Usage: discard_server [local_encaps_port] [remote_encaps_port]
968 */
969
970#include <stdio.h>
971#include <stdlib.h>
972#include <string.h>
973#include <sys/types.h>
974#if !defined(_WIN32)
975#include <unistd.h>
976#include <sys/socket.h>
977#include <netinet/in.h>
978#include <arpa/inet.h>
979#endif
980#include <usrsctp.h>
981
982#define BUFFER_SIZE 10240
983
984const int use_cb = 0;
985
986static int
987receive_cb(struct socket *sock, union sctp_sockstore addr, void *data,
988           size_t datalen, struct sctp_rcvinfo rcv, int flags)
989{
990    char name[INET6_ADDRSTRLEN];
991
992    if (data) {
993        if (flags & MSG_NOTIFICATION) {
994            printf("Notification of length %d received.\n", (int)datalen);
995        } else {
996            printf("Msg of length %d received from %s:%u on stream %d with "
997                   "SSN %u and TSN %u, PPID %d, context %u.\n",
998                   (int)datalen,
999                   addr.sa.sa_family == AF_INET ?
1000                       inet_ntop(AF_INET, &addr.sin.sin_addr, name,
1001                                 INET6_ADDRSTRLEN):
1002                       inet_ntop(AF_INET6, &addr.sin6.sin6_addr, name,
1003                                 INET6_ADDRSTRLEN),
1004                   ntohs(addr.sin.sin_port),
1005                   rcv.rcv_sid,
1006                   rcv.rcv_ssn,
1007                   rcv.rcv_tsn,
1008                   ntohl(rcv.rcv_ppid),
1009                   rcv.rcv_context);
1010        }
1011        free(data);
1012    }
1013    return 1;
1014}
1015
1016int
1017main(int argc, char *argv[])
1018{
1019    struct socket *sock;
1020    struct sockaddr_in6 addr;
1021    struct sctp_udpencaps encaps;
1022    struct sctp_event event;
1023    uint16_t event_types[] = {SCTP_ASSOC_CHANGE,
1024	                              SCTP_PEER_ADDR_CHANGE,
1025	                              SCTP_REMOTE_ERROR,
1026	                              SCTP_SHUTDOWN_EVENT,
1027	                              SCTP_ADAPTATION_INDICATION,
1028	                              SCTP_PARTIAL_DELIVERY_EVENT};
1029    unsigned int i;
1030    struct sctp_assoc_value av;
1031    const int on = 1;
1032    int n, flags;
1033    socklen_t from_len;
1034    char buffer[BUFFER_SIZE];
1035    char name[INET6_ADDRSTRLEN];
1036    struct sctp_recvv_rn rn;
1037    socklen_t infolen = sizeof(struct sctp_recvv_rn);
1038    struct sctp_rcvinfo rcv;
1039    struct sctp_nxtinfo nxt;
1040    unsigned int infotype = 0;
1041
1042    if (argc > 1) {
1043        usrsctp_init(atoi(argv[1]));
1044    } else {
1045        usrsctp_init(9899);
1046    }
1047    usrsctp_sysctl_set_sctp_debug_on(0);
1048    usrsctp_sysctl_set_sctp_blackhole(2);
1049
1050    if ((sock = usrsctp_socket(AF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP,
1051    	                          use_cb?receive_cb:NULL, NULL, 0)) == NULL) {
1052        perror("userspace_socket");
1053    }
1054    if (usrsctp_setsockopt(sock, IPPROTO_SCTP, SCTP_I_WANT_MAPPED_V4_ADDR,
1055                           (const void*)&on, (socklen_t)sizeof(int)) < 0) {
1056        perror("setsockopt");
1057    }
1058    memset(&av, 0, sizeof(struct sctp_assoc_value));
1059    av.assoc_id = SCTP_ALL_ASSOC;
1060    av.assoc_value = 47;
1061
1062    if (usrsctp_setsockopt(sock, IPPROTO_SCTP, SCTP_CONTEXT, (const void*)&av,
1063                           (socklen_t)sizeof(struct sctp_assoc_value)) < 0) {
1064        perror("setsockopt");
1065    }
1066    if (argc > 2) {
1067        memset(&encaps, 0, sizeof(struct sctp_udpencaps));
1068        encaps.sue_address.ss_family = AF_INET6;
1069        encaps.sue_port = htons(atoi(argv[2]));
1070        if (usrsctp_setsockopt(sock, IPPROTO_SCTP, SCTP_REMOTE_UDP_ENCAPS_PORT,
1071                               (const void*)&encaps,
1072                               (socklen_t)sizeof(struct sctp_udpencaps)) < 0) {
1073            perror("setsockopt");
1074        }
1075    }
1076    memset(&event, 0, sizeof(event));
1077    event.se_assoc_id = SCTP_FUTURE_ASSOC;
1078    event.se_on = 1;
1079    for (i = 0; i < (unsigned int)(sizeof(event_types)/sizeof(uint16_t)); i++) {
1080        event.se_type = event_types[i];
1081        if (usrsctp_setsockopt(sock, IPPROTO_SCTP, SCTP_EVENT, &event,
1082                               sizeof(struct sctp_event)) < 0) {
1083            perror("userspace_setsockopt");
1084        }
1085    }
1086    memset((void *)&addr, 0, sizeof(struct sockaddr_in6));
1087#ifdef HAVE_SIN_LEN
1088    addr.sin6_len = sizeof(struct sockaddr_in6);
1089#endif
1090    addr.sin6_family = AF_INET6;
1091    addr.sin6_port = htons(9);
1092    addr.sin6_addr = in6addr_any;
1093    if (usrsctp_bind(sock, (struct sockaddr *)&addr,
1094                     sizeof(struct sockaddr_in6)) < 0) {
1095        perror("userspace_bind");
1096    }
1097    if (usrsctp_listen(sock, 1) < 0) {
1098        perror("userspace_listen");
1099    }
1100    while (1) {
1101        if (use_cb) {
1102#if defined(_WIN32)
1103            Sleep(1*1000);
1104#else
1105            sleep(1);
1106#endif
1107        } else {
1108            from_len = (socklen_t)sizeof(struct sockaddr_in6);
1109            flags = 0;
1110            rn.recvv_rcvinfo = rcv;
1111            rn.recvv_nxtinfo = nxt;
1112            n = usrsctp_recvv(sock, (void*)buffer, BUFFER_SIZE,
1113                              (struct sockaddr *) &addr, &from_len, (void *)&rn,
1114	                     &infolen, &infotype, &flags);
1115            if (n > 0) {
1116                if (flags & MSG_NOTIFICATION) {
1117                    printf("Notification of length %d received.\n", n);
1118                } else {
1119                    printf("Msg of length %d received from %s:%u on stream "
1120                           "%d with SSN %u and TSN %u, PPID %d, context %u, "
1121                           "complete %d.\n",
1122                           n,
1123                           inet_ntop(AF_INET6, &addr.sin6_addr, name,
1124                                     INET6_ADDRSTRLEN), ntohs(addr.sin6_port),
1125                           rn.recvv_rcvinfo.rcv_sid,
1126                           rn.recvv_rcvinfo.rcv_ssn,
1127                           rn.recvv_rcvinfo.rcv_tsn,
1128                           ntohl(rn.recvv_rcvinfo.rcv_ppid),
1129                           rn.recvv_rcvinfo.rcv_context,
1130                           (flags & MSG_EOR) ? 1 : 0);
1131                }
1132            }
1133        }
1134    }
1135    usrsctp_close(sock);
1136    while (usrsctp_finish() != 0) {
1137#if defined(_WIN32)
1138        Sleep(1000);
1139#else
1140        sleep(1);
1141#endif
1142    }
1143    return (0);
1144}
1145
1146\end{verbatim}
1147
1148\subsection{Client}\label{client}
1149\begin{verbatim}
1150/*
1151 * Copyright (C) 2011-2012 Michael Tuexen
1152 *
1153 * All rights reserved.
1154 *
1155 * Redistribution and use in source and binary forms, with or without
1156 * modification, are permitted provided that the following conditions
1157 * are met:
1158 * 1. Redistributions of source code must retain the above copyright
1159 *    notice, this list of conditions and the following disclaimer.
1160 * 2. Redistributions in binary form must reproduce the above copyright
1161 *    notice, this list of conditions and the following disclaimer in the
1162 *    documentation and/or other materials provided with the distribution.
1163 * 3. Neither the name of the project nor the names of its contributors
1164 *    may be used to endorse or promote products derived from this software
1165 *    without specific prior written permission.
1166 *
1167 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
1168 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1169 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1170 * ARE DISCLAIMED.	IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
1171 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1172 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1173 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1174 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1175 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1176 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1177 * SUCH DAMAGE.
1178 */
1179
1180/*
1181 * Usage: client remote_addr remote_port [local_encaps_port remote_encaps_port]
1182 */
1183
1184#include <stdio.h>
1185#include <stdlib.h>
1186#include <string.h>
1187#if !defined(_WIN32)
1188#include <unistd.h>
1189#endif
1190#include <sys/types.h>
1191#if !defined(_WIN32)
1192#include <sys/socket.h>
1193#include <netinet/in.h>
1194#include <arpa/inet.h>
1195#endif
1196#include <usrsctp.h>
1197
1198int done = 0;
1199
1200static int
1201receive_cb(struct socket *sock, union sctp_sockstore addr, void *data,
1202           size_t datalen, struct sctp_rcvinfo rcv, int flags)
1203{
1204    if (data == NULL) {
1205        done = 1;
1206        usrsctp_close(sock);
1207    } else {
1208        write(fileno(stdout), data, datalen);
1209        free(data);
1210    }
1211    return 1;
1212}
1213
1214int
1215main(int argc, char *argv[])
1216{
1217    struct socket *sock;
1218    struct sockaddr_in addr4;
1219    struct sockaddr_in6 addr6;
1220    struct sctp_udpencaps encaps;
1221    char buffer[80];
1222
1223    if (argc > 3) {
1224        usrsctp_init(atoi(argv[3]));
1225    } else {
1226        usrsctp_init(9899);
1227    }
1228    usrsctp_sysctl_set_sctp_debug_on(0);
1229    usrsctp_sysctl_set_sctp_blackhole(2);
1230    if ((sock = usrsctp_socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP,
1231                               receive_cb, NULL, 0)) == NULL) {
1232        perror("userspace_socket ipv6");
1233    }
1234    if (argc > 4) {
1235        memset(&encaps, 0, sizeof(struct sctp_udpencaps));
1236        encaps.sue_address.ss_family = AF_INET6;
1237        encaps.sue_port = htons(atoi(argv[4]));
1238        if (usrsctp_setsockopt(sock, IPPROTO_SCTP, SCTP_REMOTE_UDP_ENCAPS_PORT,
1239                               (const void*)&encaps,
1240                               (socklen_t)sizeof(struct sctp_udpencaps)) < 0) {
1241            perror("setsockopt");
1242        }
1243    }
1244    memset((void *)&addr4, 0, sizeof(struct sockaddr_in));
1245    memset((void *)&addr6, 0, sizeof(struct sockaddr_in6));
1246#if !defined(__linux__) && !defined(_WIN32)
1247    addr4.sin_len = sizeof(struct sockaddr_in);
1248    addr6.sin6_len = sizeof(struct sockaddr_in6);
1249#endif
1250    addr4.sin_family = AF_INET;
1251    addr6.sin6_family = AF_INET6;
1252    addr4.sin_port = htons(atoi(argv[2]));
1253    addr6.sin6_port = htons(atoi(argv[2]));
1254    if (inet_pton(AF_INET6, argv[1], &addr6.sin6_addr) == 1) {
1255        if (usrsctp_connect(sock, (struct sockaddr *)&addr6,
1256                            sizeof(struct sockaddr_in6)) < 0) {
1257            perror("userspace_connect");
1258        }
1259    } else if (inet_pton(AF_INET, argv[1], &addr4.sin_addr) == 1) {
1260        if (usrsctp_connect(sock, (struct sockaddr *)&addr4,
1261                            sizeof(struct sockaddr_in)) < 0) {
1262            perror("userspace_connect");
1263        }
1264    } else {
1265        printf("Illegal destination address.\n");
1266    }
1267    while ((fgets(buffer, sizeof(buffer), stdin) != NULL) && !done) {
1268        usrsctp_sendv(sock, buffer, strlen(buffer), NULL, 0,
1269				                  NULL, 0, SCTP_SENDV_NOINFO, 0);
1270    }
1271    if (!done) {
1272        usrsctp_shutdown(sock, SHUT_WR);
1273    }
1274    while (!done) {
1275#if defined(_WIN32)
1276        Sleep(1*1000);
1277#else
1278        sleep(1);
1279#endif
1280    }
1281    while (usrsctp_finish() != 0) {
1282#if defined(_WIN32)
1283        Sleep(1000);
1284#else
1285        sleep(1);
1286#endif
1287    }
1288    return(0);
1289}
1290
1291\end{verbatim}
1292\bibliographystyle{plain}
1293%
1294\begin{thebibliography}{99}
1295
1296\bibitem{socketAPI}
1297R.~Stewart, M.~T\"uxen, K.~Poon, and V.~Yasevich:
1298\textit{Sockets API Extensions for the Stream Control Transmission Protocol (SCTP)}.
1299RFC~6458, Dezember~2011.
1300
1301\bibitem{SCTP}
1302R.~Stewart:
1303\textit{Stream Control Transmission Protocol}.
1304RFC~4960, September~2007.
1305
1306
1307\bibitem{auth}
1308M.~T\"uxen, R.~Stewart, P.~Lei, and E.~Rescorla:
1309\textit{Authenticated Chunks for the Stream Control Transmission Protocol (SCTP)}.
1310RFC~4895, August~2007.
1311
1312\bibitem{streamReset}
1313R.~Stewart, M.~T\"uxen, and P.~Lei:
1314\textit{Stream Control Transmission Protocol (SCTP) Stream Reconfiguration}.
1315RFC~6525, February~2012.
1316
1317
1318\bibitem{addip}
1319R.~Stewart,  Q.~Xie, M.~T\"uxen, S.~Maruyama, and M.~Kozuka:
1320\textit{Stream Control Transmission Protocol (SCTP) Dynamic Address Reconfiguration}.
1321RFC~5061, September~2007.
1322
1323\bibitem{sack-imm}
1324M.~T\"uxen, I.~R\"ungeler, and R.~Stewart:
1325\textit{SACK-IMMEDIATELY Extension for the Stream Control Transmission Protocol}.
1326draft-tuexen-tsvwg-sctp-sack-immediately-09 (work in progress), April~2012.
1327
1328\bibitem{udpencaps}
1329M.~T\"uxen and R.~Stewart
1330\textit{UDP Encapsulation of SCTP Packetsl}.
1331draft-ietf-tsvwg-sctp-udp-encaps-03 (work in progress), March~2012.
1332
1333\end{thebibliography}
1334\end{document}
1335