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