1 /* SCTP kernel Implementation: User API extensions.
5 * Distributed under the terms of the LGPL v2.1 as described in
6 * http://www.gnu.org/copyleft/lesser.txt.
8 * This file is part of the user library that offers support for the
9 * SCTP kernel Implementation. The main purpose of this
10 * code is to provide the SCTP Socket API mappings for user
11 * application to interface with the SCTP in kernel.
13 * This implementation is based on the Socket API Extensions for SCTP
14 * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
16 * (C) Copyright IBM Corp. 2001, 2005
18 * Written or modified by:
19 * Frank Filz <ffilz@us.ibm.com>
22 #include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
23 #include <netinet/in.h>
24 #include <netinet/sctp.h> /* SCTP_SOCKOPT_CONNECTX_* */
28 /* Support the sctp_connectx() interface.
30 * See Sockets API Extensions for SCTP. Section 8.1.
32 * Instead of implementing through a socket call in sys_socketcall(),
33 * tunnel the request through setsockopt().
35 static int __connectx_addrsize(const struct sockaddr *addrs,
39 struct sockaddr *sa_addr;
44 for (i = 0; i < addrcnt; i++) {
45 sa_addr = (struct sockaddr *)addrbuf;
46 switch (sa_addr->sa_family) {
48 addrs_size += sizeof(struct sockaddr_in);
49 addrbuf += sizeof(struct sockaddr_in);
52 addrs_size += sizeof(struct sockaddr_in6);
53 addrbuf += sizeof(struct sockaddr_in6);
65 int __sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt)
67 socklen_t addrs_size = __connectx_addrsize(addrs, addrcnt);
72 return setsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_CONNECTX_OLD, addrs,
76 extern int sctp_connectx_orig (int)
77 __attribute ((alias ("__sctp_connectx")));
79 int sctp_connectx_new(int fd, struct sockaddr *addrs, int addrcnt,
82 socklen_t addrs_size = __connectx_addrsize(addrs, addrcnt);
91 status = setsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_CONNECTX, addrs,
94 /* the kernel doesn't support the new connectx interface */
95 if (status < 0 && errno == ENOPROTOOPT)
96 return setsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_CONNECTX_OLD,
99 /* Normalize status and set association id */
109 __asm__(".symver __sctp_connectx, sctp_connectx@");
110 __asm__(".symver sctp_connectx_orig, sctp_connectx@VERS_1");
111 __asm__(".symver sctp_connectx_new, sctp_connectx@@VERS_2");