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__ */
