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 sctp_getladdrs (), sctp_freealddrs (), 65ba96af16cf74736f632baec4672dda40c441682mridge * sctp_getpaddrs (), sctp_freeapaddrs () for 1-1 style sockets 75ba96af16cf74736f632baec4672dda40c441682mridge * 85ba96af16cf74736f632baec4672dda40c441682mridge * sctp_getladdrs () Tests: 95ba96af16cf74736f632baec4672dda40c441682mridge * ----------------------- 105ba96af16cf74736f632baec4672dda40c441682mridge * TEST1: Bad socket descriptor 115ba96af16cf74736f632baec4672dda40c441682mridge * TEST2: Invalid socket 125ba96af16cf74736f632baec4672dda40c441682mridge * TEST3: Socket of different protocol 135ba96af16cf74736f632baec4672dda40c441682mridge * TEST4: Getting the local addresses 145ba96af16cf74736f632baec4672dda40c441682mridge * 155ba96af16cf74736f632baec4672dda40c441682mridge * sctp_freealddrs () Tests: 165ba96af16cf74736f632baec4672dda40c441682mridge * ------------------------ 175ba96af16cf74736f632baec4672dda40c441682mridge * TEST5: Freeing the local address 185ba96af16cf74736f632baec4672dda40c441682mridge * 195ba96af16cf74736f632baec4672dda40c441682mridge * sctp_getpaddrs () Tests: 205ba96af16cf74736f632baec4672dda40c441682mridge * ----------------------- 215ba96af16cf74736f632baec4672dda40c441682mridge * TEST6: Bad socket descriptor 225ba96af16cf74736f632baec4672dda40c441682mridge * TEST7: Invalid socket 235ba96af16cf74736f632baec4672dda40c441682mridge * TEST8: Socket of different protocol 245ba96af16cf74736f632baec4672dda40c441682mridge * TEST9: Getting the peers addresses 255ba96af16cf74736f632baec4672dda40c441682mridge * 265ba96af16cf74736f632baec4672dda40c441682mridge * sctp_freeapddrs () Tests: 275ba96af16cf74736f632baec4672dda40c441682mridge * ------------------------ 285ba96af16cf74736f632baec4672dda40c441682mridge * TEST10: Freeing the peer's address 295ba96af16cf74736f632baec4672dda40c441682mridge * 306f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is free software; 315ba96af16cf74736f632baec4672dda40c441682mridge * you can redistribute it and/or modify it under the terms of 325ba96af16cf74736f632baec4672dda40c441682mridge * the GNU General Public License as published by 335ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation; either version 2, or (at your option) 345ba96af16cf74736f632baec4672dda40c441682mridge * any later version. 355ba96af16cf74736f632baec4672dda40c441682mridge * 366f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * The SCTP implementation is distributed in the hope that it 375ba96af16cf74736f632baec4672dda40c441682mridge * will be useful, but WITHOUT ANY WARRANTY; without even the implied 385ba96af16cf74736f632baec4672dda40c441682mridge * ************************ 395ba96af16cf74736f632baec4672dda40c441682mridge * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 405ba96af16cf74736f632baec4672dda40c441682mridge * See the GNU General Public License for more details. 415ba96af16cf74736f632baec4672dda40c441682mridge * 425ba96af16cf74736f632baec4672dda40c441682mridge * You should have received a copy of the GNU General Public License 435ba96af16cf74736f632baec4672dda40c441682mridge * along with GNU CC; see the file COPYING. If not, write to 445ba96af16cf74736f632baec4672dda40c441682mridge * the Free Software Foundation, 59 Temple Place - Suite 330, 455ba96af16cf74736f632baec4672dda40c441682mridge * Boston, MA 02111-1307, USA. 465ba96af16cf74736f632baec4672dda40c441682mridge * 475ba96af16cf74736f632baec4672dda40c441682mridge * Please send any bug reports or fixes you make to the 485ba96af16cf74736f632baec4672dda40c441682mridge * email address(es): 495ba96af16cf74736f632baec4672dda40c441682mridge * lksctp developers <lksctp-developers@lists.sourceforge.net> 505ba96af16cf74736f632baec4672dda40c441682mridge * 515ba96af16cf74736f632baec4672dda40c441682mridge * Or submit a bug report through the following website: 525ba96af16cf74736f632baec4672dda40c441682mridge * http://www.sf.net/projects/lksctp 535ba96af16cf74736f632baec4672dda40c441682mridge * 545ba96af16cf74736f632baec4672dda40c441682mridge * Any bugs reported given to us we will try to fix... any fixes shared will 555ba96af16cf74736f632baec4672dda40c441682mridge * be incorporated into the next SCTP release. 565ba96af16cf74736f632baec4672dda40c441682mridge * 575ba96af16cf74736f632baec4672dda40c441682mridge */ 585ba96af16cf74736f632baec4672dda40c441682mridge 595ba96af16cf74736f632baec4672dda40c441682mridge#include <stdio.h> 605ba96af16cf74736f632baec4672dda40c441682mridge#include <unistd.h> 615ba96af16cf74736f632baec4672dda40c441682mridge#include <fcntl.h> 625ba96af16cf74736f632baec4672dda40c441682mridge#include <stdlib.h> 635ba96af16cf74736f632baec4672dda40c441682mridge#include <string.h> 645ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/types.h> 655ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/socket.h> 666f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu#include <netinet/in.h> /* for sockaddr_in */ 675ba96af16cf74736f632baec4672dda40c441682mridge#include <arpa/inet.h> 685ba96af16cf74736f632baec4672dda40c441682mridge#include <errno.h> 695ba96af16cf74736f632baec4672dda40c441682mridge#include <netinet/sctp.h> 705ba96af16cf74736f632baec4672dda40c441682mridge#include <sys/uio.h> 715ba96af16cf74736f632baec4672dda40c441682mridge#include <sctputil.h> 725ba96af16cf74736f632baec4672dda40c441682mridge 735ba96af16cf74736f632baec4672dda40c441682mridgechar *TCID = __FILE__; 745ba96af16cf74736f632baec4672dda40c441682mridgeint TST_TOTAL = 10; 755ba96af16cf74736f632baec4672dda40c441682mridgeint TST_CNT = 0; 765ba96af16cf74736f632baec4672dda40c441682mridge 776f22494d19b605ded308dc0fa713e91cb873f44aSimon Xuint 786f22494d19b605ded308dc0fa713e91cb873f44aSimon Xumain(int argc, char *argv[]) 795ba96af16cf74736f632baec4672dda40c441682mridge{ 806f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu int error; 8164a341fc42c967890a9fb5d8855568e23104bef6mridge socklen_t len; 826f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu int lstn_sk,clnt_sk,acpt_sk,pf_class,sk1; 835ba96af16cf74736f632baec4672dda40c441682mridge struct msghdr outmessage; 846f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct msghdr inmessage; 856f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu char *message = "hello, world!\n"; 866f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct iovec iov_rcv; 876f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct sctp_sndrcvinfo *sinfo; 886f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu int msg_count; 896f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))]; 906f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct cmsghdr *cmsg; 916f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct iovec out_iov; 926f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu char * buffer_rcv; 935ba96af16cf74736f632baec4672dda40c441682mridge char incmsg[CMSG_SPACE(sizeof(sctp_cmsg_data_t))]; 945ba96af16cf74736f632baec4672dda40c441682mridge struct sockaddr *laddrs, *paddrs; 958c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu int fd, err_no = 0; 968c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu char filename[21]; 975ba96af16cf74736f632baec4672dda40c441682mridge 986f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu struct sockaddr_in conn_addr,lstn_addr,acpt_addr; 995ba96af16cf74736f632baec4672dda40c441682mridge struct sockaddr_in *addr; 1005ba96af16cf74736f632baec4672dda40c441682mridge 1015ba96af16cf74736f632baec4672dda40c441682mridge /* Rather than fflush() throughout the code, set stdout to 1026f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu * be unbuffered. 1036f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu */ 1046f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu setvbuf(stdout, NULL, _IONBF, 0); 1056f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu setvbuf(stderr, NULL, _IONBF, 0); 1065ba96af16cf74736f632baec4672dda40c441682mridge 1076f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu pf_class = PF_INET; 1085ba96af16cf74736f632baec4672dda40c441682mridge 1096f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*Creating a regular socket*/ 1105ba96af16cf74736f632baec4672dda40c441682mridge clnt_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 1115ba96af16cf74736f632baec4672dda40c441682mridge 1126f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*Creating a listen socket*/ 1136f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 1145ba96af16cf74736f632baec4672dda40c441682mridge 1155ba96af16cf74736f632baec4672dda40c441682mridge conn_addr.sin_family = AF_INET; 1166f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK; 1176f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu conn_addr.sin_port = htons(SCTP_TESTPORT_1); 1185ba96af16cf74736f632baec4672dda40c441682mridge 1195ba96af16cf74736f632baec4672dda40c441682mridge lstn_addr.sin_family = AF_INET; 1206f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK; 1216f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu lstn_addr.sin_port = htons(SCTP_TESTPORT_1); 1225ba96af16cf74736f632baec4672dda40c441682mridge 1236f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*Binding the listen socket*/ 1246f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu test_bind(lstn_sk, (struct sockaddr *) &lstn_addr, sizeof(lstn_addr)); 1255ba96af16cf74736f632baec4672dda40c441682mridge 1266f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*Listening many sockets as we are calling too many connect here*/ 1275ba96af16cf74736f632baec4672dda40c441682mridge test_listen(lstn_sk, 1); 1285ba96af16cf74736f632baec4672dda40c441682mridge 1295ba96af16cf74736f632baec4672dda40c441682mridge len = sizeof(struct sockaddr_in); 1306f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 1316f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu test_connect(clnt_sk, (struct sockaddr *) &conn_addr, len); 1322c28215423293e443469a07ae7011135d058b671Garrett Cooper 1336f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu acpt_sk = test_accept(lstn_sk, (struct sockaddr *) &acpt_addr, &len); 1345ba96af16cf74736f632baec4672dda40c441682mridge 1355ba96af16cf74736f632baec4672dda40c441682mridge memset(&inmessage, 0, sizeof(inmessage)); 1366f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu buffer_rcv = malloc(REALLY_BIG); 1375ba96af16cf74736f632baec4672dda40c441682mridge 1386f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu iov_rcv.iov_base = buffer_rcv; 1396f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu iov_rcv.iov_len = REALLY_BIG; 1406f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu inmessage.msg_iov = &iov_rcv; 1416f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu inmessage.msg_iovlen = 1; 1426f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu inmessage.msg_control = incmsg; 1436f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu inmessage.msg_controllen = sizeof(incmsg); 1445ba96af16cf74736f632baec4672dda40c441682mridge 1456f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu msg_count = strlen(message) + 1; 1465ba96af16cf74736f632baec4672dda40c441682mridge 1475ba96af16cf74736f632baec4672dda40c441682mridge memset(&outmessage, 0, sizeof(outmessage)); 1486f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_name = &lstn_addr; 1496f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_namelen = sizeof(lstn_addr); 1506f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_iov = &out_iov; 1516f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_iovlen = 1; 1526f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_control = outcmsg; 1536f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_controllen = sizeof(outcmsg); 1546f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_flags = 0; 1556f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 1566f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu cmsg = CMSG_FIRSTHDR(&outmessage); 1576f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu cmsg->cmsg_level = IPPROTO_SCTP; 1586f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu cmsg->cmsg_type = SCTP_SNDRCV; 1596f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo)); 1606f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_controllen = cmsg->cmsg_len; 1616f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); 1626f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu memset(sinfo, 0x00, sizeof(struct sctp_sndrcvinfo)); 1636f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 1646f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_iov->iov_base = message; 1656f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu outmessage.msg_iov->iov_len = msg_count; 1666f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 1675ba96af16cf74736f632baec4672dda40c441682mridge test_sendmsg(clnt_sk, &outmessage, MSG_NOSIGNAL, msg_count); 1685ba96af16cf74736f632baec4672dda40c441682mridge 1695ba96af16cf74736f632baec4672dda40c441682mridge test_recvmsg(acpt_sk, &inmessage, MSG_NOSIGNAL); 1705ba96af16cf74736f632baec4672dda40c441682mridge 1716f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getladdrs() TEST1: Bad socket descriptor, EBADF Expected error*/ 1725ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getladdrs(-1, 0, &laddrs); 1735ba96af16cf74736f632baec4672dda40c441682mridge if (error != -1 || errno != EBADF) 1746f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getladdrs with a bad socket " 1755ba96af16cf74736f632baec4672dda40c441682mridge "descriptor error:%d, errno:%d", error, errno); 1765ba96af16cf74736f632baec4672dda40c441682mridge 1775ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getladdrs() with a bad socket descriptor - " 1785ba96af16cf74736f632baec4672dda40c441682mridge "EBADF"); 1795ba96af16cf74736f632baec4672dda40c441682mridge 1806f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getladdrs() TEST2: Invalid socket, ENOTSOCK Expected error*/ 1818c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu strcpy(filename, "/tmp/sctptest.XXXXXX"); 1828c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu fd = mkstemp(filename); 1838c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (fd == -1) 1848c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s", 1858c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu filename, strerror(errno)); 1868c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu error = sctp_getladdrs(fd, 0, &laddrs); 1878c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (error == -1) 1888c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu err_no = errno; 1898c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu close(fd); 1908c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu unlink(filename); 1918c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (error != -1 || err_no != ENOTSOCK) 1926f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getladdrs with invalid socket " 1938c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu "error:%d, errno:%d", error, err_no); 1945ba96af16cf74736f632baec4672dda40c441682mridge 1955ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getladdrs() with invalid socket - ENOTSOCK"); 1965ba96af16cf74736f632baec4672dda40c441682mridge 1975ba96af16cf74736f632baec4672dda40c441682mridge /*sctp_getladdrs() TEST3: socket of different protocol 1986f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu EOPNOTSUPP Expected error*/ 1996f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu sk1 = socket(pf_class, SOCK_STREAM, IPPROTO_IP); 2005ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getladdrs(sk1, 0, &laddrs); 2015ba96af16cf74736f632baec4672dda40c441682mridge if (error != -1 || errno != EOPNOTSUPP) 2026f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getladdrs with socket of " 2035ba96af16cf74736f632baec4672dda40c441682mridge "different protocol error:%d, errno:%d", error, errno); 2045ba96af16cf74736f632baec4672dda40c441682mridge 2055ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getladdrs() with socket of different protocol - " 2065ba96af16cf74736f632baec4672dda40c441682mridge "EOPNOTSUPP"); 2075ba96af16cf74736f632baec4672dda40c441682mridge 2086f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getladdrs() TEST4: Getting the local addresses*/ 2095ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getladdrs(lstn_sk, 0, &laddrs); 2105ba96af16cf74736f632baec4672dda40c441682mridge if (error < 0) 2116f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getladdrs with valid socket " 2125ba96af16cf74736f632baec4672dda40c441682mridge "error:%d, errno:%d", error, errno); 2135ba96af16cf74736f632baec4672dda40c441682mridge 2145ba96af16cf74736f632baec4672dda40c441682mridge addr = (struct sockaddr_in *)laddrs; 2156f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu if (addr->sin_port != lstn_addr.sin_port || 2166f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu addr->sin_family != lstn_addr.sin_family || 2175ba96af16cf74736f632baec4672dda40c441682mridge addr->sin_addr.s_addr != lstn_addr.sin_addr.s_addr) 2186f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getladdrs comparision failed"); 2195ba96af16cf74736f632baec4672dda40c441682mridge 2205ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getladdrs() - SUCCESS"); 2215ba96af16cf74736f632baec4672dda40c441682mridge 2226f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_freealddrs() TEST5: freeing the local address*/ 2235ba96af16cf74736f632baec4672dda40c441682mridge if ((sctp_freeladdrs(laddrs)) < 0) 2246f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_freeladdrs " 2255ba96af16cf74736f632baec4672dda40c441682mridge "error:%d, errno:%d", error, errno); 2266f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 2275ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_freeladdrs() - SUCCESS"); 2285ba96af16cf74736f632baec4672dda40c441682mridge 2296f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getpaddrs() TEST6: Bad socket descriptor, EBADF Expected error*/ 2305ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getpaddrs(-1, 0, &paddrs); 2315ba96af16cf74736f632baec4672dda40c441682mridge if (error != -1 || errno != EBADF) 2326f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getpaddrs with a bad socket " 2335ba96af16cf74736f632baec4672dda40c441682mridge "descriptor error:%d, errno:%d", error, errno); 2345ba96af16cf74736f632baec4672dda40c441682mridge 2355ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getpaddrs() with a bad socket descriptor - " 2365ba96af16cf74736f632baec4672dda40c441682mridge "EBADF"); 2375ba96af16cf74736f632baec4672dda40c441682mridge 2386f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getpaddrs() TEST7: Invalid socket, ENOTSOCK Expected error*/ 2398c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu strcpy(filename, "/tmp/sctptest.XXXXXX"); 2408c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu fd = mkstemp(filename); 2418c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (fd == -1) 2428c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s", 2438c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu filename, strerror(errno)); 2448c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu error = sctp_getpaddrs(fd, 0, &paddrs); 2458c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (error == -1) 2468c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu err_no = errno; 2478c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu close(fd); 2488c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu unlink(filename); 2498c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu if (error != -1 || err_no != ENOTSOCK) 2506f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getpaddrs with invalid socket " 2518c1e85d4a4a769fe20a82839e4d181280be80e76Simon Xu "error:%d, errno:%d", error, err_no); 2525ba96af16cf74736f632baec4672dda40c441682mridge 2535ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getpaddrs() with invalid socket - ENOTSOCK"); 2546f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 2555ba96af16cf74736f632baec4672dda40c441682mridge /*sctp_getpaddrs() TEST8: socket of different protocol 2566f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu EOPNOTSUPP Expected error*/ 2575ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getpaddrs(sk1, 0, &laddrs); 2585ba96af16cf74736f632baec4672dda40c441682mridge if (error != -1 || errno != EOPNOTSUPP) 2596f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getpaddrs with socket of " 2605ba96af16cf74736f632baec4672dda40c441682mridge "different protocol error:%d, errno:%d", error, errno); 2615ba96af16cf74736f632baec4672dda40c441682mridge 2625ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getpaddrs() with socket of different protocol - " 2635ba96af16cf74736f632baec4672dda40c441682mridge "EOPNOTSUPP"); 2646f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 2656f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_getpaddrs() TEST9: Getting the peer addresses*/ 2665ba96af16cf74736f632baec4672dda40c441682mridge error = sctp_getpaddrs(acpt_sk, 0, &paddrs); 2675ba96af16cf74736f632baec4672dda40c441682mridge if (error < 0) 2686f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getpaddrs with valid socket " 2695ba96af16cf74736f632baec4672dda40c441682mridge "error:%d, errno:%d", error, errno); 2706f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 2715ba96af16cf74736f632baec4672dda40c441682mridge addr = (struct sockaddr_in *)paddrs; 2725ba96af16cf74736f632baec4672dda40c441682mridge if (addr->sin_port != acpt_addr.sin_port || 2736f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu addr->sin_family != acpt_addr.sin_family || 2746f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu addr->sin_addr.s_addr != acpt_addr.sin_addr.s_addr) 2756f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_getpaddrs comparision failed"); 2765ba96af16cf74736f632baec4672dda40c441682mridge 2775ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_getpaddrs() - SUCCESS"); 2785ba96af16cf74736f632baec4672dda40c441682mridge 2796f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu /*sctp_freeapddrs() TEST10: freeing the peer address*/ 2805ba96af16cf74736f632baec4672dda40c441682mridge if ((sctp_freepaddrs(paddrs)) < 0) 2816f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu tst_brkm(TBROK, tst_exit, "sctp_freepaddrs " 2825ba96af16cf74736f632baec4672dda40c441682mridge "error:%d, errno:%d", error, errno); 2836f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu 2845ba96af16cf74736f632baec4672dda40c441682mridge tst_resm(TPASS, "sctp_freepaddrs() - SUCCESS"); 2855ba96af16cf74736f632baec4672dda40c441682mridge 2865ba96af16cf74736f632baec4672dda40c441682mridge close(clnt_sk); 2875ba96af16cf74736f632baec4672dda40c441682mridge 2886f22494d19b605ded308dc0fa713e91cb873f44aSimon Xu return 0; 289ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 290