1 /* SCTP kernel Implementation 2 * Copyright (c) 2003 Hewlett-Packard Development Company, L.P 3 * (C) Copyright IBM Corp. 2004 4 * 5 * This file has test cases to test the socket (), bind () and listen () for 6 * 1-1 style sockets 7 * 8 * socket () Tests: 9 * --------------- 10 * TEST1: Invalid domain 11 * TEST2: Invalid type 12 * TEST3: Opening a TCP style socket 13 * 14 * bind () Tests: 15 * ------------- 16 * TEST4: Invalid address 17 * TEST5: Invalid address length 18 * TEST6: Invalid socket descriptor 19 * TEST7: Invalid host name 20 * TEST8: On a socket that is already bound 21 * TEST9: On reserved ports 22 * TEST10: INADDR_ANY address and non-zero port 23 * TEST11: INADDR_ANY address and zero port 24 * TEST12: Local address and zero port 25 * 26 * listen () Tests: 27 * --------------- 28 * TEST13: Bad socket descriptor 29 * TEST14: Invalid socket 30 * TEST15: Listening a bound socket 31 * 32 * The SCTP implementation is free software; 33 * you can redistribute it and/or modify it under the terms of 34 * the GNU General Public License as published by 35 * the Free Software Foundation; either version 2, or (at your option) 36 * any later version. 37 * 38 * The SCTP implementation is distributed in the hope that it 39 * will be useful, but WITHOUT ANY WARRANTY; without even the implied 40 * ************************ 41 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 42 * See the GNU General Public License for more details. 43 * 44 * You should have received a copy of the GNU General Public License 45 * along with GNU CC; see the file COPYING. If not, write to 46 * the Free Software Foundation, 59 Temple Place - Suite 330, 47 * Boston, MA 02111-1307, USA. 48 * 49 * Please send any bug reports or fixes you make to the 50 * email address(es): 51 * lksctp developers <lksctp-developers (at) lists.sourceforge.net> 52 * 53 * Or submit a bug report through the following website: 54 * http://www.sf.net/projects/lksctp 55 * 56 * Any bugs reported given to us we will try to fix... any fixes shared will 57 * be incorporated into the next SCTP release. 58 * 59 */ 60 61 #include <stdio.h> 62 #include <unistd.h> 63 #include <fcntl.h> 64 #include <stdlib.h> 65 #include <string.h> 66 #include <sys/types.h> 67 #include <sys/socket.h> 68 #include <netinet/in.h> /* for sockaddr_in */ 69 #include <arpa/inet.h> 70 #include <errno.h> 71 #include <netinet/sctp.h> 72 #include <sys/uio.h> 73 #include <sctputil.h> 74 75 #define SCTP_RESERVED_PORT 7 76 #define SCTP_INV_LOOPBACK "172.31.43.112" 77 78 char *TCID = __FILE__; 79 int TST_TOTAL = 15; 80 int TST_CNT = 0; 81 82 int 83 main(int argc, char *argv[]) 84 { 85 int sk,pf_class; 86 int error = 0; 87 int uid; 88 int fd, err_no = 0; 89 char filename[21]; 90 91 struct sockaddr_in bind_addr; 92 93 /* Rather than fflush() throughout the code, set stdout to 94 * be unbuffered. 95 */ 96 setvbuf(stdout, NULL, _IONBF, 0); 97 setvbuf(stderr, NULL, _IONBF, 0); 98 99 pf_class = PF_INET; 100 101 /* socket() TEST1: Invalid domain, EAFNOSUPPORT Expected error */ 102 sk = socket(-1, SOCK_STREAM, IPPROTO_SCTP); 103 if (sk != -1 || errno != EAFNOSUPPORT) 104 tst_brkm(TBROK, tst_exit, "socket() with invalid domain " 105 "error:%d, errno:%d", error, errno); 106 107 tst_resm(TPASS, "socket() with invalid domain - EAFNOSUPPORT"); 108 109 /*socket() TEST2 : Invalid type, EINVAL Expected error*/ 110 sk = socket(pf_class, -1, IPPROTO_SCTP); 111 if (sk != -1 || errno != EINVAL) 112 tst_brkm(TBROK, tst_exit, "socket() with invalid type " 113 "error:%d, errno:%d", error, errno); 114 115 tst_resm(TPASS, "socket() with invalid type - EINVAL"); 116 117 /*socket() TEST3: opening a socket*/ 118 sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 119 if (sk < 0) 120 tst_brkm(TBROK, tst_exit, "valid socket() call " 121 "error:%d, errno:%d", error, errno); 122 123 tst_resm(TPASS, "socket() - SUCCESS"); 124 125 /*bind() TEST4: Invalid structure, EFAULT Expected error */ 126 error = bind(sk, (struct sockaddr *)-1, sizeof(struct sockaddr_in)); 127 if (error != -1 || errno != EFAULT) 128 tst_brkm(TBROK, tst_exit, "bind() with invalid address ptr " 129 "error:%d, errno:%d", error, errno); 130 131 tst_resm(TPASS, "bind() with invalid address ptr - EFAULT"); 132 133 /*bind() TEST5: Invalid address length, EINVAL Expect error*/ 134 bind_addr.sin_family = AF_INET; 135 bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK; 136 bind_addr.sin_port = htons(SCTP_TESTPORT_1); 137 138 error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr)-2); 139 if (error != -1 || errno != EINVAL) 140 tst_brkm(TBROK, tst_exit, "bind() with invalid address length " 141 "error:%d, errno:%d", error, errno); 142 143 tst_resm(TPASS, "bind() with invalid address length - EINVAL"); 144 145 /*bind() TEST6: Invalid socket descriptor, ENOTSOCK Expect Error*/ 146 strcpy(filename, "/tmp/sctptest.XXXXXX"); 147 fd = mkstemp(filename); 148 if (fd == -1) 149 tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s", 150 filename, strerror(errno)); 151 error = bind(fd, (struct sockaddr *) &bind_addr, sizeof(bind_addr)); 152 if (error == -1) 153 err_no = errno; 154 close(fd); 155 unlink(filename); 156 if (error != -1 || err_no != ENOTSOCK) 157 tst_brkm(TBROK, tst_exit, "bind() with invalid socket " 158 "descriptor error:%d, errno:%d", error, err_no); 159 160 tst_resm(TPASS, "bind() with invalid socket descriptor - ENOTSOCK"); 161 162 /*bind() TEST7: Invalid host name, EADDRNOTAVAIL Expect Error*/ 163 /*Assigning invalid host name*/ 164 bind_addr.sin_addr.s_addr = inet_addr(SCTP_INV_LOOPBACK); 165 error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr)); 166 if (error != -1 || errno != EADDRNOTAVAIL) 167 tst_brkm(TBROK, tst_exit, "bind() with invalid local " 168 "address error:%d, errno:%d", error, errno); 169 170 tst_resm(TPASS, "bind() with invalid local address - EADDRNOTAVAIL"); 171 172 /*bind() TEST8: Bind on a socket that has already called bind 173 EINAVL, Expected error*/ 174 bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK; 175 /*Calling bind first time, it should pass*/ 176 test_bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr)); 177 178 error = bind(sk, (struct sockaddr *) &bind_addr, sizeof(bind_addr)); 179 if (error != -1 || errno != EINVAL) 180 tst_brkm(TBROK, tst_exit, "bind() on an already bound socket " 181 "error:%d, errno:%d", error, errno); 182 183 tst_resm(TPASS, "bind() on an already bound socket - EINVAL"); 184 185 /*Closing the socket which succeed in bind() */ 186 close(sk); 187 188 /*Opening the socket again for further test*/ 189 sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 190 191 /*bind() TEST9: Bind on reserved ports EACCES, Expected error*/ 192 /*Assigning a reserved port*/ 193 uid = getuid(); 194 if (uid != 0) { 195 bind_addr.sin_port = htons(SCTP_RESERVED_PORT); 196 error = bind(sk, (struct sockaddr *) &bind_addr, 197 sizeof(bind_addr)); 198 if (error != -1 || errno != EACCES) 199 tst_brkm(TBROK, tst_exit, "bind() on reserverd port " 200 "error:%d, errno:%d", error, errno); 201 202 tst_resm(TPASS, "bind() on reserved port - EACCESS"); 203 } 204 205 /*bind() TEST10: INADDR_ANY address and non-zero port, bind() should 206 succeed*/ 207 bind_addr.sin_addr.s_addr = INADDR_ANY; 208 bind_addr.sin_port = htons(SCTP_TESTPORT_1); 209 error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr)); 210 if ( error < 0 ) 211 tst_brkm(TBROK, tst_exit, "bind() with INADDR_ANY address and " 212 "non-zero port error:%d, errno:%d", error, errno); 213 214 tst_resm(TPASS, "bind() with INADDR_ANY address and non-zero port - " 215 "SUCCESS"); 216 217 /*Closing the socket which succeed in bind() */ 218 close(sk); 219 220 /*Opening the socket again for further test*/ 221 sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 222 223 /*bind() TEST11: INADDR_ANY address and zero port, bind() should 224 succeed*/ 225 bind_addr.sin_port = 0; 226 error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr)); 227 if ( error < 0 ) 228 tst_brkm(TBROK, tst_exit, "bind() with INADDR_ANY address and " 229 "zero port error:%d, errno:%d", error, errno); 230 231 tst_resm(TPASS, "bind() with INADDR_ANY address and zero port - " 232 "SUCCESS"); 233 234 /*Closing the socket which succeed in bind() */ 235 close(sk); 236 237 /*Opening the socket again for further test*/ 238 sk = socket(pf_class, SOCK_STREAM, IPPROTO_SCTP); 239 240 /*bind() TEST12: local address and zero port, bind() should 241 succeed*/ 242 bind_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK; 243 bind_addr.sin_port = 0; 244 error = bind(sk, (struct sockaddr *) &bind_addr,sizeof(bind_addr)); 245 if ( error < 0 ) 246 tst_brkm(TBROK, tst_exit, "bind() with local address and " 247 "zero port error:%d, errno:%d", error, errno); 248 249 tst_resm(TPASS, "bind() with local address and zero port - " 250 "SUCCESS"); 251 252 /*listen() TEST13: Bad socket descriptor EBADF, Expected error*/ 253 error = listen(-1, 3); 254 if (error != -1 || errno != EBADF) 255 tst_brkm(TBROK, tst_exit, "listen() with bad socket descriptor " 256 "error:%d, errno:%d", error, errno); 257 258 tst_resm(TPASS, "listen() with bad socket descriptor - EBADF"); 259 260 /*listen() TEST14: Invalid socket ENOTSOCK, Expected error*/ 261 strcpy(filename, "/tmp/sctptest.XXXXXX"); 262 fd = mkstemp(filename); 263 if (fd == -1) 264 tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s", 265 filename, strerror(errno)); 266 error = listen(fd, 3); 267 if (error == -1) 268 err_no = errno; 269 close(fd); 270 unlink(filename); 271 if (error != -1 || err_no != ENOTSOCK) 272 tst_brkm(TBROK, tst_exit, "listen() with invalid socket " 273 "error:%d, errno:%d", error, err_no); 274 275 tst_resm(TPASS, "listen() with invalid socket - ENOTSOCK"); 276 277 /*listen() TEST15:listen on a bound socket, should succeed*/ 278 error = listen(sk, 3); 279 if ( error < 0 ) 280 tst_brkm(TBROK, tst_exit, "listen() on a bound socket " 281 "error:%d, errno:%d", error, errno); 282 283 tst_resm(TPASS, "listen() on a bound socket - SUCCESS"); 284 285 close(sk); 286 287 return 0; 288 } 289