Squashed 'third_party/lksctp-tools/' content from commit 200eca7f1

Change-Id: I8f7575513f114b205178cac5c6b3706f3d725cb5
git-subtree-dir: third_party/lksctp-tools
git-subtree-split: 200eca7f1419b1ae53958b51e8551f7e7f6cd467
diff --git a/src/testlib/sctputil.h b/src/testlib/sctputil.h
new file mode 100644
index 0000000..9dbabd4
--- /dev/null
+++ b/src/testlib/sctputil.h
@@ -0,0 +1,358 @@
+/* SCTP kernel Implementation
+ * (C) Copyright IBM Corp. 2001, 2003
+ * Copyright (c) 1999-2000 Cisco, Inc.
+ * Copyright (c) 1999-2001 Motorola, Inc.
+ * Copyright (c) 2001 Intel Corp.
+ * Copyright (c) 2001 Nokia, Inc.
+ * Copyright (c) 2001 La Monte H.P. Yarroll
+ * 
+ * The SCTP implementation is free software;
+ * you can redistribute it and/or modify it under the terms of
+ * the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * The SCTP implementation is distributed in the hope that it
+ * will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ *                 ************************
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU CC; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Please send any bug reports or fixes you make to the
+ * email address(es):
+ *    lksctp developers <lksctp-developers@lists.sourceforge.net>
+ *
+ * Or submit a bug report through the following website:
+ *    http://www.sf.net/projects/lksctp
+ *
+ * Any bugs reported to us we will try to fix... any fixes shared will
+ * be incorporated into the next SCTP release.
+ *
+ * Written or modified by:
+ *    La Monte H.P. Yarroll <piggy@acm.org>
+ *    Karl Knutson <karl@athena.chicago.il.us>
+ *    Randall Stewart <randall@stewart.chicago.il.us>
+ *    Ken Morneau <kmorneau@cisco.com>
+ *    Qiaobing Xie <qxie1@motorola.com>
+ *    Daisy Chang <daisyc@us.ibm.com>
+ *    Jon Grimm <jgrimm@us.ibm.com>
+ *    Sridhar Samudrala <samudrala@us.ibm.com>
+ *    Hui Huang <hui.huang@nokia.com>
+ */
+
+#ifndef __sctputil_h__
+#define __sctputil_h__
+
+#ifdef LTP
+#include <test.h>
+#include <usctest.h>
+#endif
+
+#include <string.h>
+
+typedef union {
+	struct sockaddr_in v4;	
+	struct sockaddr_in6 v6;
+	struct sockaddr sa;	
+} sockaddr_storage_t;
+
+
+#define REALLY_BIG 65536
+
+/* Literal defines.  */
+#ifdef PROT_SOCK
+#define SCTP_TESTPORT_1 PROT_SOCK
+#else
+#define SCTP_TESTPORT_1 1024 
+#endif
+#define SCTP_TESTPORT_2 (SCTP_TESTPORT_1+1)
+
+#define SCTP_IP_BCAST  	htonl(0xffffffff)
+#define SCTP_IP_LOOPBACK  htonl(0x7f000001)
+
+/* These are stolen from <netinet/in.h>.  */
+#define SCTP_IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
+#define SCTP_IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
+
+/* Display an IPv4 address in readable format.  */
+#define NIPQUAD(addr) \
+        ((unsigned char *)&addr)[0], \
+        ((unsigned char *)&addr)[1], \
+        ((unsigned char *)&addr)[2], \
+        ((unsigned char *)&addr)[3]
+
+/* Display an IPv6 address in readable format.  */
+#define NIP6(addr) \
+        ntohs((addr).s6_addr16[0]), \
+        ntohs((addr).s6_addr16[1]), \
+        ntohs((addr).s6_addr16[2]), \
+        ntohs((addr).s6_addr16[3]), \
+        ntohs((addr).s6_addr16[4]), \
+        ntohs((addr).s6_addr16[5]), \
+        ntohs((addr).s6_addr16[6]), \
+        ntohs((addr).s6_addr16[7])
+
+#define DUMP_CORE { 					 \
+	char *diediedie = 0;				 \
+	printf("DUMP_CORE %s: %d\n", __FILE__, __LINE__);\
+	*diediedie = 0;					 \
+}
+
+#ifndef LTP
+enum {
+	TPASS,
+	TINFO,
+};
+
+extern char *TCID;
+extern int TST_TOTAL;
+extern int TST_CNT;
+
+#define tst_brkm(a1, a2, whatever...) \
+	{ \
+		printf("%s %2d BROK : ", TCID, ++TST_CNT); \
+		printf(whatever); \
+		printf("\n"); \
+		DUMP_CORE \
+	}
+#define tst_resm(a1, whatever...) \
+	{ \
+		printf("%s %2d %s : ", TCID, \
+			 (a1 == TPASS)?++TST_CNT:0, \
+			 (a1 == TPASS)?"PASS":"INFO"); \
+		printf(whatever); \
+		printf("\n"); \
+	}
+#endif
+
+static inline int test_socket(int domain, int type, int protocol)
+{
+	int sk = socket(domain, type, protocol);
+        if (-1 == sk)
+                tst_brkm(TBROK, tst_exit, "socket: %s", strerror(errno));
+	return sk;
+}
+
+static inline int test_bind(int sk, struct sockaddr *addr, socklen_t addrlen)
+{
+	int error = bind(sk, addr, addrlen);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "bind: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_bindx_add(int sk, struct sockaddr *addr, int count)
+{
+	int error = sctp_bindx(sk, addr, count, SCTP_BINDX_ADD_ADDR);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "bindx (add): %s", strerror(errno));
+	return error;
+}
+
+static inline int test_listen(int sk, int backlog)
+{
+	int error = listen(sk, backlog);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "listen: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_connect(int sk, struct sockaddr *addr, socklen_t addrlen)
+{
+	int error = connect(sk, addr, addrlen);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "connect: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_connectx(int sk, struct sockaddr *addr, int count)
+{
+	int error = sctp_connectx(sk, addr, count, NULL);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "connectx: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_accept(int sk, struct sockaddr *addr, socklen_t *addrlen)
+{
+	int error = accept(sk, addr, addrlen);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "accept: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_send(int sk, const void *msg, size_t len, int flags)
+{
+	int error = send(sk, msg, len, flags);
+        if (len != error)
+                tst_brkm(TBROK, tst_exit, "send: error:%d errno:%d",
+			 error, errno);
+	return error;
+}
+
+static inline int test_sendto(int sk, const void *msg, size_t len, int flags,
+			      const struct sockaddr *to, socklen_t tolen)
+{
+	int error = sendto(sk, msg, len, flags, to, tolen);
+        if (len != error)
+                tst_brkm(TBROK, tst_exit, "sendto: error:%d errno:%d",
+			 error, errno);
+	return error;
+}
+
+static inline int test_sendmsg(int sk, const struct msghdr *msg, int flags,
+			       int msglen)
+{
+	int error = sendmsg(sk, msg, flags);
+        if (msglen != error)
+                tst_brkm(TBROK, tst_exit, "sendmsg: error:%d errno:%d",
+			 error, errno);
+	return error;
+}
+
+static inline int test_recv(int sk, void *buf, size_t len, int flags)
+{
+	int error = recv(sk, buf, len, flags);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "recv: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_recvmsg(int sk, struct msghdr *msg, int flags)
+{
+	int error = recvmsg(sk, msg, flags);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "recvmsg: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_shutdown(int sk, int how)
+{
+	int error = shutdown(sk, how);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "shutdown: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_getsockopt(int sk, int optname, void *optval,
+				  socklen_t *optlen)
+{
+	int error = getsockopt(sk, SOL_SCTP, optname, optval, optlen);
+	if (error)
+		tst_brkm(TBROK, tst_exit, "getsockopt(%d): %s", optname,
+			 strerror(errno));
+	return error;
+}
+
+static inline int test_setsockopt(int sk, int optname, const void *optval,
+				  socklen_t optlen)
+{
+	int error = setsockopt(sk, SOL_SCTP, optname, optval, optlen);
+	if (error)
+		tst_brkm(TBROK, tst_exit, "setsockopt(%d): %s", optname,
+			 strerror(errno));
+	return error;
+}
+
+static inline int test_sctp_peeloff(int sk, sctp_assoc_t assoc_id)
+{
+	int error = sctp_peeloff(sk, assoc_id);
+        if (-1 == error)
+                tst_brkm(TBROK, tst_exit, "sctp_peeloff: %s", strerror(errno));
+	return error;
+}
+
+static inline int test_sctp_sendmsg(int s, const void *msg, size_t len,
+				    struct sockaddr *to, socklen_t tolen,
+				    uint32_t ppid, uint32_t flags,
+				    uint16_t stream_no, uint32_t timetolive,
+				    uint32_t context)
+{
+	int error = sctp_sendmsg(s, msg, len, to, tolen, ppid, flags, stream_no,
+	  		         timetolive, context);
+	if (len != error)
+		tst_brkm(TBROK, tst_exit, "sctp_sendmsg: error:%d errno:%d",
+			 error, errno);
+	return error;			
+}
+
+static inline int test_sctp_send(int s, const void *msg, size_t len,
+				 const struct sctp_sndrcvinfo *sinfo, 
+				 int flags)
+{
+	int error = sctp_send(s, msg, len, sinfo, flags);
+	if (len != error)
+		tst_brkm(TBROK, tst_exit, "sctp_send: error:%d errno:%d",
+			 error, errno);
+	return error;			
+}
+
+#ifdef HAVE_SCTP_SENDV
+static inline int test_sctp_sendv(int s, const struct iovec *iov, int iovcnt,
+				  struct sockaddr *addrs, int addrcnt,
+				  void *info, socklen_t infolen,
+				  unsigned int infotype, int flags)
+{
+	int error = sctp_sendv(s, iov, iovcnt, addrs, addrcnt, info, infolen,
+			       infotype, flags);
+	int i, tlen = 0;
+
+	for (i = 0; i < iovcnt; i++)
+		tlen += iov->iov_len;
+
+	if (tlen != error)
+		tst_brkm(TBROK, tst_exit, "sctp_sendv: error:%d errno:%d",
+			 error, errno);
+	return error;
+}
+#endif
+
+static inline int test_sctp_recvmsg(int sk, void *msg, size_t len,
+				    struct sockaddr *from, socklen_t *fromlen,
+				    struct sctp_sndrcvinfo *sinfo,
+				    int *msg_flags)
+{
+	int error = sctp_recvmsg(sk, msg, len, from, fromlen, sinfo, msg_flags);
+	if (-1 == error)
+		tst_brkm(TBROK, tst_exit, "sctp_recvmsg: %s", strerror(errno));
+	return error;			
+}
+
+#ifdef HAVE_SCTP_SENDV
+static inline int test_sctp_recvv(int s, const struct iovec *iov, int iovlen,
+				  struct sockaddr *from, socklen_t *fromlen,
+				  void *info, socklen_t *infolen,
+				  unsigned int *infotype, int *flags)
+{
+	int error = sctp_recvv(s, iov, iovlen, from, fromlen, info, infolen,
+			       infotype, flags);
+	if (-1 == error)
+		tst_brkm(TBROK, tst_exit, "sctp_recvmsg: %s", strerror(errno));
+	return error;
+}
+#endif
+
+static inline void *test_malloc(size_t size)
+{
+	void *buf = malloc(size);
+        if (NULL == buf)
+                tst_brkm(TBROK, tst_exit, "malloc failed");
+	return buf;
+}
+
+void test_check_msg_notification(struct msghdr *, int, int, uint16_t, uint32_t);
+void test_check_buf_notification(void *, int, int, int, uint16_t, uint32_t);
+void test_check_msg_data(struct msghdr *, int, int, int, uint16_t, uint32_t);
+void test_check_buf_data(void *, int, int, struct sctp_sndrcvinfo *, int, int,
+			 uint16_t, uint32_t);
+void *test_build_msg(int);
+void test_enable_assoc_change(int);
+void test_print_message(int sk, struct msghdr *msg, size_t msg_len);
+int test_peer_addr(int sk, sctp_assoc_t asoc, sockaddr_storage_t *peers, int count);
+
+#endif /* __sctputil_h__ */