aboutsummaryrefslogtreecommitdiff
path: root/testcases
diff options
context:
space:
mode:
Diffstat (limited to 'testcases')
-rw-r--r--testcases/network/sctp/Makefile53
-rw-r--r--testcases/network/sctp/func_tests/Makefile73
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_accept_close.c231
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_addrs.c276
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_connect.c221
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_connectx.c228
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_events.c188
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_initmsg_connect.c119
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_nonblock.c216
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_recvfrom.c193
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_recvmsg.c205
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_rtoinfo.c113
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_send.c228
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_sendmsg.c377
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_sendto.c163
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_shutdown.c215
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_socket_bind_listen.c266
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_sockopt.c413
-rw-r--r--testcases/network/sctp/func_tests/test_1_to_1_threads.c199
-rw-r--r--testcases/network/sctp/func_tests/test_assoc_abort.c242
-rw-r--r--testcases/network/sctp/func_tests/test_assoc_shutdown.c244
-rw-r--r--testcases/network/sctp/func_tests/test_autoclose.c165
-rw-r--r--testcases/network/sctp/func_tests/test_basic.c453
-rw-r--r--testcases/network/sctp/func_tests/test_connect.c212
-rw-r--r--testcases/network/sctp/func_tests/test_connectx.c259
-rw-r--r--testcases/network/sctp/func_tests/test_fragments.c297
-rw-r--r--testcases/network/sctp/func_tests/test_getname.c256
-rw-r--r--testcases/network/sctp/func_tests/test_inaddr_any.c252
-rw-r--r--testcases/network/sctp/func_tests/test_peeloff.c295
-rw-r--r--testcases/network/sctp/func_tests/test_recvmsg.c158
-rw-r--r--testcases/network/sctp/func_tests/test_sctp_sendrecvmsg.c367
-rw-r--r--testcases/network/sctp/func_tests/test_sockopt.c872
-rw-r--r--testcases/network/sctp/func_tests/test_tcp_style.c462
-rw-r--r--testcases/network/sctp/func_tests/test_timetolive.c402
-rw-r--r--testcases/network/sctp/include/netinet/sctp.h674
-rw-r--r--testcases/network/sctp/lib/Makefile31
-rw-r--r--testcases/network/sctp/lib/addrs.c180
-rw-r--r--testcases/network/sctp/lib/bindx.c77
-rw-r--r--testcases/network/sctp/lib/connectx.c61
-rw-r--r--testcases/network/sctp/lib/opt_info.c58
-rw-r--r--testcases/network/sctp/lib/peeloff.c46
-rw-r--r--testcases/network/sctp/lib/recvmsg.c101
-rw-r--r--testcases/network/sctp/lib/sendmsg.c106
-rw-r--r--testcases/network/sctp/testlib/Makefile41
-rw-r--r--testcases/network/sctp/testlib/sctputil.c416
-rw-r--r--testcases/network/sctp/testlib/sctputil.h328
46 files changed, 0 insertions, 11032 deletions
diff --git a/testcases/network/sctp/Makefile b/testcases/network/sctp/Makefile
deleted file mode 100644
index e272806e4..000000000
--- a/testcases/network/sctp/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# network/sctp test suite Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program 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 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Garrett Cooper, July 2009
-#
-
-top_srcdir ?= ../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-
-LIBSCTPDIR := lib
-LIBSCTPUTILDIR := testlib
-LIBSCTP := $(LIBSCTPDIR)/libsctp.a
-LIBSCTPUTIL := $(LIBSCTPUTILDIR)/libsctputil.a
-
-FILTER_OUT_DIRS := $(LIBSCTPDIR) $(LIBSCTPUTILDIR)
-
-$(LIBSCTPDIR) $(LIBSCTPUTILDIR):
- mkdir -p "$@"
-
-lib-clean:: $(LIBSCTPDIR) $(LIBSCTPUTILDIR)
- for i in $^; do \
- $(MAKE) -C "$$i" -f "$(abs_srcdir)/$$i/Makefile" clean; \
- done
-
-
-$(LIBSCTP): $(LIBSCTPDIR)
- $(MAKE) -C "$^" -f "$(abs_srcdir)/$^/Makefile" all
-
-$(LIBSCTPUTIL): $(LIBSCTPUTILDIR)
- $(MAKE) -C "$^" -f "$(abs_srcdir)/$^/Makefile" all
-
-trunk-all: $(LIBSCTP) $(LIBSCTPUTIL)
-
-trunk-clean:: | lib-clean
-
-include $(top_srcdir)/include/mk/generic_trunk_target.mk
diff --git a/testcases/network/sctp/func_tests/Makefile b/testcases/network/sctp/func_tests/Makefile
deleted file mode 100644
index 08b685179..000000000
--- a/testcases/network/sctp/func_tests/Makefile
+++ /dev/null
@@ -1,73 +0,0 @@
-#
-# (C) Copyright IBM Corp. 2001, 2003
-#
-# This program 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 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-
-###########################################################################
-# name of file : Makefile #
-###########################################################################
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/testcases.mk
-
-CPPFLAGS += -I$(abs_srcdir)/../include -I$(abs_srcdir)/../testlib -DLTP
-
-LDFLAGS += $(addprefix -L$(abs_builddir)/../,lib testlib)
-
-LDLIBS += -lsctputil -lsctp -lpthread
-
-V4_TARGETS := $(patsubst $(abs_srcdir)/%.c,%,$(wildcard $(abs_srcdir)/*.c))
-
-V6_TARGETS := test_basic_v6 test_fragments_v6 test_getname_v6 \
- test_inaddr_any_v6 test_peeloff_v6 \
- test_sctp_sendrecvmsg_v6 test_sockopt_v6 \
- test_tcp_style_v6 test_timetolive_v6
-
-$(V6_TARGETS): CPPFLAGS += -DTEST_V6=1
-
-%_v6.o: %.c
- $(COMPILE.c) $(OUTPUT_OPTION) $<
-
-MAKE_TARGETS := $(V4_TARGETS) $(V6_TARGETS)
-
-v4test: $(V4_TARGETS)
- @for a in $^; \
- do \
- echo "./$$a"; \
- if ./$$a; then \
- echo "$$a - passed"; \
- echo ""; \
- else \
- echo "$$a - failed"; \
- exit 1; \
- fi; \
- done
-
-v6test: $(V6_TARGETS)
- @for a in $^; \
- do \
- echo "./$$a"; \
- if ./$$a; then \
- echo "$$a - passed"; \
- echo ""; \
- else \
- echo "$$a - failed"; \
- exit 1; \
- fi; \
- done
-
-include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_accept_close.c b/testcases/network/sctp/func_tests/test_1_to_1_accept_close.c
deleted file mode 100644
index e9a13e72b..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_accept_close.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the accept () and close () call for
- * 1-1 style sockets
- *
- * accept () Tests:
- * ---------------
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Invalid address
- * TEST4: On a non-listening socket
- * TEST5: On a established socket
- * TEST6: On a CLOSED association
- * TEST7: Extracting the association on the listening socket
- *
- * close () Tests:
- * --------------
- * TEST8: Bad socket descriptor
- * TEST9: valid socket descriptor
- * TEST10: Closed socket descriptor
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 10;
-int TST_CNT = 0;
-
-#define SK_MAX 10
-
-int main(int argc, char *argv[])
-{
- socklen_t len;
- int i;
- int sk, lstn_sk, clnt_sk[SK_MAX], acpt_sk, pf_class;
- int new_sk[SK_MAX], clnt2_sk[SK_MAX];
- int error;
-
- struct sockaddr_in conn_addr, lstn_addr, acpt_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- for (i = 0; i < SK_MAX; i++)
- new_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /* Creating a regular socket */
- for (i = 0; i < SK_MAX; i++)
- clnt_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- for (i = 0; i < SK_MAX; i++)
- clnt2_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /* Creating a listen socket */
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /* Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /* Listening many sockets as we are calling too many connect here */
- test_listen(lstn_sk, SK_MAX);
-
- /* connect() is called just to make sure accept() doesn't block the
- * program
- */
- i = 0;
- len = sizeof(struct sockaddr_in);
- test_connect(clnt_sk[i++], (struct sockaddr *)&conn_addr, len);
-
- /* accept() TEST1: Bad socket descriptor EBADF, Expected error */
- error = accept(-1, (struct sockaddr *)&acpt_addr, &len);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "accept with a bad socket descriptor"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() with a bad socket descriptor - EBADF");
-
- /*accept() TEST2: Invalid socket ENOTSOCK, Expected error */
- error = accept(0, (struct sockaddr *)&acpt_addr, &len);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "accept with invalid socket"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() with invalid socket - ENOTSOCK");
-
- /*accept() TEST3: Invalid address EFAULT, Expected error */
- error = accept(lstn_sk, (struct sockaddr *)-1, &len);
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "accept with invalid address"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() with invalid address - EFAULT");
-
- test_connect(clnt_sk[i++], (struct sockaddr *)&conn_addr, len);
-
- /*accept() TEST4: on a non-listening socket EINVAL, Expected error */
- error = accept(sk, (struct sockaddr *)&acpt_addr, &len);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "accept on a non-listening socket"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() on a non-listening socket - EINVAL");
-
- test_connect(clnt_sk[i++], (struct sockaddr *)&conn_addr, len);
-
- /*Calling accept to establish the connection */
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&acpt_addr, &len);
-
- /*accept() TEST5: On a established socket EINVAL, Expected error */
- error = accept(acpt_sk, (struct sockaddr *)&acpt_addr, &len);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "accept on an established socket"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() on an established socket - EINVAL");
-
- /*Closing the previously established association */
- close(acpt_sk);
-
- test_connect(clnt_sk[i], (struct sockaddr *)&conn_addr, len);
-
- /*accept() TEST6: On the CLOSED association should succeed */
- acpt_sk = accept(lstn_sk, (struct sockaddr *)&acpt_addr, &len);
- if (acpt_sk < 0)
- tst_brkm(TBROK, NULL, "accept a closed association"
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() a closed association - SUCCESS");
-
- close(acpt_sk);
-
- /*accept() TEST7: Extracting the association on the listening socket
- as new socket, new socket socket descriptor should return */
- for (i = 0; i < (SK_MAX - 1); i++)
- test_connect(clnt2_sk[i], (struct sockaddr *)&conn_addr, len);
-
- for (i = 0; i < (SK_MAX - 1); i++)
- new_sk[i] = test_accept(lstn_sk, (struct sockaddr *)&acpt_addr,
- &len);
-
- tst_resm(TPASS, "accept() on a listening socket - SUCCESS");
-
- /*close() TEST8: Bad socket descriptor, EBADF Expected error */
- error = close(-1);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "close with a bad socket descriptor "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "close() with a bad socket descriptor - EBADF");
-
- /*close() TEST9: valid socket descriptor should succeed */
- error = close(sk);
- if (error < 0)
- tst_brkm(TBROK, NULL, "close with a valid socket descriptor"
- " error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "close() with a valid socket descriptor - SUCCESS");
-
- /*close() TEST10: closed socket descriptor, EBADF Expected error */
- error = close(sk);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "close with a closed socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "close() with a closed socket descriptor - EBADF");
-
- for (i = 0; i < SK_MAX; i++) {
- close(clnt_sk[i]);
- close(new_sk[i]);
- close(clnt2_sk[i]);
- }
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_addrs.c b/testcases/network/sctp/func_tests/test_1_to_1_addrs.c
deleted file mode 100644
index 7b3b86f75..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_addrs.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the sctp_getladdrs (), sctp_freealddrs (),
- * sctp_getpaddrs (), sctp_freeapaddrs () for 1-1 style sockets
- *
- * sctp_getladdrs () Tests:
- * -----------------------
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Socket of different protocol
- * TEST4: Getting the local addresses
- *
- * sctp_freealddrs () Tests:
- * ------------------------
- * TEST5: Freeing the local address
- *
- * sctp_getpaddrs () Tests:
- * -----------------------
- * TEST6: Bad socket descriptor
- * TEST7: Invalid socket
- * TEST8: Socket of different protocol
- * TEST9: Getting the peers addresses
- *
- * sctp_freeapddrs () Tests:
- * ------------------------
- * TEST10: Freeing the peer's address
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 10;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int error;
- socklen_t len;
- int sk, lstn_sk, clnt_sk, acpt_sk, pf_class, sk1;
- struct msghdr outmessage;
- struct msghdr inmessage;
- char *message = "hello, world!\n";
- struct iovec iov;
- struct iovec iov_rcv;
- struct sctp_sndrcvinfo *sinfo;
- int msg_count;
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct iovec out_iov;
- char *buffer_snd;
- char *buffer_rcv;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- struct sockaddr *laddrs, *paddrs;
-
- struct sockaddr_in conn_addr, lstn_addr, acpt_addr;
- struct sockaddr_in *addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a regular socket */
- clnt_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a listen socket */
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening many sockets as we are calling too many connect here */
- test_listen(lstn_sk, 1);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(clnt_sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&acpt_addr, &len);
-
- memset(&inmessage, 0, sizeof(inmessage));
- buffer_rcv = malloc(REALLY_BIG);
-
- iov_rcv.iov_base = buffer_rcv;
- iov_rcv.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov_rcv;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- msg_count = strlen(message) + 1;
-
- memset(&outmessage, 0, sizeof(outmessage));
- buffer_snd = malloc(REALLY_BIG);
-
- outmessage.msg_name = &lstn_addr;
- outmessage.msg_namelen = sizeof(lstn_addr);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
-
- iov.iov_base = buffer_snd;
- iov.iov_len = REALLY_BIG;
- outmessage.msg_iov->iov_base = message;
-
- outmessage.msg_iov->iov_len = msg_count;
- test_sendmsg(clnt_sk, &outmessage, MSG_NOSIGNAL, msg_count);
-
- test_recvmsg(acpt_sk, &inmessage, MSG_NOSIGNAL);
-
- /*sctp_getladdrs() TEST1: Bad socket descriptor, EBADF Expected error */
- error = sctp_getladdrs(-1, 0, &laddrs);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "sctp_getladdrs with a bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getladdrs() with a bad socket descriptor - "
- "EBADF");
-
- /*sctp_getladdrs() TEST2: Invalid socket, ENOTSOCK Expected error */
- error = sctp_getladdrs(0, 0, &laddrs);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "sctp_getladdrs with invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getladdrs() with invalid socket - ENOTSOCK");
-
- /*sctp_getladdrs() TEST3: socket of different protocol
- EOPNOTSUPP Expected error */
- sk1 = socket(pf_class, SOCK_STREAM, IPPROTO_IP);
- error = sctp_getladdrs(sk1, 0, &laddrs);
- if (error != -1 || errno != EOPNOTSUPP)
- tst_brkm(TBROK, NULL, "sctp_getladdrs with socket of "
- "different protocol error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getladdrs() with socket of different protocol - "
- "EOPNOTSUPP");
-
- /*sctp_getladdrs() TEST4: Getting the local addresses */
- error = sctp_getladdrs(lstn_sk, 0, &laddrs);
- if (error < 0)
- tst_brkm(TBROK, NULL, "sctp_getladdrs with valid socket "
- "error:%d, errno:%d", error, errno);
-
- addr = (struct sockaddr_in *)laddrs;
- if (addr->sin_port != lstn_addr.sin_port ||
- addr->sin_family != lstn_addr.sin_family ||
- addr->sin_addr.s_addr != lstn_addr.sin_addr.s_addr)
- tst_brkm(TBROK, NULL, "sctp_getladdrs comparision failed");
-
- tst_resm(TPASS, "sctp_getladdrs() - SUCCESS");
-
- /*sctp_freealddrs() TEST5: freeing the local address */
- if ((sctp_freeladdrs(laddrs)) < 0)
- tst_brkm(TBROK, NULL, "sctp_freeladdrs "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_freeladdrs() - SUCCESS");
-
- /*sctp_getpaddrs() TEST6: Bad socket descriptor, EBADF Expected error */
- error = sctp_getpaddrs(-1, 0, &paddrs);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs with a bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getpaddrs() with a bad socket descriptor - "
- "EBADF");
-
- /*sctp_getpaddrs() TEST7: Invalid socket, ENOTSOCK Expected error */
- error = sctp_getpaddrs(0, 0, &paddrs);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs with invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getpaddrs() with invalid socket - ENOTSOCK");
-
- /*sctp_getpaddrs() TEST8: socket of different protocol
- EOPNOTSUPP Expected error */
- error = sctp_getpaddrs(sk1, 0, &laddrs);
- if (error != -1 || errno != EOPNOTSUPP)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs with socket of "
- "different protocol error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_getpaddrs() with socket of different protocol - "
- "EOPNOTSUPP");
-
- /*sctp_getpaddrs() TEST9: Getting the peer addresses */
- error = sctp_getpaddrs(acpt_sk, 0, &paddrs);
- if (error < 0)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs with valid socket "
- "error:%d, errno:%d", error, errno);
-
- addr = (struct sockaddr_in *)paddrs;
- if (addr->sin_port != acpt_addr.sin_port ||
- addr->sin_family != acpt_addr.sin_family ||
- addr->sin_addr.s_addr != acpt_addr.sin_addr.s_addr)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs comparision failed");
-
- tst_resm(TPASS, "sctp_getpaddrs() - SUCCESS");
-
- /*sctp_freeapddrs() TEST10: freeing the peer address */
- if ((sctp_freepaddrs(paddrs)) < 0)
- tst_brkm(TBROK, NULL, "sctp_freepaddrs "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_freepaddrs() - SUCCESS");
-
- close(clnt_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_connect.c b/testcases/network/sctp/func_tests/test_1_to_1_connect.c
deleted file mode 100644
index 93f2caa9e..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_connect.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the connect () call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Invalid address
- * TEST4: Invalid address length
- * TEST5: Invalid address family
- * TEST6: Valid blocking connect
- * TEST7: Connect when accept queue is full
- * TEST8: On a listening socket
- * TEST9: On established socket
- * TEST10: Connect to re-establish a closed association.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <linux/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <sys/uio.h>
-#include <netinet/sctp.h>
-#include "sctputil.h"
-
-char *TCID = __FILE__;
-int TST_TOTAL = 10;
-int TST_CNT = 0;
-
-#define SK_MAX 10
-
-int main(int argc, char *argv[])
-{
- int error, i;
- socklen_t len;
- int sk, lstn_sk, clnt_sk[SK_MAX], acpt_sk[SK_MAX], pf_class;
- int sk1, clnt2_sk;
-
- struct sockaddr_in conn_addr, lstn_addr, acpt_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a listen socket */
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a regular socket */
- for (i = 0; i < SK_MAX; i++)
- clnt_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- clnt2_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, SK_MAX - 1);
-
- /*connect () TEST1: Bad socket descriptor, EBADF Expected error */
- len = sizeof(struct sockaddr_in);
- error = connect(-1, (const struct sockaddr *)&conn_addr, len);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "connect with bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() with bad socket descriptor - EBADF");
-
- /*connect () TEST2: Invalid socket, ENOTSOCK Expected error */
- error = connect(0, (const struct sockaddr *)&conn_addr, len);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "connect with invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() with invalid socket - ENOTSOCK");
-
- /*connect () TEST3: Invalid address, EFAULT Expected error */
- error = connect(sk, (const struct sockaddr *)-1, len);
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "connect with invalid address "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() with invalid address - EFAULT");
-
- /*connect () TEST4: Invalid address length, EINVAL Expected error */
- error = connect(sk, (const struct sockaddr *)&conn_addr, (len - 3));
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "connect with invalid address length "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() with invalid address length - EINVAL");
-
- /*connect () TEST5: Invalid address family, EINVAL Expect error */
- conn_addr.sin_family = 9090; /*Assigning invalid address family */
- error = connect(sk, (const struct sockaddr *)&conn_addr, len);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "connect with invalid address family "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() with invalid address family - EINVAL");
-
- conn_addr.sin_family = AF_INET;
-
- /*connect () TEST6: Blocking connect, should pass */
- /*All the be below blocking connect should pass as socket will be
- listening SK_MAX clients */
- for (i = 0; i < SK_MAX; i++) {
- error = connect(clnt_sk[i], (const struct sockaddr *)&conn_addr,
- len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "valid blocking connect "
- "error:%d, errno:%d", error, errno);
- }
-
- tst_resm(TPASS, "valid blocking connect() - SUCCESS");
-
- /*connect () TEST7: connect when accept queue is full, ECONNREFUSED
- Expect error */
- /*Now that accept queue is full, the below connect should fail */
- error = connect(clnt2_sk, (const struct sockaddr *)&conn_addr, len);
- if (error != -1 || errno != ECONNREFUSED)
- tst_brkm(TBROK, NULL, "connect when accept queue is full "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() when accept queue is full - ECONNREFUSED");
-
- /*Calling a accept first to estblish the pending connections */
- for (i = 0; i < SK_MAX; i++)
- acpt_sk[i] = test_accept(lstn_sk,
- (struct sockaddr *)&acpt_addr, &len);
-
- /*connect () TEST8: from a listening socket, EISCONN Expect error */
- error = connect(lstn_sk, (const struct sockaddr *)&lstn_addr, len);
- if (error != -1 || errno != EISCONN)
- tst_brkm(TBROK, NULL, "connect on a listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() on a listening socket - EISCONN");
-
- /*connect() TEST9: On established socket, EISCONN Expect error */
- i = 0;
- error = connect(acpt_sk[i], (const struct sockaddr *)&lstn_addr, len);
- if (error != -1 || errno != EISCONN)
- tst_brkm(TBROK, NULL, "connect on an established socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() on an established socket - EISCONN");
-
- for (i = 0; i < 4; i++) {
- close(clnt_sk[i]);
- close(acpt_sk[i]);
- }
-
- /* connect() TEST10: Re-establish an association that is closed.
- * should succeed.
- */
- error = connect(sk1, (const struct sockaddr *)&conn_addr, len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "Re-establish an association that "
- "is closed error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect() to re-establish a closed association - "
- "SUCCESS");
-
- close(sk);
- close(sk1);
- close(lstn_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_connectx.c b/testcases/network/sctp/func_tests/test_1_to_1_connectx.c
deleted file mode 100644
index 551d49b42..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_connectx.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the sctp_connectx () call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Invalid address
- * TEST4: Invalid address length
- * TEST5: Invalid address family
- * TEST6: Valid blocking sctp_connectx
- * TEST7: Connect when accept queue is full
- * TEST8: On a listening socket
- * TEST9: On established socket
- * TEST10: Connect to re-establish a closed association.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <linux/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <sys/uio.h>
-#include <netinet/sctp.h>
-#include "sctputil.h"
-
-char *TCID = __FILE__;
-int TST_TOTAL = 10;
-int TST_CNT = 0;
-
-#define SK_MAX 10
-
-int main(int argc, char *argv[])
-{
- int error, i;
- socklen_t len;
- int sk, lstn_sk, clnt_sk[SK_MAX], acpt_sk[SK_MAX], pf_class;
- int sk1, clnt2_sk;
-
- struct sockaddr_in conn_addr, lstn_addr, acpt_addr;
- struct sockaddr *tmp_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a listen socket */
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*Creating a regular socket */
- for (i = 0; i < SK_MAX; i++)
- clnt_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- clnt2_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, SK_MAX - 1);
-
- /*sctp_connectx () TEST1: Bad socket descriptor, EBADF Expected error */
- len = sizeof(struct sockaddr_in);
- error = sctp_connectx(-1, (struct sockaddr *)&conn_addr, 1);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "sctp_connectx with bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() with bad socket descriptor - EBADF");
-
- /*sctp_connectx () TEST2: Invalid socket, ENOTSOCK Expected error */
- error = sctp_connectx(0, (struct sockaddr *)&conn_addr, 1);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "sctp_connectx with invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() with invalid socket - ENOTSOCK");
-
- /*sctp_connectx () TEST3: Invalid address, EINVAL Expected error */
- tmp_addr = (struct sockaddr *)malloc(sizeof(struct sockaddr) - 1);
- tmp_addr->sa_family = AF_INET;
- error = sctp_connectx(sk, tmp_addr, 1);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "sctp_connectx with invalid address "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() with invalid address - EINVAL");
-
- /*sctp_connectx () TEST4: Invalid address length, EINVAL Expected error */
- error = sctp_connectx(sk, (struct sockaddr *)&conn_addr, 0);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL,
- "sctp_connectx with invalid address length "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() with invalid address length - EINVAL");
-
- /*sctp_connectx () TEST5: Invalid address family, EINVAL Expect error */
- conn_addr.sin_family = 9090; /*Assigning invalid address family */
- error = sctp_connectx(sk, (struct sockaddr *)&conn_addr, 1);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL,
- "sctp_connectx with invalid address family "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() with invalid address family - EINVAL");
-
- conn_addr.sin_family = AF_INET;
-
- /*sctp_connectx () TEST6: Blocking sctp_connectx, should pass */
- /*All the be below blocking sctp_connectx should pass as socket will be
- listening SK_MAX clients */
- for (i = 0; i < SK_MAX; i++) {
- error = sctp_connectx(clnt_sk[i], (struct sockaddr *)&conn_addr,
- 1);
- if (error < 0)
- tst_brkm(TBROK, NULL, "valid blocking sctp_connectx "
- "error:%d, errno:%d", error, errno);
- }
-
- tst_resm(TPASS, "valid blocking sctp_connectx() - SUCCESS");
-
- /*sctp_connectx () TEST7: sctp_connectx when accept queue is full, ECONNREFUSED
- Expect error */
- /*Now that accept queue is full, the below sctp_connectx should fail */
- error = sctp_connectx(clnt2_sk, (struct sockaddr *)&conn_addr, 1);
- if (error != -1 || errno != ECONNREFUSED)
- tst_brkm(TBROK, NULL, "sctp_connectx when accept queue is full "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS,
- "sctp_connectx() when accept queue is full - ECONNREFUSED");
-
- /*Calling a accept first to estblish the pending sctp_connectxions */
- for (i = 0; i < SK_MAX; i++)
- acpt_sk[i] = test_accept(lstn_sk,
- (struct sockaddr *)&acpt_addr, &len);
-
- /*sctp_connectx () TEST8: from a listening socket, EISCONN Expect error */
- error = sctp_connectx(lstn_sk, (struct sockaddr *)&lstn_addr, 1);
- if (error != -1 || errno != EISCONN)
- tst_brkm(TBROK, NULL, "sctp_connectx on a listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() on a listening socket - EISCONN");
-
- /*sctp_connectx() TEST9: On established socket, EISCONN Expect error */
- i = 0;
- error = sctp_connectx(acpt_sk[i], (struct sockaddr *)&lstn_addr, 1);
- if (error != -1 || errno != EISCONN)
- tst_brkm(TBROK, NULL, "sctp_connectx on an established socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_connectx() on an established socket - EISCONN");
-
- for (i = 0; i < 4; i++) {
- close(clnt_sk[i]);
- close(acpt_sk[i]);
- }
-
- /* sctp_connectx() TEST10: Re-establish an association that is closed.
- * should succeed.
- */
- error = sctp_connectx(sk1, (struct sockaddr *)&conn_addr, 1);
- if (error < 0)
- tst_brkm(TBROK, NULL, "Re-establish an association that "
- "is closed error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS,
- "sctp_connectx() to re-establish a closed association - "
- "SUCCESS");
-
- close(sk);
- close(sk1);
- close(lstn_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_events.c b/testcases/network/sctp/func_tests/test_1_to_1_events.c
deleted file mode 100644
index 514b25b14..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_events.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This test tests the events for 1-1 style sockets.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/socket.h> /* needed by linux/sctp.h */
-#include <sys/uio.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-#include <string.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 4;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk, acpt_sk;
- struct sockaddr_in svr_loop, clt_loop, acpt_loop;
- struct iovec iov, out_iov;
- struct msghdr inmessage, outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- int error;
- socklen_t len;
- char *big_buffer;
- struct sctp_event_subscribe event;
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- char *message = "hello, world!\n";
- uint32_t ppid;
- uint32_t stream;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
- svr_loop.sin_family = AF_INET;
- svr_loop.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.sin_port = htons(SCTP_TESTPORT_1);
-
- clt_loop.sin_family = AF_INET;
- clt_loop.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop.sin_port = htons(SCTP_TESTPORT_1);
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(svr_sk, (struct sockaddr *)&svr_loop, sizeof(svr_loop));
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 3);
-
- /* Create the client socket. */
- clt_sk = test_socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
-
- event.sctp_data_io_event = 1;
- event.sctp_association_event = 1;
- event.sctp_shutdown_event = 1;
- len = sizeof(struct sctp_event_subscribe);
- test_setsockopt(svr_sk, SCTP_EVENTS, &event, len);
- test_setsockopt(clt_sk, SCTP_EVENTS, &event, len);
-
- len = sizeof(struct sockaddr_in);
- test_connect(clt_sk, (struct sockaddr *)&clt_loop, len);
-
- acpt_sk = test_accept(svr_sk, (struct sockaddr *)&acpt_loop, &len);
-
- /* Build up a msghdr structure we can use for all sending. */
- memset(&outmessage, 0, sizeof(outmessage));
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
-
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
-
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = (strlen(message) + 1);
-
- /* Send . This will create the association */
- test_sendmsg(clt_sk, &outmessage, 0, strlen(message) + 1);
-
- memset(&inmessage, 0, sizeof(inmessage));
- /* NOW initialize inmessage with enough space for DATA... */
- big_buffer = malloc(REALLY_BIG);
- if (!big_buffer) {
- DUMP_CORE;
- }
-
- /* Let's do a test to do a recvmsg when we are not listening and
- * when we have no associations.
- */
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- error = test_recvmsg(clt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage,
- error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- tst_resm(TPASS, "COMM_UP notification on client socket - SUCCESS");
-
- error = test_recvmsg(acpt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage,
- error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- tst_resm(TPASS, "COMM_UP notification on server socket - SUCCESS");
-
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(acpt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-
- tst_resm(TPASS, "Data message on server socket - SUCCESS");
-
- close(clt_sk);
- error = test_recvmsg(acpt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage,
- error,
- sizeof(struct sctp_shutdown_event),
- SCTP_SHUTDOWN_EVENT, 0);
-
- tst_resm(TPASS, "SHUTDOWN notification on accepted socket - SUCCESS");
- close(svr_sk);
- close(acpt_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_initmsg_connect.c b/testcases/network/sctp/func_tests/test_1_to_1_initmsg_connect.c
deleted file mode 100644
index 11b629a66..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_initmsg_connect.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * When init timeout is set to zero, a connect () crashed the system. This case
- * tests the fix for the same.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 1;
-int TST_CNT = 0;
-
-int main(int argc, char **argv)
-{
- int sk1, sk2, sk3, pf_class;
- socklen_t len;
- struct sockaddr_in lstn_addr, acpt_addr;
- struct sockaddr_in conn_addr;
- char *buffer_rcv;
- struct sctp_initmsg sinmsg;
- char *message = "Hello World!\n";
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- /* Opening the socket */
-
- pf_class = PF_INET;
-
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- sk3 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- test_bind(sk3, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- len = sizeof(struct sctp_initmsg);
- sinmsg.sinit_num_ostreams = 65535;
- sinmsg.sinit_max_instreams = 10;
- sinmsg.sinit_max_attempts = 1;
- sinmsg.sinit_max_init_timeo = 0;
- test_setsockopt(sk1, SCTP_INITMSG, &sinmsg, len);
- sinmsg.sinit_num_ostreams = 10;
- sinmsg.sinit_max_instreams = 65535;
- test_setsockopt(sk3, SCTP_INITMSG, &sinmsg, len);
-
- test_listen(sk3, 1);
-
- len = sizeof(struct sockaddr_in);
- test_connect(sk1, (struct sockaddr *)&conn_addr, len);
-
- sk2 = test_accept(sk3, (struct sockaddr *)&acpt_addr, &len);
-
- test_sctp_sendmsg(sk1, message, strlen(message) + 1,
- (struct sockaddr *)&conn_addr, len,
- 0, 0, 65534, 0, 0);
-
- buffer_rcv = malloc(100);
- test_recv(sk2, buffer_rcv, (strlen(message) + 1), MSG_NOSIGNAL);
-
- tst_resm(TPASS, "connect() with init timeout set to 0 - SUCCESS");
-
- close(sk1);
- close(sk2);
- close(sk3);
-
- return 0;
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_nonblock.c b/testcases/network/sctp/func_tests/test_1_to_1_nonblock.c
deleted file mode 100644
index 7b66b20c7..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_nonblock.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the Non-Blocking mode of connect(),
- * accept() and recvmsg() calls.
- *
- * TEST1: Non blocking accept return EAGAIN if connect is not called
- * TEST2: Non blocking connect should return EINPROGRESS
- * TEST3: accept() passes when connect called in Non-blocking mode
- * TEST4: Non blocking recvmsg should return EAGAIN
- * TEST5: recvmsg() should succeed if data present to receive in non blocking
- * mode
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 5;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int error, msg_count;
- socklen_t len;
- int sk, pf_class, lstn_sk, acpt_sk, flag, cflag, sflag;
- struct msghdr outmessage;
- struct msghdr inmessage;
- char *message = "hello, world!\n";
- struct iovec iov;
- struct iovec iov_rcv;
- struct sctp_sndrcvinfo *sinfo;
- int count;
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct iovec out_iov;
- char *buffer_snd;
- char *buffer_rcv;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
-
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbufferd
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
- flag = MSG_NOSIGNAL;
-
- /*Setting server socket non-blocking */
- sflag = fcntl(lstn_sk, F_GETFL, 0);
- if (sflag < 0)
- tst_brkm(TBROK, NULL, "fcnt F_GETFL failed "
- "sflag:%d, errno:%d", sflag, errno);
-
- error = fcntl(lstn_sk, F_SETFL, sflag | O_NONBLOCK);
- if (error < 0)
- tst_brkm(TBROK, NULL, "fcnt F_SETFL failed "
- "error:%d, errno:%d", error, errno);
-
- /* TEST1: accept should return EAGAIN instead blocking. */
- error = accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
- if (error != -1 || errno != EAGAIN)
- tst_brkm(TBROK, NULL, "non-blocking accept "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "non-blocking accept() - EAGAIN");
-
- /* TEST2: Non Block connect should return EINPROGRESS */
- /*Set client socket as non-blocking */
- cflag = fcntl(sk, F_GETFL, 0);
- if (cflag < 0)
- tst_brkm(TBROK, NULL, "fcnt F_GETFL failed "
- "cflag:%d, errno:%d", cflag, errno);
-
- error = fcntl(sk, F_SETFL, sflag | O_NONBLOCK);
- if (error < 0)
- tst_brkm(TBROK, NULL, "fcnt F_SETFL failed "
- "error:%d, errno:%d", error, errno);
-
- error = connect(sk, (const struct sockaddr *)&conn_addr, len);
- if (error != -1 || errno != EINPROGRESS)
- tst_brkm(TBROK, NULL, "non-blocking connect "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "non-blocking connect() - EINPROGRESS");
-
- /* TEST3: Now that connect() called, accept will succeed */
- acpt_sk = accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
- if (acpt_sk < 0)
- tst_brkm(TBROK, NULL, "accept after a non-blocking connect "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept() after a non-blocking connect - SUCCESS");
-
- memset(&outmessage, 0, sizeof(outmessage));
- buffer_snd = malloc(REALLY_BIG);
-
- outmessage.msg_name = &svr_addr;
- outmessage.msg_namelen = sizeof(svr_addr);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
-
- iov.iov_base = buffer_snd;
- iov.iov_len = REALLY_BIG;
- outmessage.msg_iov->iov_base = message;
-
- outmessage.msg_iov->iov_len = strlen(message) + 1;
-
- memset(&inmessage, 0, sizeof(inmessage));
- buffer_rcv = malloc(REALLY_BIG);
-
- iov_rcv.iov_base = buffer_rcv;
- iov_rcv.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov_rcv;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- msg_count = strlen(message) + 1;
-
- /* TEST4: recvmsg() should return EAGAIN instead blocking */
- error = recvmsg(sk, &inmessage, MSG_WAITALL);
- if (error != -1 || errno != EAGAIN)
- tst_brkm(TBROK, NULL, "non-blocking recvmsg "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "non-blocking recvmsg() - EAGAIN");
-
- count = test_sendmsg(acpt_sk, &outmessage, flag, msg_count);
-
- /* TEST5: recvmsg() should succeed now as data is available. */
- error = test_recvmsg(sk, &inmessage, flag);
- test_check_msg_data(&inmessage, error, msg_count, MSG_EOR, 0, 0);
-
- tst_resm(TPASS, "non-blocking recvmsg() when data is available - "
- "SUCCESS");
-
- close(lstn_sk);
- close(acpt_sk);
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_recvfrom.c b/testcases/network/sctp/func_tests/test_1_to_1_recvfrom.c
deleted file mode 100644
index 658692b8c..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_recvfrom.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the recvfrom () call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Invalid message pointer
- * TEST4: On a listening socket
- * TEST5: Reading on a socket that received SHUTDOWN
- * TEST6: Reading the pending message on socket that received SHUTDOWN
- * TEST7: No more message and association is shutdown
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 7;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int ret, msg_count;
- socklen_t len;
- int sk, pf_class, lstn_sk, acpt_sk, flag;
- char *message = "hello, world!\n";
- char *message_rcv;
- int count;
-
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- message_rcv = malloc(512);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- msg_count = (strlen(message) + 1);
-
- flag = MSG_NOSIGNAL;
- /*Sending the message */
- count = test_send(sk, message, msg_count, flag);
-
- /*recvfrom () TEST1: Bad socket descriptor, EBADF Expected error */
- count = recvfrom(-1, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "recvfrom with a bad socket "
- "descriptor count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() with a bad socket descriptor - EBADF");
-
- /*recvfrom () TEST2: Invalid socket , ENOTSOCK Expected error */
- count = recvfrom(0, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "recvfrom with invalid socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() with invalid socket - ENOTSOCK");
-
- /*recvfrom () TEST3: Invalid message pointer EFAULT, Expected error */
- count = recvfrom(acpt_sk, (char *)-1, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "recvfrom with invalid message "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() with invalid message ptr - EFAULT");
-
- /*TEST4: recvfrom on listening socket,ENOTCONN Expected error */
- count = recvfrom(lstn_sk, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count != -1 || errno != ENOTCONN)
- tst_brkm(TBROK, NULL, "recvfrom on listening socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() on listening socket - ENOTCONN");
-
- count = test_send(acpt_sk, message, msg_count, flag);
-
- ret = test_shutdown(sk, SHUT_WR);
-
- /*recvfrom () TEST5:reading on a socket that received SHUTDOWN */
- count = recvfrom(acpt_sk, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count < 0)
- tst_brkm(TBROK, NULL, "recvfrom on a socket that has "
- "received shutdown count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() on a socket that has received shutdown - "
- "EOF");
-
- /*recvfrom () TEST6:reading the pending message on socket that sent
- SHUTDOWN */
- count = recvfrom(sk, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count < 0)
- tst_brkm(TBROK, NULL, "recvfrom on a socket with pending "
- "message that has sent shutdown count:%d, errno:%d",
- count, errno);
-
- tst_resm(TPASS, "recvfrom() on a socket with pending message that has "
- "sent shutdown - SUCCESS");
-
- /*recvfrom () TEST7: No more message and association is shutdown,
- ENOTCONN Expected error */
- count = recvfrom(sk, message_rcv, msg_count, flag,
- (struct sockaddr *)&svr_addr, &len);
- if (count != -1 || errno != ENOTCONN)
- tst_brkm(TBROK, NULL, "recvfrom on a socket with no "
- "pending messages and has sent shutdown count:%d, "
- "errno:%d", count, errno);
-
- tst_resm(TPASS, "recvfrom() on a socket with no pending messages and "
- " has sent shutdown - ENOTCONN");
-
- close(sk);
- close(lstn_sk);
- close(acpt_sk);
- tst_exit();
-
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_recvmsg.c b/testcases/network/sctp/func_tests/test_1_to_1_recvmsg.c
deleted file mode 100644
index a40b16d6c..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_recvmsg.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the recvmsg() call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: Invalid iovec pointer
- * TEST4: Invalid msghdr pointer
- * TEST5: On a listening socket
- * TEST6: Reading on a socket that received SHUTDOWN
- * TEST7: Reading the pending message socket that received SHUTDOWN
- * TEST8: No more message and association is shutdown
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 8;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- socklen_t len;
- int ret;
- int sk, pf_class, lstn_sk, acpt_sk;
- int flag = 0;
- struct msghdr inmessage;
- char *message = "hello, world!\n";
- struct iovec iov_rcv;
- int count;
- char *buffer_rcv;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char *message1 = "hello, world!\n";
-
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- memset(&inmessage, 0, sizeof(inmessage));
- buffer_rcv = malloc(REALLY_BIG);
-
- iov_rcv.iov_base = buffer_rcv;
- iov_rcv.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov_rcv;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- /*recvmsg () TEST1: Bad socket descriptor, EBADF Expected error */
- count = recvmsg(-1, &inmessage, flag);
- if (count != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "recvmsg with a bad socket "
- "descriptor count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() with a bad socket descriptor - EBADF");
-
- /*recvmsg () TEST2: Invalid socket , ENOTSOCK Expected error */
- count = recvmsg(0, &inmessage, flag);
- if (count != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "recvmsg with invalid socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() with invalid socket - ENOTSOCK");
-
- /*recvmsg () TEST3: Invalid iovec pointer EFAULT, Expected error */
- inmessage.msg_iov = (struct iovec *)-1;
- count = recvmsg(acpt_sk, &inmessage, flag);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "recvmsg with invalid iovec "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() with invalid iovec ptr - EFAULT");
-
- inmessage.msg_iov = &iov_rcv;
-
- /*recvmsg () TEST4: Invalid msghdr pointer EFAULT, Expected error */
- count = recvmsg(acpt_sk, (struct msghdr *)-1, flag);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "recvmsg with invalid msghdr "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() with invalid msghdr ptr - EFAULT");
-
- /*recvmsg () TEST5:recvmsg on listening socket,ENOTCONN Expected error */
- count = recvmsg(lstn_sk, &inmessage, flag);
- if (count != -1 || errno != ENOTCONN)
- tst_brkm(TBROK, NULL, "recvmsg on listening socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() on listening socket - ENOTCONN");
-
- count = test_send(acpt_sk, message1, strlen(message), 0);
-
- ret = test_shutdown(sk, SHUT_WR);
-
- flag = MSG_NOSIGNAL;
- /*recvmsg () TEST6:reading on a socket that received SHUTDOWN */
- count = recvmsg(acpt_sk, &inmessage, flag);
- if (count < 0)
- tst_brkm(TBROK, NULL, "recvmsg on a socket that has "
- "received shutdown count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() on a socket that has received shutdown - "
- "EOF");
-
- /*recvmsg () TEST7:reading the pending message socket that sent
- SHUTDOWN */
- count = recvmsg(sk, &inmessage, flag);
- if (count < 0)
- tst_brkm(TBROK, NULL, "recvmsg on a socket with pending "
- "message that has sent shutdown count:%d, errno:%d",
- count, errno);
-
- tst_resm(TPASS, "recvmsg() on a socket with pending message that has "
- "sent shutdown - SUCCESS");
-
- /*recvmsg () TEST8: No more message and association is shutdown,
- ENOTCONN Expected error */
- count = recvmsg(sk, &inmessage, flag);
- if (count != -1 || errno != ENOTCONN)
- tst_brkm(TBROK, NULL, "recvmsg on a socket with no "
- "pending messages and has sent shutdown count:%d, "
- "errno:%d", count, errno);
-
- tst_resm(TPASS, "recvmsg() on a socket with no pending messages and "
- " has sent shutdown - ENOTCONN");
-
- close(sk);
- close(lstn_sk);
- close(acpt_sk);
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_rtoinfo.c b/testcases/network/sctp/func_tests/test_1_to_1_rtoinfo.c
deleted file mode 100644
index c31bdd973..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_rtoinfo.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the getsockopt () and sectsockopt () with
- * SCTP_RTOINFO option on 1-1 style socket
- *
- * This program first gets the default values using getsockopt(). It also sets
- * the value using setsockopt() and gets the set value using getsockopt().
- * A comparison between set values and get values are performed.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <linux/socket.h>
-#include <linux/in.h> /* for sockaddr_in */
-#include <linux/in6.h> /* for sockaddr_in6 */
-#include <errno.h>
-#include <sys/uio.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 3;
-int TST_CNT = 0;
-
-int main(void)
-{
-
- int sd, ret;
- socklen_t len;
- struct sctp_rtoinfo srtoinfo; /*setting the variables */
- struct sctp_rtoinfo grtoinfo; /*Getting the variables */
-
- sd = test_socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP);
-
- len = sizeof(struct sctp_rtoinfo);
-
- /*TEST1 Getting the default values using getsockopt() */
- ret = getsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &grtoinfo, &len);
- if (ret < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_RTOINFO "
- "ret:%d, errno:%d", ret, errno);
-
- tst_resm(TPASS, "getsockopt() SCTP_RTOINFO - SUCCESS");
-
- /*Assigning the values to RTO initial and max and min bounds */
- srtoinfo.srto_initial = 60;
- srtoinfo.srto_max = 100;
- srtoinfo.srto_min = 40;
-
- /*TEST2 Setting the values using setsockopt() */
- ret = setsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &srtoinfo,
- sizeof(struct sctp_rtoinfo));
- if (ret < 0)
- tst_brkm(TBROK, NULL, "setsockopt SCTP_RTOINFO "
- "ret:%d, errno:%d", ret, errno);
-
- tst_resm(TPASS, "setsockopt() SCTP_RTOINFO - SUCCESS");
-
- /*Getting the values which are set using setsockopt() */
- ret = getsockopt(sd, IPPROTO_SCTP, SCTP_RTOINFO, &grtoinfo, &len);
- if (ret < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_RTOINFO "
- "ret:%d, errno:%d", ret, errno);
-
- /* TEST3 Compare the get values with the set values. */
- if (srtoinfo.srto_initial != grtoinfo.srto_initial &&
- srtoinfo.srto_max != grtoinfo.srto_max &&
- srtoinfo.srto_min != grtoinfo.srto_min)
- tst_brkm(TBROK, NULL, "setsockopt/getsockopt SCTP_RTOINFO "
- "compare failed");
-
- tst_resm(TPASS, "setsockopt()/getsockopt SCTP_RTOINFO compare - "
- "SUCCESS");
-
- close(sd);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_send.c b/testcases/network/sctp/func_tests/test_1_to_1_send.c
deleted file mode 100644
index a8dc8f597..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_send.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the send() call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: On a listening socket
- * TEST4: On a closed association
- * TEST5: Invalid message address
- * TEST6: send from client to server
- * TEST7: send from server to client
- * TEST8: sending partial data from a buffer
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 8;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- socklen_t len, len_snd;
- int msg_count;
- int sk, sk1, pf_class, lstn_sk, acpt_sk, acpt1_sk, flag, count;
- char *message = "hello, world!\n";
- char *message_rcv;
-
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- len_snd = (strlen(message) + 1);
-
- flag = MSG_NOSIGNAL;
- /*send () TEST1: Bad socket descriptor, EBADF Expected error */
- count = send(-1, message, len_snd, flag);
- if (count != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "send with a bad socket "
- "descriptor count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() with a bad socket descriptor - EBADF");
-
- /*send () TEST2: Invalid socket, ENOTSOCK Expected error */
- count = send(0, message, len_snd, flag);
- if (count != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "send with invalid socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() with invalid socket - ENOTSOCK");
-
- /*send () TEST3: send on listening socket, EPIPE Expected error */
- count = send(lstn_sk, message, len_snd, flag);
- if (count != -1 || errno != EPIPE)
- tst_brkm(TBROK, NULL, "send on a listening socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() on a listening socket - EPIPE");
-#if 0
- /*send () TEST4: Invalid message address, EFAULT Expected error */
- /* FIXME this test should pass. Don't catch why... */
- count = send(sk, (char *)0x1, len_snd, flag);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "send with invalid message "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() with invalid message ptr - EFAULT");
-#endif
-
- test_connect(sk1, (struct sockaddr *)&lstn_addr, len);
-
- count = test_send(sk1, message, len_snd, flag);
-
- close(sk1);
-
- acpt1_sk = test_accept(lstn_sk, (struct sockaddr *)&conn_addr, &len);
-
- /*send () TEST5: send on closed association, EPIPE Expected error */
- count = send(acpt1_sk, message, len_snd, flag);
- if (count != -1 || errno != EPIPE)
- tst_brkm(TBROK, NULL, "send on a closed association "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() on a closed association - EPIPE");
-
- close(sk);
- close(lstn_sk);
- close(acpt_sk);
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- message_rcv = malloc(512);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- msg_count = strlen(message) + 1;
-
- /*send() TEST6: Sending data from client socket to server socket */
- count = send(sk, message, msg_count, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "send from client to server "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() from client to server - SUCCESS");
-
- test_recv(acpt_sk, message_rcv, msg_count, flag);
-
- strncpy(message_rcv, "\0", 512);
-
- /*send() TEST7: Sending data from accept socket to client socket */
- count = send(acpt_sk, message, msg_count, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "send from accept socket to client "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "send() from accept socket to client - SUCCESS");
-
- test_recv(sk, message_rcv, msg_count, flag);
-
- /*send() TEST8: Sending less number of data from the buffer */
- /*Sending only 5 bytes so that only hello is received */
- test_send(sk, message, 5, flag);
- test_recv(acpt_sk, message_rcv, 5, flag);
-
- tst_resm(TPASS, "send() partial data from a buffer - SUCCESS");
-
- /* TEST9: sctp_send with no sinfo */
- test_sctp_send(sk, message, strlen(message) + 1, NULL, flag);
- test_recv(acpt_sk, message_rcv, strlen(message) + 1, flag);
- tst_resm(TPASS, "sctp_send() with no sinfo - SUCCESS");
-
- close(sk1);
- close(lstn_sk);
- close(acpt_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_sendmsg.c b/testcases/network/sctp/func_tests/test_1_to_1_sendmsg.c
deleted file mode 100644
index dffdde581..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_sendmsg.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the sendmsg() call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: On a listening socket
- * TEST4: Invalid iovec pointer
- * TEST5: Invalid iovec length
- * TEST6: Invalid msghdr pointer
- * TEST7: Invalid sinfo flags
- * TEST8: SCTP_EOF flag set
- * TEST9: SCTP_ABORT flag set
- * TEST10: On a closed association
- *
- * TEST11: Sending data from server socket to client socket
- * TEST12: Sending data from client socket to server socket
- * TEST13: Sending data from unconnected client to server
- * TEST14: Sending a message on SHUT_RD socket
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 14;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- socklen_t len;
- int msg_count;
- int sk, sk1, pf_class, lstn_sk, acpt_sk, acpt1_sk, flag;
- struct msghdr outmessage;
- char *message = "hello, world!\n";
- struct iovec iov;
- struct sctp_sndrcvinfo *sinfo;
- int count;
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct iovec out_iov;
- char *buffer;
- struct msghdr inmessage;
- char *buffer_snd;
- char *buffer_rcv;
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
- struct iovec iov_rcv;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- memset(&outmessage, 0, sizeof(outmessage));
- buffer = malloc(REALLY_BIG);
-
- outmessage.msg_name = &conn_addr;
- outmessage.msg_namelen = sizeof(conn_addr);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
-
- iov.iov_base = buffer;
- iov.iov_len = REALLY_BIG;
- outmessage.msg_iov->iov_base = message;
-
- outmessage.msg_iov->iov_len = strlen(message) + 1;
-
- flag = MSG_NOSIGNAL;
- /*sendmsg () TEST1: Bad socket descriptor, EBADF Expected error */
- count = sendmsg(-1, &outmessage, flag);
- if (count != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "sendmsg with a bad socket "
- "descriptor count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with a bad socket descriptor - EBADF");
-
- /*sendmsg () TEST2: Invalid socket, ENOTSOCK Expected error */
- count = sendmsg(0, &outmessage, flag);
- if (count != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "sendmsg with invalid socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with invalid socket - ENOTSOCK");
-
- /*sendmsg () TEST3: sendmsg on listening socket, EPIPE Expected error */
- count = sendmsg(lstn_sk, &outmessage, flag);
- if (count != -1 || errno != EPIPE)
- tst_brkm(TBROK, NULL, "sendmsg on a listening socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() on a listening socket - EPIPE");
-
- /*sendmsg () TEST4: Invalid iovec pointer EFAULT, Expected error */
- outmessage.msg_iov = (struct iovec *)-1;
- count = sendmsg(sk, &outmessage, flag);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "sendmsg with invalid iovec "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with invalid iovec ptr - EFAULT");
-
- outmessage.msg_iov = &out_iov;
-
- /*sendmsg () TEST5: Invalid iovec count EINVAL, Expected error */
- outmessage.msg_iovlen = 0;
- count = sendmsg(sk, &outmessage, flag);
- if (count != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "sendmsg with invalid iovec "
- "length count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with invalid iovec length - EINVAL");
-
- outmessage.msg_iovlen = 1;
-
- /*sendmsg () TEST6: Invalid msghdr pointer EFAULT, Expected error */
- count = sendmsg(sk, (struct msghdr *)-1, flag);
- if (count != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "sendmsg with invalid msghdr "
- "pointer count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with invalid msghdr ptr - EFAULT");
-
- /*sendmsg () TEST7: Invalid sinfo flag EINVAL, Expected error */
- sinfo->sinfo_flags = 999;
- count = sendmsg(sk, &outmessage, -1);
- if (count != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "sendmsg with invalid sinfo "
- "flags count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with invalid sinfo flags - EINVAL");
-
- /*sendmsg () TEST8: SCTP_EOF flag EINVAL, Expected error */
- sinfo->sinfo_flags = SCTP_EOF;
- count = sendmsg(sk, &outmessage, flag);
- if (count != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "sendmsg with SCTP_EOF flag "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with SCTP_EOF flag - EINVAL");
-
- /*sendmsg () TEST9: SCTP_ABORT flag EINVAL, Expected error */
- sinfo->sinfo_flags = SCTP_ABORT;
- count = sendmsg(sk, &outmessage, flag);
- if (count != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "sendmsg with SCTP_ABORT flag "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() with SCTP_ABORT flag - EINVAL");
-
- sinfo->sinfo_flags = 0;
-
- test_connect(sk1, (struct sockaddr *)&lstn_addr, len);
-
- test_sendmsg(sk1, &outmessage, flag, strlen(message) + 1);
-
- close(sk1);
- acpt1_sk = test_accept(lstn_sk, (struct sockaddr *)&conn_addr, &len);
-
- /*sendmsg () TEST10:sendmsg on closed association, EPIPE Expected error */
- count = sendmsg(acpt1_sk, &outmessage, flag);
- if (count != -1 || errno != EPIPE)
- tst_brkm(TBROK, NULL, "sendmsg on a closed association "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() on a closed association - EPIPE");
-
- close(sk);
- close(lstn_sk);
- close(acpt_sk);
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
- flag = MSG_NOSIGNAL;
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- memset(&outmessage, 0, sizeof(outmessage));
- buffer_snd = malloc(REALLY_BIG);
-
- outmessage.msg_name = &svr_addr;
- outmessage.msg_namelen = sizeof(svr_addr);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
-
- iov.iov_base = buffer_snd;
- iov.iov_len = REALLY_BIG;
- outmessage.msg_iov->iov_base = message;
-
- outmessage.msg_iov->iov_len = strlen(message) + 1;
-
- memset(&inmessage, 0, sizeof(inmessage));
- buffer_rcv = malloc(REALLY_BIG);
-
- iov_rcv.iov_base = buffer_rcv;
- iov_rcv.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov_rcv;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- msg_count = strlen(message) + 1;
-
- /*sendmsg() TEST11: Sending data from server socket to client socket */
- count = sendmsg(acpt_sk, &outmessage, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendmsg from accept socket to "
- "client count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() from accept socket to client - SUCCESS");
-
- count = test_recvmsg(sk, &inmessage, flag);
- test_check_msg_data(&inmessage, count, msg_count, MSG_EOR, 0, 0);
-
- outmessage.msg_name = &conn_addr;
- outmessage.msg_namelen = sizeof(conn_addr);
- /*sendmsg() TEST12: Sending data from client socket to server socket */
- count = sendmsg(sk, &outmessage, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendmsg from client to server "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() from client to server - SUCCESS");
-
- count = test_recvmsg(acpt_sk, &inmessage, flag);
- test_check_msg_data(&inmessage, count, msg_count, MSG_EOR, 0, 0);
-
- outmessage.msg_name = &conn_addr;
- outmessage.msg_namelen = sizeof(conn_addr);
- close(sk);
- close(acpt_sk);
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*sendmsg() TEST13: Sending data from unconnected client socket to
- server socket */
- count = sendmsg(sk1, &outmessage, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendmsg from unconnected client to "
- "server count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() from unconnected clt to server - SUCCESS");
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- count = test_recvmsg(acpt_sk, &inmessage, flag);
- test_check_msg_data(&inmessage, count, msg_count, MSG_EOR, 0, 0);
-
- test_shutdown(sk1, SHUT_RD);
-
- /*sendmsg() TEST14: Sending a message on SHUT_RD socket */
- count = sendmsg(sk1, &outmessage, flag);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendmsg on a SHUT_RD socket "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendmsg() on a SHUT_RD socket - SUCCESS");
-
- count = test_recvmsg(acpt_sk, &inmessage, flag);
- test_check_msg_data(&inmessage, count, msg_count, MSG_EOR, 0, 0);
-
- close(sk1);
- close(lstn_sk);
- close(acpt_sk);
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_sendto.c b/testcases/network/sctp/func_tests/test_1_to_1_sendto.c
deleted file mode 100644
index d576d7796..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_sendto.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the sendto () call
- * for 1-1 style sockets
- *
- * TEST1: Sending data from client socket to server socket
- * TEST2: Sending data from accept (server) socket to client socket
- * TEST3: Sending data from unconnected client socket to server
- * TEST4: sending partial data from a buffer
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 4;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int msg_count;
- socklen_t len;
- int sk, sk1, pf_class, lstn_sk, acpt_sk, flag;
- char *message = "hello, world!\n";
- char *message_rcv;
- int count;
-
- struct sockaddr_in conn_addr, lstn_addr, svr_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbufferd
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- message_rcv = malloc(512);
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- /*Binding the listen socket */
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- /*Listening the socket */
- test_listen(lstn_sk, 10);
-
- len = sizeof(struct sockaddr_in);
- flag = MSG_NOSIGNAL;
-
- test_connect(sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- msg_count = strlen(message) + 1;
-
- /*sendto() TEST1: Sending data from client socket to server socket */
- count = sendto(sk, message, msg_count, flag,
- (const struct sockaddr *)&conn_addr, len);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendto from client to server "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendto() from client to server - SUCCESS");
-
- test_recv(acpt_sk, message_rcv, msg_count, flag);
-
- strncpy(message_rcv, "\0", 512);
-
- /*sendto() TEST2: Sending data from accept socket to client socket */
- count = sendto(acpt_sk, message, msg_count, flag,
- (const struct sockaddr *)&svr_addr, len);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendto from accept socket to client "
- "count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendto() from accept socket to client - SUCCESS");
-
- test_recv(sk, message_rcv, msg_count, flag);
-
- close(sk);
- close(acpt_sk);
-
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*sendto() TEST3: Sending data from unconnected client socket to
- server socket */
- count = sendto(sk1, message, msg_count, flag,
- (const struct sockaddr *)&conn_addr, len);
- if (count != msg_count)
- tst_brkm(TBROK, NULL, "sendto from unconnected client to "
- "server count:%d, errno:%d", count, errno);
-
- tst_resm(TPASS, "sendto() from unconnected client to server - SUCCESS");
-
- acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
-
- test_recv(acpt_sk, message_rcv, msg_count, flag);
-
- /*send() TEST4: Sending less number of data from the buffer */
- /*Sending only 5 bytes so that only hello is received */
- test_sendto(sk, message, 5, flag, (const struct sockaddr *)&conn_addr,
- len);
- test_recv(acpt_sk, message_rcv, 5, flag);
-
- tst_resm(TPASS, "sendto() partial data from a buffer - SUCCESS");
-
- close(sk1);
- close(lstn_sk);
- close(acpt_sk);
- tst_exit();
-
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_shutdown.c b/testcases/network/sctp/func_tests/test_1_to_1_shutdown.c
deleted file mode 100644
index 02c8bf8e9..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_shutdown.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the shutdown() call for 1-1 style sockets
- *
- * TEST1: Bad socket descriptor
- * TEST2: Invalid socket
- * TEST3: shutdown with SHUT_WR flag to disable new send
- * TEST4: shutdown with SHUT_RD flag to disable new receive
- * TEST5: shutdown with SHUT_RDWR flag to disable new receive/send
- * TEST6: Unconnected socket
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <linux/socket.h>
-#include <netinet/sctp.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 6;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int clnt_sk[MAX_CLIENTS], acpt_sk[MAX_CLIENTS], sk;
- int lstn_sk;
- struct sockaddr_in lstn_addr, acpt_addr;
- socklen_t addrlen;
- int error, i;
- char *message = "hello, world!\n";
- char msgbuf[100];
- int pf_class;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
- pf_class = PF_INET;
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- test_bind(lstn_sk, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
-
- test_listen(lstn_sk, MAX_CLIENTS);
-
- for (i = 0; i < MAX_CLIENTS; i++) {
- clnt_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_connect(clnt_sk[i], (struct sockaddr *)&lstn_addr,
- sizeof(lstn_addr));
- }
-
- for (i = 0; i < MAX_CLIENTS; i++) {
- addrlen = sizeof(acpt_addr);
- acpt_sk[i] = test_accept(lstn_sk, (struct sockaddr *)&acpt_addr,
- &addrlen);
- }
-
- /*shutdown() TEST1: Bad socket descriptor, EBADF Expected error */
- error = shutdown(-1, SHUT_WR);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "shutdown with a bad socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() with a bad socket descriptor - EBADF");
-
- /*shutdown() TEST2: Invalid socket, ENOTSOCK Expected error */
- error = shutdown(0, SHUT_WR);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "shutdown with an invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() with an invalid socket - ENOTSOCK");
-
- errno = 0;
- /*Do a send first before doing shutdown */
- test_send(acpt_sk[0], message, strlen(message), 0);
-
- /*shutdown() TEST3: shutdown with SHUT_WR flag to disable new send */
- error = shutdown(clnt_sk[0], SHUT_WR);
- if (error < 0)
- tst_brkm(TBROK, NULL, "shutdown with SHUT_WR flag "
- "error:%d, errno:%d", error, errno);
-
- /* Reading on a socket that has received SHUTDOWN should return 0
- * indicating EOF.
- */
- error = recv(acpt_sk[0], msgbuf, 100, 0);
- if ((error != 0) || (errno != 0))
- tst_brkm(TBROK, NULL, "recv on a SHUTDOWN received socket "
- "error:%d, errno:%d", error, errno);
-
- /* Read the pending message on clnt_sk[0] that was received before
- * SHUTDOWN call.
- */
- test_recv(clnt_sk[0], msgbuf, 100, 0);
-
- /* No more messages and the association is SHUTDOWN, should fail. */
- error = recv(clnt_sk[0], msgbuf, 100, 0);
- if ((error != -1) || (errno != ENOTCONN))
- tst_brkm(TBROK, NULL, "recv on a SHUT_WR socket with no "
- "messages error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() with SHUT_WR flag - SUCCESS");
-
- errno = 0;
-
- /*shutdown() TEST4: shutdown with SHUT_RD flag to disable new receive */
- test_shutdown(clnt_sk[1], SHUT_RD);
-
- error = recv(clnt_sk[1], msgbuf, 100, 0);
- if ((error != 0) || (errno != 0))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RD socket "
- "error:%d, errno:%d", error, errno);
-
- /* Sending a message on SHUT_RD socket. */
- error = test_send(clnt_sk[1], message, strlen(message), 0);
- if (error < 0)
- tst_brkm(TBROK, NULL, "send on a SHUT_RD socket "
- "error:%d, errno:%d", error, errno);
-
- /* Receive the message sent on SHUT_RD socket. */
- test_recv(acpt_sk[1], msgbuf, 100, 0);
-
- /* Send a message to the SHUT_RD socket. */
- test_send(acpt_sk[1], message, strlen(message), 0);
-
- /* We should not receive the message as the socket is SHUT_RD */
- error = recv(clnt_sk[1], msgbuf, 100, 0);
- if ((error != 0) || (errno != 0))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RD socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() with SHUT_RD flag - SUCCESS");
-
- /*shutdown() TEST5: shutdown with SHUT_RDWR flag to disable new
- receive/send */
- test_shutdown(clnt_sk[2], SHUT_RDWR);
-
- error = recv(acpt_sk[2], msgbuf, 100, 0);
- if ((error != 0) || (errno != 0))
- tst_brkm(TBROK, NULL, "recv on a SHUTDOWN received socket "
- "error:%d, errno:%d", error, errno);
-
- error = recv(clnt_sk[2], msgbuf, 100, 0);
- if ((error != 0) || (errno != 0))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RDWR socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() with SHUT_RDWR flag - SUCCESS");
-
- /*shutdown() TEST6: Unconnected socket, ENOTCONN Expected error */
- error = shutdown(sk, SHUT_RD);
- if ((error != -1) || (errno != ENOTCONN))
- tst_brkm(TBROK, NULL, "shutdown on an unconnected socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "shutdown() on an unconnected socket - SUCCESS");
-
- for (i = 0; i < MAX_CLIENTS; i++)
- close(clnt_sk[i]);
- for (i = 0; i < MAX_CLIENTS; i++)
- close(acpt_sk[i]);
-
- close(lstn_sk);
- close(sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_socket_bind_listen.c b/testcases/network/sctp/func_tests/test_1_to_1_socket_bind_listen.c
deleted file mode 100644
index 086ce0b57..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_socket_bind_listen.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test the socket (), bind () and listen () for
- * 1-1 style sockets
- *
- * socket () Tests:
- * ---------------
- * TEST1: Invalid domain
- * TEST2: Invalid type
- * TEST3: Opening a TCP style socket
- *
- * bind () Tests:
- * -------------
- * TEST4: Invalid address
- * TEST5: Invalid address length
- * TEST6: Invalid socket descriptor
- * TEST7: Invalid host name
- * TEST8: On a socket that is already bound
- * TEST9: On reserved ports
- * TEST10: INADDR_ANY address and non-zero port
- * TEST11: INADDR_ANY address and zero port
- * TEST12: Local address and zero port
- *
- * listen () Tests:
- * ---------------
- * TEST13: Bad socket descriptor
- * TEST14: Invalid socket
- * TEST15: Listening a bound socket
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <sctputil.h>
-
-#define SCTP_RESERVED_PORT 7
-#define SCTP_INV_LOOPBACK "172.31.43.112"
-
-char *TCID = __FILE__;
-int TST_TOTAL = 15;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int sk, pf_class;
- int error = 0;
- int uid;
-
- struct sockaddr_in bind_addr;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- /* socket() TEST1: Invalid domain, EAFNOSUPPORT Expected error */
- sk = socket(-1, SOCK_STREAM, IPPROTO_SCTP);
- if (sk != -1 || errno != EAFNOSUPPORT)
- tst_brkm(TBROK, NULL, "socket() with invalid domain "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "socket() with invalid domain - EAFNOSUPPORT");
-
- /*socket() TEST2 : Invalid type, EINVAL Expected error */
- sk = socket(pf_class, -1, IPPROTO_SCTP);
- if (sk != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "socket() with invalid type "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "socket() with invalid type - EINVAL");
-
- /*socket() TEST3: opening a socket */
- sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- if (sk < 0)
- tst_brkm(TBROK, NULL, "valid socket() call "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "socket() - SUCCESS");
-
- /*bind() TEST4: Invalid structure, EFAULT Expected error */
- error = bind(sk, (struct sockaddr *)-1, sizeof(struct sockaddr_in));
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "bind() with invalid address ptr "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with invalid address ptr - EFAULT");
-
- /*bind() TEST5: Invalid address length, EINVAL Expect error */
- bind_addr.sin_family = AF_INET;
- bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- bind_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr) - 2);
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "bind() with invalid address length "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with invalid address length - EINVAL");
-
- /*bind() TEST6: Invalid socket descriptor, ENOTSOCK Expect Error */
- error = bind(0, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "bind() with invalid socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with invalid socket descriptor - ENOTSOCK");
-
- /*bind() TEST7: Invalid host name, EADDRNOTAVAIL Expect Error */
- /*Assigning invalid host name */
- bind_addr.sin_addr.s_addr = inet_addr(SCTP_INV_LOOPBACK);
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error != -1 || errno != EADDRNOTAVAIL)
- tst_brkm(TBROK, NULL, "bind() with invalid local "
- "address error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with invalid local address - EADDRNOTAVAIL");
-
- /*bind() TEST8: Bind on a socket that has already called bind
- EINAVL, Expected error */
- bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- /*Calling bind first time, it should pass */
- test_bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
-
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error != -1 || errno != EINVAL)
- tst_brkm(TBROK, NULL, "bind() on an already bound socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() on an already bound socket - EINVAL");
-
- /*Closing the socket which succeed in bind() */
- close(sk);
-
- /*Opening the socket again for further test */
- sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*bind() TEST9: Bind on reserved ports EACCES, Expected error */
- /*Assigning a reserved port */
- uid = getuid();
- if (uid != 0) {
- bind_addr.sin_port = htons(SCTP_RESERVED_PORT);
- error = bind(sk, (struct sockaddr *)&bind_addr,
- sizeof(bind_addr));
- if (error != -1 || errno != EACCES)
- tst_brkm(TBROK, NULL, "bind() on reserverd port "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() on reserved port - EACCESS");
- }
-
- /*bind() TEST10: INADDR_ANY address and non-zero port, bind() should
- succeed */
- bind_addr.sin_addr.s_addr = INADDR_ANY;
- bind_addr.sin_port = htons(SCTP_TESTPORT_1);
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error < 0)
- tst_brkm(TBROK, NULL, "bind() with INADDR_ANY address and "
- "non-zero port error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with INADDR_ANY address and non-zero port - "
- "SUCCESS");
-
- /*Closing the socket which succeed in bind() */
- close(sk);
-
- /*Opening the socket again for further test */
- sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*bind() TEST11: INADDR_ANY address and zero port, bind() should
- succeed */
- bind_addr.sin_port = 0;
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error < 0)
- tst_brkm(TBROK, NULL, "bind() with INADDR_ANY address and "
- "zero port error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with INADDR_ANY address and zero port - "
- "SUCCESS");
-
- /*Closing the socket which succeed in bind() */
- close(sk);
-
- /*Opening the socket again for further test */
- sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*bind() TEST12: local address and zero port, bind() should
- succeed */
- bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- bind_addr.sin_port = 0;
- error = bind(sk, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
- if (error < 0)
- tst_brkm(TBROK, NULL, "bind() with local address and "
- "zero port error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "bind() with local address and zero port - " "SUCCESS");
-
- /*listen() TEST13: Bad socket descriptor EBADF, Expected error */
- error = listen(-1, 3);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "listen() with bad socket descriptor "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "listen() with bad socket descriptor - EBADF");
-
- /*listen() TEST14: Invalid socket ENOTSOCK, Expected error */
- error = listen(0, 3);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "listen() with invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "listen() with invalid socket - ENOTSOCK");
-
- /*listen() TEST15:listen on a bound socket, should succeed */
- error = listen(sk, 3);
- if (error < 0)
- tst_brkm(TBROK, NULL, "listen() on a bound socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "listen() on a bound socket - SUCCESS");
-
- close(sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_sockopt.c b/testcases/network/sctp/func_tests/test_1_to_1_sockopt.c
deleted file mode 100644
index c36f502dc..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_sockopt.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file has test cases to test negative scenarios for getsockopt ()
- * setsockopt () call for 1-1 style sockets
- *
- * setsockopt () Tests:
- * -------------------
- * TEST1: setsockopt: Bad socket descriptor
- * TEST2: setsockopt: Invalid socket
- * TEST3: setsockopt: Invalid level
- * TEST4: setsockopt: Invalid option buffer
- * TEST5: setsockopt: Invalid option name
- * TEST6: getsockopt: Bad socket descriptor
- * TEST7: getsockopt: Invalid socket
- * TEST8: getsockopt: Invalid option buffer
- * TEST9: getsockopt: Invalid option name
- *
- * TEST10: getsockopt: SCTP_INITMSG
- * TEST11: setsockopt: SCTP_INITMSG
- * TEST12: setsockopt: SO_LINGER
- * TEST13: getsockopt: SO_LINGER
- * TEST14: getsockopt: SO_RCVBUF
- * TEST15: getsockopt: SCTP_STATUS
- * TEST16: setsockopt: SO_RCVBUF
- * TEST17: setsockopt: SO_SNDBUF
- * TEST18: getsockopt: SO_SNDBUF
- * TEST19: getsockopt: SCTP_PRIMARY_ADDR
- * TEST20: setsockopt: SCTP_PRIMARY_ADDR
- * TEST21: getsockopt: SCTP_ASSOCINFO
- * TEST22: setsockopt: SCTP_ASSOCINFO
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 22;
-int TST_CNT = 0;
-
-int main(void)
-{
- int error;
- socklen_t len;
- int sk, sk1, sk2, acpt_sk, pf_class;
- struct sctp_rtoinfo grtinfo;
- struct sockaddr_in lstn_addr, conn_addr;
- struct sctp_initmsg ginmsg; /*get the value for SCTP_INITMSG */
- struct sctp_initmsg sinmsg; /*set the value for SCTP_INITMSG */
- struct linger slinger; /*SO_LINGER structure */
- struct linger glinger; /*SO_LINGER structure */
- struct sockaddr_in addr;
- struct sockaddr_in *gaddr;
- struct sctp_status gstatus; /*SCTP_STATUS option */
- int rcvbuf_val_get, rcvbuf_val_set; /*get and set var for SO_RCVBUF */
- int sndbuf_val_get, sndbuf_val_set; /*get and set var for SO_SNDBUF */
- struct sctp_prim gprimaddr; /*SCTP_PRIMARY_ADDR get */
- struct sctp_prim sprimaddr; /*SCTP_PRIMARY_ADDR set */
- struct sctp_assocparams sassocparams; /* SCTP_ASSOCPARAMS set */
- struct sctp_assocparams gassocparams; /* SCTP_ASSOCPARAMS get */
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- pf_class = PF_INET;
-
- sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /*setsockopt() TEST1: Bad socket descriptor EBADF, Expected error */
- error = setsockopt(-1, IPPROTO_SCTP, 0, 0, 0);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "setsockopt with a bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() with a bad socket descriptor - EBADF");
-
- /*setsockopt() TEST2: Invalid socket ENOTSOCK, Expected error */
- error = setsockopt(0, IPPROTO_SCTP, 0, 0, 0);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "setsockopt with an invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() with an invalid socket - ENOTSOCK");
-
- /*setsockopt() TEST3: Invalid level ENOPROTOOPT, Expected error */
- error = setsockopt(sk, -1, SCTP_RTOINFO, 0, 0);
- if (error != -1 || errno != ENOPROTOOPT)
- tst_brkm(TBROK, NULL, "setsockopt with invalid level "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() with an invalid level - ENOPROTOOPT");
-
- /*setsockopt() TEST4: Invalid option buffer EFAULT, Expected error */
- error = setsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO,
- (const struct sctp_rtoinfo *)-1,
- sizeof(struct sctp_rtoinfo));
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "setsockopt with invalid option "
- "buffer error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() with invalid option buffer - EFAULT");
-
- /*setsockopt() TEST5: Invalid option Name EOPNOTSUPP, Expected error */
- error = setsockopt(sk, IPPROTO_SCTP, SCTP_AUTOCLOSE, 0, 0);
- if (error != -1 || errno != EOPNOTSUPP)
- tst_brkm(TBROK, NULL, "setsockopt with invalid option "
- "name error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() with invalid option name - EOPNOTSUPP");
-
- /*getsockopt() TEST6: Bad socket descriptor EBADF, Expected error */
- error = getsockopt(-1, IPPROTO_SCTP, 0, 0, 0);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "getsockopt with a bad socket "
- "descriptor error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() with a bad socket descriptor - EBADF");
-
- /*getsockopt() TEST7: Invalid socket ENOTSOCK, Expected error */
- error = getsockopt(0, IPPROTO_SCTP, 0, 0, 0);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "getsockopt with an invalid socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() with an invalid socket - ENOTSOCK");
-#if 0
- /*getsockopt() TEST3: Invalid level ENOPROTOOPT, Expected error */
- /*I have commented this test case because it is returning EOPNOTSUPP.
- When I checked the code there also it is returning EOPNOTSUPP. As this
- is not specific to TCP style, I do not want to do the code change */
-
- error = getsockopt(sk, -1, SCTP_RTOINFO, 0, 0);
- if (error != -1 || errno != ENOPROTOOPT)
- tst_brkm(TBROK, NULL, "getsockopt with invalid level "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() with an invalid level - ENOPROTOOPT");
-#endif
- len = sizeof(struct sctp_rtoinfo);
-
- /*getsockopt() TEST8: Invalid option buffer EFAULT, Expected error */
- error = getsockopt(sk, IPPROTO_SCTP, SCTP_RTOINFO,
- (struct sctp_rtoinfo *)-1, &len);
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "getsockopt with invalid option "
- "buffer error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() with invalid option buffer - EFAULT");
-
- /*getsockopt() TEST9: Invalid option Name EOPNOTSUPP, Expected error */
- error = getsockopt(sk, IPPROTO_SCTP, SCTP_AUTOCLOSE, &grtinfo, &len);
- if (error != -1 || errno != EOPNOTSUPP)
- tst_brkm(TBROK, NULL, "getsockopt with invalid option "
- "name error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() with invalid option name - EOPNOTSUPP");
-
- close(sk);
-
- sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- len = sizeof(struct sctp_initmsg);
-
- /* TEST10: Test cases for getsockopt SCTP_INITMSG */
- test_getsockopt(sk1, SCTP_INITMSG, &ginmsg, &len);
-
- tst_resm(TPASS, "getsockopt() SCTP_INITMSG - SUCCESS");
-
- sinmsg.sinit_num_ostreams = 5;
- sinmsg.sinit_max_instreams = 5;
- sinmsg.sinit_max_attempts = 3;
- sinmsg.sinit_max_init_timeo = 30;
- /* TEST11: Test case for setsockopt SCTP_INITMSG */
- test_setsockopt(sk1, SCTP_INITMSG, &sinmsg, sizeof(sinmsg));
-
- test_getsockopt(sk1, SCTP_INITMSG, &ginmsg, &len);
-
- if (sinmsg.sinit_num_ostreams != ginmsg.sinit_num_ostreams &&
- sinmsg.sinit_max_instreams != ginmsg.sinit_max_instreams &&
- sinmsg.sinit_max_attempts != ginmsg.sinit_max_attempts &&
- sinmsg.sinit_max_init_timeo != ginmsg.sinit_max_init_timeo)
- tst_brkm(TBROK, NULL, "setsockopt/getsockopt SCTP_INITMSG "
- "compare failed");
-
- tst_resm(TPASS, "setsockopt() SCTP_INITMSG - SUCCESS");
-
- /*Now get the values on different endpoint */
- test_getsockopt(sk2, SCTP_INITMSG, &ginmsg, &len);
-
- /*Comparison should not succeed here */
- if (sinmsg.sinit_num_ostreams == ginmsg.sinit_num_ostreams &&
- sinmsg.sinit_max_instreams == ginmsg.sinit_max_instreams &&
- sinmsg.sinit_max_attempts == ginmsg.sinit_max_attempts &&
- sinmsg.sinit_max_init_timeo == ginmsg.sinit_max_init_timeo)
- tst_brkm(TBROK, NULL, "setsockopt/getsockopt SCTP_INITMSG "
- "unexpected compare success");
-
- /* SO_LINGER Test with l_onff = 0 and l_linger = 0 */
- slinger.l_onoff = 0;
- slinger.l_linger = 0;
- test_bind(sk1, (struct sockaddr *)&lstn_addr, sizeof(lstn_addr));
- test_listen(sk1, 10);
- len = sizeof(struct sockaddr_in);
- test_connect(sk2, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(sk1, (struct sockaddr *)&addr, &len);
-
- len = sizeof(struct linger);
- /* TEST12: Test case for setsockopt SO_LINGER */
- error = setsockopt(sk2, SOL_SOCKET, SO_LINGER, &slinger, len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "setsockopt SO_LINGER "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() SO_LINGER - SUCCESS");
-
- /* TEST13: Test case for getsockopt SO_LINGER */
- error = getsockopt(sk2, SOL_SOCKET, SO_LINGER, &glinger, &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SO_LINGER "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SO_LINGER - SUCCESS");
-
- if (slinger.l_onoff != glinger.l_onoff ||
- slinger.l_linger != glinger.l_linger)
- tst_brkm(TBROK, NULL, "setsockopt/getsockopt SO_LINGER "
- "compare failed");
-
- /*First gets the default SO_RCVBUF value and comapres with the
- value obtained from SCTP_STATUS */
- len = sizeof(int);
- /* TEST14: Test case for getsockopt SO_RCVBUF */
- error = getsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &rcvbuf_val_get, &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SO_RCVBUF "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SO_RCVBUF - SUCCESS");
-
- len = sizeof(struct sctp_status);
- /* TEST15: Test case for getsockopt SCTP_STATUS */
- error = getsockopt(sk2, IPPROTO_SCTP, SCTP_STATUS, &gstatus, &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_STATUS "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SCTP_STATUS - SUCCESS");
-
- /* Reducing the SO_RCVBUF value using setsockopt() */
- len = sizeof(int);
- /* (rcvbuf len)*2 should be no less than SOCK_MIN_RCVBUF in kernel */
- rcvbuf_val_set = 1500;
- /* TEST16: Test case for setsockopt SO_RCVBUF */
- error = setsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &rcvbuf_val_set, len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "setsockopt SO_RCVBUF "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() SO_RCVBUF - SUCCESS");
-
- error = getsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &rcvbuf_val_get, &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SO_RCVBUF "
- "error:%d, errno:%d", error, errno);
-
- if ((2 * rcvbuf_val_set) != rcvbuf_val_get)
- tst_brkm(TBROK, NULL, "Comparison failed:Set value and "
- "got value differs Set Value=%d Get Value=%d",
- (2 * rcvbuf_val_set), rcvbuf_val_get);
-
- sndbuf_val_set = 1024;
- /* TEST17: Test case for setsockopt SO_SNDBUF */
- error = setsockopt(sk2, SOL_SOCKET, SO_SNDBUF, &sndbuf_val_set, len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "setsockopt SO_SNDBUF "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() SO_SNDBUF - SUCCESS");
-
- /* TEST18: Test case for getsockopt SO_SNDBUF */
- error = getsockopt(sk2, SOL_SOCKET, SO_SNDBUF, &sndbuf_val_get, &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SO_SNDBUF "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SO_SNDBUF - SUCCESS");
-
- if ((2 * sndbuf_val_set) != sndbuf_val_get)
- tst_brkm(TBROK, NULL, "Comparison failed:Set value and "
- "got value differs Set Value=%d Get Value=%d\n",
- (2 * sndbuf_val_set), sndbuf_val_get);
-
- /* Getting the primary address using SCTP_PRIMARY_ADDR */
- len = sizeof(struct sctp_prim);
- /* TEST19: Test case for getsockopt SCTP_PRIMARY_ADDR */
- error = getsockopt(sk2, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &gprimaddr,
- &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_PRIMARY_ADDR "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SCTP_PRIMARY_ADDR - SUCCESS");
-
- gaddr = (struct sockaddr_in *)&gprimaddr.ssp_addr;
- if (htons(gaddr->sin_port) != lstn_addr.sin_port &&
- gaddr->sin_family != lstn_addr.sin_family &&
- gaddr->sin_addr.s_addr != lstn_addr.sin_addr.s_addr)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_PRIMARY_ADDR value "
- "mismatch");
-
- memcpy(&sprimaddr, &gprimaddr, sizeof(struct sctp_prim));
-
- /* TEST20: Test case for setsockopt SCTP_PRIMARY_ADDR */
- error = setsockopt(sk2, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &sprimaddr,
- len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "setsockopt SCTP_PRIMARY_ADDR "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt() SCTP_PRIMARY_ADDR - SUCCESS");
-
- /* TEST21: Test case for getsockopt SCTP_PRIMARY_ADDR */
- /* Getting the association info using SCTP_ASSOCINFO */
- len = sizeof(struct sctp_assocparams);
- error = getsockopt(sk2, IPPROTO_SCTP, SCTP_ASSOCINFO, &gassocparams,
- &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_ASSOCINFO "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt() SCTP_ASSOCINFO - SUCCESS");
-
- /* TEST21: Test case for setsockopt SCTP_ASSOCINFO */
- memcpy(&sassocparams, &gassocparams, sizeof(struct sctp_assocparams));
- sassocparams.sasoc_asocmaxrxt += 5;
- sassocparams.sasoc_cookie_life += 10;
-
- error = setsockopt(sk2, IPPROTO_SCTP, SCTP_ASSOCINFO, &sassocparams,
- len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "setsockopt SCTP_ASSOCINFO "
- "error:%d, errno:%d", error, errno);
-
- error = getsockopt(sk2, IPPROTO_SCTP, SCTP_ASSOCINFO, &gassocparams,
- &len);
- if (error < 0)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_ASSOCINFO "
- "error:%d, errno:%d", error, errno);
-
- if (sassocparams.sasoc_asocmaxrxt != gassocparams.sasoc_asocmaxrxt ||
- sassocparams.sasoc_cookie_life != gassocparams.sasoc_cookie_life)
- tst_brkm(TBROK, NULL, "getsockopt SCTP_ASSOCINFO value "
- "mismatch");
- tst_resm(TPASS, "setsockopt() SCTP_ASSOCINFO - SUCCESS");
-
- close(sk2);
- close(sk1);
- close(acpt_sk);
-
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_1_to_1_threads.c b/testcases/network/sctp/func_tests/test_1_to_1_threads.c
deleted file mode 100644
index d09ec09e9..000000000
--- a/testcases/network/sctp/func_tests/test_1_to_1_threads.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/* SCTP kernel reference Implementation
- * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
- * (C) Copyright IBM Corp. 2004
- *
- * This file does send and receive for 500 threads on a unique association for
- * THREAD_SND_RCV_LOOPS = 10 many times. To change the number of threads
- * change the THREADS valuen and loop change the THREAD_SND_RCV_LOOPS.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release
- *
- */
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h> /* for sockaddr_in */
-#include <arpa/inet.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sys/uio.h>
-#include <stdint.h>
-#include <linux/socket.h>
-#include <sctputil.h>
-
-#define THREADS 10 /* FIXME should be 500 instead of 10 */
-#define THREAD_SND_RCV_LOOPS 10
-
-char *TCID = __FILE__;
-int TST_TOTAL = 1;
-int TST_CNT = 0;
-
-int client_sk;
-int server_sk;
-int acpt_sk;
-struct sockaddr_in conn_addr;
-char *message = "hello, world!\n";
-
-void t_recv(int id)
-{
- int cnt;
- struct msghdr inmessage;
- struct iovec iov;
- char incmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- char *buffer;
-
- memset(&inmessage, 0, sizeof(inmessage));
- buffer = malloc(100);
-
- iov.iov_base = buffer;
- iov.iov_len = 100;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- cnt = test_recvmsg(acpt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, cnt, strlen(message) + 1, MSG_EOR,
- 0, 0);
-}
-
-void t_send(int id)
-{
- struct msghdr outmessage;
- struct sctp_sndrcvinfo *sinfo;
- char *buffer_snd;
- struct cmsghdr *cmsg;
- struct iovec out_iov;
- char outcmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
-
- memset(&outmessage, 0, sizeof(outmessage));
- buffer_snd = malloc(100);
-
- outmessage.msg_name = &conn_addr;
- outmessage.msg_namelen = sizeof(conn_addr);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
-
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = (strlen(message) + 1);
-
- test_sendmsg(client_sk, &outmessage, 0, strlen(message) + 1);
-}
-
-void *relay(void *id_)
-{
- int id = (uintptr_t) id_;
- if (id == 0) {
- t_send(id);
- } else if (id == THREADS - 1) {
- t_send(id);
- } else {
- t_recv(id);
- t_send(id);
- }
-
- return 0;
-}
-
-int main(void)
-{
-
- int cnt, i;
- pthread_t thread[THREADS];
- int status;
- int exit_status;
- void *result;
- pthread_attr_t attr;
- struct sockaddr_in lstn_addr;
- socklen_t len = sizeof(struct sockaddr_in);
- struct sockaddr_in svr_addr;
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
-
- server_sk = test_socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP);
- client_sk = test_socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP);
-
- lstn_addr.sin_family = AF_INET;
- lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- conn_addr.sin_family = AF_INET;
- conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- conn_addr.sin_port = htons(SCTP_TESTPORT_1);
-
- test_bind(server_sk, (struct sockaddr *)&lstn_addr,
- sizeof(struct sockaddr_in));
-
- test_listen(server_sk, 10);
-
- test_connect(client_sk, (struct sockaddr *)&conn_addr, len);
-
- acpt_sk = test_accept(server_sk, (struct sockaddr *)&svr_addr, &len);
-
- for (i = 0; i < THREAD_SND_RCV_LOOPS; i++) {
- for (cnt = 1; cnt < THREADS; cnt++) {
- status = pthread_create(&thread[cnt], &attr,
- relay, (void *)(uintptr_t) cnt);
- if (status)
- tst_brkm(TBROK, NULL, "pthread_create "
- "failed status:%d, errno:%d", status,
- errno);
- }
-
- pthread_attr_destroy(&attr);
- for (cnt = 1; cnt < THREADS; cnt++) {
- exit_status = pthread_join(thread[cnt], &result);
- if (exit_status == -1)
- tst_brkm(TBROK, NULL, "pthread_join "
- "Thread #%d exited with status:%d",
- cnt, exit_status);
- }
- }
-
- tst_resm(TPASS, "send and receive data across multiple threads - "
- "SUCCESS");
-
- pthread_exit(NULL);
-}
diff --git a/testcases/network/sctp/func_tests/test_assoc_abort.c b/testcases/network/sctp/func_tests/test_assoc_abort.c
deleted file mode 100644
index 52d5ebd44..000000000
--- a/testcases/network/sctp/func_tests/test_assoc_abort.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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:
- * Ardelle Fan <ardelle.fan@intle.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a functional test to verify the ungraceful abort of an
- * association.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 1;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk[MAX_CLIENTS];
- sockaddr_storage_t svr_loop, clt_loop[MAX_CLIENTS];
- sctp_assoc_t svr_associd[MAX_CLIENTS];
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- int error;
- uint32_t ppid;
- uint32_t stream;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int i;
- char *message = "hello, world!\n";
- struct sctp_status status;
- socklen_t status_len;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
- test_bind(svr_sk, &svr_loop.sa, sizeof(svr_loop));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind all the client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_sk[i] = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- clt_loop[i].v4.sin_family = AF_INET;
- clt_loop[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop[i].v4.sin_port = htons(SCTP_TESTPORT_2 + i);
- test_bind(clt_sk[i], &clt_loop[i].sa, sizeof(clt_loop[i]));
-
- test_enable_assoc_change(clt_sk[i]);
- }
-
- /* Build up a msghdr structure we can use for all sending. */
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- out_iov.iov_base = message;
- out_iov.iov_len = strlen(message) + 1;
-
- /* Send the first message from all the clients to the server. This
- * will create the associations.
- */
- for (i = 0; i < MAX_CLIENTS; i++)
- test_sendmsg(clt_sk[i], &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on all client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- }
-
- /* Get the communication up message and the data message on the
- * server sockets for all the clients.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd[i] = sac->sac_assoc_id;
- }
-
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- outmessage.msg_iov = NULL;
- outmessage.msg_iovlen = 0;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- sinfo->sinfo_flags |= SCTP_ABORT;
-
- /* Shutdown all the associations of the server socket in a loop. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- sinfo->sinfo_assoc_id = svr_associd[i];
-
- /* Verify that the association is present. */
- memset(&status, 0, sizeof(struct sctp_status));
- status.sstat_assoc_id = sinfo->sinfo_assoc_id;
- status_len = sizeof(struct sctp_status);
- error = getsockopt(svr_sk, SOL_SCTP, SCTP_STATUS,
- &status, &status_len);
- if (error)
- tst_brkm(TBROK, NULL,
- "getsockopt(SCTP_STATUS): %s",
- strerror(errno));
-
- /* Call sendmsg() to abort the association. */
- test_sendmsg(svr_sk, &outmessage, 0, 0);
-
- /* Verify that the association is no longer present. */
- memset(&status, 0, sizeof(struct sctp_status));
- status.sstat_assoc_id = sinfo->sinfo_assoc_id;
- status_len = sizeof(struct sctp_status);
- error = getsockopt(svr_sk, SOL_SCTP, SCTP_STATUS,
- &status, &status_len);
- if ((error != -1) && (errno != EINVAL))
- tst_brkm(TBROK, NULL,
- "getsockopt(SCTP_STATUS) "
- "error:%d errno:%d", error, errno);
- }
-
- close(svr_sk);
-
- /* Get the COMM_LOST notification. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_LOST);
-
- close(clt_sk[i]);
- }
-
- tst_resm(TPASS, "ABORT an association using SCTP_ABORT");
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_assoc_shutdown.c b/testcases/network/sctp/func_tests/test_assoc_shutdown.c
deleted file mode 100644
index a78e9555b..000000000
--- a/testcases/network/sctp/func_tests/test_assoc_shutdown.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a functional test to verify the graceful shutdown of an
- * association.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 1;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk[MAX_CLIENTS];
- sctp_assoc_t svr_associd[MAX_CLIENTS];
- sockaddr_storage_t svr_loop, clt_loop[MAX_CLIENTS];
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- int error;
- uint32_t ppid;
- uint32_t stream;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int i;
- char *message = "hello, world!\n";
- struct sctp_status status;
- socklen_t status_len;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
- test_bind(svr_sk, &svr_loop.sa, sizeof(svr_loop));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind all the client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_sk[i] = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- clt_loop[i].v4.sin_family = AF_INET;
- clt_loop[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop[i].v4.sin_port = htons(SCTP_TESTPORT_2 + i);
- test_bind(clt_sk[i], &clt_loop[i].sa, sizeof(clt_loop[i]));
-
- test_enable_assoc_change(clt_sk[i]);
- }
-
- /* Build up a msghdr structure we can use for all sending. */
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- out_iov.iov_base = message;
- out_iov.iov_len = strlen(message) + 1;
-
- /* Send the first message from all the clients to the server. This
- * will create the associations.
- */
- for (i = 0; i < MAX_CLIENTS; i++)
- test_sendmsg(clt_sk[i], &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on all client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- }
-
- /* Get the communication up message and the data message on the
- * server sockets for all the clients.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd[i] = sac->sac_assoc_id;
- }
-
- /* Build up a msghdr structure we can use for all sending. */
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- outmessage.msg_iov = NULL;
- outmessage.msg_iovlen = 0;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- sinfo->sinfo_flags |= SCTP_EOF;
-
- /* Shutdown all the associations of the server socket in a loop. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- sinfo->sinfo_assoc_id = svr_associd[i];
-
- /* Verify that the association is present. */
- memset(&status, 0, sizeof(struct sctp_status));
- status.sstat_assoc_id = sinfo->sinfo_assoc_id;
- status_len = sizeof(struct sctp_status);
- error = getsockopt(svr_sk, SOL_SCTP, SCTP_STATUS,
- &status, &status_len);
- if (error)
- tst_brkm(TBROK, NULL,
- "getsockopt(SCTP_STATUS): %s",
- strerror(errno));
-
- /* Call sendmsg() to shutdown the association. */
- test_sendmsg(svr_sk, &outmessage, 0, 0);
-
- /* Verify that the association is no longer present. */
- memset(&status, 0, sizeof(struct sctp_status));
- status.sstat_assoc_id = sinfo->sinfo_assoc_id;
- status_len = sizeof(struct sctp_status);
- error = getsockopt(svr_sk, SOL_SCTP, SCTP_STATUS,
- &status, &status_len);
- if ((error != -1) && (errno != EINVAL))
- tst_brkm(TBROK, NULL,
- "getsockopt(SCTP_STATUS) "
- "error:%d errno:%d", error, errno);
- }
-
- close(svr_sk);
-
- /* Get the shutdown complete notification. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE,
- SCTP_SHUTDOWN_COMP);
-
- close(clt_sk[i]);
- }
-
- tst_resm(TPASS, "Graceful shutdown of associations using SCTP_EOF");
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_autoclose.c b/testcases/network/sctp/func_tests/test_autoclose.c
deleted file mode 100644
index ef42fdc93..000000000
--- a/testcases/network/sctp/func_tests/test_autoclose.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a Functional Test to verify autoclose functionality and the
- * socket option SCTP_AUTOCLOSE that can be used to specify the duration in
- * which an idle association is automatically closed.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 1;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int sk1, sk2;
- sockaddr_storage_t loop1, loop2;
- struct msghdr inmessage, outmessage;
- struct iovec iov, out_iov;
- int error, bytes_sent;
- char *big_buffer;
- char *message = "hello, world!\n";
- uint32_t autoclose;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- loop1.v4.sin_family = AF_INET;
- loop1.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop1.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- loop2.v4.sin_family = AF_INET;
- loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop2.v4.sin_port = htons(SCTP_TESTPORT_2);
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(sk1);
- test_enable_assoc_change(sk2);
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop1.sa, sizeof(loop1));
- test_bind(sk2, &loop2.sa, sizeof(loop2));
-
- /* Mark sk2 as being able to accept new associations. */
- test_listen(sk2, 1);
-
- /* Set the autoclose duration for the associations created on sk1
- * and sk2 to be 5 seconds.
- */
- autoclose = 5;
- test_setsockopt(sk1, SCTP_AUTOCLOSE, &autoclose, sizeof(autoclose));
- test_setsockopt(sk2, SCTP_AUTOCLOSE, &autoclose, sizeof(autoclose));
-
- /* Send the first message. This will create the association. */
- memset(&outmessage, 0, sizeof(outmessage));
- outmessage.msg_name = &loop2;
- outmessage.msg_namelen = sizeof(loop2);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- bytes_sent = test_sendmsg(sk1, &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = NULL;
-
- /* Get the communication up message on sk2. */
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Get the communication up message on sk1. */
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Get the first message which was sent. */
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR | MSG_CTRUNC, 0, 0);
-
- tst_resm(TINFO, "Waiting for the associations to close automatically "
- "in 5 secs");
-
- /* Get the shutdown complete notification from sk1. */
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- /* Get the shutdown complete notification from sk2. */
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- tst_resm(TPASS, "Autoclose of associations");
-
- /* Shut down the link. */
- close(sk1);
- close(sk2);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_basic.c b/testcases/network/sctp/func_tests/test_basic.c
deleted file mode 100644
index a5f60e25e..000000000
--- a/testcases/network/sctp/func_tests/test_basic.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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>
- * Hui Huang <hui.huang@nokia.com>
- * Jon Grimm <jgrimm@us.ibm.com>
- * Sridhar Samudrala <samudrala@us.ibm.com>
- */
-
-/* This is a basic functional test for the SCTP kernel reference
- * implementation state machine.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 15;
-int TST_CNT = 0;
-
-int main(void)
-{
- int sk1, sk2;
- sockaddr_storage_t loop1;
- sockaddr_storage_t loop2;
- sockaddr_storage_t msgname;
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- char *message = "hello, world!\n";
- char *telephone = "Watson, come here! I need you!\n";
- char *telephone_resp = "I already brought your coffee...\n";
- int error, bytes_sent;
- int pf_class;
- uint32_t ppid;
- uint32_t stream;
- sctp_assoc_t associd1, associd2;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- struct sockaddr *laddrs, *paddrs;
- int n_laddrs, n_paddrs, i;
- struct sockaddr *sa_addr;
- struct sockaddr_in *in_addr;
- struct sockaddr_in6 *in6_addr;
- void *addr_buf;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
-
- loop1.v6.sin6_family = AF_INET6;
- loop1.v6.sin6_addr = (struct in6_addr)SCTP_IN6ADDR_ANY_INIT;
- loop1.v6.sin6_port = htons(SCTP_TESTPORT_1);
-
- loop2.v6.sin6_family = AF_INET6;
- loop2.v6.sin6_addr = in6addr_loopback;
- loop2.v6.sin6_port = htons(SCTP_TESTPORT_2);
-#else
- pf_class = PF_INET;
-
- loop1.v4.sin_family = AF_INET;
- loop1.v4.sin_addr.s_addr = INADDR_ANY;
- loop1.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- loop2.v4.sin_family = AF_INET;
- loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop2.v4.sin_port = htons(SCTP_TESTPORT_2);
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- tst_resm(TPASS, "socket");
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop1.sa, sizeof(loop1));
- test_bind(sk2, &loop2.sa, sizeof(loop2));
-
- tst_resm(TPASS, "bind");
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(sk1);
- test_enable_assoc_change(sk2);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_name = &msgname;
-
- /* Try to read on socket 2. This should fail since we are
- * neither listening, nor established.
- */
- inmessage.msg_controllen = sizeof(incmsg);
- error = recvmsg(sk2, &inmessage, MSG_WAITALL);
- if (error > 0)
- tst_brkm(TBROK, NULL, "recvmsg on a socket neither"
- "listening nor established error: %d", error);
-
- tst_resm(TPASS, "recvmsg on a socket neither listening nor "
- "established");
-
- /* Mark sk2 as being able to accept new associations. */
- error = test_listen(sk2, 1);
-
- tst_resm(TPASS, "listen");
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &loop2;
- outmessage.msg_namelen = sizeof(loop2);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(message) + 1);
-
- tst_resm(TPASS, "sendmsg with a valid msg_name");
-
- /* Get the communication up message on sk2. */
- inmessage.msg_controllen = sizeof(incmsg);
- inmessage.msg_namelen = sizeof(msgname);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-#if TEST_V6
-
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in6)) {
- DUMP_CORE;
- }
- if (msgname.v6.sin6_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
-
- if (msgname.v6.sin6_family != AF_INET6) {
- DUMP_CORE;
- }
-
- if (memcmp(&msgname.v6.sin6_addr, &in6addr_loopback,
- sizeof(msgname.v6.sin6_addr))) {
- DUMP_CORE;
- }
-#else
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in)) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
-
- if (msgname.v4.sin_family != AF_INET) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_addr.s_addr != SCTP_IP_LOOPBACK) {
- DUMP_CORE;
- }
-#endif
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd2 = sac->sac_assoc_id;
-
- /* Get the communication up message on sk1. */
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd1 = sac->sac_assoc_id;
-
- tst_resm(TPASS, "recvmsg COMM_UP notifications");
-
- /* Get the first message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- inmessage.msg_namelen = sizeof(msgname);
- memset(&msgname, 0, sizeof(msgname));
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-#if TEST_V6
-
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in6)) {
- DUMP_CORE;
- }
- if (msgname.v6.sin6_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
-
- if (msgname.v6.sin6_family != AF_INET6) {
- DUMP_CORE;
- }
-
- if (memcmp(&msgname.v6.sin6_addr, &in6addr_loopback,
- sizeof(msgname.v6.sin6_addr))) {
- DUMP_CORE;
- }
-#else
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in)) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_family != AF_INET) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_addr.s_addr != SCTP_IP_LOOPBACK) {
- DUMP_CORE;
- }
-#endif
-
- /* Try to send a message with NULL msg_name and associd, should fail */
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid++;
- stream++;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = telephone;
- outmessage.msg_iov->iov_len = strlen(telephone) + 1;
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- bytes_sent = sendmsg(sk1, &outmessage, MSG_NOSIGNAL);
- if ((bytes_sent > 0) || (EPIPE != errno))
- tst_brkm(TBROK, NULL, "sendmsg with NULL associd and "
- "NULL msg_name error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "sendmsg with NULL associd and NULL msg_name");
-
- /* Fill in a incorrect assoc_id, which should cause an error. */
- sinfo->sinfo_assoc_id = associd2;
- bytes_sent = sendmsg(sk1, &outmessage, MSG_NOSIGNAL);
- if ((bytes_sent > 0) || (EPIPE != errno))
- tst_brkm(TBROK, NULL, "sendmsg with incorrect associd "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "sendmsg with incorrect associd");
-
- /* Fill in a correct assoc_id and get back to the normal testing. */
- sinfo->sinfo_assoc_id = associd1;
- /* Send two more messages, to cause a second SACK. */
- test_sendmsg(sk1, &outmessage, 0, strlen(telephone) + 1);
-
- outmessage.msg_name = &loop2;
- outmessage.msg_namelen = sizeof(loop2);
- outmessage.msg_iov->iov_base = telephone_resp;
- outmessage.msg_iov->iov_len = strlen(telephone_resp) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(telephone_resp) + 1);
-
- tst_resm(TPASS, "sendmsg with valid associd");
-
- /* Get those two messages. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(telephone) + 1,
- MSG_EOR, stream, ppid);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(telephone_resp) + 1,
- MSG_EOR, stream, ppid);
-
- tst_resm(TPASS, "recvmsg");
-
- n_laddrs = sctp_getladdrs(sk1, associd1, &laddrs);
- if (n_laddrs <= 0)
- tst_brkm(TBROK, NULL, "sctp_getladdrs: %s", strerror(errno));
-
- tst_resm(TPASS, "sctp_getladdrs");
-
- addr_buf = (void *)laddrs;
- for (i = 0; i < n_laddrs; i++) {
- sa_addr = (struct sockaddr *)addr_buf;
- if (AF_INET == sa_addr->sa_family) {
- in_addr = (struct sockaddr_in *)sa_addr;
- tst_resm(TINFO, "LOCAL ADDR %d.%d.%d.%d PORT %d",
- NIPQUAD(in_addr->sin_addr),
- ntohs(in_addr->sin_port));
- addr_buf += sizeof(struct sockaddr_in);
- } else {
- in6_addr = (struct sockaddr_in6 *)sa_addr;
- tst_resm(TINFO,
- "LOCAL ADDR %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x PORT %d",
- NIP6(in6_addr->sin6_addr),
- ntohs(in6_addr->sin6_port));
- addr_buf += sizeof(struct sockaddr_in6);
- }
- }
-
- sctp_freeladdrs(laddrs);
-
- tst_resm(TPASS, "sctp_freeladdrs");
-
- n_paddrs = sctp_getpaddrs(sk1, associd1, &paddrs);
- if (n_paddrs <= 0)
- tst_brkm(TBROK, NULL, "sctp_getpaddrs: %s", strerror(errno));
-
- tst_resm(TPASS, "sctp_getpaddrs");
-
- addr_buf = (void *)paddrs;
- for (i = 0; i < n_paddrs; i++) {
- sa_addr = (struct sockaddr *)addr_buf;
- if (AF_INET == sa_addr->sa_family) {
- in_addr = (struct sockaddr_in *)sa_addr;
- tst_resm(TINFO, "PEER ADDR %d.%d.%d.%d PORT %d",
- NIPQUAD(in_addr->sin_addr),
- ntohs(in_addr->sin_port));
- addr_buf += sizeof(struct sockaddr_in);
- } else {
- in6_addr = (struct sockaddr_in6 *)sa_addr;
- tst_resm(TINFO,
- "PEER ADDR %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x PORT %d",
- NIP6(in6_addr->sin6_addr),
- ntohs(in6_addr->sin6_port));
- addr_buf += sizeof(struct sockaddr_in6);
- }
- }
-
- sctp_freepaddrs(paddrs);
-
- tst_resm(TPASS, "sctp_freepaddrs");
-
- /* Shut down the link. */
- close(sk1);
-
- /* Get the shutdown complete notification. */
- inmessage.msg_controllen = sizeof(incmsg);
- inmessage.msg_namelen = sizeof(msgname);
- memset(&msgname, 0, sizeof(msgname));
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-#if TEST_V6
-
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in6)) {
- DUMP_CORE;
- }
- if (msgname.v6.sin6_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
-
- if (msgname.v6.sin6_family != AF_INET6) {
- DUMP_CORE;
- }
-
- if (memcmp(&msgname.v6.sin6_addr, &in6addr_loopback,
- sizeof(msgname.v6.sin6_addr))) {
- DUMP_CORE;
- }
-#else
- if (inmessage.msg_namelen != sizeof(struct sockaddr_in)) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_port != htons(SCTP_TESTPORT_1)) {
- DUMP_CORE;
- }
-
- if (msgname.v4.sin_family != AF_INET) {
- DUMP_CORE;
- }
- if (msgname.v4.sin_addr.s_addr != SCTP_IP_LOOPBACK) {
- DUMP_CORE;
- }
-#endif
-
- tst_resm(TPASS, "recvmsg SHUTDOWN_COMP notification");
-
- close(sk2);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_connect.c b/testcases/network/sctp/func_tests/test_connect.c
deleted file mode 100644
index 6fc788ad7..000000000
--- a/testcases/network/sctp/func_tests/test_connect.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2002, 2003
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- * Written or modified by:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a kernel test to verify the one-to-many style connect() in blocking
- * and non-blocking modes.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 5;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk1, clt_sk2, peeloff_sk;
- sctp_assoc_t svr_associd1, svr_associd2, clt_associd1, clt_associd2;
- sockaddr_storage_t svr_loop, clt_loop1, clt_loop2, clt_loop3;
- struct iovec iov;
- struct msghdr inmessage;
- int error;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int flags;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
- clt_loop1.v4.sin_family = AF_INET;
- clt_loop1.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop1.v4.sin_port = htons(SCTP_TESTPORT_2);
- clt_loop2.v4.sin_family = AF_INET;
- clt_loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop2.v4.sin_port = htons(SCTP_TESTPORT_2 + 1);
- clt_loop3.v4.sin_family = AF_INET;
- clt_loop3.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop3.v4.sin_port = htons(SCTP_TESTPORT_2 + 2);
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(svr_sk, &svr_loop.sa, sizeof(svr_loop));
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind the client sockets. */
- clt_sk1 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(clt_sk1, &clt_loop1.sa, sizeof(clt_loop1));
- clt_sk2 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(clt_sk2, &clt_loop2.sa, sizeof(clt_loop2));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
- test_enable_assoc_change(clt_sk1);
- test_enable_assoc_change(clt_sk2);
-
- /* Set clt_sk1 as non-blocking. */
- flags = fcntl(clt_sk1, F_GETFL, 0);
- if (flags < 0)
- tst_brkm(TBROK, NULL, "fcntl F_GETFL: %s", strerror(errno));
- if (fcntl(clt_sk1, F_SETFL, flags | O_NONBLOCK) < 0)
- tst_brkm(TBROK, NULL, "fcntl F_SETFL: %s", strerror(errno));
-
- /* Do a non-blocking connect from clt_sk1 to svr_sk */
- error = connect(clt_sk1, &svr_loop.sa, sizeof(svr_loop));
- /* Non-blocking connect should return immediately with EINPROGRESS. */
- if ((error != -1) || (EINPROGRESS != errno))
- tst_brkm(TBROK, NULL, "non-blocking connect error: %d"
- "errno:%d", error, errno);
-
- tst_resm(TPASS, "non-blocking connect");
-
- /* Doing a connect on a socket to create an association that is
- * is already established should return EISCONN.
- */
- error = connect(clt_sk1, &svr_loop.sa, sizeof(svr_loop));
- if ((error != -1) || (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connect on a socket to create an "
- "assoc that is already established error:%d errno:%d",
- error, errno);
-
- tst_resm(TPASS, "connect on a socket to create an assoc that is "
- "already established");
-
- /* Initialize inmessage for all receives. */
- memset(&inmessage, 0, sizeof(inmessage));
- big_buffer = test_malloc(REALLY_BIG);
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = NULL;
-
- /* Get COMM_UP on clt_sk1 */
- error = test_recvmsg(clt_sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- clt_associd1 = sac->sac_assoc_id;
-
- /* Get COMM_UP on svr_sk */
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd1 = sac->sac_assoc_id;
-
- /* Do a blocking connect from clt_sk2 to svr_sk.
- * Blocking connect should block until the association is established
- * and return success.
- */
- test_connect(clt_sk2, &svr_loop.sa, sizeof(svr_loop));
-
- /* Get COMM_UP on clt_sk2 */
- error = test_recvmsg(clt_sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- clt_associd2 = sac->sac_assoc_id;
-
- /* Get COMM_UP on svr_sk */
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd2 = sac->sac_assoc_id;
-
- tst_resm(TPASS, "blocking connect");
-
- peeloff_sk = test_sctp_peeloff(svr_sk, svr_associd1);
-
- /* Doing a connect on a peeled off socket should fail. */
- error = connect(peeloff_sk, &clt_loop3.sa, sizeof(clt_loop3));
- if ((error != -1) || (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connect on a peeled off socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect on a peeled off socket");
-
- /* Trying to create an association on a socket that matches an
- * existing peeled-off association should fail.
- */
- error = connect(svr_sk, &clt_loop1.sa, sizeof(clt_loop1));
- if ((error != -1) || (EADDRNOTAVAIL != errno))
- tst_brkm(TBROK, NULL, "connect to create an assoc that "
- "matches a peeled off assoc error:%d errno:%d",
- error, errno);
-
- tst_resm(TPASS, "connect to create an assoc that matches a peeled off "
- "assoc");
-
- close(svr_sk);
- close(clt_sk1);
- close(clt_sk2);
- close(peeloff_sk);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_connectx.c b/testcases/network/sctp/func_tests/test_connectx.c
deleted file mode 100644
index 8f08025eb..000000000
--- a/testcases/network/sctp/func_tests/test_connectx.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2002, 2003
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- * Written or modified by:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a kernel test to verify the one-to-many style sctp_connectx()
- * in blocking and non-blocking modes.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 9;
-int TST_CNT = 0;
-
-#define NUMADDR 6
-#define SCTP_IP_LOOPBACK_I(I) htonl(0x7f000001 + I)
-
-#define NIPQUAD(addr) \
- ((unsigned char *)&addr)[0], \
- ((unsigned char *)&addr)[1], \
- ((unsigned char *)&addr)[2], \
- ((unsigned char *)&addr)[3]
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk1, clt_sk2, peeloff_sk;
- sctp_assoc_t svr_associd1, svr_associd2, clt_associd1, clt_associd2;
- struct iovec iov;
- struct msghdr inmessage;
- int error, i;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int flags;
- struct sockaddr_in svr_loop[NUMADDR];
- struct sockaddr_in svr_try[NUMADDR];
- struct sockaddr_in clt_loop1[NUMADDR];
- struct sockaddr_in clt_loop2[NUMADDR];
- struct sockaddr_in clt_loop3[NUMADDR];
- sockaddr_storage_t svr_test[NUMADDR], clt_test1[NUMADDR],
- clt_test2[NUMADDR];
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- for (i = 0; i < NUMADDR; i++) {
- /* Initialize the server and client addresses. */
- svr_loop[i].sin_family = AF_INET;
- svr_loop[i].sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i);
- svr_loop[i].sin_port = htons(SCTP_TESTPORT_1);
- svr_test[i].v4.sin_family = AF_INET;
- svr_test[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i);
- svr_test[i].v4.sin_port = htons(SCTP_TESTPORT_1);
- svr_try[i].sin_family = AF_INET;
- if (i < (NUMADDR - 1)) {
- svr_try[i].sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i);
- } else {
- /* Make last address invalid. */
- svr_try[i].sin_addr.s_addr =
- SCTP_IP_LOOPBACK_I(i + 0x400);
- }
- svr_try[i].sin_port = htons(SCTP_TESTPORT_1);
- clt_loop1[i].sin_family = AF_INET;
- clt_loop1[i].sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i + 0x100);
- clt_loop1[i].sin_port = htons(SCTP_TESTPORT_2);
- clt_test1[i].v4.sin_family = AF_INET;
- clt_test1[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i + 0x100);
- clt_test1[i].v4.sin_port = htons(SCTP_TESTPORT_2);
- clt_loop2[i].sin_family = AF_INET;
- clt_loop2[i].sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i + 0x200);
- clt_loop2[i].sin_port = htons(SCTP_TESTPORT_2 + 1);
- clt_test2[i].v4.sin_family = AF_INET;
- clt_test2[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i + 0x200);
- clt_test2[i].v4.sin_port = htons(SCTP_TESTPORT_2 + 1);
- clt_loop3[i].sin_family = AF_INET;
- clt_loop3[i].sin_addr.s_addr = SCTP_IP_LOOPBACK_I(i + 0x300);
- clt_loop3[i].sin_port = htons(SCTP_TESTPORT_2 + 2);
- }
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(svr_sk, (struct sockaddr *)&svr_loop[0], sizeof(svr_loop[0]));
- test_bindx_add(svr_sk, (struct sockaddr *)&svr_loop[1], NUMADDR - 1);
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind the client sockets. */
- clt_sk1 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(clt_sk1, (struct sockaddr *)&clt_loop1[0], sizeof(clt_loop1));
- test_bindx_add(clt_sk1, (struct sockaddr *)&clt_loop1[1], NUMADDR - 1);
- clt_sk2 = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(clt_sk2, (struct sockaddr *)&clt_loop2[0], sizeof(clt_loop2));
- test_bindx_add(clt_sk2, (struct sockaddr *)&clt_loop2[1], NUMADDR - 1);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
- test_enable_assoc_change(clt_sk1);
- test_enable_assoc_change(clt_sk2);
-
- /* Set clt_sk1 as non-blocking. */
- flags = fcntl(clt_sk1, F_GETFL, 0);
- if (flags < 0)
- tst_brkm(TBROK, NULL, "fcntl F_GETFL: %s", strerror(errno));
- if (fcntl(clt_sk1, F_SETFL, flags | O_NONBLOCK) < 0)
- tst_brkm(TBROK, NULL, "fcntl F_SETFL: %s", strerror(errno));
-
- /* Do a non-blocking connectx from clt_sk1 to svr_sk */
- error = sctp_connectx(clt_sk1, (struct sockaddr *)svr_try, NUMADDR);
- /* Non-blocking connectx should return immediately with EINPROGRESS. */
- if ((error != -1) || (EINPROGRESS != errno))
- tst_brkm(TBROK, NULL, "non-blocking connectx error: %d"
- "errno:%d", error, errno);
-
- tst_resm(TPASS, "non-blocking connectx");
-
- /* Doing a connectx on a socket to create an association that is
- * is already established should return EISCONN.
- */
- error = sctp_connectx(clt_sk1, (struct sockaddr *)svr_try, NUMADDR);
- if ((error != -1) || (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connectx on a socket to create an "
- "assoc that is already established error:%d errno:%d",
- error, errno);
-
- tst_resm(TPASS, "connectx on a socket to create an assoc that is "
- "already established");
-
- /* Initialize inmessage for all receives. */
- memset(&inmessage, 0, sizeof(inmessage));
- big_buffer = test_malloc(REALLY_BIG);
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = NULL;
-
- /* Get COMM_UP on clt_sk1 */
- error = test_recvmsg(clt_sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- clt_associd1 = sac->sac_assoc_id;
-
- /* Get COMM_UP on svr_sk */
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd1 = sac->sac_assoc_id;
-
- /* Do a blocking connectx from clt_sk2 to svr_sk.
- * Blocking connectx should block until the association is established
- * and return success.
- */
- test_connectx(clt_sk2, (struct sockaddr *)svr_try, NUMADDR);
-
- /* Get COMM_UP on clt_sk2 */
- error = test_recvmsg(clt_sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- clt_associd2 = sac->sac_assoc_id;
-
- /* Get COMM_UP on svr_sk */
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd2 = sac->sac_assoc_id;
-
- tst_resm(TPASS, "blocking connectx");
-
- peeloff_sk = test_sctp_peeloff(svr_sk, svr_associd1);
-
- /* Doing a connectx on a peeled off socket should fail. */
- error =
- sctp_connectx(peeloff_sk, (struct sockaddr *)clt_loop3, NUMADDR);
- if ((error != -1) || (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connectx on a peeled off socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connectx on a peeled off socket");
-
- /* Trying to create an association on a socket that matches an
- * existing peeled-off association should fail.
- */
- error = sctp_connectx(svr_sk, (struct sockaddr *)clt_loop1, NUMADDR);
- if ((error != -1) || (EADDRNOTAVAIL != errno))
- tst_brkm(TBROK, NULL, "connectx to create an assoc that "
- "matches a peeled off assoc error:%d errno:%d",
- error, errno);
-
- tst_resm(TPASS, "connectx to create an assoc that matches a peeled off "
- "assoc");
-
- test_peer_addr(peeloff_sk, svr_associd1, clt_test1, NUMADDR);
- tst_resm(TPASS, "server association 1 peers ok");
- test_peer_addr(svr_sk, svr_associd2, clt_test2, NUMADDR);
- tst_resm(TPASS, "server association 2 peers ok");
- test_peer_addr(clt_sk1, clt_associd1, svr_test, NUMADDR);
- tst_resm(TPASS, "client association 1 peers ok");
- test_peer_addr(clt_sk2, clt_associd2, svr_test, NUMADDR);
- tst_resm(TPASS, "client association 2 peers ok");
- close(svr_sk);
- close(clt_sk1);
- close(clt_sk2);
- close(peeloff_sk);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_fragments.c b/testcases/network/sctp/func_tests/test_fragments.c
deleted file mode 100644
index 4e92ac3fd..000000000
--- a/testcases/network/sctp/func_tests/test_fragments.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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>
- * Hui Huang <hui.huang@nokia.com>
- * Jon Grimm <jgrimm@us.ibm.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a functional test to verify the data fragmentation, reassembly
- * support and SCTP_DISABLE_FRAGMENTS socket option.
- * The following tests are done in sequence.
- * - Verify SCTP_DISABLE_FRAGMENTS socket option by doing a setsockopt()
- * followed by a getsockopt().
- * - Verify that a message size exceeding the association fragmentation
- * point cannot be sent when fragmentation is disabled.
- * - Send and receive a set of messages that are bigger than the path mtu.
- * The different message sizes to be tested are specified in the array
- * msg_sizes[].
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 4;
-int TST_CNT = 0;
-
-int msg_sizes[] = { 1353, 2000, 5000, 10000, 20000, 32768 };
-
-int main(int argc, char *argv[])
-{
- int sk1, sk2;
- sockaddr_storage_t loop1;
- sockaddr_storage_t loop2;
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- int error, bytes_sent;
- int pf_class, af_family;
- uint32_t ppid;
- uint32_t stream;
- sctp_assoc_t associd1, associd2;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int msg_len, msg_cnt, i;
- void *msg_buf;
- int disable_frag;
- socklen_t optlen;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
- af_family = AF_INET6;
-
- loop1.v6.sin6_family = AF_INET6;
- loop1.v6.sin6_addr = in6addr_loopback;
- loop1.v6.sin6_port = htons(SCTP_TESTPORT_1);
-
- loop2.v6.sin6_family = AF_INET6;
- loop2.v6.sin6_addr = in6addr_loopback;
- loop2.v6.sin6_port = htons(SCTP_TESTPORT_2);
-#else
- pf_class = PF_INET;
- af_family = AF_INET;
-
- loop1.v4.sin_family = AF_INET;
- loop1.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop1.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- loop2.v4.sin_family = AF_INET;
- loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop2.v4.sin_port = htons(SCTP_TESTPORT_2);
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(sk1);
- test_enable_assoc_change(sk2);
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop1.sa, sizeof(loop1));
- test_bind(sk2, &loop2.sa, sizeof(loop2));
-
- /* Mark sk2 as being able to accept new associations. */
- test_listen(sk2, 1);
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &loop2;
- outmessage.msg_namelen = sizeof(loop2);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- msg_len = 10;
- msg_buf = test_build_msg(10);
- outmessage.msg_iov->iov_base = msg_buf;
- outmessage.msg_iov->iov_len = msg_len;
- test_sendmsg(sk1, &outmessage, 0, msg_len);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on sk2. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd2 = sac->sac_assoc_id;
-
- /* Get the communication up message on sk1. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd1 = sac->sac_assoc_id;
-
- /* Get the first message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, msg_len, MSG_EOR, stream, ppid);
-
- free(msg_buf);
-
- /* Disable fragmentation. */
- disable_frag = 1;
- test_setsockopt(sk1, SCTP_DISABLE_FRAGMENTS, &disable_frag,
- sizeof(disable_frag));
-
- tst_resm(TPASS, "setsockopt(SCTP_DISABLE_FRAGMENTS)");
-
- /* Do a getsockopt() and verify that fragmentation is disabled. */
- disable_frag = 0;
- optlen = sizeof(disable_frag);
- error = test_getsockopt(sk1, SCTP_DISABLE_FRAGMENTS, &disable_frag,
- &optlen);
- if ((error != 0) && (disable_frag != 1))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DISABLE_FRAGMENTS) "
- "error:%d errno:%d disable_frag:%d",
- error, errno, disable_frag);
-
- tst_resm(TPASS, "getsockopt(SCTP_DISABLE_FRAGMENTS)");
-
- /* Try to send a messsage that exceeds association fragmentation point
- * and verify that it fails.
- */
- msg_len = 30000;
- msg_buf = test_build_msg(msg_len);
- outmessage.msg_iov->iov_base = msg_buf;
- outmessage.msg_iov->iov_len = msg_len;
- error = sendmsg(sk1, &outmessage, 0);
- if ((error != -1) || (errno != EMSGSIZE))
- tst_brkm(TBROK, NULL, "Send a message that exceeds "
- "assoc frag point error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "Send a message that exceeds assoc frag point");
-
- /* Enable Fragmentation. */
- disable_frag = 0;
- test_setsockopt(sk1, SCTP_DISABLE_FRAGMENTS, &disable_frag,
- sizeof(disable_frag));
-
- msg_cnt = sizeof(msg_sizes) / sizeof(int);
-
- /* Send and receive the messages of different sizes specified in the
- * msg_sizes array in a loop.
- */
- for (i = 0; i < msg_cnt; i++) {
-
- msg_len = msg_sizes[i];
- msg_buf = test_build_msg(msg_len);
- outmessage.msg_iov->iov_base = msg_buf;
- outmessage.msg_iov->iov_len = msg_len;
- bytes_sent = test_sendmsg(sk1, &outmessage, 0, msg_len);
-
- tst_resm(TINFO, "Sent %d byte message", bytes_sent);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- /* Handle Partial Reads. */
- if (inmessage.msg_flags & MSG_EOR) {
- test_check_msg_data(&inmessage, error, bytes_sent,
- MSG_EOR, stream, ppid);
- tst_resm(TINFO, "Received %d byte message", error);
- } else {
- int remain;
-
- test_check_msg_data(&inmessage, error, error, 0,
- stream, ppid);
- tst_resm(TINFO, "Received %d byte message", error);
-
- /* Read the remaining message. */
- inmessage.msg_controllen = sizeof(incmsg);
- remain = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, remain,
- bytes_sent - error,
- MSG_EOR, stream, ppid);
- tst_resm(TINFO, "Received %d byte message", error);
- }
-
- free(msg_buf);
- }
-
- tst_resm(TPASS, "Send/Receive fragmented messages");
-
- /* Shut down the link. */
- close(sk1);
-
- /* Get the shutdown complete notification. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- close(sk2);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_getname.c b/testcases/network/sctp/func_tests/test_getname.c
deleted file mode 100644
index f3003681b..000000000
--- a/testcases/network/sctp/func_tests/test_getname.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2004
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * The SCTP reference 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 reference 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 given to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- *
- * Written or modified by:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a kernel test to verify getsockname() and getpeername() interfaces
- * for single-homed one-to-one style sockets.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 13;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int clt_sk, svr_sk, accept_sk;
- sockaddr_storage_t svr_loop, accept_loop;
- sockaddr_storage_t svr_local_addr, svr_peer_addr;
- sockaddr_storage_t clt_local_addr, clt_peer_addr;
- socklen_t len;
- int error;
- int pf_class;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
-#if TEST_V6
- pf_class = PF_INET6;
- svr_loop.v6.sin6_family = AF_INET6;
- svr_loop.v6.sin6_addr = (struct in6_addr)SCTP_IN6ADDR_ANY_INIT;
- svr_loop.v6.sin6_port = htons(SCTP_TESTPORT_1);
-#else
- pf_class = PF_INET;
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = INADDR_ANY;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
-#endif
-
- /* Create and bind the listening server socket. */
- svr_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(svr_sk, &svr_loop.sa, sizeof(svr_loop));
-
- memset(&svr_local_addr, 0x00, sizeof(svr_local_addr));
- len = sizeof(svr_local_addr);
- /* Verify that getsockname() on an unconnected socket works fine. */
- error = getsockname(svr_sk, (struct sockaddr *)&svr_local_addr, &len);
- if (0 != error)
- tst_brkm(TBROK, NULL, "getsockname: %s", strerror(errno));
-
- tst_resm(TPASS, "getsockname on an unconnected socket");
-
- memset(&svr_peer_addr, 0x00, sizeof(svr_peer_addr));
- len = sizeof(svr_peer_addr);
- /* Verify that getpeername() on an unconnected socket fails. */
- error = getpeername(svr_sk, (struct sockaddr *)&svr_peer_addr, &len);
- if ((-1 != error) || (ENOTCONN != errno))
- tst_brkm(TBROK, NULL, "getpeername on an unconnected "
- "socket error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "getpeername on an unconnected socket");
-
- /* Mark svr_sk as being able to accept new associations. */
- test_listen(svr_sk, 5);
-
- /* Create the client socket. */
- clt_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /* Do a blocking connect from clt_sk to svr_sk */
-#if TEST_V6
- svr_loop.v6.sin6_addr = in6addr_loopback;
-#else
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
-#endif
- test_connect(clt_sk, &svr_loop.sa, sizeof(svr_loop));
-
- memset(&clt_local_addr, 0x00, sizeof(clt_local_addr));
- len = sizeof(clt_local_addr);
- /* Get the client's local address. */
- error = getsockname(clt_sk, (struct sockaddr *)&clt_local_addr, &len);
- if (0 != error)
- tst_brkm(TBROK, NULL, "getsockname on a connected client "
- "socket: %s", strerror(errno));
-
- tst_resm(TPASS, "getsockname on a connected client socket");
-
- memset(&clt_peer_addr, 0x00, sizeof(clt_peer_addr));
- len = sizeof(clt_peer_addr);
- /* Get the client's peer address. */
- error = getpeername(clt_sk, (struct sockaddr *)&clt_peer_addr, &len);
- if (0 != error)
- tst_brkm(TBROK, NULL, "getpeername on a connected client "
- "socket: %s", strerror(errno));
-
- tst_resm(TPASS, "getpeername on a connected client socket");
-
- /* Extract the association on the listening socket as a new socket. */
- len = sizeof(accept_loop);
- accept_sk = test_accept(svr_sk, &accept_loop.sa, &len);
-
- memset(&svr_local_addr, 0x00, sizeof(svr_local_addr));
- len = sizeof(svr_local_addr);
- /* Get the server's local address. */
- error = getsockname(accept_sk, (struct sockaddr *)&svr_local_addr,
- &len);
- if (0 != error)
- tst_brkm(TBROK, NULL, "getsockname on a connected server "
- "socket: %s", strerror(errno));
-
- tst_resm(TPASS, "getsockname on a connected server socket");
-
- memset(&svr_peer_addr, 0x00, sizeof(svr_peer_addr));
- len = sizeof(svr_peer_addr);
- /* Get the server's peer address. */
- error = getpeername(accept_sk, (struct sockaddr *)&svr_peer_addr, &len);
- if (0 != error)
- tst_brkm(TBROK, NULL, "getpeername on a connected server "
- "socket: %s", strerror(errno));
-
- tst_resm(TPASS, "getpeername on a connected server socket");
-
- if (svr_local_addr.v4.sin_port != clt_peer_addr.v4.sin_port)
- tst_brkm(TBROK, NULL, "Server's local port(%d) doesn't "
- "match Client's peer port(%d)\n",
- svr_local_addr.v4.sin_port, clt_peer_addr.v4.sin_port);
-
- if (svr_peer_addr.v4.sin_port != clt_local_addr.v4.sin_port)
- tst_brkm(TBROK, NULL, "Server's peer port(%d) doesn't "
- "match Client's local port(%d)\n",
- svr_peer_addr.v4.sin_port, clt_local_addr.v4.sin_port);
-#if TEST_V6
- if (memcmp(&svr_local_addr, &clt_peer_addr, len) != 0)
- tst_brkm(TBROK, NULL, "Server's local address and client's "
- "peer addresses do not match\n");
-
- if (memcmp(&svr_peer_addr, &clt_local_addr, len) != 0)
- tst_brkm(TBROK, NULL, "Server's peer address and client's "
- "local addresses do not match\n");
-#else
- if (svr_local_addr.v4.sin_addr.s_addr !=
- clt_peer_addr.v4.sin_addr.s_addr)
- tst_brkm(TBROK, NULL, "Server's local address and client's "
- "peer addresses do not match\n");
- if (svr_peer_addr.v4.sin_addr.s_addr !=
- clt_local_addr.v4.sin_addr.s_addr)
- tst_brkm(TBROK, NULL, "Server's peer address and client's "
- "local addresses do not match\n");
-#endif
- tst_resm(TPASS, "getsockname/getpeername server/client match");
-
- memset(&clt_local_addr, 0x00, sizeof(clt_local_addr));
- len = sizeof(clt_local_addr);
- /*getsockname(): Bad socket descriptor, EBADF expected error */
- error = getsockname(-1, (struct sockaddr *)&clt_local_addr, &len);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "getsockname on a bad socket "
- "descriptor. error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockname on a bad socket descriptor - EBADF");
-
- /*getsockname(): Invalid socket, ENOTSOCK expected error */
- error = getsockname(0, (struct sockaddr *)&clt_local_addr, &len);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "getsockname on an invalid socket "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockname on an invalid socket - ENOTSOCK");
-
- /*getsockname(): Invalid structure, EFAULT expected error */
- error = getsockname(clt_sk, (struct sockaddr *)-1, &len);
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "getsockname with invalid buffer "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockname with invalid buffer - EFAULT");
-
- memset(&clt_peer_addr, 0x00, sizeof(clt_peer_addr));
- len = sizeof(clt_peer_addr);
- /*getpeername(): Bad socket descriptor, EBADF expected error */
- error = getpeername(-1, (struct sockaddr *)&clt_local_addr, &len);
- if (error != -1 || errno != EBADF)
- tst_brkm(TBROK, NULL, "getpeername on a bad socket "
- "descriptor. error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getpeername on a bad socket descriptor - EBADF");
-
- /*getpeername(): Invalid socket, ENOTSOCK expected error */
- error = getpeername(0, (struct sockaddr *)&clt_local_addr, &len);
- if (error != -1 || errno != ENOTSOCK)
- tst_brkm(TBROK, NULL, "getpeername on an invalid socket "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getpeername on an invalid socket - ENOTSOCK");
-
- /*getpeername(): Invalid structure, EFAULT expected error */
- error = getpeername(clt_sk, (struct sockaddr *)-1, &len);
- if (error != -1 || errno != EFAULT)
- tst_brkm(TBROK, NULL, "getpeername with invalid buffer "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "getpeername with invalid buffer - EFAULT");
-
- close(clt_sk);
- close(svr_sk);
- close(accept_sk);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_inaddr_any.c b/testcases/network/sctp/func_tests/test_inaddr_any.c
deleted file mode 100644
index ac8a6385d..000000000
--- a/testcases/network/sctp/func_tests/test_inaddr_any.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2002, 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 reference 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 reference 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>
- * Jon Grimm <jgrimm@us.ibm.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- * Daisy Chang <daisyc@us.ibm.com>
- */
-
-/* This is a functional test to verify binding a socket with INADDRY_ANY
- * address and send messages.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 2;
-int TST_CNT = 0;
-
-int main(void)
-{
- int sk1, sk2;
- sockaddr_storage_t loop;
- sockaddr_storage_t anyaddr;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- struct iovec iov;
- struct msghdr inmessage;
- char *message = "hello, world!\n";
- char *telephone = "Watson, come here! I need you!\n";
- char *telephone_resp = "I already brought your coffee...\n";
- int error;
- int pf_class, af_family;
- uint32_t ppid;
- uint32_t stream;
- socklen_t namelen;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
- af_family = AF_INET6;
-
- loop.v6.sin6_family = AF_INET6;
- loop.v6.sin6_addr = (struct in6_addr)SCTP_IN6ADDR_LOOPBACK_INIT;
- loop.v6.sin6_port = 0;
-
- anyaddr.v6.sin6_family = AF_INET6;
- anyaddr.v6.sin6_addr = (struct in6_addr)SCTP_IN6ADDR_ANY_INIT;
- anyaddr.v6.sin6_port = 0;
-#else
- pf_class = PF_INET;
- af_family = AF_INET;
-
- loop.v4.sin_family = AF_INET;
- loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop.v4.sin_port = 0;
-
- anyaddr.v4.sin_family = AF_INET;
- anyaddr.v4.sin_addr.s_addr = INADDR_ANY;
- anyaddr.v4.sin_port = 0;
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(sk1);
- test_enable_assoc_change(sk2);
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop.sa, sizeof(loop));
- test_bind(sk2, &anyaddr.sa, sizeof(anyaddr));
-
- tst_resm(TPASS, "bind INADDR_ANY address");
-
- /* Mark sk2 as being able to accept new associations */
- test_listen(sk2, 1);
-
- /* Now use getsockaname() to retrieve the ephmeral ports. */
- namelen = sizeof(loop);
- error = getsockname(sk1, &loop.sa, &namelen);
- if (error != 0)
- tst_brkm(TBROK, NULL, "getsockname: %s", strerror(errno));
-
- namelen = sizeof(anyaddr);
- error = getsockname(sk2, &anyaddr.sa, &namelen);
- if (error != 0)
- tst_brkm(TBROK, NULL, "getsockname: %s", strerror(errno));
-
-#if TEST_V6
- loop.v6.sin6_port = anyaddr.v6.sin6_port;
-#else
- loop.v4.sin_port = anyaddr.v4.sin_port;
-#endif
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &loop;
- outmessage.msg_namelen = sizeof(loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = test_malloc(REALLY_BIG);
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on sk2. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Get the communication up message on sk1. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Get the first message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-
- /* Send 2 messages. */
- outmessage.msg_name = &loop;
- outmessage.msg_namelen = sizeof(loop);
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid++;
- stream++;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = telephone;
- outmessage.msg_iov->iov_len = strlen(telephone) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(telephone) + 1);
-
- outmessage.msg_iov->iov_base = telephone_resp;
- outmessage.msg_iov->iov_len = strlen(telephone_resp) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(telephone_resp) + 1);
-
- /* Get those two messages. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(telephone) + 1,
- MSG_EOR, stream, ppid);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(telephone_resp) + 1,
- MSG_EOR, stream, ppid);
-
- /* Shut down the link. */
- close(sk1);
-
- /* Get the shutdown complete notification. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- close(sk2);
-
- tst_resm(TPASS, "send msgs from a socket with INADDR_ANY bind address");
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_peeloff.c b/testcases/network/sctp/func_tests/test_peeloff.c
deleted file mode 100644
index 08db12581..000000000
--- a/testcases/network/sctp/func_tests/test_peeloff.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a Functional test to verify the new SCTP interface sctp_peeloff()
- * that can be used to branch off an association into a separate socket.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 6;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk[MAX_CLIENTS], peeloff_sk[MAX_CLIENTS];
- sctp_assoc_t svr_associd[MAX_CLIENTS], clt_associd[MAX_CLIENTS];
- sockaddr_storage_t svr_loop, clt_loop[MAX_CLIENTS];
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- int error;
- uint32_t ppid;
- uint32_t stream;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- int i;
- char *message = "hello, world!\n";
- int pf_class;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
-#if TEST_V6
- pf_class = PF_INET6;
- svr_loop.v6.sin6_family = AF_INET6;
- svr_loop.v6.sin6_addr = in6addr_loopback;
- svr_loop.v6.sin6_port = htons(SCTP_TESTPORT_1);
-#else
- pf_class = PF_INET;
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
-#endif
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(svr_sk, &svr_loop.sa, sizeof(svr_loop));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind all the client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_sk[i] = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-#if TEST_V6
- clt_loop[i].v6.sin6_family = AF_INET6;
- clt_loop[i].v6.sin6_addr = in6addr_loopback;
- clt_loop[i].v6.sin6_port = htons(SCTP_TESTPORT_2 + i);
-#else
- clt_loop[i].v4.sin_family = AF_INET;
- clt_loop[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop[i].v4.sin_port = htons(SCTP_TESTPORT_2 + i);
-#endif
- test_bind(clt_sk[i], &clt_loop[i].sa, sizeof(clt_loop[i]));
-
- test_enable_assoc_change(clt_sk[i]);
- }
-
- /* Send the first message from all the clients to the server. This
- * will create the associations.
- */
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- for (i = 0; i < MAX_CLIENTS; i++)
- test_sendmsg(clt_sk[i], &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on all client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- clt_associd[i] = sac->sac_assoc_id;
- }
-
- /* Get the communication up message and the data message on the
- * server sockets for all the clients.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- svr_associd[i] = sac->sac_assoc_id;
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
- }
-
- /* Branch off all the associations on the server socket to separate
- * individual sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++)
- peeloff_sk[i] = test_sctp_peeloff(svr_sk, svr_associd[i]);
-
- tst_resm(TPASS, "sctp_peeloff");
-
- errno = 0;
- /* Verify that a peeled off socket is not allowed to do a listen(). */
- error = listen(peeloff_sk[0], 1);
- if (error != -1)
- tst_brkm(TBROK, NULL, "listen on a peeled off socket "
- "error: %d, errno: %d", error, errno);
-
- tst_resm(TPASS, "listen on a peeled off socket");
-
- errno = 0;
- /* Verify that an association cannot be branched off an already
- * peeled-off socket.
- */
- if ((-1 != sctp_peeloff(peeloff_sk[0], svr_associd[0])) ||
- (EINVAL != errno))
- tst_brkm(TBROK, NULL, "sctp_peeloff on a peeled off "
- "socket error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sctp_peeloff on a peeled off socket");
-
- /* Send a message from all the client sockets to the server socket. */
- for (i = 0; i < MAX_CLIENTS; i++)
- test_sendmsg(clt_sk[i], &outmessage, 0, strlen(message) + 1);
-
- /* Receive the sent messages on the peeled off server sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(peeloff_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
- }
-
- tst_resm(TPASS, "Receive msgs on peeled off sockets");
-
- /* Send a message from all the peeled off server sockets to the client
- * sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- outmessage.msg_name = &clt_loop[i];
- outmessage.msg_namelen = sizeof(clt_loop[i]);
- test_sendmsg(peeloff_sk[i], &outmessage, 0,
- strlen(message) + 1);
- }
-
- /* Receive the messages sent from the peeled of server sockets on
- * the client sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
- }
-
- tst_resm(TPASS, "Send msgs on peeled off sockets");
-
- errno = 0;
- /* Verify that a peeled-off socket cannot initialize a new
- * association by trying to send a message to a client that is not
- * associated with the peeled-off socket.
- * The message is sent to the client that is associated with the
- * socket.
- */
- outmessage.msg_name = &clt_loop[1];
- outmessage.msg_namelen = sizeof(clt_loop[1]);
- test_sendmsg(peeloff_sk[0], &outmessage, 0, strlen(message) + 1);
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[0], &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-
- tst_resm(TPASS, "peeled off socket cannot initialize a new assoc");
-
- close(svr_sk);
-
- /* Close all the peeled off server sockets. */
- for (i = 0; i < MAX_CLIENTS; i++)
- close(peeloff_sk[i]);
-
- /* Get the shutdown complete notification from all the client
- * sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk[i], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE,
- SCTP_SHUTDOWN_COMP);
-
- close(clt_sk[i]);
- }
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_recvmsg.c b/testcases/network/sctp/func_tests/test_recvmsg.c
deleted file mode 100644
index b6314d814..000000000
--- a/testcases/network/sctp/func_tests/test_recvmsg.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2002, 2003
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * This file is part of the SCTP kernel reference Implementation
- *
- * The SCTP reference 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 reference 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
- *
- * Written or modified by:
- * Sridhar Samudrala <sri@us.ibm.com>
- *
- * Any bugs reported to us we will try to fix... any fixes shared will
- * be incorporated into the next SCTP release.
- */
-
-/* This is a kernel test to verify
- * 1. MSG_EOR flag is set correctly when a single message is read using multiple
- * recvmsg() calls.
- * 2. MSG_PEEK support.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 2;
-int TST_CNT = 0;
-
-int main(int argc, char *argv[])
-{
- int svr_sk, clt_sk;
- struct sockaddr_in svr_loop, clt_loop;
- struct iovec iov, out_iov;
- struct msghdr inmessage, outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- int error, msglen, i;
- char *big_buffer;
- void *msg_buf;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
- svr_loop.sin_family = AF_INET;
- svr_loop.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.sin_port = htons(SCTP_TESTPORT_1);
- clt_loop.sin_family = AF_INET;
- clt_loop.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop.sin_port = htons(SCTP_TESTPORT_2);
-
- /* Create and bind the server socket. */
- svr_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(svr_sk, (struct sockaddr *)&svr_loop, sizeof(svr_loop));
-
- /* Mark server socket as being able to accept new associations. */
- test_listen(svr_sk, 1);
-
- /* Create and bind the client sockets. */
- clt_sk = test_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
- test_bind(clt_sk, (struct sockaddr *)&clt_loop, sizeof(clt_loop));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(svr_sk);
- test_enable_assoc_change(clt_sk);
-
- /* Send a message. This will create the association. */
- memset(&outmessage, 0, sizeof(outmessage));
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- msg_buf = test_build_msg(30000);
- outmessage.msg_iov->iov_base = msg_buf;
- outmessage.msg_iov->iov_len = 30000;
- test_sendmsg(clt_sk, &outmessage, 0, 30000);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = 2000;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Receive COMM_UP on clt_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(clt_sk, &inmessage, 0);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Receive COMM_UP on svr_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* Read the 30000 byte message using multiple recvmsg() calls in a
- * loop with 2000 bytes per read.
- */
- for (i = 0, msglen = 30000; i < 15; i++, msglen -= 2000) {
- iov.iov_len = REALLY_BIG;
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_PEEK);
- test_check_msg_data(&inmessage, error, msglen, MSG_EOR, 0, 0);
-
- iov.iov_len = 2000;
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, 2000,
- ((i == 14) ? MSG_EOR : 0), 0, 0);
- }
-
- tst_resm(TPASS, "recvmsg with MSG_PEEK flag");
- tst_resm(TPASS, "MSG_EOR in msg_flags set correctly");
-
- close(svr_sk);
- close(clt_sk);
-
- /* Indicate successful completion. */
- return 0;
-}
diff --git a/testcases/network/sctp/func_tests/test_sctp_sendrecvmsg.c b/testcases/network/sctp/func_tests/test_sctp_sendrecvmsg.c
deleted file mode 100644
index ed418290c..000000000
--- a/testcases/network/sctp/func_tests/test_sctp_sendrecvmsg.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2003
- * Copyright (c) 2003 Intel Corp.
- *
- * The SCTP reference 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 reference 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:
- * To compile the v6 version, set the symbol TEST_V6 to 1.
- *
- * Written or modified by:
- * Ardelle Fan <ardelle.fan@intel.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a basic functional test for the SCTP new library APIs
- * sctp_sendmsg() and sctp_recvmsg(). test_timetolive.c is rewritten using
- * these new APIs.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 10;
-int TST_CNT = 0;
-
-/* RCVBUF value, and indirectly RWND*2 */
-#define SMALL_RCVBUF 3000
-#define SMALL_MAXSEG 100
-/* This is extra data length to ensure rwnd closes */
-#define RWND_SLOP 100
-static char *fillmsg = NULL;
-static char *ttlmsg = "This should time out!\n";
-static char *nottlmsg = "This should NOT time out!\n";
-static char ttlfrag[SMALL_MAXSEG * 3] = { 0 };
-
-static char *message = "Hello world\n";
-
-int main(int argc, char *argv[])
-{
- int sk1, sk2;
- sockaddr_storage_t loop1;
- sockaddr_storage_t loop2;
- sockaddr_storage_t msgname;
- int error;
- int pf_class, af_family;
- uint32_t ppid;
- uint32_t stream;
- struct sctp_event_subscribe subscribe;
- char *big_buffer;
- int offset, msg_flags;
- socklen_t msgname_len, len;
- size_t buflen;
- struct sctp_send_failed *ssf;
- struct sctp_sndrcvinfo sinfo;
- struct sctp_sndrcvinfo snd_sinfo;
- sctp_assoc_t associd1, associd2;
- int oldlen;
- struct sctp_status gstatus;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
- af_family = AF_INET6;
-
- loop1.v6.sin6_family = AF_INET6;
- loop1.v6.sin6_addr = in6addr_loopback;
- loop1.v6.sin6_port = htons(SCTP_TESTPORT_1);
-
- loop2.v6.sin6_family = AF_INET6;
- loop2.v6.sin6_addr = in6addr_loopback;
- loop2.v6.sin6_port = htons(SCTP_TESTPORT_2);
-#else
- pf_class = PF_INET;
- af_family = AF_INET;
-
- loop1.v4.sin_family = AF_INET;
- loop1.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop1.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- loop2.v4.sin_family = AF_INET;
- loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop2.v4.sin_port = htons(SCTP_TESTPORT_2);
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Set the MAXSEG to something smallish. */
- {
- int val = SMALL_MAXSEG;
- test_setsockopt(sk1, SCTP_MAXSEG, &val, sizeof(val));
- }
-
- memset(&subscribe, 0, sizeof(subscribe));
- subscribe.sctp_data_io_event = 1;
- subscribe.sctp_association_event = 1;
- subscribe.sctp_send_failure_event = 1;
- test_setsockopt(sk1, SCTP_EVENTS, &subscribe, sizeof(subscribe));
- test_setsockopt(sk2, SCTP_EVENTS, &subscribe, sizeof(subscribe));
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop1.sa, sizeof(loop1));
- test_bind(sk2, &loop2.sa, sizeof(loop2));
-
- /*
- * Set the RWND small so we can fill it up easily.
- * then reset RCVBUF to avoid frame droppage
- */
- len = sizeof(int);
- error = getsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &oldlen, &len);
-
- if (error)
- tst_brkm(TBROK, NULL, "can't get rcvbuf size: %s",
- strerror(errno));
-
- len = SMALL_RCVBUF; /* Really becomes 2xlen when set. */
-
- error = setsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len));
- if (error)
- tst_brkm(TBROK, NULL, "setsockopt(SO_RCVBUF): %s",
- strerror(errno));
-
- /* Mark sk2 as being able to accept new associations. */
- test_listen(sk2, 1);
-
- /* Send the first message. This will create the association. */
- ppid = rand();
- stream = 1;
- test_sctp_sendmsg(sk1, message, strlen(message) + 1,
- (struct sockaddr *)&loop2, sizeof(loop2),
- ppid, 0, stream, 0, 0);
-
- tst_resm(TPASS, "sctp_sendmsg");
-
- /* Get the communication up message on sk2. */
- buflen = REALLY_BIG;
- big_buffer = test_malloc(buflen);
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- associd2 = ((struct sctp_assoc_change *)big_buffer)->sac_assoc_id;
- test_check_buf_notification(big_buffer, error, msg_flags,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- /* restore the rcvbuffer size for the receiving socket */
- error = setsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &oldlen, sizeof(oldlen));
-
- if (error)
- tst_brkm(TBROK, NULL, "setsockopt(SO_RCVBUF): %s",
- strerror(errno));
-
- /* Get the communication up message on sk1. */
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk1, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- associd1 = ((struct sctp_assoc_change *)big_buffer)->sac_assoc_id;
- test_check_buf_notification(big_buffer, error, msg_flags,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
-
- tst_resm(TPASS, "sctp_recvmsg SCTP_COMM_UP notification");
-
- /* Get the first message which was sent. */
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- test_check_buf_data(big_buffer, error, msg_flags, &sinfo,
- strlen(message) + 1, MSG_EOR, stream, ppid);
-
- tst_resm(TPASS, "sctp_recvmsg data");
-
- /* Figure out how big to make our fillmsg */
- len = sizeof(struct sctp_status);
- memset(&gstatus, 0, sizeof(struct sctp_status));
- gstatus.sstat_assoc_id = associd1;
- error = getsockopt(sk1, IPPROTO_SCTP, SCTP_STATUS, &gstatus, &len);
-
- if (error)
- tst_brkm(TBROK, NULL, "can't get rwnd size: %s",
- strerror(errno));
- tst_resm(TINFO, "creating a fillmsg of size %d",
- gstatus.sstat_rwnd + RWND_SLOP);
- fillmsg = malloc(gstatus.sstat_rwnd + RWND_SLOP);
-
- /* Send a fillmsg */
- memset(fillmsg, 'X', gstatus.sstat_rwnd + RWND_SLOP);
- fillmsg[gstatus.sstat_rwnd + RWND_SLOP - 1] = '\0';
- ppid++;
- stream++;
- test_sctp_sendmsg(sk1, fillmsg, gstatus.sstat_rwnd + RWND_SLOP,
- (struct sockaddr *)&loop2, sizeof(loop2),
- ppid, 0, stream, 0, 0);
-
- /* Now send a message that will timeout. */
- test_sctp_sendmsg(sk1, ttlmsg, strlen(ttlmsg) + 1,
- (struct sockaddr *)&loop2, sizeof(loop2),
- ppid, 0, stream, 2000, 0);
-
- tst_resm(TPASS, "sctp_sendmsg with ttl");
-
- /* Next send a message that won't time out. */
- test_sctp_sendmsg(sk1, nottlmsg, strlen(nottlmsg) + 1,
- (struct sockaddr *)&loop2, sizeof(loop2),
- ppid, 0, stream, 0, 0);
-
- tst_resm(TPASS, "sctp_sendmsg with zero ttl");
-
- /* And finally a fragmented message that will time out. */
- memset(ttlfrag, '0', sizeof(ttlfrag));
- ttlfrag[sizeof(ttlfrag) - 1] = '\0';
- test_sctp_sendmsg(sk1, ttlfrag, sizeof(ttlfrag),
- (struct sockaddr *)&loop2, sizeof(loop2),
- ppid, 0, stream, 2000, 0);
-
- tst_resm(TPASS, "sctp_sendmsg fragmented msg with ttl");
-
- /* Sleep waiting for the message to time out. */
- tst_resm(TINFO, "** SLEEPING for 3 seconds **");
- sleep(3);
-
- /* Get the fillmsg. */
- do {
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- } while (!(msg_flags & MSG_EOR));
-
- /* Get the message that did NOT time out. */
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- test_check_buf_data(big_buffer, error, msg_flags, &sinfo,
- strlen(nottlmsg) + 1, MSG_EOR, stream, ppid);
- if (0 != strncmp(big_buffer, nottlmsg, strlen(nottlmsg)))
- tst_brkm(TBROK, NULL, "sctp_recvmsg: Wrong Message !!!");
-
- tst_resm(TPASS, "sctp_recvmsg msg with zero ttl");
-
- /* Get the SEND_FAILED notification for the message that DID
- * time out.
- */
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk1, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- test_check_buf_notification(big_buffer, error, msg_flags,
- sizeof(struct sctp_send_failed) +
- strlen(ttlmsg) + 1, SCTP_SEND_FAILED, 0);
- ssf = (struct sctp_send_failed *)big_buffer;
- if (0 != strncmp(ttlmsg, (char *)ssf->ssf_data, strlen(ttlmsg) + 1))
- tst_brkm(TBROK, NULL, "SEND_FAILED data mismatch");
-
- tst_resm(TPASS, "sctp_recvmsg SEND_FAILED for message with ttl");
-
- offset = 0;
-
- /* Get the SEND_FAILED notifications for the fragmented message that
- * timed out.
- */
- do {
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk1, big_buffer, buflen,
- (struct sockaddr *)&msgname,
- &msgname_len, &sinfo, &msg_flags);
- test_check_buf_notification(big_buffer, error, msg_flags,
- sizeof(struct sctp_send_failed) +
- SMALL_MAXSEG, SCTP_SEND_FAILED, 0);
- ssf = (struct sctp_send_failed *)big_buffer;
- if (0 != strncmp(&ttlfrag[offset], (char *)ssf->ssf_data,
- SMALL_MAXSEG))
- tst_brkm(TBROK, NULL, "SEND_FAILED data mismatch");
- offset += SMALL_MAXSEG;
- } while (!(ssf->ssf_info.sinfo_flags & 0x01)); /* LAST FRAG */
-
- tst_resm(TPASS, "sctp_recvmsg SEND_FAILED for fragmented message with "
- "ttl");
-
- snd_sinfo.sinfo_ppid = rand();
- snd_sinfo.sinfo_flags = 0;
- snd_sinfo.sinfo_stream = 2;
- snd_sinfo.sinfo_timetolive = 0;
- snd_sinfo.sinfo_assoc_id = associd1;
- test_sctp_send(sk1, message, strlen(message) + 1, &snd_sinfo,
- MSG_NOSIGNAL);
-
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- test_check_buf_data(big_buffer, error, msg_flags, &sinfo,
- strlen(message) + 1, MSG_EOR,
- snd_sinfo.sinfo_stream, snd_sinfo.sinfo_ppid);
-
- tst_resm(TPASS, "sctp_send");
-
- /* Shut down the link. */
- close(sk1);
-
- /* Get the shutdown complete notification. */
- buflen = REALLY_BIG;
- msgname_len = sizeof(msgname);
- error = test_sctp_recvmsg(sk2, big_buffer, buflen,
- (struct sockaddr *)&msgname, &msgname_len,
- &sinfo, &msg_flags);
- test_check_buf_notification(big_buffer, error, msg_flags,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- close(sk2);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_sockopt.c b/testcases/network/sctp/func_tests/test_sockopt.c
deleted file mode 100644
index 0dc332423..000000000
--- a/testcases/network/sctp/func_tests/test_sockopt.c
+++ /dev/null
@@ -1,872 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2004
- * Copyright (c) 1999-2000 Cisco, Inc.
- * Copyright (c) 1999-2001 Motorola, Inc.
- * Copyright (c) 2001 Intel Corp.
- * Copyright (c) 2001 Nokia, Inc.
- *
- * The SCTP reference 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 reference 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>
- * Hui Huang <hui.huang@nokia.com>
- * Jon Grimm <jgrimm@us.ibm.com>
- * Sridhar Samudrala <samudrala@us.ibm.com>
- */
-
-/* This is a functional test to verify the various SCTP level socket
- * options that can be used to get information about existing SCTP
- * associations and to configure certain parameters.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <errno.h>
-#include <netinet/in.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 29;
-int TST_CNT = 0;
-
-int main(void)
-{
- int udp_svr_sk, udp_clt_sk, tcp_svr_sk, tcp_clt_sk;
- int accept_sk, peeloff_sk;
- sockaddr_storage_t udp_svr_loop, udp_clt_loop;
- sockaddr_storage_t tcp_svr_loop, tcp_clt_loop;
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- char *message = "hello, world!\n";
- int error;
- int pf_class, af_family;
- uint32_t ppid;
- uint32_t stream;
- sctp_assoc_t udp_svr_associd, udp_clt_associd;
- struct sctp_assoc_change *sac;
- char *big_buffer;
- struct sctp_event_subscribe subscribe;
- struct sctp_initmsg initmsg;
- struct sctp_sndrcvinfo set_udp_sk_dflt_param, get_udp_sk_dflt_param;
- struct sctp_sndrcvinfo set_tcp_sk_dflt_param, get_tcp_sk_dflt_param;
- struct sctp_sndrcvinfo set_udp_assoc_dflt_param;
- struct sctp_sndrcvinfo get_udp_assoc_dflt_param;
- struct sctp_sndrcvinfo set_tcp_assoc_dflt_param;
- struct sctp_sndrcvinfo get_tcp_assoc_dflt_param;
- struct sctp_sndrcvinfo get_peeloff_assoc_dflt_param;
- struct sctp_sndrcvinfo get_accept_assoc_dflt_param;
- struct sctp_paddrinfo pinfo;
- socklen_t optlen, addrlen;
- struct sctp_status status;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
- af_family = AF_INET6;
-
- udp_svr_loop.v6.sin6_family = AF_INET6;
- udp_svr_loop.v6.sin6_addr = in6addr_loopback;
- udp_svr_loop.v6.sin6_port = htons(SCTP_TESTPORT_1);
-
- udp_clt_loop.v6.sin6_family = AF_INET6;
- udp_clt_loop.v6.sin6_addr = in6addr_loopback;
- udp_clt_loop.v6.sin6_port = htons(SCTP_TESTPORT_1 + 1);
-
- tcp_svr_loop.v6.sin6_family = AF_INET6;
- tcp_svr_loop.v6.sin6_addr = in6addr_loopback;
- tcp_svr_loop.v6.sin6_port = htons(SCTP_TESTPORT_1 + 2);
-
- tcp_clt_loop.v6.sin6_family = AF_INET6;
- tcp_clt_loop.v6.sin6_addr = in6addr_loopback;
- tcp_clt_loop.v6.sin6_port = htons(SCTP_TESTPORT_1 + 3);
-#else
- pf_class = PF_INET;
- af_family = AF_INET;
-
- udp_svr_loop.v4.sin_family = AF_INET;
- udp_svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- udp_svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- udp_clt_loop.v4.sin_family = AF_INET;
- udp_clt_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- udp_clt_loop.v4.sin_port = htons(SCTP_TESTPORT_1 + 1);
-
- tcp_svr_loop.v4.sin_family = AF_INET;
- tcp_svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- tcp_svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1 + 2);
-
- tcp_clt_loop.v4.sin_family = AF_INET;
- tcp_clt_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- tcp_clt_loop.v4.sin_port = htons(SCTP_TESTPORT_2 + 3);
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(udp_svr_sk);
- test_enable_assoc_change(udp_clt_sk);
-
- /* Bind these sockets to the test ports. */
- test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
- test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop));
-
- /* Mark udp_svr_sk as being able to accept new associations. */
- test_listen(udp_svr_sk, 1);
-
- /* TEST #1: SCTP_STATUS socket option. */
- /* Make sure that SCTP_STATUS getsockopt on a socket with no
- * association fails.
- */
- optlen = sizeof(struct sctp_status);
- memset(&status, 0, optlen);
- error = getsockopt(udp_svr_sk, SOL_SCTP, SCTP_STATUS, &status, &optlen);
- if ((error != -1) && (errno != EINVAL))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_STATUS) on a "
- "socket with no assoc error:%d errno:%d",
- error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_STATUS) on a socket with no assoc");
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &udp_svr_loop;
- outmessage.msg_namelen = sizeof(udp_svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(udp_clt_sk, &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on udp_svr_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- udp_svr_associd = sac->sac_assoc_id;
-
- /* Get the communication up message on udp_clt_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_clt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- udp_clt_associd = sac->sac_assoc_id;
-
- /* Get the first message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-
- /* Get SCTP_STATUS for udp_clt_sk's given association. */
- optlen = sizeof(struct sctp_status);
- memset(&status, 0, optlen);
- status.sstat_assoc_id = udp_clt_associd;
- test_getsockopt(udp_clt_sk, SCTP_STATUS, &status, &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_STATUS)");
-
- /* Make sure that SCTP_STATUS getsockopt with invalid associd fails. */
- optlen = sizeof(struct sctp_status);
- memset(&status, 0, optlen);
- status.sstat_assoc_id = udp_svr_associd;
- error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_STATUS, &status, &optlen);
- if ((error != -1) && (errno != EINVAL))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_STATUS) with "
- "associd error: %d errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_STATUS) with invalid associd");
-
- /* Make sure that SCTP_STATUS getsockopt with NULL associd fails. */
- optlen = sizeof(struct sctp_status);
- memset(&status, 0, optlen);
- status.sstat_assoc_id = 0;
- error = getsockopt(udp_svr_sk, SOL_SCTP, SCTP_STATUS, &status, &optlen);
- if ((error != -1) && (errno != EINVAL))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_STATUS) with "
- "NULL associd error: %d errno:%d", error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_STATUS) with NULL associd");
-
- /* Shut down the link. */
- close(udp_clt_sk);
-
- /* Get the shutdown complete notification. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- error = 0;
- close(udp_svr_sk);
-
- /* TEST #2: SCTP_EVENTS socket option and SCTP_SHUTDOWN_EVENT
- * notification.
- */
- /* Create the two endpoints which will talk to each other. */
- udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(udp_svr_sk);
- test_enable_assoc_change(udp_clt_sk);
-
- /* Bind these sockets to the test ports. */
- test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
- test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop));
-
- /* Mark udp_svr_sk as being able to accept new associations. */
- test_listen(udp_svr_sk, 1);
-
- /* Get the default events that are enabled on udp_svr_sk. */
- optlen = sizeof(subscribe);
- test_getsockopt(udp_svr_sk, SCTP_EVENTS, &subscribe, &optlen);
-
- /* Get the default events that are enabled on udp_clt_sk. */
- optlen = sizeof(subscribe);
- test_getsockopt(udp_clt_sk, SCTP_EVENTS, &subscribe, &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_EVENTS)");
-
- /* Disable all the events on udp_svr_sk and udp_clt_sk. */
- memset(&subscribe, 0, sizeof(struct sctp_event_subscribe));
- test_setsockopt(udp_svr_sk, SCTP_EVENTS, &subscribe, sizeof(subscribe));
- test_setsockopt(udp_clt_sk, SCTP_EVENTS, &subscribe, sizeof(subscribe));
-
- tst_resm(TPASS, "setsockopt(SCTP_EVENTS)");
-
- /* Get the updated list of enabled events on udp_svr_sk and
- * udp_clt_sk.
- */
- optlen = sizeof(subscribe);
- test_getsockopt(udp_svr_sk, SCTP_EVENTS, &subscribe, &optlen);
- optlen = sizeof(subscribe);
- test_getsockopt(udp_clt_sk, SCTP_EVENTS, &subscribe, &optlen);
-
- /* Send a message. This will create the association. */
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(udp_clt_sk, &outmessage, 0, strlen(message) + 1);
-
- /* Get the message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, 0, 0);
- /* Verify that we received the msg without any ancillary data. */
- if (inmessage.msg_controllen != 0)
- tst_brkm(TBROK, NULL, "Receive unexpected ancillary" "data");
-
- /* Enable SCTP_SHUTDOWN_EVENTs on udp_svr_sk. */
- memset(&subscribe, 0, sizeof(struct sctp_event_subscribe));
- subscribe.sctp_shutdown_event = 1;
- test_setsockopt(udp_svr_sk, SCTP_EVENTS, &subscribe, sizeof(subscribe));
-
- error = 0;
- /* Shut down the link. */
- close(udp_clt_sk);
-
- /* Get the SHUTDOWN_EVENT notification on udp_svr_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_shutdown_event),
- SCTP_SHUTDOWN_EVENT, 0);
-
- tst_resm(TPASS, "setsockopt(SCTP_EVENTS) - SCTP_SHUTDOWN_EVENT");
-
- close(udp_svr_sk);
-
- /* TEST #3: whether sctp_opt_info equals */
- /* Create the two endpoints which will talk to each other. */
- udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(udp_svr_sk);
- test_enable_assoc_change(udp_clt_sk);
-
- /* Bind these sockets to the test ports. */
- test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
- test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop));
-
- /* Mark udp_svr_sk as being able to accept new associations. */
- test_listen(udp_svr_sk, 1);
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &udp_svr_loop;
- outmessage.msg_namelen = sizeof(udp_svr_loop);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(udp_clt_sk, &outmessage, 0, strlen(message) + 1);
-
- /* Get the communication up message on udp_clt_sk. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_clt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- udp_clt_associd = sac->sac_assoc_id;
-
- /* Compare the SCTP_STATUS result between sctp_opt_info and
- * getsockopt
- */
- {
- struct sctp_status status1, status2;
-
- memset(&status1, 0, sizeof(status1));
- memset(&status2, 0, sizeof(status2));
- optlen = sizeof(struct sctp_status);
-
- /* Test SCTP_STATUS for udp_clt_sk's given association. */
- error = sctp_opt_info(udp_clt_sk, udp_clt_associd, SCTP_STATUS,
- (char *)&status1, &optlen);
- if (error != 0)
- tst_brkm(TBROK, NULL,
- "sctp_opt_info(SCTP_STATUS): %s",
- strerror(errno));
-
- status2.sstat_assoc_id = udp_clt_associd;
- error = getsockopt(udp_clt_sk, IPPROTO_SCTP, SCTP_STATUS,
- (char *)&status2, &optlen);
- if (error != 0)
- tst_brkm(TBROK, NULL,
- "getsockopt(SCTP_STATUS): %s",
- strerror(errno));
- if (strncmp((char *)&status1, (char *)&status2, optlen))
- tst_brkm(TBROK, NULL, "sctp_opt_info(SCTP_STAUS)"
- "doesn't match getsockopt(SCTP_STATUS)");
-
- tst_resm(TPASS, "sctp_opt_info(SCTP_STATUS)");
- }
- error = 0;
- /* Shut down the link. */
- close(udp_svr_sk);
- close(udp_clt_sk);
-
- /* TEST #4: SCTP_INITMSG socket option. */
- /* Create a socket. */
- udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- /* Bind this socket to the test port. */
- test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(udp_svr_sk);
-
- /* Get the default parameters for association initialization. */
- optlen = sizeof(initmsg);
- test_getsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_INITMSG)");
-
- /* Change the parameters for association initialization. */
- initmsg.sinit_num_ostreams = 5;
- initmsg.sinit_max_instreams = 5;
- initmsg.sinit_max_attempts = 3;
- initmsg.sinit_max_init_timeo = 30;
- test_setsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, sizeof(initmsg));
-
- tst_resm(TPASS, "setsockopt(SCTP_INITMSG)");
-
- /* Get the updated parameters for association initialization. */
- optlen = sizeof(initmsg);
- test_getsockopt(udp_svr_sk, SCTP_INITMSG, &initmsg, &optlen);
-
- close(udp_svr_sk);
-
- /* TEST #5: SCTP_DEFAULT_SEND_PARAM socket option. */
- /* Create and bind 2 UDP-style sockets(udp_svr_sk, udp_clt_sk) and
- * 2 TCP-style sockets. (tcp_svr_sk, tcp_clt_sk)
- */
- udp_svr_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- udp_clt_sk = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- tcp_svr_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- tcp_clt_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(udp_svr_sk);
- test_enable_assoc_change(udp_clt_sk);
- test_enable_assoc_change(tcp_svr_sk);
- test_enable_assoc_change(tcp_clt_sk);
-
- test_bind(udp_svr_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
- test_bind(udp_clt_sk, &udp_clt_loop.sa, sizeof(udp_clt_loop));
- test_bind(tcp_svr_sk, &tcp_svr_loop.sa, sizeof(tcp_svr_loop));
- test_bind(tcp_clt_sk, &tcp_clt_loop.sa, sizeof(tcp_clt_loop));
-
- /* Mark udp_svr_sk and tcp_svr_sk as being able to accept new
- * associations.
- */
- test_listen(udp_svr_sk, 5);
- test_listen(tcp_svr_sk, 5);
-
- /* Set default send parameters on the unconnected UDP-style sockets. */
- memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_udp_sk_dflt_param.sinfo_ppid = 1000;
- test_setsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_udp_sk_dflt_param, sizeof(set_udp_sk_dflt_param));
- memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_udp_sk_dflt_param.sinfo_ppid = 1000;
- test_setsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_udp_sk_dflt_param, sizeof(set_udp_sk_dflt_param));
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style socket");
-
- /* Get default send parameters on the unconnected UDP-style socket. */
- memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_udp_sk_dflt_param);
- test_getsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_udp_sk_dflt_param, &optlen);
-
- /* Verify that the get param matches set param. */
- if (set_udp_sk_dflt_param.sinfo_ppid !=
- get_udp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- /* Get default send parameters on the unconnected UDP-style socket. */
- memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_udp_sk_dflt_param);
- test_getsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_udp_sk_dflt_param, &optlen);
-
- /* Verify that the get param matches set param. */
- if (set_udp_sk_dflt_param.sinfo_ppid !=
- get_udp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style socket");
-
- /* Verify that trying to set send params with an invalid assoc id
- * on an UDP-style socket fails.
- */
- memset(&set_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_udp_sk_dflt_param.sinfo_ppid = 1000;
- /* Invalid assoc id */
- set_udp_sk_dflt_param.sinfo_assoc_id = 1234;
- error = setsockopt(udp_clt_sk, SOL_SCTP, SCTP_DEFAULT_SEND_PARAM,
- &set_udp_sk_dflt_param,
- sizeof(set_udp_sk_dflt_param));
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "setsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "invalid associd error:%d, errno:%d\n", error, errno);
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "- one-to-many style invalid associd");
-
- /* Do a connect on a UDP-style socket and establish an association. */
- test_connect(udp_clt_sk, &udp_svr_loop.sa, sizeof(udp_svr_loop));
-
- /* Receive the COMM_UP notifications and get the associd's */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_svr_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- udp_svr_associd = sac->sac_assoc_id;
-
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(udp_clt_sk, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- udp_clt_associd = sac->sac_assoc_id;
-
- /* Verify that trying to set send params with an assoc id not
- * belonging to the socket on an UDP-style socket fails.
- */
- memset(&set_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_udp_assoc_dflt_param.sinfo_ppid = 3000;
- set_udp_assoc_dflt_param.sinfo_assoc_id = udp_clt_associd;
- error = setsockopt(udp_svr_sk, SOL_SCTP, SCTP_DEFAULT_SEND_PARAM,
- &set_udp_assoc_dflt_param,
- sizeof(set_udp_assoc_dflt_param));
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "setsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "associd belonging to another socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style associd belonging to another socket");
-
- /* Set default send parameters of an association on the listening
- * UDP-style socket with a valid associd.
- */
- memset(&set_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_udp_assoc_dflt_param.sinfo_ppid = 3000;
- set_udp_assoc_dflt_param.sinfo_assoc_id = udp_svr_associd;
- test_setsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_udp_assoc_dflt_param,
- sizeof(set_udp_assoc_dflt_param));
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style valid associd");
-
- /* Get default send parameters of an association on the listening
- * UDP-style socket with a valid associd.
- */
- memset(&get_udp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- get_udp_assoc_dflt_param.sinfo_assoc_id = udp_svr_associd;
- optlen = sizeof(get_udp_assoc_dflt_param);
- test_getsockopt(udp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_udp_assoc_dflt_param, &optlen);
-
- /* Verify that the get param matches the set param. */
- if (get_udp_assoc_dflt_param.sinfo_ppid !=
- set_udp_assoc_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style valid associd");
-
- /* Get default send parameters of an association on the connected
- * UDP-style socket with zero associd. This should return the
- * socket wide default parameters.
- */
- memset(&get_udp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- get_udp_sk_dflt_param.sinfo_assoc_id = 0;
- optlen = sizeof(get_udp_sk_dflt_param);
- test_getsockopt(udp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_udp_sk_dflt_param, &optlen);
-
- /* Verify that the get param matches the socket-wide set param. */
- if (get_udp_sk_dflt_param.sinfo_ppid !=
- set_udp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style zero associd");
-
- peeloff_sk = test_sctp_peeloff(udp_svr_sk, udp_svr_associd);
-
- /* Get default send parameters of an association on the peeled off
- * UDP-style socket. This should return the association's default
- * parameters.
- */
- memset(&get_peeloff_assoc_dflt_param, 0,
- sizeof(struct sctp_sndrcvinfo));
- get_peeloff_assoc_dflt_param.sinfo_assoc_id = 0;
- optlen = sizeof(get_peeloff_assoc_dflt_param);
- test_getsockopt(peeloff_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_peeloff_assoc_dflt_param, &optlen);
-
- /* Verify that the get param matches the association's set param. */
- if (get_peeloff_assoc_dflt_param.sinfo_ppid !=
- set_udp_assoc_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-many style peeled off socket");
-
- /* Set default send parameters on the unconnected TCP-style sockets. */
- memset(&set_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_tcp_sk_dflt_param.sinfo_ppid = 2000;
- /* Invalid assoc id, ignored on a TCP-style socket. */
- set_tcp_sk_dflt_param.sinfo_assoc_id = 1234;
- test_setsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_tcp_sk_dflt_param, sizeof(set_tcp_sk_dflt_param));
-
- /* Set default send parameters on the unconnected TCP-style sockets. */
- memset(&set_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_tcp_sk_dflt_param.sinfo_ppid = 2000;
- /* Invalid assoc id, ignored on a TCP-style socket. */
- set_tcp_sk_dflt_param.sinfo_assoc_id = 1234;
- test_setsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_tcp_sk_dflt_param, sizeof(set_tcp_sk_dflt_param));
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-one style socket");
-
- /* Get default send parameters on the unconnected TCP-style socket. */
- memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_tcp_sk_dflt_param);
- test_getsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_tcp_sk_dflt_param, &optlen);
-
- /* Verify that the get param matches set param. */
- if (set_tcp_sk_dflt_param.sinfo_ppid !=
- get_tcp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- /* Get default send parameters on the unconnected TCP-style socket. */
- memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_tcp_sk_dflt_param);
- test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_tcp_sk_dflt_param, &optlen);
-
- /* Verify that the get param matches set param. */
- if (set_tcp_sk_dflt_param.sinfo_ppid !=
- get_tcp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-one style socket");
-
- /* Do a connect on a TCP-style socket and establish an association. */
- test_connect(tcp_clt_sk, &tcp_svr_loop.sa, sizeof(tcp_svr_loop));
-
- /* Set default send parameters of an association on the connected
- * TCP-style socket.
- */
- memset(&set_tcp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- set_tcp_assoc_dflt_param.sinfo_ppid = 4000;
- set_tcp_assoc_dflt_param.sinfo_assoc_id = 0;
- test_setsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &set_tcp_assoc_dflt_param,
- sizeof(set_tcp_assoc_dflt_param));
-
- tst_resm(TPASS, "setsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-one style assoc");
-
- /* Get default send parameters of an association on the connected
- * TCP-style socket.
- */
- memset(&get_tcp_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_tcp_assoc_dflt_param);
- test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_tcp_assoc_dflt_param, &optlen);
-
- if (set_tcp_assoc_dflt_param.sinfo_ppid !=
- get_tcp_assoc_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- /* Get default send parameters on the connected TCP-style socket. */
- memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_tcp_sk_dflt_param);
- test_getsockopt(tcp_clt_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_tcp_sk_dflt_param, &optlen);
-
- /* Verify that the get parameters returned matches the set param
- * set for the association, not the socket-wide param.
- */
- if ((get_tcp_sk_dflt_param.sinfo_ppid ==
- set_tcp_sk_dflt_param.sinfo_ppid) ||
- (get_tcp_sk_dflt_param.sinfo_ppid !=
- set_tcp_assoc_dflt_param.sinfo_ppid))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- /* Get default send parameters on the listening TCP-style socket. */
- memset(&get_tcp_sk_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_tcp_sk_dflt_param);
- test_getsockopt(tcp_svr_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_tcp_sk_dflt_param, &optlen);
-
- /* Verify that the get parameters returned matches the socket-wide
- * set param.
- */
- if (get_tcp_sk_dflt_param.sinfo_ppid !=
- set_tcp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-one style assoc");
-
- accept_sk = test_accept(tcp_svr_sk, NULL, &addrlen);
-
- /* Get default send parameters of an association on the accepted
- * TCP-style socket.
- */
- memset(&get_accept_assoc_dflt_param, 0, sizeof(struct sctp_sndrcvinfo));
- optlen = sizeof(get_accept_assoc_dflt_param);
- test_getsockopt(accept_sk, SCTP_DEFAULT_SEND_PARAM,
- &get_accept_assoc_dflt_param, &optlen);
-
- error = 0;
-
- /* Verify that the get parameters returned matches the socket-wide
- * set param.
- */
- if (get_tcp_sk_dflt_param.sinfo_ppid !=
- set_tcp_sk_dflt_param.sinfo_ppid)
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_DEFAULT_SEND_PARAM) "
- "mismatch.");
-
- tst_resm(TPASS, "getsockopt(SCTP_DEFAULT_SEND_PARAM) - "
- "one-to-one style accepted socket");
-
- /* TEST #6: SCTP_GET_PEER_ADDR_INFO socket option. */
- /* Try 0 associd and 0 addr */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO,
- &pinfo, &optlen);
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_GET_PEER_ADDR_INFO) "
- "null associd, null addr error:%d, errno:%d\n",
- error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "null associd and null addr");
-
- /* Try valid associd, but 0 addr */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- pinfo.spinfo_assoc_id = udp_clt_associd;
- error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO,
- &pinfo, &optlen);
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_GET_PEER_ADDR_INFO) "
- "valid associd, null addr error:%d, errno:%d\n",
- error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "valid associd and null addr");
-
- /* Try valid associd, invalid addr */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- pinfo.spinfo_assoc_id = udp_clt_associd;
- memcpy(&pinfo.spinfo_address, &udp_clt_loop, sizeof(udp_clt_loop));
- error = getsockopt(udp_clt_sk, SOL_SCTP, SCTP_GET_PEER_ADDR_INFO,
- &pinfo, &optlen);
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "getsockopt(SCTP_GET_PEER_ADDR_INFO) "
- "valid associd, invalid addr error:%d, errno:%d\n",
- error, errno);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "valid associd and invalid addr");
-
- /* Try valid associd, valid addr */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- pinfo.spinfo_assoc_id = udp_clt_associd;
- memcpy(&pinfo.spinfo_address, &udp_svr_loop, sizeof(udp_svr_loop));
- test_getsockopt(udp_clt_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "valid associd and valid addr");
-
- /* Try valid addr, peeled off socket */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- pinfo.spinfo_assoc_id = 0;
- memcpy(&pinfo.spinfo_address, &udp_clt_loop, sizeof(udp_clt_loop));
- test_getsockopt(peeloff_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo, &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "valid associd and valid addr peeled off socket");
-
- /* Try valid addr, TCP-style accept socket */
- memset(&pinfo, 0, sizeof(pinfo));
- optlen = sizeof(pinfo);
- pinfo.spinfo_assoc_id = 0;
- memcpy(&pinfo.spinfo_address, &tcp_clt_loop, sizeof(tcp_clt_loop));
- error = test_getsockopt(accept_sk, SCTP_GET_PEER_ADDR_INFO, &pinfo,
- &optlen);
-
- tst_resm(TPASS, "getsockopt(SCTP_GET_PEER_ADDR_INFO) - "
- "valid associd and valid addr accepted socket");
-
- close(udp_svr_sk);
- close(udp_clt_sk);
- close(tcp_svr_sk);
- close(tcp_clt_sk);
- close(accept_sk);
- close(peeloff_sk);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_tcp_style.c b/testcases/network/sctp/func_tests/test_tcp_style.c
deleted file mode 100644
index da0a5c606..000000000
--- a/testcases/network/sctp/func_tests/test_tcp_style.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2003
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * This file is part of the SCTP kernel reference Implementation
- *
- * The SCTP reference 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 reference 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:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/* This is a kernel test to verify the TCP-style socket interfaces. */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <sys/poll.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 22;
-int TST_CNT = 0;
-
-#define MAX_CLIENTS 10
-
-int main(int argc, char *argv[])
-{
- int clt_sk[MAX_CLIENTS], accept_sk[MAX_CLIENTS];
- int listen_sk, clt2_sk, accept2_sk;
- sockaddr_storage_t clt_loop[MAX_CLIENTS];
- sockaddr_storage_t svr_loop, accept_loop, clt2_loop;
- socklen_t addrlen;
- int error, i;
- char *message = "hello, world!\n";
- char msgbuf[100];
- int pf_class;
- struct pollfd poll_fd;
- fd_set set;
- struct msghdr outmessage;
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct iovec out_iov;
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct msghdr inmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char *big_buffer;
- struct iovec iov;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Initialize the server and client addresses. */
-#if TEST_V6
- pf_class = PF_INET6;
- svr_loop.v6.sin6_family = AF_INET6;
- svr_loop.v6.sin6_addr = in6addr_loopback;
- svr_loop.v6.sin6_port = htons(SCTP_TESTPORT_1);
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_loop[i].v6.sin6_family = AF_INET6;
- clt_loop[i].v6.sin6_addr = in6addr_loopback;
- clt_loop[i].v6.sin6_port = htons(SCTP_TESTPORT_2 + i);
- }
- clt2_loop.v6.sin6_family = AF_INET6;
- clt2_loop.v6.sin6_addr = in6addr_loopback;
- clt2_loop.v6.sin6_port = htons(SCTP_TESTPORT_2 + i);
-#else
- pf_class = PF_INET;
- svr_loop.v4.sin_family = AF_INET;
- svr_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- svr_loop.v4.sin_port = htons(SCTP_TESTPORT_1);
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_loop[i].v4.sin_family = AF_INET;
- clt_loop[i].v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt_loop[i].v4.sin_port = htons(SCTP_TESTPORT_2 + i);
- }
- clt2_loop.v4.sin_family = AF_INET;
- clt2_loop.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- clt2_loop.v4.sin_port = htons(SCTP_TESTPORT_2 + i);
-#endif
-
- /* Create and bind the listening server socket. */
- listen_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(listen_sk, &svr_loop.sa, sizeof(svr_loop));
-
- /* Mark listen_sk as being able to accept new associations. */
- test_listen(listen_sk, MAX_CLIENTS - 1);
-
- /* Create and bind the client sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- clt_sk[i] = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(clt_sk[i], &clt_loop[i].sa, sizeof(clt_loop[i]));
- }
- clt2_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(clt2_sk, &clt2_loop.sa, sizeof(clt2_loop));
-
- addrlen = sizeof(accept_loop);
- /* Try to do accept on a non-listening socket. It should fail. */
- error = accept(clt_sk[0], &accept_loop.sa, &addrlen);
- if ((-1 != error) && (EINVAL != errno))
- tst_brkm(TBROK, NULL, "accept on non-listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "accept on non-listening socket");
-
- /* Try to do a connect from a listening socket. It should fail. */
- error = connect(listen_sk, (struct sockaddr *)&clt_loop[0],
- sizeof(clt_loop[0]));
- if ((-1 != error) && (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connect to non-listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect to non-listening socket");
-
- /* Do a blocking connect from clt_sk's to listen_sk */
- for (i = 0; i < MAX_CLIENTS; i++)
- test_connect(clt_sk[i], &svr_loop.sa, sizeof(svr_loop));
-
- tst_resm(TPASS, "connect to listening socket");
-
- /* Verify that no more connect's can be done after the acceptq
- * backlog has reached the max value.
- */
- error = connect(clt2_sk, &svr_loop.sa, sizeof(svr_loop));
- if ((-1 != error) && (ECONNREFUSED != errno))
- tst_brkm(TBROK, NULL, "connect after max backlog "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "connect after max backlog");
-
- /* Extract the associations on the listening socket as new sockets. */
- for (i = 0; i < MAX_CLIENTS; i++) {
- poll_fd.fd = listen_sk;
- poll_fd.events = POLLIN;
- poll_fd.revents = 0;
- error = poll(&poll_fd, 1, -1);
- if ((1 != error) && (1 != poll_fd.revents))
- tst_brkm(TBROK, NULL, "Unexpected return value "
- "with poll, error:%d errno:%d, revents:%d",
- error, errno, poll_fd.revents);
-
- addrlen = sizeof(accept_loop);
- accept_sk[i] = test_accept(listen_sk, &accept_loop.sa,
- &addrlen);
- }
-
- tst_resm(TPASS, "accept from listening socket");
-
- /* Try to do a connect on an established socket. It should fail. */
- error = connect(accept_sk[0], &clt_loop[0].sa, sizeof(clt_loop[0]));
- if ((-1 != error) || (EISCONN != errno))
- tst_brkm(TBROK, NULL, "connect on an established socket "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "connect on an established socket");
-
- /* Try to do accept on an established socket. It should fail. */
- error = accept(accept_sk[0], &accept_loop.sa, &addrlen);
- if ((-1 != error) && (EINVAL != errno))
- tst_brkm(TBROK, NULL, "accept on an established socket "
- "error:%d errno:%d", error, errno);
-
- error = accept(clt_sk[0], &accept_loop.sa, &addrlen);
- if ((-1 != error) && (EINVAL != errno))
- tst_brkm(TBROK, NULL, "accept on an established socket "
- "failure: error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "accept on an established socket");
-
- /* Send and receive a message from the client sockets to the accepted
- * sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- test_send(clt_sk[i], message, strlen(message), 0);
- test_recv(accept_sk[i], msgbuf, 100, 0);
- }
-
- tst_resm(TPASS, "client sockets -> accepted sockets");
-
- /* Send and receive a message from the accepted sockets to the client
- * sockets.
- */
- for (i = 0; i < MAX_CLIENTS; i++) {
- test_send(accept_sk[i], message, strlen(message), 0);
- test_recv(clt_sk[i], msgbuf, 100, 0);
- }
-
- tst_resm(TPASS, "accepted sockets -> client sockets");
-
- /* Sending a message on a listening socket should fail. */
- error = send(listen_sk, message, strlen(message), MSG_NOSIGNAL);
- if ((-1 != error) || (EPIPE != errno))
- tst_brkm(TBROK, NULL, "send on a listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "send on a listening socket");
-
- /* Trying to receive a message on a listening socket should fail. */
- error = recv(listen_sk, msgbuf, 100, 0);
- if ((-1 != error) || (ENOTCONN != errno))
- tst_brkm(TBROK, NULL, "recv on a listening socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "recv on a listening socket");
-
- /* TESTCASES for shutdown() */
- errno = 0;
- test_send(accept_sk[0], message, strlen(message), 0);
-
- /* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
- test_enable_assoc_change(clt_sk[0]);
-
- /* Do a SHUT_WR on clt_sk[0] to disable any new sends. */
- test_shutdown(clt_sk[0], SHUT_WR);
-
- /* Reading on a socket that has received SHUTDOWN should return 0
- * indicating EOF.
- */
- error = recv(accept_sk[0], msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUTDOWN received socket "
- "error:%d errno:%d", error, errno);
-
- tst_resm(TPASS, "recv on a SHUTDOWN received socket");
-
- /* Read the pending message on clt_sk[0] that was received before
- * SHUTDOWN call.
- */
- test_recv(clt_sk[0], msgbuf, 100, 0);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
- inmessage.msg_controllen = sizeof(incmsg);
-
- /* Receive the SHUTDOWN_COMP notification as they are enabled. */
- error = test_recvmsg(clt_sk[0], &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- tst_resm(TPASS, "recv SHUTDOWN_COMP notification on a SHUT_WR socket");
-
- /* No more messages and the association is SHUTDOWN, should fail. */
- error = recv(clt_sk[0], msgbuf, 100, 0);
- if ((-1 != error) || (ENOTCONN != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUTDOWN sent socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "recv on a SHUTDOWN sent socket");
-
- errno = 0;
-
- /* Do a SHUT_RD on clt_sk[1] to disable any new receives. */
- test_shutdown(clt_sk[1], SHUT_RD);
-
- error = recv(clt_sk[1], msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RD socket "
- "error:%d, errno:%d", error, errno);
-
- /* Sending a message on SHUT_RD socket. */
- test_send(clt_sk[1], message, strlen(message), 0);
-
- /* Receive the message sent on SHUT_RD socket. */
- test_recv(accept_sk[1], msgbuf, 100, 0);
-
- /* Send a message to the SHUT_RD socket. */
- test_send(accept_sk[1], message, strlen(message), 0);
-
- /* We should not receive the message as the socket is SHUT_RD */
- error = recv(clt_sk[1], msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RD socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "recv on a SHUT_RD socket");
-
- /* Do a SHUT_RDWR on clt_sk[2] to disable any new sends/receives. */
- test_shutdown(clt_sk[2], SHUT_RDWR);
-
- error = recv(accept_sk[2], msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RDWR socket "
- "error:%d, errno:%d", error, errno);
-
- error = recv(clt_sk[2], msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "recv on a SHUT_RDWR socket "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "recv on a SHUT_RDWR socket");
-
- error = 0;
-
- for (i = 0; i < MAX_CLIENTS; i++)
- close(clt_sk[i]);
- for (i = 0; i < MAX_CLIENTS; i++)
- close(accept_sk[i]);
-
- /* Test case to verify accept of a CLOSED association. */
- /* Do a connect, send and a close to ESTABLISH and CLOSE an
- * association on the listening socket.
- */
- test_connect(clt2_sk, &svr_loop.sa, sizeof(svr_loop));
-
- test_send(clt2_sk, message, strlen(message), 0);
-
- close(clt2_sk);
-
- FD_ZERO(&set);
- FD_SET(listen_sk, &set);
-
- error = select(listen_sk + 1, &set, NULL, NULL, NULL);
- if (1 != error)
- tst_brkm(TBROK, NULL, "select error:%d, "
- "errno: %d", error, errno);
-
- /* Now accept the CLOSED association waiting on the listening
- * socket.
- */
- accept2_sk = test_accept(listen_sk, &accept_loop.sa, &addrlen);
-
- /* Receive the message sent before doing a close. */
- test_recv(accept2_sk, msgbuf, 100, 0);
-
- /* Receive EOF indication as there are no more messages and the
- * socket is SHUTDOWN.
- */
- error = recv(accept2_sk, msgbuf, 100, 0);
- if ((0 != error) || (0 != errno))
- tst_brkm(TBROK, NULL, "Unexpected error return on "
- "recv(error:%d, errno:%d)", error, errno);
-
- tst_resm(TPASS, "accept of a CLOSED association");
-
- /* Trying to send a message over the CLOSED association should
- * generate EPIPE.
- */
- error = send(accept2_sk, message, strlen(message), MSG_NOSIGNAL);
- if ((-1 != error) || (EPIPE != errno))
- tst_brkm(TBROK, NULL, "send to a CLOSED association "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "send to a CLOSED association");
-
- error = 0;
- close(accept2_sk);
-
- /* Verify that auto-connect can be done on a TCP-style socket using
- * sendto/sendmsg.
- */
- clt2_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
- test_bind(clt2_sk, &clt2_loop.sa, sizeof(clt2_loop));
-
- /* Do a sendto() without a connect() */
- test_sendto(clt2_sk, message, strlen(message), 0, &svr_loop.sa,
- sizeof(svr_loop));
-
- accept2_sk = test_accept(listen_sk, &accept_loop.sa, &addrlen);
-
- test_recv(accept2_sk, msgbuf, 100, 0);
-
- tst_resm(TPASS, "auto-connect using sendto");
-
- outmessage.msg_name = &svr_loop;
- outmessage.msg_namelen = sizeof(svr_loop);
- outmessage.msg_iov = NULL;
- outmessage.msg_iovlen = 0;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
-
- /* Verify that SCTP_EOF cannot be used to shutdown an association
- * on a TCP-style socket.
- */
- sinfo->sinfo_flags |= SCTP_EOF;
- error = sendmsg(clt2_sk, &outmessage, 0);
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "sendmsg with SCTP_EOF flag "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sendmsg with SCTP_EOF flag");
-
- /* Verify that SCTP_ABORT cannot be used to abort an association
- * on a TCP-style socket.
- */
- sinfo->sinfo_flags |= SCTP_ABORT;
- error = sendmsg(clt2_sk, &outmessage, 0);
- if ((-1 != error) || (EINVAL != errno))
- tst_brkm(TBROK, NULL, "sendmsg with SCTP_ABORT flag "
- "error:%d, errno:%d", error, errno);
-
- tst_resm(TPASS, "sendmsg with SCTP_ABORT flag");
-
- /* Verify that a normal message can be sent using sendmsg. */
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- out_iov.iov_base = message;
- out_iov.iov_len = strlen(message) + 1;
- sinfo->sinfo_flags = 0;
- test_sendmsg(clt2_sk, &outmessage, 0, strlen(message) + 1);
-
- test_recv(accept2_sk, msgbuf, 100, 0);
-
- tst_resm(TPASS, "sendmsg with no flags");
-
- close(clt2_sk);
- close(accept2_sk);
- close(listen_sk);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/func_tests/test_timetolive.c b/testcases/network/sctp/func_tests/test_timetolive.c
deleted file mode 100644
index 05f5bb62f..000000000
--- a/testcases/network/sctp/func_tests/test_timetolive.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/* SCTP kernel reference 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.
- *
- * The SCTP reference 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 reference 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:
- * Jon Grimm <jgrimm@us.ibm.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-/*
- * This is a basic functional test for the SCTP kernel reference
- * implementation of sndrcvinfo.sinfo_timetolive.
- *
- * 1) Create two sockets, the listening socket sets its RECVBUF small
- * 2) Create a connection. Send enough data to the non-reading listener
- * to fill the RCVBUF.
- * 5) Set sinfo_timetolive on a message and send.
- * 6) Disable sinfo_timetolive on a message and send.
- * 7) Wait sinfo_timetolive.
- * 8) Read out all the data at the receiver.
- * 9) Make sure timed out message did not make it.
- * 10) Make sure that the message with no timeout makes it to the receiver.
- *
- * Also test with SEND_FAILED notifications. Also, use a fragmented
- * message so as to also exercise the SEND_FAILED of fragmentation
- * code.
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <errno.h>
-#include <netinet/sctp.h>
-#include <sctputil.h>
-
-char *TCID = __FILE__;
-int TST_TOTAL = 6;
-int TST_CNT = 0;
-
-/* This is the size of our RCVBUF */
-#define SMALL_RCVBUF 3000
-
-/* MAX segment size */
-#define SMALL_MAXSEG 100
-
-/* RWND_SLOP is the extra data that fills up the rwnd */
-#define RWND_SLOP 100
-static char *fillmsg = NULL;
-static char *ttlmsg = "This should time out!\n";
-static char *nottlmsg = "This should NOT time out!\n";
-static char ttlfrag[SMALL_MAXSEG * 3] = { 0 };
-
-static char *message = "Hello world\n";
-
-int main(int argc, char *argv[])
-{
- int sk1, sk2;
- sockaddr_storage_t loop1;
- sockaddr_storage_t loop2;
- struct iovec iov;
- struct msghdr inmessage;
- struct msghdr outmessage;
- char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))];
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
- struct iovec out_iov;
- int error;
- int pf_class, af_family;
- uint32_t ppid;
- uint32_t stream;
- sctp_assoc_t associd1, associd2;
- struct sctp_assoc_change *sac;
- struct sctp_event_subscribe subscribe;
- char *big_buffer;
- int offset;
- struct sctp_send_failed *ssf;
- socklen_t len; /* Really becomes 2xlen when set. */
- int orig_len;
- struct sctp_status gstatus;
-
- /* Rather than fflush() throughout the code, set stdout to
- * be unbuffered.
- */
- setvbuf(stdout, NULL, _IONBF, 0);
-
- /* Set some basic values which depend on the address family. */
-#if TEST_V6
- pf_class = PF_INET6;
- af_family = AF_INET6;
-
- loop1.v6.sin6_family = AF_INET6;
- loop1.v6.sin6_addr = in6addr_loopback;
- loop1.v6.sin6_port = htons(SCTP_TESTPORT_1);
-
- loop2.v6.sin6_family = AF_INET6;
- loop2.v6.sin6_addr = in6addr_loopback;
- loop2.v6.sin6_port = htons(SCTP_TESTPORT_2);
-#else
- pf_class = PF_INET;
- af_family = AF_INET;
-
- loop1.v4.sin_family = AF_INET;
- loop1.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop1.v4.sin_port = htons(SCTP_TESTPORT_1);
-
- loop2.v4.sin_family = AF_INET;
- loop2.v4.sin_addr.s_addr = SCTP_IP_LOOPBACK;
- loop2.v4.sin_port = htons(SCTP_TESTPORT_2);
-#endif /* TEST_V6 */
-
- /* Create the two endpoints which will talk to each other. */
- sk1 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
- sk2 = test_socket(pf_class, SOCK_SEQPACKET, IPPROTO_SCTP);
-
- len = sizeof(int);
- error = getsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &orig_len, &len);
- if (error)
- tst_brkm(TBROK, NULL, "can't get rcvbuf size: %s",
- strerror(errno));
- /* Set the MAXSEG to something smallish. */
- {
- int val = SMALL_MAXSEG;
- test_setsockopt(sk1, SCTP_MAXSEG, &val, sizeof(val));
- }
-
- memset(&subscribe, 0, sizeof(subscribe));
- subscribe.sctp_data_io_event = 1;
- subscribe.sctp_association_event = 1;
- subscribe.sctp_send_failure_event = 1;
- test_setsockopt(sk1, SCTP_EVENTS, &subscribe, sizeof(subscribe));
- test_setsockopt(sk2, SCTP_EVENTS, &subscribe, sizeof(subscribe));
-
- /* Bind these sockets to the test ports. */
- test_bind(sk1, &loop1.sa, sizeof(loop1));
- test_bind(sk2, &loop2.sa, sizeof(loop2));
-
- /*
- * This code sets the associations RWND very small so we can
- * fill it. It does this by manipulating the rcvbuf as follows:
- * 1) Reduce the rcvbuf size on the socket
- * 2) create an association so that we advertize rcvbuf/2 as
- * our initial rwnd
- * 3) raise the rcvbuf value so that we don't drop data wile
- * receiving later data
- */
- len = SMALL_RCVBUF;
- error = setsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len));
- if (error)
- tst_brkm(TBROK, NULL, "setsockopt(SO_RCVBUF): %s",
- strerror(errno));
-
- /* Mark sk2 as being able to accept new associations. */
- test_listen(sk2, 1);
-
- /* Send the first message. This will create the association. */
- outmessage.msg_name = &loop2;
- outmessage.msg_namelen = sizeof(loop2);
- outmessage.msg_iov = &out_iov;
- outmessage.msg_iovlen = 1;
- outmessage.msg_control = outcmsg;
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid = rand(); /* Choose an arbitrary value. */
- stream = 1;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = message;
- outmessage.msg_iov->iov_len = strlen(message) + 1;
- test_sendmsg(sk1, &outmessage, 0, strlen(message) + 1);
-
- /* Initialize inmessage for all receives. */
- big_buffer = test_malloc(REALLY_BIG);
- memset(&inmessage, 0, sizeof(inmessage));
- iov.iov_base = big_buffer;
- iov.iov_len = REALLY_BIG;
- inmessage.msg_iov = &iov;
- inmessage.msg_iovlen = 1;
- inmessage.msg_control = incmsg;
-
- /* Get the communication up message on sk2. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd2 = sac->sac_assoc_id;
-
- /* Get the communication up message on sk1. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_COMM_UP);
- sac = (struct sctp_assoc_change *)iov.iov_base;
- associd1 = sac->sac_assoc_id;
-
- /* restore the rcvbuffer size for the receiving socket */
- error = setsockopt(sk2, SOL_SOCKET, SO_RCVBUF, &orig_len,
- sizeof(orig_len));
-
- if (error)
- tst_brkm(TBROK, NULL, "setsockopt(SO_RCVBUF): %s",
- strerror(errno));
-
- /* Get the first data message which was sent. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(message) + 1,
- MSG_EOR, stream, ppid);
-
- /* Figure out how big to make our fillmsg */
- len = sizeof(struct sctp_status);
- memset(&gstatus, 0, sizeof(struct sctp_status));
- gstatus.sstat_assoc_id = associd1;
- error = getsockopt(sk1, IPPROTO_SCTP, SCTP_STATUS, &gstatus, &len);
-
- if (error)
- tst_brkm(TBROK, NULL, "can't get rwnd size: %s",
- strerror(errno));
- tst_resm(TINFO, "Creating fillmsg of size %d",
- gstatus.sstat_rwnd + RWND_SLOP);
- fillmsg = malloc(gstatus.sstat_rwnd + RWND_SLOP);
-
- /* Send a fillmsg */
- outmessage.msg_controllen = sizeof(outcmsg);
- outmessage.msg_flags = 0;
- cmsg = CMSG_FIRSTHDR(&outmessage);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
- outmessage.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo));
- ppid++;
- stream++;
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- memset(fillmsg, 'X', gstatus.sstat_rwnd + RWND_SLOP);
- fillmsg[gstatus.sstat_rwnd + RWND_SLOP - 1] = '\0';
- outmessage.msg_iov->iov_base = fillmsg;
- outmessage.msg_iov->iov_len = gstatus.sstat_rwnd + RWND_SLOP;
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- sinfo->sinfo_assoc_id = associd1;
- sinfo->sinfo_timetolive = 0;
- test_sendmsg(sk1, &outmessage, MSG_NOSIGNAL,
- gstatus.sstat_rwnd + RWND_SLOP);
-
- /* Now send the message with timeout. */
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = ttlmsg;
- outmessage.msg_iov->iov_len = strlen(ttlmsg) + 1;
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- sinfo->sinfo_assoc_id = associd1;
- sinfo->sinfo_timetolive = 2000;
- test_sendmsg(sk1, &outmessage, MSG_NOSIGNAL, strlen(ttlmsg) + 1);
-
- tst_resm(TPASS, "Send a message with timeout");
-
- /* Next send a message with no timeout. */
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- outmessage.msg_iov->iov_base = nottlmsg;
- outmessage.msg_iov->iov_len = strlen(nottlmsg) + 1;
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- sinfo->sinfo_assoc_id = associd1;
- sinfo->sinfo_timetolive = 0;
- test_sendmsg(sk1, &outmessage, MSG_NOSIGNAL, strlen(nottlmsg) + 1);
-
- tst_resm(TPASS, "Send a message with no timeout");
-
- /* And finally a fragmented message that will time out. */
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_stream = stream;
- memset(ttlfrag, '0', sizeof(ttlfrag));
- ttlfrag[sizeof(ttlfrag) - 1] = '\0';
- outmessage.msg_iov->iov_base = ttlfrag;
- outmessage.msg_iov->iov_len = sizeof(ttlfrag);
- outmessage.msg_name = NULL;
- outmessage.msg_namelen = 0;
- sinfo->sinfo_assoc_id = associd1;
- sinfo->sinfo_timetolive = 2000;
- test_sendmsg(sk1, &outmessage, MSG_NOSIGNAL, sizeof(ttlfrag));
-
- tst_resm(TPASS, "Send a fragmented message with timeout");
-
- /* Sleep waiting for the message to time out. */
- tst_resm(TINFO, " ** SLEEPING for 3 seconds **");
- sleep(3);
-
- /* Read the fillmsg snuck in between the ttl'd messages. */
- do {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- } while (!(inmessage.msg_flags & MSG_EOR));
-
- /* Now get the message that did NOT time out. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_data(&inmessage, error, strlen(nottlmsg) + 1,
- MSG_EOR, stream, ppid);
- if (0 != strncmp(iov.iov_base, nottlmsg, strlen(nottlmsg) + 1))
- tst_brkm(TBROK, NULL, "Received Wrong Message !!!");
-
- tst_resm(TPASS, "Receive message with no timeout");
-
- /* Get the SEND_FAILED notification for the message that DID
- * time out.
- */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_send_failed) +
- strlen(ttlmsg) + 1, SCTP_SEND_FAILED, 0);
- ssf = (struct sctp_send_failed *)iov.iov_base;
- if (0 != strncmp(ttlmsg, (char *)ssf->ssf_data, strlen(ttlmsg) + 1))
- tst_brkm(TBROK, NULL, "SEND_FAILED data mismatch");
-
- tst_resm(TPASS, "Receive SEND_FAILED for message with timeout");
-
- /* Get the SEND_FAILED notification for the fragmented message that
- * DID time out.
- */
- offset = 0;
- do {
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk1, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_send_failed) +
- SMALL_MAXSEG, SCTP_SEND_FAILED, 0);
- ssf = (struct sctp_send_failed *)iov.iov_base;
- if (0 != strncmp(&ttlfrag[offset], (char *)ssf->ssf_data,
- SMALL_MAXSEG))
- tst_brkm(TBROK, NULL, "SEND_FAILED data mismatch");
- offset += SMALL_MAXSEG;
- } while (!(ssf->ssf_info.sinfo_flags & 0x01)); /* LAST_FRAG */
-
- tst_resm(TPASS, "Receive SEND_FAILED for fragmented message with "
- "timeout");
-
- /* Shut down the link. */
- close(sk1);
-
- /* Get the shutdown complete notification. */
- inmessage.msg_controllen = sizeof(incmsg);
- error = test_recvmsg(sk2, &inmessage, MSG_WAITALL);
- test_check_msg_notification(&inmessage, error,
- sizeof(struct sctp_assoc_change),
- SCTP_ASSOC_CHANGE, SCTP_SHUTDOWN_COMP);
-
- close(sk2);
-
- /* Indicate successful completion. */
- tst_exit();
-}
diff --git a/testcases/network/sctp/include/netinet/sctp.h b/testcases/network/sctp/include/netinet/sctp.h
deleted file mode 100644
index e30bfdfff..000000000
--- a/testcases/network/sctp/include/netinet/sctp.h
+++ /dev/null
@@ -1,674 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * sctp.h
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with SCTP in kernel.
- *
- * This header represents the structures and constants needed to support
- * the SCTP Extension to the Sockets API.
- *
- * (C) Copyright IBM Corp. 2001, 2004
- * Copyright (c) 1999-2000 Cisco, Inc.
- * Copyright (c) 1999-2001 Motorola, Inc.
- *
- * Written or modified by:
- * La Monte H.P. Yarroll <piggy@acm.org>
- * R. Stewart <randall@sctp.chicago.il.us>
- * K. Morneau <kmorneau@cisco.com>
- * Q. Xie <qxie1@email.mot.com>
- * Karl Knutson <karl@athena.chicago.il.us>
- * Jon Grimm <jgrimm@austin.ibm.com>
- * Daisy Chang <daisyc@us.ibm.com>
- * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-#ifndef __linux_sctp_h__
-#define __linux_sctp_h__
-
-#include <stdint.h>
-#include <linux/types.h>
-#include <sys/socket.h>
-
-__BEGIN_DECLS
-
-typedef __s32 sctp_assoc_t;
-
-/* Socket option layer for SCTP */
-#ifndef SOL_SCTP
-#define SOL_SCTP 132
-#endif
-
-#ifndef IPPROTO_SCTP
-#define IPPROTO_SCTP 132
-#endif
-
-/* 9. Preprocessor constants */
-#define HAVE_SCTP
-#define HAVE_KERNEL_SCTP
-#define HAVE_SCTP_MULTIBUF
-#define HAVE_SCTP_NOCONNECT
-#define HAVE_SCTP_PRSCTP
-#define HAVE_SCTP_ADDIP
-#define HAVE_SCTP_CANSET_PRIMARY
-
-/* The following symbols come from the Sockets API Extensions for
- * SCTP <draft-ietf-tsvwg-sctpsocket-07.txt>.
- */
-enum sctp_optname {
- SCTP_RTOINFO,
-#define SCTP_RTOINFO SCTP_RTOINFO
- SCTP_ASSOCINFO,
-#define SCTP_ASSOCINFO SCTP_ASSOCINFO
- SCTP_INITMSG,
-#define SCTP_INITMSG SCTP_INITMSG
- SCTP_NODELAY, /* Get/set nodelay option. */
-#define SCTP_NODELAY SCTP_NODELAY
- SCTP_AUTOCLOSE,
-#define SCTP_AUTOCLOSE SCTP_AUTOCLOSE
- SCTP_SET_PEER_PRIMARY_ADDR,
-#define SCTP_SET_PEER_PRIMARY_ADDR SCTP_SET_PEER_PRIMARY_ADDR
- SCTP_PRIMARY_ADDR,
-#define SCTP_PRIMARY_ADDR SCTP_PRIMARY_ADDR
- SCTP_ADAPTION_LAYER,
-#define SCTP_ADAPTION_LAYER SCTP_ADAPTION_LAYER
- SCTP_DISABLE_FRAGMENTS,
-#define SCTP_DISABLE_FRAGMENTS SCTP_DISABLE_FRAGMENTS
- SCTP_PEER_ADDR_PARAMS,
-#define SCTP_PEER_ADDR_PARAMS SCTP_PEER_ADDR_PARAMS
- SCTP_DEFAULT_SEND_PARAM,
-#define SCTP_DEFAULT_SEND_PARAM SCTP_DEFAULT_SEND_PARAM
- SCTP_EVENTS,
-#define SCTP_EVENTS SCTP_EVENTS
- SCTP_I_WANT_MAPPED_V4_ADDR, /* Turn on/off mapped v4 addresses */
-#define SCTP_I_WANT_MAPPED_V4_ADDR SCTP_I_WANT_MAPPED_V4_ADDR
- SCTP_MAXSEG, /* Get/set maximum fragment. */
-#define SCTP_MAXSEG SCTP_MAXSEG
- SCTP_STATUS,
-#define SCTP_STATUS SCTP_STATUS
- SCTP_GET_PEER_ADDR_INFO,
-#define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO
-
- /* Internal Socket Options. Some of the sctp library functions are
- * implemented using these socket options.
- */
- SCTP_SOCKOPT_BINDX_ADD = 100,/* BINDX requests for adding addresses. */
-#define SCTP_SOCKOPT_BINDX_ADD SCTP_SOCKOPT_BINDX_ADD
- SCTP_SOCKOPT_BINDX_REM, /* BINDX requests for removing addresses. */
-#define SCTP_SOCKOPT_BINDX_REM SCTP_SOCKOPT_BINDX_REM
- SCTP_SOCKOPT_PEELOFF, /* peel off association. */
-#define SCTP_SOCKOPT_PEELOFF SCTP_SOCKOPT_PEELOFF
- SCTP_GET_PEER_ADDRS_NUM_OLD, /* Get number of peer addresss. */
-#define SCTP_GET_PEER_ADDRS_NUM_OLD SCTP_GET_PEER_ADDRS_NUM_OLD
- SCTP_GET_PEER_ADDRS_OLD, /* Get all peer addresss. */
-#define SCTP_GET_PEER_ADDRS_OLD SCTP_GET_PEER_ADDRS_OLD
- SCTP_GET_LOCAL_ADDRS_NUM_OLD, /* Get number of local addresss. */
-#define SCTP_GET_LOCAL_ADDRS_NUM_OLD SCTP_GET_LOCAL_ADDRS_NUM_OLD
- SCTP_GET_LOCAL_ADDRS_OLD, /* Get all local addresss. */
-#define SCTP_GET_LOCAL_ADDRS_OLD SCTP_GET_LOCAL_ADDRS_OLD
- SCTP_SOCKOPT_CONNECTX, /* CONNECTX requests. */
-#define SCTP_SOCKOPT_CONNECTX SCTP_SOCKOPT_CONNECTX
- SCTP_GET_PEER_ADDRS, /* Get all peer addresss. */
-#define SCTP_GET_PEER_ADDRS SCTP_GET_PEER_ADDRS
- SCTP_GET_LOCAL_ADDRS, /* Get all local addresss. */
-#define SCTP_GET_LOCAL_ADDRS SCTP_GET_LOCAL_ADDRS
-};
-
-/*
- * 5.2.1 SCTP Initiation Structure (SCTP_INIT)
- *
- * This cmsghdr structure provides information for initializing new
- * SCTP associations with sendmsg(). The SCTP_INITMSG socket option
- * uses this same data structure. This structure is not used for
- * recvmsg().
- *
- * cmsg_level cmsg_type cmsg_data[]
- * ------------ ------------ ----------------------
- * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg
- *
- */
-struct sctp_initmsg {
- __u16 sinit_num_ostreams;
- __u16 sinit_max_instreams;
- __u16 sinit_max_attempts;
- __u16 sinit_max_init_timeo;
-};
-
-/*
- * 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
- *
- * This cmsghdr structure specifies SCTP options for sendmsg() and
- * describes SCTP header information about a received message through
- * recvmsg().
- *
- * cmsg_level cmsg_type cmsg_data[]
- * ------------ ------------ ----------------------
- * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo
- *
- */
-struct sctp_sndrcvinfo {
- __u16 sinfo_stream;
- __u16 sinfo_ssn;
- __u16 sinfo_flags;
- __u32 sinfo_ppid;
- __u32 sinfo_context;
- __u32 sinfo_timetolive;
- __u32 sinfo_tsn;
- __u32 sinfo_cumtsn;
- sctp_assoc_t sinfo_assoc_id;
-};
-
-/*
- * sinfo_flags: 16 bits (unsigned integer)
- *
- * This field may contain any of the following flags and is composed of
- * a bitwise OR of these values.
- */
-
-enum sctp_sinfo_flags {
- SCTP_UNORDERED = 1, /* Send/receive message unordered. */
- SCTP_ADDR_OVER = 2, /* Override the primary destination. */
- SCTP_ABORT=4, /* Send an ABORT message to the peer. */
- SCTP_EOF=MSG_FIN, /* Initiate graceful shutdown process. */
-};
-
-
-typedef union {
- __u8 raw;
- struct sctp_initmsg init;
- struct sctp_sndrcvinfo sndrcv;
-} sctp_cmsg_data_t;
-
-/* These are cmsg_types. */
-typedef enum sctp_cmsg_type {
- SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */
- SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */
-} sctp_cmsg_t;
-
-
-/*
- * 5.3.1.1 SCTP_ASSOC_CHANGE
- *
- * Communication notifications inform the ULP that an SCTP association
- * has either begun or ended. The identifier for a new association is
- * provided by this notificaion. The notification information has the
- * following format:
- *
- */
-struct sctp_assoc_change {
- __u16 sac_type;
- __u16 sac_flags;
- __u32 sac_length;
- __u16 sac_state;
- __u16 sac_error;
- __u16 sac_outbound_streams;
- __u16 sac_inbound_streams;
- sctp_assoc_t sac_assoc_id;
-};
-
-/*
- * sac_state: 32 bits (signed integer)
- *
- * This field holds one of a number of values that communicate the
- * event that happened to the association. They include:
- *
- * Note: The following state names deviate from the API draft as
- * the names clash too easily with other kernel symbols.
- */
-enum sctp_sac_state {
- SCTP_COMM_UP,
- SCTP_COMM_LOST,
- SCTP_RESTART,
- SCTP_SHUTDOWN_COMP,
- SCTP_CANT_STR_ASSOC,
-};
-
-/*
- * 5.3.1.2 SCTP_PEER_ADDR_CHANGE
- *
- * When a destination address on a multi-homed peer encounters a change
- * an interface details event is sent. The information has the
- * following structure:
- */
-struct sctp_paddr_change {
- __u16 spc_type;
- __u16 spc_flags;
- __u32 spc_length;
- struct sockaddr_storage spc_aaddr;
- int spc_state;
- int spc_error;
- sctp_assoc_t spc_assoc_id;
-} __attribute__((packed, aligned(4)));
-
-/*
- * spc_state: 32 bits (signed integer)
- *
- * This field holds one of a number of values that communicate the
- * event that happened to the address. They include:
- */
-enum sctp_spc_state {
- SCTP_ADDR_AVAILABLE,
- SCTP_ADDR_UNREACHABLE,
- SCTP_ADDR_REMOVED,
- SCTP_ADDR_ADDED,
- SCTP_ADDR_MADE_PRIM,
-};
-
-
-/*
- * 5.3.1.3 SCTP_REMOTE_ERROR
- *
- * A remote peer may send an Operational Error message to its peer.
- * This message indicates a variety of error conditions on an
- * association. The entire error TLV as it appears on the wire is
- * included in a SCTP_REMOTE_ERROR event. Please refer to the SCTP
- * specification [SCTP] and any extensions for a list of possible
- * error formats. SCTP error TLVs have the format:
- */
-struct sctp_remote_error {
- __u16 sre_type;
- __u16 sre_flags;
- __u32 sre_length;
- __u16 sre_error;
- sctp_assoc_t sre_assoc_id;
- __u8 sre_data[0];
-};
-
-
-/*
- * 5.3.1.4 SCTP_SEND_FAILED
- *
- * If SCTP cannot deliver a message it may return the message as a
- * notification.
- */
-struct sctp_send_failed {
- __u16 ssf_type;
- __u16 ssf_flags;
- __u32 ssf_length;
- __u32 ssf_error;
- struct sctp_sndrcvinfo ssf_info;
- sctp_assoc_t ssf_assoc_id;
- __u8 ssf_data[0];
-};
-
-/*
- * ssf_flags: 16 bits (unsigned integer)
- *
- * The flag value will take one of the following values
- *
- * SCTP_DATA_UNSENT - Indicates that the data was never put on
- * the wire.
- *
- * SCTP_DATA_SENT - Indicates that the data was put on the wire.
- * Note that this does not necessarily mean that the
- * data was (or was not) successfully delivered.
- */
-enum sctp_ssf_flags {
- SCTP_DATA_UNSENT,
- SCTP_DATA_SENT,
-};
-
-/*
- * 5.3.1.5 SCTP_SHUTDOWN_EVENT
- *
- * When a peer sends a SHUTDOWN, SCTP delivers this notification to
- * inform the application that it should cease sending data.
- */
-struct sctp_shutdown_event {
- __u16 sse_type;
- __u16 sse_flags;
- __u32 sse_length;
- sctp_assoc_t sse_assoc_id;
-};
-
-/*
- * 5.3.1.6 SCTP_ADAPTION_INDICATION
- *
- * When a peer sends a Adaption Layer Indication parameter , SCTP
- * delivers this notification to inform the application
- * that of the peers requested adaption layer.
- */
-struct sctp_adaption_event {
- __u16 sai_type;
- __u16 sai_flags;
- __u32 sai_length;
- __u32 sai_adaption_ind;
- sctp_assoc_t sai_assoc_id;
-};
-
-/*
- * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT
- *
- * When a reciever is engaged in a partial delivery of a
- * message this notification will be used to inidicate
- * various events.
- */
-struct sctp_pdapi_event {
- __u16 pdapi_type;
- __u16 pdapi_flags;
- __u32 pdapi_length;
- __u32 pdapi_indication;
- sctp_assoc_t pdapi_assoc_id;
-};
-
-enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, };
-
-/*
- * Described in Section 7.3
- * Ancillary Data and Notification Interest Options
- */
-struct sctp_event_subscribe {
- __u8 sctp_data_io_event;
- __u8 sctp_association_event;
- __u8 sctp_address_event;
- __u8 sctp_send_failure_event;
- __u8 sctp_peer_error_event;
- __u8 sctp_shutdown_event;
- __u8 sctp_partial_delivery_event;
- __u8 sctp_adaption_layer_event;
-};
-
-/*
- * 5.3.1 SCTP Notification Structure
- *
- * The notification structure is defined as the union of all
- * notification types.
- *
- */
-union sctp_notification {
- struct {
- __u16 sn_type; /* Notification type. */
- __u16 sn_flags;
- __u32 sn_length;
- } sn_header;
- struct sctp_assoc_change sn_assoc_change;
- struct sctp_paddr_change sn_paddr_change;
- struct sctp_remote_error sn_remote_error;
- struct sctp_send_failed sn_send_failed;
- struct sctp_shutdown_event sn_shutdown_event;
- struct sctp_adaption_event sn_adaption_event;
- struct sctp_pdapi_event sn_pdapi_event;
-};
-
-/* Section 5.3.1
- * All standard values for sn_type flags are greater than 2^15.
- * Values from 2^15 and down are reserved.
- */
-
-enum sctp_sn_type {
- SCTP_SN_TYPE_BASE = (1<<15),
- SCTP_ASSOC_CHANGE,
- SCTP_PEER_ADDR_CHANGE,
- SCTP_SEND_FAILED,
- SCTP_REMOTE_ERROR,
- SCTP_SHUTDOWN_EVENT,
- SCTP_PARTIAL_DELIVERY_EVENT,
- SCTP_ADAPTION_INDICATION,
-};
-
-/* Notification error codes used to fill up the error fields in some
- * notifications.
- * SCTP_PEER_ADDRESS_CHAGE : spc_error
- * SCTP_ASSOC_CHANGE : sac_error
- * These names should be potentially included in the draft 04 of the SCTP
- * sockets API specification.
- */
-typedef enum sctp_sn_error {
- SCTP_FAILED_THRESHOLD,
- SCTP_RECEIVED_SACK,
- SCTP_HEARTBEAT_SUCCESS,
- SCTP_RESPONSE_TO_USER_REQ,
- SCTP_INTERNAL_ERROR,
- SCTP_SHUTDOWN_GUARD_EXPIRES,
- SCTP_PEER_FAULTY,
-} sctp_sn_error_t;
-
-/*
- * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO)
- *
- * The protocol parameters used to initialize and bound retransmission
- * timeout (RTO) are tunable. See [SCTP] for more information on how
- * these parameters are used in RTO calculation.
- */
-struct sctp_rtoinfo {
- sctp_assoc_t srto_assoc_id;
- __u32 srto_initial;
- __u32 srto_max;
- __u32 srto_min;
-};
-
-/*
- * 7.1.2 Association Parameters (SCTP_ASSOCINFO)
- *
- * This option is used to both examine and set various association and
- * endpoint parameters.
- */
-struct sctp_assocparams {
- sctp_assoc_t sasoc_assoc_id;
- __u16 sasoc_asocmaxrxt;
- __u16 sasoc_number_peer_destinations;
- __u32 sasoc_peer_rwnd;
- __u32 sasoc_local_rwnd;
- __u32 sasoc_cookie_life;
-};
-
-/*
- * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR)
- *
- * Requests that the peer mark the enclosed address as the association
- * primary. The enclosed address must be one of the association's
- * locally bound addresses. The following structure is used to make a
- * set primary request:
- */
-struct sctp_setpeerprim {
- sctp_assoc_t sspp_assoc_id;
- struct sockaddr_storage sspp_addr;
-} __attribute__((packed, aligned(4)));
-
-/*
- * 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR)
- *
- * Requests that the local SCTP stack use the enclosed peer address as
- * the association primary. The enclosed address must be one of the
- * association peer's addresses. The following structure is used to
- * make a set peer primary request:
- */
-struct sctp_prim {
- sctp_assoc_t ssp_assoc_id;
- struct sockaddr_storage ssp_addr;
-} __attribute__((packed, aligned(4)));
-
-/*
- * 7.1.11 Set Adaption Layer Indicator (SCTP_ADAPTION_LAYER)
- *
- * Requests that the local endpoint set the specified Adaption Layer
- * Indication parameter for all future INIT and INIT-ACK exchanges.
- */
-struct sctp_setadaption {
- __u32 ssb_adaption_ind;
-};
-
-/*
- * 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS)
- *
- * Applications can enable or disable heartbeats for any peer address
- * of an association, modify an address's heartbeat interval, force a
- * heartbeat to be sent immediately, and adjust the address's maximum
- * number of retransmissions sent before an address is considered
- * unreachable. The following structure is used to access and modify an
- * address's parameters:
- */
-struct sctp_paddrparams {
- sctp_assoc_t spp_assoc_id;
- struct sockaddr_storage spp_address;
- __u32 spp_hbinterval;
- __u16 spp_pathmaxrxt;
-} __attribute__((packed, aligned(4)));
-
-/*
- * 7.2.2 Peer Address Information
- *
- * Applications can retrieve information about a specific peer address
- * of an association, including its reachability state, congestion
- * window, and retransmission timer values. This information is
- * read-only. The following structure is used to access this
- * information:
- */
-struct sctp_paddrinfo {
- sctp_assoc_t spinfo_assoc_id;
- struct sockaddr_storage spinfo_address;
- __s32 spinfo_state;
- __u32 spinfo_cwnd;
- __u32 spinfo_srtt;
- __u32 spinfo_rto;
- __u32 spinfo_mtu;
-} __attribute__((packed, aligned(4)));
-
-/* Peer addresses's state. */
-enum sctp_spinfo_state {
- SCTP_INACTIVE,
- SCTP_ACTIVE,
-};
-
-/*
- * 7.2.1 Association Status (SCTP_STATUS)
- *
- * Applications can retrieve current status information about an
- * association, including association state, peer receiver window size,
- * number of unacked data chunks, and number of data chunks pending
- * receipt. This information is read-only. The following structure is
- * used to access this information:
- */
-struct sctp_status {
- sctp_assoc_t sstat_assoc_id;
- __s32 sstat_state;
- __u32 sstat_rwnd;
- __u16 sstat_unackdata;
- __u16 sstat_penddata;
- __u16 sstat_instrms;
- __u16 sstat_outstrms;
- __u32 sstat_fragmentation_point;
- struct sctp_paddrinfo sstat_primary;
-};
-
-/* Association states. */
-enum sctp_sstat_state {
- SCTP_EMPTY = 0,
- SCTP_CLOSED = 1,
- SCTP_COOKIE_WAIT = 2,
- SCTP_COOKIE_ECHOED = 3,
- SCTP_ESTABLISHED = 4,
- SCTP_SHUTDOWN_PENDING = 5,
- SCTP_SHUTDOWN_SENT = 6,
- SCTP_SHUTDOWN_RECEIVED = 7,
- SCTP_SHUTDOWN_ACK_SENT = 8,
-};
-
-/*
- * 8.3, 8.5 get all peer/local addresses in an association.
- * This parameter struct is used by SCTP_GET_PEER_ADDRS and
- * SCTP_GET_LOCAL_ADDRS socket options used internally to implement
- * sctp_getpaddrs() and sctp_getladdrs() API.
- */
-struct sctp_getaddrs_old {
- sctp_assoc_t assoc_id;
- int addr_num;
- struct sockaddr *addrs;
-};
-struct sctp_getaddrs {
- sctp_assoc_t assoc_id; /*input*/
- __u32 addr_num; /*output*/
- __u8 addrs[0]; /*output, variable size*/
-};
-
-/* These are bit fields for msghdr->msg_flags. See section 5.1. */
-/* On user space Linux, these live in <bits/socket.h> as an enum. */
-enum sctp_msg_flags {
- MSG_NOTIFICATION = 0x8000,
-#define MSG_NOTIFICATION MSG_NOTIFICATION
-};
-
-/*
- * 8.1 sctp_bindx()
- *
- * The flags parameter is formed from the bitwise OR of zero or more of the
- * following currently defined flags:
- */
-#define SCTP_BINDX_ADD_ADDR 0x01
-#define SCTP_BINDX_REM_ADDR 0x02
-
-/* This is the structure that is passed as an argument(optval) to
- * getsockopt(SCTP_SOCKOPT_PEELOFF).
- */
-typedef struct {
- sctp_assoc_t associd;
- int sd;
-} sctp_peeloff_arg_t;
-
-
-int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, int flags);
-
-int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt);
-
-int sctp_peeloff(int sd, sctp_assoc_t assoc_id);
-
-/* Prototype for the library function sctp_opt_info defined in
- * API 7. Socket Options.
- */
-int sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t *size);
-
-/* Get all peer address on a socket. This is a new SCTP API
- * described in the section 8.3 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
-int sctp_getpaddrs(int sd, sctp_assoc_t id, struct sockaddr **addrs);
-
-/* Frees all resources allocated by sctp_getpaddrs(). This is a new SCTP API
- * described in the section 8.4 of the Sockets API Extensions for SCTP.
- */
-int sctp_freepaddrs(struct sockaddr *addrs);
-
-/* Get all locally bound address on a socket. This is a new SCTP API
- * described in the section 8.5 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
-int sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **addrs);
-
-/* Frees all resources allocated by sctp_getladdrs(). This is a new SCTP API
- * described in the section 8.6 of the Sockets API Extensions for SCTP.
- */
-int sctp_freeladdrs(struct sockaddr *addrs);
-
-/* This library function assists the user with the advanced features
- * of SCTP. This is a new SCTP API described in the section 8.7 of the
- * Sockets API Extensions for SCTP. This is implemented using the
- * sendmsg() interface.
- */
-int 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);
-
-/* This library function assist the user with sending a message without
- * dealing directly with the CMSG header.
- */
-int sctp_send(int s, const void *msg, size_t len,
- const struct sctp_sndrcvinfo *sinfo, int flags);
-
-/* This library function assists the user with the advanced features
- * of SCTP. This is a new SCTP API described in the section 8.8 of the
- * Sockets API Extensions for SCTP. This is implemented using the
- * recvmsg() interface.
- */
-int sctp_recvmsg(int s, void *msg, size_t len, struct sockaddr *from,
- socklen_t *fromlen, struct sctp_sndrcvinfo *sinfo,
- int *msg_flags);
-
-__END_DECLS
-
-#endif /* __linux_sctp_h__ */
diff --git a/testcases/network/sctp/lib/Makefile b/testcases/network/sctp/lib/Makefile
deleted file mode 100644
index f0d0b6f6c..000000000
--- a/testcases/network/sctp/lib/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# testcases/network/sctp/lib Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program 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 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Garrett Cooper, July 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-
-CPPFLAGS += -I$(abs_srcdir)/../include
-
-LIB := libsctp.a
-
-include $(top_srcdir)/include/mk/lib.mk
diff --git a/testcases/network/sctp/lib/addrs.c b/testcases/network/sctp/lib/addrs.c
deleted file mode 100644
index 184335c71..000000000
--- a/testcases/network/sctp/lib/addrs.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * addrs.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
- *
- * (C) Copyright IBM Corp. 2003
- * Copyright (c) 2001-2002 Intel Corp.
- *
- * Written or modified by:
- * Ardelle Fan <ardelle.fan@intel.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <netinet/sctp.h>
-#include <errno.h>
-
-/*
- * Get local/peer addresses using the old API
- * Old kernels (2.6.13 and earlier) only support this API but it breaks 32-bit
- * programs on 64-bit kernels.
- */
-static int
-sctp_getaddrs_old(int sd, sctp_assoc_t id, int optname_num, int optname_old,
- struct sockaddr **addrs)
-{
- socklen_t len = sizeof(sctp_assoc_t);
- int cnt, err;
- struct sctp_getaddrs_old getaddrs;
-
- cnt = getsockopt(sd, SOL_SCTP, optname_num, &id, &len);
- if (cnt < 0)
- return -1;
-
- if (0 == cnt) {
- *addrs = NULL;
- return 0;
- }
-
- len = cnt * sizeof(struct sockaddr_in6);
-
- getaddrs.assoc_id = id;
- getaddrs.addr_num = cnt;
- getaddrs.addrs = (struct sockaddr *)malloc(len);
- if (NULL == getaddrs.addrs)
- return -1;
-
- len = sizeof(getaddrs);
- err = getsockopt(sd, SOL_SCTP, optname_old, &getaddrs, &len);
- if (err < 0) {
- free(getaddrs.addrs);
- return -1;
- }
-
- *addrs = getaddrs.addrs;
-
- return getaddrs.addr_num;
-
-} /* sctp_getaddrs_old() */
-
-/*
- * Common getsockopt() layer
- * If the NEW getsockopt() API fails this function will fall back to using
- * the old API
- */
-static int
-sctp_getaddrs(int sd, sctp_assoc_t id,
- int optname_new, int optname_num_old, int optname_old,
- struct sockaddr **addrs)
-{
- int cnt, err;
- socklen_t len;
- size_t bufsize = 4096; /*enough for most cases */
-
- struct sctp_getaddrs *getaddrs =
- (struct sctp_getaddrs *)malloc(bufsize);
- if (!getaddrs)
- return -1;
-
- for (;;) {
- char *new_buf;
-
- len = bufsize;
- getaddrs->assoc_id = id;
- err = getsockopt(sd, SOL_SCTP, optname_new, getaddrs, &len);
- if (err == 0) {
- /*got it */
- break;
- }
- if (errno == ENOPROTOOPT) {
- /*Kernel does not support new API */
- free(getaddrs);
- return sctp_getaddrs_old(sd, id,
- optname_num_old, optname_old,
- addrs);
- }
- if (errno != ENOMEM) {
- /*unknown error */
- return -1;
- }
- /*expand buffer */
- if (bufsize > 128 * 1024) {
- /*this is getting ridiculous */
- free(getaddrs);
- errno = ENOBUFS;
- return -1;
- }
- new_buf = realloc(getaddrs, bufsize + 4096);
- if (!new_buf) {
- free(getaddrs);
- return -1;
- }
- bufsize += 4096;
- getaddrs = (struct sctp_getaddrs *)new_buf;
- }
-
- /* we skip traversing the list, allocating a new buffer etc. and enjoy
- * a simple hack*/
- cnt = getaddrs->addr_num;
- memmove(getaddrs, getaddrs + 1, len - sizeof(struct sctp_getaddrs));
- *addrs = (struct sockaddr *)getaddrs;
-
- return cnt;
-} /* sctp_getaddrs() */
-
-/* Get all peer address on a socket. This is a new SCTP API
- * described in the section 8.3 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
-int sctp_getpaddrs(int sd, sctp_assoc_t id, struct sockaddr **addrs)
-{
- return sctp_getaddrs(sd, id,
- SCTP_GET_PEER_ADDRS,
- SCTP_GET_PEER_ADDRS_NUM_OLD,
- SCTP_GET_PEER_ADDRS_OLD, addrs);
-} /* sctp_getpaddrs() */
-
-/* Frees all resources allocated by sctp_getpaddrs(). This is a new SCTP API
- * described in the section 8.4 of the Sockets API Extensions for SCTP.
- */
-int sctp_freepaddrs(struct sockaddr *addrs)
-{
- free(addrs);
- return 0;
-
-} /* sctp_freepaddrs() */
-
-/* Get all locally bound address on a socket. This is a new SCTP API
- * described in the section 8.5 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
-int sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **addrs)
-{
- return sctp_getaddrs(sd, id,
- SCTP_GET_LOCAL_ADDRS,
- SCTP_GET_LOCAL_ADDRS_NUM_OLD,
- SCTP_GET_LOCAL_ADDRS_OLD, addrs);
-} /* sctp_getladdrs() */
-
-/* Frees all resources allocated by sctp_getladdrs(). This is a new SCTP API
- * described in the section 8.6 of the Sockets API Extensions for SCTP.
- */
-int sctp_freeladdrs(struct sockaddr *addrs)
-{
- free(addrs);
- return 0;
-
-} /* sctp_freeladdrs() */
diff --git a/testcases/network/sctp/lib/bindx.c b/testcases/network/sctp/lib/bindx.c
deleted file mode 100644
index b89b31ec4..000000000
--- a/testcases/network/sctp/lib/bindx.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * bindx.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
- *
- * (C) Copyright IBM Corp. 2001, 2003
- * Copyright (c) 2002 Intel Corporation.
- *
- * Written or modified by:
- * La Monte H.P. Yarroll <piggy@acm.org>
- * Daisy Chang <daisyc@us.ibm.com>
- * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/in.h>
-#include <netinet/sctp.h> /* SCTP_SOCKOPT_BINDX_* */
-#include <errno.h>
-
-/* Support the sctp_bindx() interface.
- *
- * See Sockets API Extensions for SCTP. Section 8.1.
- *
- * Instead of implementing through a socket call in sys_socketcall(),
- * tunnel the request through setsockopt().
- */
-int sctp_bindx(int fd, struct sockaddr *addrs, int addrcnt, int flags)
-{
- int setsock_option = 0;
- void *addrbuf;
- struct sockaddr *sa_addr;
- socklen_t addrs_size = 0;
- int i;
-
- switch (flags) {
- case SCTP_BINDX_ADD_ADDR:
- setsock_option = SCTP_SOCKOPT_BINDX_ADD;
- break;
- case SCTP_BINDX_REM_ADDR:
- setsock_option = SCTP_SOCKOPT_BINDX_REM;
- break;
- default:
- errno = EINVAL;
- return -1;
- }
-
- addrbuf = addrs;
- for (i = 0; i < addrcnt; i++) {
- sa_addr = (struct sockaddr *)addrbuf;
- switch (sa_addr->sa_family) {
- case AF_INET:
- addrs_size += sizeof(struct sockaddr_in);
- addrbuf += sizeof(struct sockaddr_in);
- break;
- case AF_INET6:
- addrs_size += sizeof(struct sockaddr_in6);
- addrbuf += sizeof(struct sockaddr_in6);
- break;
- default:
- errno = EINVAL;
- return -1;
- }
- }
-
- return setsockopt(fd, SOL_SCTP, setsock_option, addrs, addrs_size);
-}
diff --git a/testcases/network/sctp/lib/connectx.c b/testcases/network/sctp/lib/connectx.c
deleted file mode 100644
index 5a5662393..000000000
--- a/testcases/network/sctp/lib/connectx.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * connectx.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt.
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
- *
- * (C) Copyright IBM Corp. 2001, 2005
- *
- * Written or modified by:
- * Frank Filz <ffilz@us.ibm.com>
- */
-
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/in.h>
-#include <netinet/sctp.h> /* SCTP_SOCKOPT_CONNECTX_* */
-#include <errno.h>
-
-/* Support the sctp_connectx() interface.
- *
- * See Sockets API Extensions for SCTP. Section 8.1.
- *
- * Instead of implementing through a socket call in sys_socketcall(),
- * tunnel the request through setsockopt().
- */
-int sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt)
-{
- void *addrbuf;
- struct sockaddr *sa_addr;
- socklen_t addrs_size = 0;
- int i;
-
- addrbuf = addrs;
- for (i = 0; i < addrcnt; i++) {
- sa_addr = (struct sockaddr *)addrbuf;
- switch (sa_addr->sa_family) {
- case AF_INET:
- addrs_size += sizeof(struct sockaddr_in);
- addrbuf += sizeof(struct sockaddr_in);
- break;
- case AF_INET6:
- addrs_size += sizeof(struct sockaddr_in6);
- addrbuf += sizeof(struct sockaddr_in6);
- break;
- default:
- errno = EINVAL;
- return -1;
- }
- }
-
- return setsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_CONNECTX, addrs,
- addrs_size);
-}
diff --git a/testcases/network/sctp/lib/opt_info.c b/testcases/network/sctp/lib/opt_info.c
deleted file mode 100644
index ba765ce2c..000000000
--- a/testcases/network/sctp/lib/opt_info.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * opt_info.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code if to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
- *
- * (C) Copyright IBM Corp. 2003
- * Copyright (c) 2002 Intel Corporation.
- *
- * Written or modified by:
- * Ardelle Fan <ardelle.fan@intel.com>
- */
-
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/sctp.h> /* SCTP_SOCKOPT_BINDX_* */
-#include <errno.h>
-
-/* Support the sctp_opt_info() interface.
- *
- * See Sockets API Extensions for SCTP. Section 7.
- *
- * Pass sctp option information pass both in to and out of the SCTP stack.
- * This is a new SCTP API described in the section 7 of the Sockets API
- * Extensions for SCTP. This is implemented using the getsockopt() interface.
- */
-int sctp_opt_info(int sd, sctp_assoc_t id, int opt, void *arg, socklen_t * size)
-{
- switch (opt) {
- case SCTP_RTOINFO:
- case SCTP_ASSOCINFO:
- case SCTP_INITMSG:
- case SCTP_NODELAY:
- case SCTP_AUTOCLOSE:
- case SCTP_PRIMARY_ADDR:
- case SCTP_DISABLE_FRAGMENTS:
- case SCTP_PEER_ADDR_PARAMS:
- case SCTP_DEFAULT_SEND_PARAM:
- case SCTP_EVENTS:
- case SCTP_I_WANT_MAPPED_V4_ADDR:
- case SCTP_MAXSEG:
- case SCTP_STATUS:
- case SCTP_GET_PEER_ADDR_INFO:
- *(sctp_assoc_t *) arg = id;
- return getsockopt(sd, IPPROTO_SCTP, opt, arg, size);
- default:
- return ENOTSUP;
- }
-
-} /* sctp_opt_info() */
diff --git a/testcases/network/sctp/lib/peeloff.c b/testcases/network/sctp/lib/peeloff.c
deleted file mode 100644
index 04fe9bca5..000000000
--- a/testcases/network/sctp/lib/peeloff.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * peeloff.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt.
- *
- * (C) Copyright IBM Corp. 2001, 2003
- *
- * Written or modified by:
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/sctp.h> /* SCTP_SOCKOPT_BINDX_* */
-#include <errno.h>
-
-/* Branch off an association into a seperate socket. This is a new SCTP API
- * described in the section 8.2 of the Sockets API Extensions for SCTP.
- * This is implemented using the getsockopt() interface.
- */
-int sctp_peeloff(int fd, sctp_assoc_t associd)
-{
- sctp_peeloff_arg_t peeloff;
- socklen_t peeloff_size = sizeof(peeloff);
- int err;
-
- peeloff.associd = associd;
- peeloff.sd = 0;
- err = getsockopt(fd, SOL_SCTP, SCTP_SOCKOPT_PEELOFF, &peeloff,
- &peeloff_size);
- if (err < 0) {
- return err;
- }
-
- return peeloff.sd;
-
-} /* sctp_peeloff() */
diff --git a/testcases/network/sctp/lib/recvmsg.c b/testcases/network/sctp/lib/recvmsg.c
deleted file mode 100644
index 4efffaef0..000000000
--- a/testcases/network/sctp/lib/recvmsg.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * sctp_recvmsg.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt>
- *
- * Copyright (c) 2003 International Business Machines, Corp.
- *
- * Written or modified by:
- * Ryan Layer <rmlayer@us.ibm.com>
- *
- * An implementation may provide a library function (or possibly system
- * call) to assist the user with the advanced features of SCTP. Note
- * that in order for the sctp_sndrcvinfo structure to be filled in by
- * sctp_recvmsg() the caller must enable the sctp_data_io_events with
- * the SCTP_EVENTS option.
- *
- * sctp_recvmsg(). Its syntax is,
- *
- * int sctp_recvmsg(int s,
- * void *msg,
- * size_t len,
- * struct sockaddr *from,
- * socklen_t *fromlen,
- * struct sctp_sndrcvinfo *sinfo,
- * int *msg_flags)
- *
- *
- * s - is the socket descriptor
- * msg - is a message buffer to be filled.
- * len - is the length of the message buffer.
- * from - is a pointer to a address to be filled with
- * the sender of this messages address.
- * fromlen - is the from length.
- * sinfo - A pointer to a sctp_sndrcvinfo structure
- * to be filled upon receipt of the message.
- * msg_flags - A pointer to a integer to be filled with
- * any message flags (e.g. MSG_NOTIFICATION).
- */
-
-#include <string.h>
-#include <errno.h>
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/sctp.h>
-
-int sctp_recvmsg(int s, void *msg, size_t len, struct sockaddr *from,
- socklen_t * fromlen, struct sctp_sndrcvinfo *sinfo,
- int *msg_flags)
-{
- int error;
- struct iovec iov;
- struct msghdr inmsg;
- char incmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg = NULL;
-
- memset(&inmsg, 0, sizeof(inmsg));
-
- iov.iov_base = msg;
- iov.iov_len = len;
-
- inmsg.msg_name = from;
- inmsg.msg_namelen = fromlen ? *fromlen : 0;
- inmsg.msg_iov = &iov;
- inmsg.msg_iovlen = 1;
- inmsg.msg_control = incmsg;
- inmsg.msg_controllen = sizeof(incmsg);
-
- error = recvmsg(s, &inmsg, 0);
- if (error < 0)
- return error;
-
- if (fromlen)
- *fromlen = inmsg.msg_namelen;
- if (msg_flags)
- *msg_flags = inmsg.msg_flags;
-
- if (!sinfo)
- return error;
-
- for (cmsg = CMSG_FIRSTHDR(&inmsg); cmsg != NULL;
- cmsg = CMSG_NXTHDR(&inmsg, cmsg)) {
- if ((IPPROTO_SCTP == cmsg->cmsg_level) &&
- (SCTP_SNDRCV == cmsg->cmsg_type))
- break;
- }
-
- /* Copy sinfo. */
- if (cmsg)
- memcpy(sinfo, CMSG_DATA(cmsg), sizeof(struct sctp_sndrcvinfo));
-
- return (error);
-}
diff --git a/testcases/network/sctp/lib/sendmsg.c b/testcases/network/sctp/lib/sendmsg.c
deleted file mode 100644
index 82d98f595..000000000
--- a/testcases/network/sctp/lib/sendmsg.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/* SCTP kernel reference Implementation: User API extensions.
- *
- * sendmsg.c
- *
- * Distributed under the terms of the LGPL v2.1 as described in
- * http://www.gnu.org/copyleft/lesser.txt
- *
- * This file is part of the user library that offers support for the
- * SCTP kernel reference Implementation. The main purpose of this
- * code is to provide the SCTP Socket API mappings for user
- * application to interface with the SCTP in kernel.
- *
- * This implementation is based on the Socket API Extensions for SCTP
- * defined in <draft-ietf-tsvwg-sctpsocket-10.txt>
- *
- * Copyright (c) 2003 Intel Corp.
- *
- * Written or modified by:
- * Ardelle Fan <ardelle.fan@intel.com>
- */
-
-#include <string.h>
-#include <sys/socket.h> /* struct sockaddr_storage, setsockopt() */
-#include <netinet/sctp.h>
-
-/* This library function assists the user with the advanced features
- * of SCTP. This is a new SCTP API described in the section 8.7 of the
- * Sockets API Extensions for SCTP. This is implemented using the
- * sendmsg() interface.
- */
-int
-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)
-{
- struct msghdr outmsg;
- struct iovec iov;
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
- struct sctp_sndrcvinfo *sinfo;
-
- outmsg.msg_name = to;
- outmsg.msg_namelen = tolen;
- outmsg.msg_iov = &iov;
- iov.iov_base = (void *)msg;
- iov.iov_len = len;
- outmsg.msg_iovlen = 1;
-
- outmsg.msg_control = outcmsg;
- outmsg.msg_controllen = sizeof(outcmsg);
- outmsg.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmsg);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
-
- outmsg.msg_controllen = cmsg->cmsg_len;
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
- memset(sinfo, 0, sizeof(struct sctp_sndrcvinfo));
- sinfo->sinfo_ppid = ppid;
- sinfo->sinfo_flags = flags;
- sinfo->sinfo_stream = stream_no;
- sinfo->sinfo_timetolive = timetolive;
- sinfo->sinfo_context = context;
-
- return sendmsg(s, &outmsg, 0);
-}
-
-/* This library function assist the user with sending a message without
- * dealing directly with the CMSG header.
- */
-int
-sctp_send(int s, const void *msg, size_t len,
- const struct sctp_sndrcvinfo *sinfo, int flags)
-{
- struct msghdr outmsg;
- struct iovec iov;
-
- outmsg.msg_name = NULL;
- outmsg.msg_namelen = 0;
- outmsg.msg_iov = &iov;
- iov.iov_base = (void *)msg;
- iov.iov_len = len;
- outmsg.msg_iovlen = 1;
- outmsg.msg_controllen = 0;
-
- if (sinfo) {
- char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
- struct cmsghdr *cmsg;
-
- outmsg.msg_control = outcmsg;
- outmsg.msg_controllen = sizeof(outcmsg);
- outmsg.msg_flags = 0;
-
- cmsg = CMSG_FIRSTHDR(&outmsg);
- cmsg->cmsg_level = IPPROTO_SCTP;
- cmsg->cmsg_type = SCTP_SNDRCV;
- cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
-
- outmsg.msg_controllen = cmsg->cmsg_len;
- memcpy(CMSG_DATA(cmsg), sinfo, sizeof(struct sctp_sndrcvinfo));
- }
-
- return sendmsg(s, &outmsg, flags);
-}
diff --git a/testcases/network/sctp/testlib/Makefile b/testcases/network/sctp/testlib/Makefile
deleted file mode 100644
index 2cd356445..000000000
--- a/testcases/network/sctp/testlib/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# testcases/network/sctp/testlib Makefile.
-#
-# Copyright (C) 2009, Cisco Systems Inc.
-#
-# This program 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 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Garrett Cooper, July 2009
-#
-
-top_srcdir ?= ../../../..
-
-include $(top_srcdir)/include/mk/env_pre.mk
-
-CPPFLAGS += -DLTP -I$(abs_srcdir)/../include
-
-LDLIBS += -lltp -lsctp
-
-LIB := libsctputil.a
-
-#
-#DEPLIBDIR := ../lib
-
-include $(top_srcdir)/include/mk/lib.mk
-
-#$(MAKE_TARGETS): | libsctp.a
-
-#$()/libsctp.a:
-# $(MAKE) -C $(builddir)/../lib all
diff --git a/testcases/network/sctp/testlib/sctputil.c b/testcases/network/sctp/testlib/sctputil.c
deleted file mode 100644
index 26c9203ca..000000000
--- a/testcases/network/sctp/testlib/sctputil.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/* SCTP kernel reference Implementation
- * (C) Copyright IBM Corp. 2001, 2003
- * Copyright (C) 1999 Cisco
- * Copyright (C) 1999-2000 Motorola
- # Copyright (C) 2001 Nokia
- * Copyright (C) 2001 La Monte H.P. Yarroll
- *
- * The SCTP reference 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 reference 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>
- * Narasimha Budihal <narsi@refcode.org>
- * Karl Knutson <karl@athena.chicago.il.us>
- * Jon Grimm <jgrimm@us.ibm.com>
- * Daisy Chang <daisyc@us.ibm.com>
- * Sridhar Samudrala <sri@us.ibm.com>
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <netinet/in.h>
-#include <stdlib.h>
-#include "netinet/sctp.h"
-#include "sctputil.h"
-
-/* This function prints the cmsg data. */
-void test_print_cmsg(sctp_cmsg_t type, sctp_cmsg_data_t * data)
-{
- switch (type) {
- case SCTP_INIT:
- printf("INIT\n");
- printf(" sinit_num_ostreams %d\n",
- data->init.sinit_num_ostreams);
- printf(" sinit_max_instreams %d\n",
- data->init.sinit_max_instreams);
- printf(" sinit_max_attempts %d\n",
- data->init.sinit_max_attempts);
- printf(" sinit_max_init_timeo %d\n",
- data->init.sinit_max_init_timeo);
-
- break;
- case SCTP_SNDRCV:
- printf("SNDRCV\n");
- printf(" sinfo_stream %u\n", data->sndrcv.sinfo_stream);
- printf(" sinfo_ssn %u\n", data->sndrcv.sinfo_ssn);
- printf(" sinfo_flags 0x%x\n", data->sndrcv.sinfo_flags);
- printf(" sinfo_ppid %u\n", data->sndrcv.sinfo_ppid);
- printf(" sinfo_context %x\n", data->sndrcv.sinfo_context);
- printf(" sinfo_tsn %u\n", data->sndrcv.sinfo_tsn);
- printf(" sinfo_cumtsn %u\n", data->sndrcv.sinfo_cumtsn);
- printf(" sinfo_assoc_id %u\n", data->sndrcv.sinfo_assoc_id);
-
- break;
-
- default:
- printf("UNKNOWN CMSG: %d\n", type);
- break;
- }
-}
-
-/* This function prints the message. */
-void test_print_message(int sk, struct msghdr *msg, size_t msg_len)
-{
- sctp_cmsg_data_t *data;
- struct cmsghdr *cmsg;
- int i;
- int done = 0;
- char save;
- union sctp_notification *sn;
-
- for (cmsg = CMSG_FIRSTHDR(msg);
- cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) {
- data = (sctp_cmsg_data_t *) CMSG_DATA(cmsg);
- test_print_cmsg(cmsg->cmsg_type, data);
- }
-
- if (!(MSG_NOTIFICATION & msg->msg_flags)) {
- int index = 0;
- /* Make sure that everything is printable and that we
- * are NUL terminated...
- */
- printf("DATA(%zi): ", msg_len);
- while (msg_len > 0) {
- char *text;
- int len;
-
- text = msg->msg_iov[index].iov_base;
- len = msg->msg_iov[index].iov_len;
-
- save = text[msg_len - 1];
- if (len > msg_len) {
- text[(len = msg_len) - 1] = '\0';
- }
-
- if ((msg_len -= len) > 0) {
- index++;
- }
-
- for (i = 0; i < len - 1; ++i) {
- if (!isprint(text[i]))
- text[i] = '.';
- }
-
- printf("%s", text);
- text[msg_len - 1] = save;
-
- if ((done = !strcmp(text, "exit"))) {
- break;
- }
- }
- } else {
- printf("NOTIFICATION: ");
- sn = (union sctp_notification *)msg->msg_iov[0].iov_base;
- switch (sn->sn_header.sn_type) {
- case SCTP_ASSOC_CHANGE:
- switch (sn->sn_assoc_change.sac_state) {
- case SCTP_COMM_UP:
- printf("ASSOC_CHANGE - COMM_UP");
- break;
- case SCTP_COMM_LOST:
- printf("ASSOC_CHANGE - COMM_LOST");
- break;
- case SCTP_RESTART:
- printf("ASSOC_CHANGE - RESTART");
- break;
- case SCTP_SHUTDOWN_COMP:
- printf("ASSOC_CHANGE - SHUTDOWN_COMP");
- break;
- case SCTP_CANT_STR_ASSOC:
- printf("ASSOC_CHANGE - CANT_STR_ASSOC");
- break;
- default:
- printf("ASSOC_CHANGE - UNEXPECTED(%d)",
- sn->sn_assoc_change.sac_state);
- break;
- }
- break;
- default:
- printf("%d", sn->sn_header.sn_type);
- break;
- }
- }
-
- printf("\n");
-}
-
-/* Check if a buf/msg_flags matches a notification, its type, and possibly an
- * additional field in the corresponding notification structure.
- */
-void
-test_check_buf_notification(void *buf, int datalen, int msg_flags,
- int expected_datalen, uint16_t expected_sn_type,
- uint32_t expected_additional)
-{
- union sctp_notification *sn;
-
- if (!(msg_flags & MSG_NOTIFICATION))
- tst_brkm(TBROK, NULL, "Got a datamsg, expecting notification");
-
- if (expected_datalen <= 0)
- return;
-
- if (datalen != expected_datalen)
- tst_brkm(TBROK, NULL, "Got a notification of unexpected "
- "length (%d); expected length was %d", datalen,
- expected_datalen);
-
- sn = (union sctp_notification *)buf;
- if (sn->sn_header.sn_type != expected_sn_type)
- tst_brkm(TBROK, NULL, "Unexpected notification:%d "
- "expected:%d", sn->sn_header.sn_type,
- expected_sn_type);
-
- switch (sn->sn_header.sn_type) {
- case SCTP_ASSOC_CHANGE:
- if (sn->sn_assoc_change.sac_state != expected_additional)
- tst_brkm(TBROK, NULL, "Unexpected sac_state:%d "
- "expected:%d", sn->sn_assoc_change.sac_state,
- expected_additional);
- break;
- default:
- break;
- }
-}
-
-/* Check if a message matches a notification, its type, and possibly an
- * additional field in the corresponding notification structure.
- */
-void
-test_check_msg_notification(struct msghdr *msg, int datalen,
- int expected_datalen, uint16_t expected_sn_type,
- uint32_t expected_additional)
-{
- test_check_buf_notification(msg->msg_iov[0].iov_base, datalen,
- msg->msg_flags, expected_datalen,
- expected_sn_type, expected_additional);
-}
-
-/* Check if a buf/msg_flags/sinfo corresponds to data, its length, msg_flags,
- * stream and ppid.
- */
-void
-test_check_buf_data(void *buf, int datalen, int msg_flags,
- struct sctp_sndrcvinfo *sinfo, int expected_datalen,
- int expected_msg_flags, uint16_t expected_stream,
- uint32_t expected_ppid)
-{
- if (msg_flags & MSG_NOTIFICATION)
- tst_brkm(TBROK, NULL, "Got a notification, expecting a"
- "datamsg");
-
- if (expected_datalen <= 0)
- return;
-
- if (datalen != expected_datalen)
- tst_brkm(TBROK, NULL, "Got a datamsg of unexpected "
- "length:%d, expected length:%d", datalen,
- expected_datalen);
-
- if ((msg_flags & ~0x80000000) != expected_msg_flags)
- tst_brkm(TBROK, NULL, "Unexpected msg_flags:0x%x "
- "expecting:0x%x", msg_flags, expected_msg_flags);
-
- if ((0 == expected_stream) && (0 == expected_ppid))
- return;
-
- if (!sinfo)
- tst_brkm(TBROK, NULL, "Null sinfo, but expected "
- "stream:%d expected ppid:%d", expected_stream,
- expected_ppid);
-
- if (sinfo->sinfo_stream != expected_stream)
- tst_brkm(TBROK, NULL, "stream mismatch: expected:%x "
- "got:%x", expected_stream, sinfo->sinfo_stream);
- if (sinfo->sinfo_ppid != expected_ppid)
- tst_brkm(TBROK, NULL, "ppid mismatch: expected:%x "
- "got:%x\n", expected_ppid, sinfo->sinfo_ppid);
-}
-
-/* Check if a message corresponds to data, its length, msg_flags, stream and
- * ppid.
- */
-void
-test_check_msg_data(struct msghdr *msg, int datalen, int expected_datalen,
- int expected_msg_flags, uint16_t expected_stream,
- uint32_t expected_ppid)
-{
- struct cmsghdr *cmsg = NULL;
- struct sctp_sndrcvinfo *sinfo = NULL;
-
- /* Receive auxiliary data in msgh. */
- for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL;
- cmsg = CMSG_NXTHDR(msg, cmsg)) {
- if (IPPROTO_SCTP == cmsg->cmsg_level &&
- SCTP_SNDRCV == cmsg->cmsg_type)
- break;
- } /* for (all cmsgs) */
-
- if ((!cmsg) ||
- (cmsg->cmsg_len < CMSG_LEN(sizeof(struct sctp_sndrcvinfo))))
- sinfo = NULL;
- else
- sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
-
- test_check_buf_data(msg->msg_iov[0].iov_base, datalen, msg->msg_flags,
- sinfo, expected_datalen, expected_msg_flags,
- expected_stream, expected_ppid);
-
-}
-
-/* Allocate a buffer of requested len and fill in with data. */
-void *test_build_msg(int len)
-{
- int i = len - 1;
- int n;
- unsigned char msg[] =
- "012345678901234567890123456789012345678901234567890";
- char *msg_buf, *p;
-
- msg_buf = (char *)malloc(len);
- if (!msg_buf)
- tst_brkm(TBROK, NULL, "malloc failed");
-
- p = msg_buf;
-
- do {
- n = ((i > 50) ? 50 : i);
- memcpy(p, msg, ((i > 50) ? 50 : i));
- p += n;
- i -= n;
- } while (i > 0);
-
- msg_buf[len - 1] = '\0';
-
- return (msg_buf);
-}
-
-/* Enable ASSOC_CHANGE and SNDRCVINFO notifications. */
-void test_enable_assoc_change(int fd)
-{
- struct sctp_event_subscribe subscribe;
-
- memset(&subscribe, 0, sizeof(subscribe));
- subscribe.sctp_data_io_event = 1;
- subscribe.sctp_association_event = 1;
- test_setsockopt(fd, SCTP_EVENTS, (char *)&subscribe, sizeof(subscribe));
-}
-
-static int cmp_addr(sockaddr_storage_t * addr1, sockaddr_storage_t * addr2)
-{
- if (addr1->sa.sa_family != addr2->sa.sa_family)
- return 0;
- switch (addr1->sa.sa_family) {
- case AF_INET6:
- if (addr1->v6.sin6_port != addr2->v6.sin6_port)
- return -1;
- return memcmp(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr,
- sizeof(addr1->v6.sin6_addr));
- case AF_INET:
- if (addr1->v4.sin_port != addr2->v4.sin_port)
- return 0;
- return memcmp(&addr1->v4.sin_addr, &addr2->v4.sin_addr,
- sizeof(addr1->v4.sin_addr));
- default:
- tst_brkm(TBROK, NULL, "invalid address type %d",
- addr1->sa.sa_family);
- return -1;
- }
-}
-
-/* Test peer addresses for association. */
-int test_peer_addr(int sk, sctp_assoc_t asoc, sockaddr_storage_t * peers,
- int count)
-{
- struct sockaddr *addrs;
- int error, i, j;
- struct sockaddr *sa_addr;
- socklen_t addrs_size = 0;
- void *addrbuf;
- char *found = (char *)malloc(count);
- memset(found, 0, count);
-
- error = sctp_getpaddrs(sk, asoc, &addrs);
- if (-1 == error) {
- tst_brkm(TBROK, NULL, "sctp_getpaddrs: %s", strerror(errno));
- return error;
- }
- if (error != count) {
- sctp_freepaddrs(addrs);
- tst_brkm(TBROK, NULL, "peer count %d mismatch, expected %d",
- error, count);
- }
- addrbuf = addrs;
- for (i = 0; i < count; i++) {
- sa_addr = (struct sockaddr *)addrbuf;
- switch (sa_addr->sa_family) {
- case AF_INET:
- addrs_size += sizeof(struct sockaddr_in);
- addrbuf += sizeof(struct sockaddr_in);
- break;
- case AF_INET6:
- addrs_size += sizeof(struct sockaddr_in6);
- addrbuf += sizeof(struct sockaddr_in6);
- break;
- default:
- errno = EINVAL;
- sctp_freepaddrs(addrs);
- tst_brkm(TBROK, NULL, "sctp_getpaddrs: %s",
- strerror(errno));
- return -1;
- }
- for (j = 0; j < count; j++) {
- if (cmp_addr((sockaddr_storage_t *) sa_addr,
- &peers[j]) == 0) {
- found[j] = 1;
- }
- }
- }
- for (j = 0; j < count; j++) {
- if (found[j] == 0) {
- tst_brkm(TBROK, NULL, "peer address %d not found", j);
- }
- }
- sctp_freepaddrs(addrs);
- return 0;
-}
diff --git a/testcases/network/sctp/testlib/sctputil.h b/testcases/network/sctp/testlib/sctputil.h
deleted file mode 100644
index 417855241..000000000
--- a/testcases/network/sctp/testlib/sctputil.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/* SCTP kernel reference 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 reference 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 reference 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, NULL, "socket: %s", strerror(errno));
- return sk;
-}
-
-static inline int test_bind(int sk, struct sockaddr *addr, socklen_t addrlen)
-{
- int error;
- int true_const=1;
-
- setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &true_const, sizeof(int));
- error = bind(sk, addr, addrlen);
- if (-1 == error)
- tst_brkm(TBROK, NULL, "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, NULL, "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, NULL, "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, NULL, "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);
- if (-1 == error)
- tst_brkm(TBROK, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "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, NULL, "sctp_send: error:%d errno:%d",
- error, errno);
- return error;
-}
-
-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, NULL, "sctp_recvmsg: %s", strerror(errno));
- return error;
-}
-
-static inline void *test_malloc(size_t size)
-{
- void *buf = malloc(size);
- if (NULL == buf)
- tst_brkm(TBROK, NULL, "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__ */