Home | History | Annotate | Download | only in func_tests
      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