16f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu/* SCTP kernel Implementation
25ba96af16cf74736f632baec4672dda40c441682mridge * Copyright (c) 2003 Hewlett-Packard Development Company, L.P
35ba96af16cf74736f632baec4672dda40c441682mridge * (C) Copyright IBM Corp. 2004
45ba96af16cf74736f632baec4672dda40c441682mridge *
55ba96af16cf74736f632baec4672dda40c441682mridge * This file has test cases to test the socket (), bind () and listen () for
65ba96af16cf74736f632baec4672dda40c441682mridge * 1-1 style sockets
75ba96af16cf74736f632baec4672dda40c441682mridge *
85ba96af16cf74736f632baec4672dda40c441682mridge * socket () Tests:
95ba96af16cf74736f632baec4672dda40c441682mridge * ---------------
105ba96af16cf74736f632baec4672dda40c441682mridge * TEST1: Invalid domain
115ba96af16cf74736f632baec4672dda40c441682mridge * TEST2: Invalid type
125ba96af16cf74736f632baec4672dda40c441682mridge * TEST3: Opening a TCP style socket
135ba96af16cf74736f632baec4672dda40c441682mridge *
145ba96af16cf74736f632baec4672dda40c441682mridge * bind () Tests:
155ba96af16cf74736f632baec4672dda40c441682mridge * -------------
165ba96af16cf74736f632baec4672dda40c441682mridge * TEST4: Invalid address
175ba96af16cf74736f632baec4672dda40c441682mridge * TEST5: Invalid address length
185ba96af16cf74736f632baec4672dda40c441682mridge * TEST6: Invalid socket descriptor
195ba96af16cf74736f632baec4672dda40c441682mridge * TEST7: Invalid host name
205ba96af16cf74736f632baec4672dda40c441682mridge * TEST8: On a socket that is already bound
215ba96af16cf74736f632baec4672dda40c441682mridge * TEST9: On reserved ports
225ba96af16cf74736f632baec4672dda40c441682mridge * TEST10: INADDR_ANY address and non-zero port
235ba96af16cf74736f632baec4672dda40c441682mridge * TEST11: INADDR_ANY address and zero port
245ba96af16cf74736f632baec4672dda40c441682mridge * TEST12: Local address and zero port
256f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu *
265ba96af16cf74736f632baec4672dda40c441682mridge * listen () Tests:
275ba96af16cf74736f632baec4672dda40c441682mridge * ---------------
285ba96af16cf74736f632baec4672dda40c441682mridge * TEST13: Bad socket descriptor
295ba96af16cf74736f632baec4672dda40c441682mridge * TEST14: Invalid socket
305ba96af16cf74736f632baec4672dda40c441682mridge * TEST15: Listening a bound socket
316f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu *
326f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is free software;
335ba96af16cf74736f632baec4672dda40c441682mridge * you can redistribute it and/or modify it under the terms of
345ba96af16cf74736f632baec4672dda40c441682mridge * the GNU General Public License as published by
355ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation; either version 2, or (at your option)
365ba96af16cf74736f632baec4672dda40c441682mridge * any later version.
375ba96af16cf74736f632baec4672dda40c441682mridge *
386f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is distributed in the hope that it
395ba96af16cf74736f632baec4672dda40c441682mridge * will be useful, but WITHOUT ANY WARRANTY; without even the implied
405ba96af16cf74736f632baec4672dda40c441682mridge *                 ************************
415ba96af16cf74736f632baec4672dda40c441682mridge * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
425ba96af16cf74736f632baec4672dda40c441682mridge * See the GNU General Public License for more details.
435ba96af16cf74736f632baec4672dda40c441682mridge *
445ba96af16cf74736f632baec4672dda40c441682mridge * You should have received a copy of the GNU General Public License
455ba96af16cf74736f632baec4672dda40c441682mridge * along with GNU CC; see the file COPYING.  If not, write to
465ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation, 59 Temple Place - Suite 330,
475ba96af16cf74736f632baec4672dda40c441682mridge * Boston, MA 02111-1307, USA.
485ba96af16cf74736f632baec4672dda40c441682mridge *
495ba96af16cf74736f632baec4672dda40c441682mridge * Please send any bug reports or fixes you make to the
505ba96af16cf74736f632baec4672dda40c441682mridge * email address(es):
515ba96af16cf74736f632baec4672dda40c441682mridge *    lksctp developers <lksctp-developers@lists.sourceforge.net>
525ba96af16cf74736f632baec4672dda40c441682mridge *
535ba96af16cf74736f632baec4672dda40c441682mridge * Or submit a bug report through the following website:
545ba96af16cf74736f632baec4672dda40c441682mridge *    http://www.sf.net/projects/lksctp
555ba96af16cf74736f632baec4672dda40c441682mridge *
565ba96af16cf74736f632baec4672dda40c441682mridge * Any bugs reported given to us we will try to fix... any fixes shared will
575ba96af16cf74736f632baec4672dda40c441682mridge * be incorporated into the next SCTP release.
585ba96af16cf74736f632baec4672dda40c441682mridge *
595ba96af16cf74736f632baec4672dda40c441682mridge */
605ba96af16cf74736f632baec4672dda40c441682mridge
615ba96af16cf74736f632baec4672dda40c441682mridge#include <stdio.h>
625ba96af16cf74736f632baec4672dda40c441682mridge#include <unistd.h>
635ba96af16cf74736f632baec4672dda40c441682mridge#include <fcntl.h>
645ba96af16cf74736f632baec4672dda40c441682mridge#include <stdlib.h>
655ba96af16cf74736f632baec4672dda40c441682mridge#include <string.h>
665ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/types.h>
675ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/socket.h>
686f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu#include <netinet/in.h>         /* for sockaddr_in */
695ba96af16cf74736f632baec4672dda40c441682mridge#include <arpa/inet.h>
705ba96af16cf74736f632baec4672dda40c441682mridge#include <errno.h>
715ba96af16cf74736f632baec4672dda40c441682mridge#include <netinet/sctp.h>
725ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/uio.h>
735ba96af16cf74736f632baec4672dda40c441682mridge#include <sctputil.h>
745ba96af16cf74736f632baec4672dda40c441682mridge
755ba96af16cf74736f632baec4672dda40c441682mridge#define SCTP_RESERVED_PORT 7
765ba96af16cf74736f632baec4672dda40c441682mridge#define SCTP_INV_LOOPBACK "172.31.43.112"
775ba96af16cf74736f632baec4672dda40c441682mridge
785ba96af16cf74736f632baec4672dda40c441682mridgechar *TCID = __FILE__;
795ba96af16cf74736f632baec4672dda40c441682mridgeint TST_TOTAL = 15;
805ba96af16cf74736f632baec4672dda40c441682mridgeint TST_CNT = 0;
815ba96af16cf74736f632baec4672dda40c441682mridge
826f22494d19b605ded308dc0fa713e91cb873f44aSimon Xuint
836f22494d19b605ded308dc0fa713e91cb873f44aSimon Xumain(int argc, char *argv[])
845ba96af16cf74736f632baec4672dda40c441682mridge{
856f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        int sk,pf_class;
8664a341fc42c967890a9fb5d8855568e23104bef6mridge	int error = 0;
875ba96af16cf74736f632baec4672dda40c441682mridge	int uid;
888c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	int fd, err_no = 0;
898c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	char filename[21];
905ba96af16cf74736f632baec4672dda40c441682mridge
916f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        struct sockaddr_in bind_addr;
925ba96af16cf74736f632baec4672dda40c441682mridge
935ba96af16cf74736f632baec4672dda40c441682mridge	/* Rather than fflush() throughout the code, set stdout to
946f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu         * be unbuffered.
956f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu         */
966f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        setvbuf(stdout, NULL, _IONBF, 0);
976f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        setvbuf(stderr, NULL, _IONBF, 0);
985ba96af16cf74736f632baec4672dda40c441682mridge
996f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        pf_class = PF_INET;
1005ba96af16cf74736f632baec4672dda40c441682mridge
1016f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        /* socket() TEST1: Invalid domain, EAFNOSUPPORT Expected error */
1026f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        sk = socket(-1, SOCK_STREAM, IPPROTO_SCTP);
1036f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (sk != -1 || errno != EAFNOSUPPORT)
1046f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "socket() with invalid domain "
1056f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu                         "error:%d, errno:%d", error, errno);
1065ba96af16cf74736f632baec4672dda40c441682mridge
1075ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "socket() with invalid domain - EAFNOSUPPORT");
1085ba96af16cf74736f632baec4672dda40c441682mridge
1096f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*socket() TEST2 : Invalid type, EINVAL Expected error*/
1106f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        sk = socket(pf_class, -1, IPPROTO_SCTP);
1116f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (sk != -1 || errno != EINVAL)
1126f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "socket() with invalid type "
1136f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu                         "error:%d, errno:%d", error, errno);
1145ba96af16cf74736f632baec4672dda40c441682mridge
1155ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "socket() with invalid type - EINVAL");
1165ba96af16cf74736f632baec4672dda40c441682mridge
1176f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*socket() TEST3: opening a socket*/
1186f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
1196f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (sk < 0)
1206f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "valid socket() call "
1216f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu                         "error:%d, errno:%d", error, errno);
1225ba96af16cf74736f632baec4672dda40c441682mridge
1235ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "socket() - SUCCESS");
1245ba96af16cf74736f632baec4672dda40c441682mridge
1255ba96af16cf74736f632baec4672dda40c441682mridge	/*bind() TEST4: Invalid structure, EFAULT Expected error */
1266f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        error = bind(sk, (struct sockaddr *)-1, sizeof(struct sockaddr_in));
1276f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (error != -1 || errno != EFAULT)
1286f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with invalid address ptr "
1296f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu                         "error:%d, errno:%d", error, errno);
1305ba96af16cf74736f632baec4672dda40c441682mridge
1315ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with invalid address ptr - EFAULT");
1325ba96af16cf74736f632baec4672dda40c441682mridge
1336f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST5: Invalid address length, EINVAL Expect error*/
1345ba96af16cf74736f632baec4672dda40c441682mridge	bind_addr.sin_family = AF_INET;
1356f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
1366f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_port = htons(SCTP_TESTPORT_1);
1375ba96af16cf74736f632baec4672dda40c441682mridge
1386f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr)-2);
1396f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (error != -1 || errno != EINVAL)
1406f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with invalid address length "
1416f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu                         "error:%d, errno:%d", error, errno);
1425ba96af16cf74736f632baec4672dda40c441682mridge
1435ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with invalid address length - EINVAL");
1445ba96af16cf74736f632baec4672dda40c441682mridge
1456f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST6: Invalid socket descriptor, ENOTSOCK Expect Error*/
1468c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	strcpy(filename, "/tmp/sctptest.XXXXXX");
1478c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	fd = mkstemp(filename);
1488c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (fd == -1)
1498c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu		tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s",
1508c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu				filename, strerror(errno));
1518c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	error = bind(fd, (struct sockaddr *) &bind_addr, sizeof(bind_addr));
1528c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (error == -1)
1538c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu		err_no = errno;
1548c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	close(fd);
1558c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	unlink(filename);
1568c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (error != -1 || err_no != ENOTSOCK)
1576f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with invalid socket "
1588c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu			 "descriptor error:%d, errno:%d", error, err_no);
1595ba96af16cf74736f632baec4672dda40c441682mridge
1605ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with invalid socket descriptor - ENOTSOCK");
1615ba96af16cf74736f632baec4672dda40c441682mridge
1626f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST7: Invalid host name, EADDRNOTAVAIL Expect Error*/
1636f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Assigning invalid host name*/
1645ba96af16cf74736f632baec4672dda40c441682mridge	bind_addr.sin_addr.s_addr = inet_addr(SCTP_INV_LOOPBACK);
1656f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr));
1666f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        if (error != -1 || errno != EADDRNOTAVAIL)
1676f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with invalid local "
1685ba96af16cf74736f632baec4672dda40c441682mridge			 "address error:%d, errno:%d", error, errno);
1695ba96af16cf74736f632baec4672dda40c441682mridge
1705ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with invalid local address - EADDRNOTAVAIL");
1715ba96af16cf74736f632baec4672dda40c441682mridge
1725ba96af16cf74736f632baec4672dda40c441682mridge	/*bind() TEST8: Bind on a socket that has already called bind
1736f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	EINAVL, Expected error*/
1745ba96af16cf74736f632baec4672dda40c441682mridge	bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
1756f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Calling bind first time, it should pass*/
1766f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	test_bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr));
1775ba96af16cf74736f632baec4672dda40c441682mridge
1786f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr));
1795ba96af16cf74736f632baec4672dda40c441682mridge	if (error != -1 || errno != EINVAL)
1806f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() on an already bound socket "
1815ba96af16cf74736f632baec4672dda40c441682mridge			 "error:%d, errno:%d", error, errno);
1825ba96af16cf74736f632baec4672dda40c441682mridge
1835ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() on an already bound socket - EINVAL");
1845ba96af16cf74736f632baec4672dda40c441682mridge
1855ba96af16cf74736f632baec4672dda40c441682mridge	/*Closing the socket which succeed in bind() */
1865ba96af16cf74736f632baec4672dda40c441682mridge	close(sk);
1875ba96af16cf74736f632baec4672dda40c441682mridge
1886f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Opening the socket again for further test*/
1895ba96af16cf74736f632baec4672dda40c441682mridge	sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
1905ba96af16cf74736f632baec4672dda40c441682mridge
1916f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST9: Bind on reserved ports EACCES, Expected error*/
1926f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Assigning a reserved port*/
1935ba96af16cf74736f632baec4672dda40c441682mridge	uid = getuid();
1945ba96af16cf74736f632baec4672dda40c441682mridge	if (uid != 0) {
1956f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		bind_addr.sin_port = htons(SCTP_RESERVED_PORT);
1966f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		error = bind(sk, (struct sockaddr *) &bind_addr,
1975ba96af16cf74736f632baec4672dda40c441682mridge			     sizeof(bind_addr));
1985ba96af16cf74736f632baec4672dda40c441682mridge		if (error != -1 || errno != EACCES)
1996f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu			tst_brkm(TBROK, tst_exit, "bind() on reserverd port "
2006f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu			 "error:%d, errno:%d", error, errno);
2015ba96af16cf74736f632baec4672dda40c441682mridge
2025ba96af16cf74736f632baec4672dda40c441682mridge		tst_resm(TPASS, "bind() on reserved port - EACCESS");
2035ba96af16cf74736f632baec4672dda40c441682mridge	}
2045ba96af16cf74736f632baec4672dda40c441682mridge
2056f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST10: INADDR_ANY address and non-zero port, bind() should
2066f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	succeed*/
2075ba96af16cf74736f632baec4672dda40c441682mridge	bind_addr.sin_addr.s_addr = INADDR_ANY;
2086f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_port = htons(SCTP_TESTPORT_1);
2096f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr));
2106f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	if ( error < 0 )
2116f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with INADDR_ANY address and "
2125ba96af16cf74736f632baec4672dda40c441682mridge			 "non-zero port error:%d, errno:%d", error, errno);
2135ba96af16cf74736f632baec4672dda40c441682mridge
2145ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with INADDR_ANY address and non-zero port - "
2155ba96af16cf74736f632baec4672dda40c441682mridge		 "SUCCESS");
2166f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu
2175ba96af16cf74736f632baec4672dda40c441682mridge	/*Closing the socket which succeed in bind() */
2185ba96af16cf74736f632baec4672dda40c441682mridge	close(sk);
2195ba96af16cf74736f632baec4672dda40c441682mridge
2206f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Opening the socket again for further test*/
2215ba96af16cf74736f632baec4672dda40c441682mridge	sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
2225ba96af16cf74736f632baec4672dda40c441682mridge
2236f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST11: INADDR_ANY address and zero port, bind() should
2246f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	succeed*/
2256f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_port = 0;
2266f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr));
2276f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	if ( error < 0 )
2286f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with INADDR_ANY address and "
2295ba96af16cf74736f632baec4672dda40c441682mridge			 "zero port error:%d, errno:%d", error, errno);
2305ba96af16cf74736f632baec4672dda40c441682mridge
2315ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "bind() with INADDR_ANY address and zero port - "
2325ba96af16cf74736f632baec4672dda40c441682mridge		 "SUCCESS");
2335ba96af16cf74736f632baec4672dda40c441682mridge
2345ba96af16cf74736f632baec4672dda40c441682mridge	/*Closing the socket which succeed in bind() */
2355ba96af16cf74736f632baec4672dda40c441682mridge	close(sk);
2365ba96af16cf74736f632baec4672dda40c441682mridge
2376f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*Opening the socket again for further test*/
2385ba96af16cf74736f632baec4672dda40c441682mridge	sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
2395ba96af16cf74736f632baec4672dda40c441682mridge
2406f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*bind() TEST12: local address and zero port, bind() should
2416f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	succeed*/
2426f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
2436f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu        bind_addr.sin_port = 0;
2446f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr));
2456f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	if ( error < 0 )
2466f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "bind() with local address and "
2475ba96af16cf74736f632baec4672dda40c441682mridge			 "zero port error:%d, errno:%d", error, errno);
2485ba96af16cf74736f632baec4672dda40c441682mridge
2496f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	tst_resm(TPASS, "bind() with local address and zero port - "
2506f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		 "SUCCESS");
2515ba96af16cf74736f632baec4672dda40c441682mridge
2526f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*listen() TEST13: Bad socket descriptor EBADF, Expected error*/
2535ba96af16cf74736f632baec4672dda40c441682mridge	error = listen(-1, 3);
2545ba96af16cf74736f632baec4672dda40c441682mridge	if (error != -1 || errno != EBADF)
2556f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "listen() with bad socket descriptor "
2565ba96af16cf74736f632baec4672dda40c441682mridge			 "error:%d, errno:%d", error, errno);
2575ba96af16cf74736f632baec4672dda40c441682mridge
2585ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "listen() with bad socket descriptor - EBADF");
2595ba96af16cf74736f632baec4672dda40c441682mridge
2606f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*listen() TEST14: Invalid socket ENOTSOCK, Expected error*/
2618c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	strcpy(filename, "/tmp/sctptest.XXXXXX");
2628c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	fd = mkstemp(filename);
2638c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (fd == -1)
2648c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu		tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s",
2658c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu				filename, strerror(errno));
2668c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	error = listen(fd, 3);
2678c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (error == -1)
2688c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu		err_no = errno;
2698c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	close(fd);
2708c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	unlink(filename);
2718c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu	if (error != -1 || err_no != ENOTSOCK)
2726f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "listen() with invalid socket "
2738c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu			 "error:%d, errno:%d", error, err_no);
2745ba96af16cf74736f632baec4672dda40c441682mridge
2755ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "listen() with invalid socket - ENOTSOCK");
2765ba96af16cf74736f632baec4672dda40c441682mridge
2776f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	/*listen() TEST15:listen on a bound socket, should succeed*/
2785ba96af16cf74736f632baec4672dda40c441682mridge	error = listen(sk, 3);
2796f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	if ( error < 0 )
2806f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu		tst_brkm(TBROK, tst_exit, "listen() on a bound socket "
2815ba96af16cf74736f632baec4672dda40c441682mridge			 "error:%d, errno:%d", error, errno);
2825ba96af16cf74736f632baec4672dda40c441682mridge
2835ba96af16cf74736f632baec4672dda40c441682mridge	tst_resm(TPASS, "listen() on a bound socket - SUCCESS");
2845ba96af16cf74736f632baec4672dda40c441682mridge
2855ba96af16cf74736f632baec4672dda40c441682mridge	close(sk);
2866f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu
2876f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu	return 0;
288ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
289