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 send() call for 1-1 style sockets
      6  *
      7  * TEST1: Bad socket descriptor
      8  * TEST2: Invalid socket
      9  * TEST3: On a listening socket
     10  * TEST4: On a closed association
     11  * TEST5: Invalid message address
     12  * TEST6: send from client to server
     13  * TEST7: send from server to client
     14  * TEST8: sending partial data from a buffer
     15  *
     16  * The SCTP implementation is free software;
     17  * you can redistribute it and/or modify it under the terms of
     18  * the GNU General Public License as published by
     19  * the Free Software Foundation; either version 2, or (at your option)
     20  * any later version.
     21  *
     22  * The SCTP implementation is distributed in the hope that it
     23  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
     24  *                 ************************
     25  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     26  * See the GNU General Public License for more details.
     27  *
     28  * You should have received a copy of the GNU General Public License
     29  * along with GNU CC; see the file COPYING.  If not, write to
     30  * the Free Software Foundation, 59 Temple Place - Suite 330,
     31  * Boston, MA 02111-1307, USA.
     32  *
     33  * Please send any bug reports or fixes you make to the
     34  * email address(es):
     35  *    lksctp developers <lksctp-developers (at) lists.sourceforge.net>
     36  *
     37  * Or submit a bug report through the following website:
     38  *    http://www.sf.net/projects/lksctp
     39  *
     40  * Any bugs reported given to us we will try to fix... any fixes shared will
     41  * be incorporated into the next SCTP release
     42  *
     43  */
     44 
     45 #include <stdio.h>
     46 #include <unistd.h>
     47 #include <fcntl.h>
     48 #include <stdlib.h>
     49 #include <string.h>
     50 #include <sys/types.h>
     51 #include <sys/socket.h>
     52 #include <netinet/in.h>         /* for sockaddr_in */
     53 #include <arpa/inet.h>
     54 #include <errno.h>
     55 #include <netinet/sctp.h>
     56 #include <sys/uio.h>
     57 #include <linux/socket.h>
     58 #include <sctputil.h>
     59 
     60 char *TCID = __FILE__;
     61 int TST_TOTAL = 8;
     62 int TST_CNT = 0;
     63 
     64 int
     65 main(int argc, char *argv[])
     66 {
     67         socklen_t len,len_snd;
     68 	int msg_count;
     69 	int sk,sk1,pf_class,lstn_sk,acpt_sk,acpt1_sk, flag, count;
     70         char *message = "hello, world!\n";
     71         char *message_rcv;
     72 	int fd, err_no = 0;
     73 	char filename[21];
     74 
     75         struct sockaddr_in conn_addr,lstn_addr,svr_addr;
     76 
     77 	/* Rather than fflush() throughout the code, set stdout to
     78          * be unbuffered.
     79          */
     80         setvbuf(stdout, NULL, _IONBF, 0);
     81         setvbuf(stderr, NULL, _IONBF, 0);
     82 
     83         pf_class = PF_INET;
     84 
     85         sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
     86 
     87         sk1 = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
     88 
     89         lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
     90 
     91 	conn_addr.sin_family = AF_INET;
     92         conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
     93         conn_addr.sin_port = htons(SCTP_TESTPORT_1);
     94 
     95 	lstn_addr.sin_family = AF_INET;
     96         lstn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
     97         lstn_addr.sin_port = htons(SCTP_TESTPORT_1);
     98 
     99 	/*Binding the listen socket*/
    100         test_bind(lstn_sk, (struct sockaddr *) &lstn_addr, sizeof(lstn_addr));
    101 
    102         /*Listening the socket*/
    103         test_listen(lstn_sk, 10);
    104 
    105 	len = sizeof(struct sockaddr_in);
    106 
    107 	test_connect(sk, (struct sockaddr *) &conn_addr, len);
    108 
    109 	acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
    110 
    111 	len_snd = (strlen(message) + 1);
    112 
    113 	flag = MSG_NOSIGNAL;
    114 	/*send () TEST1: Bad socket descriptor, EBADF Expected error*/
    115 	count = send(-1, message, len_snd, flag);
    116 	if (count != -1 || errno != EBADF)
    117 		tst_brkm(TBROK, tst_exit, "send with a bad socket "
    118 			 "descriptor count:%d, errno:%d", count, errno);
    119 
    120 	tst_resm(TPASS, "send() with a bad socket descriptor - EBADF");
    121 
    122 	/*send () TEST2: Invalid socket, ENOTSOCK Expected error*/
    123 	strcpy(filename, "/tmp/sctptest.XXXXXX");
    124 	fd = mkstemp(filename);
    125 	if (fd == -1)
    126 		tst_brkm(TBROK, tst_exit, "Failed to mkstemp %s: %s",
    127 				filename, strerror(errno));
    128 	count = send(fd, message, len_snd, flag);
    129 	if (count == -1)
    130 		err_no = errno;
    131 	close(fd);
    132 	unlink(filename);
    133 	if (count != -1 || err_no != ENOTSOCK)
    134 		tst_brkm(TBROK, tst_exit, "send with invalid socket "
    135 			 "count:%d, errno:%d", count, err_no);
    136 
    137 	tst_resm(TPASS, "send() with invalid socket - ENOTSOCK");
    138 
    139 	/*send () TEST3: send on listening socket, EPIPE Expected error*/
    140 	count = send(lstn_sk, message, len_snd, flag);
    141 	if (count != -1 || errno != EPIPE)
    142 		tst_brkm(TBROK, tst_exit, "send on a listening socket "
    143 			 "count:%d, errno:%d", count, errno);
    144 
    145 	tst_resm(TPASS, "send() on a listening socket - EPIPE");
    146 #if 0
    147 	/*send () TEST4: Invalid message address, EFAULT Expected error*/
    148        /* FIXME this test should pass. Don't catch why...  */
    149 	count = send(sk, (char *)0x1, len_snd, flag);
    150 	if (count != -1 || errno != EFAULT)
    151 		tst_brkm(TBROK, tst_exit, "send with invalid message "
    152 			 "pointer count:%d, errno:%d", count, errno);
    153 
    154 	tst_resm(TPASS, "send() with invalid message ptr - EFAULT");
    155 #endif
    156 
    157 	test_connect(sk1, (struct sockaddr *) &lstn_addr, len);
    158 
    159 	count = test_send(sk1, message, len_snd, flag);
    160 
    161 	close(sk1);
    162 
    163 	acpt1_sk = test_accept(lstn_sk, (struct sockaddr *)&conn_addr, &len);
    164 
    165 	/*send () TEST5: send on closed association, EPIPE Expected error*/
    166 	count = send(acpt1_sk, message, len_snd, flag);
    167 	if (count != -1 || errno != EPIPE)
    168 		tst_brkm(TBROK, tst_exit, "send on a closed association "
    169 			 "count:%d, errno:%d", count, errno);
    170 
    171 	tst_resm(TPASS, "send() on a closed association - EPIPE");
    172 
    173 	close(acpt1_sk);
    174 	close(sk);
    175 	close(lstn_sk);
    176 	close(acpt_sk);
    177 
    178         sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
    179 
    180         lstn_sk = test_socket(pf_class, SOCK_STREAM, IPPROTO_SCTP);
    181 
    182 	message_rcv = malloc(512);
    183 
    184 	/*Binding the listen socket*/
    185         test_bind(lstn_sk, (struct sockaddr *) &lstn_addr, sizeof(lstn_addr));
    186 
    187         /*Listening the socket*/
    188         test_listen(lstn_sk, 10);
    189 
    190 	conn_addr.sin_family = AF_INET;
    191         conn_addr.sin_addr.s_addr = SCTP_IP_LOOPBACK;
    192         conn_addr.sin_port = htons(SCTP_TESTPORT_1);
    193 
    194 	len = sizeof(struct sockaddr_in);
    195 
    196 	test_connect(sk, (struct sockaddr *) &conn_addr, len);
    197 
    198 	acpt_sk = test_accept(lstn_sk, (struct sockaddr *)&svr_addr, &len);
    199 
    200 	msg_count = strlen(message) + 1;
    201 
    202 	/*send() TEST6: Sending data from client socket to server socket*/
    203 	count = send(sk, message, msg_count, flag);
    204 	if (count != msg_count)
    205 		tst_brkm(TBROK, tst_exit, "send from client to server "
    206                          "count:%d, errno:%d", count, errno);
    207 
    208 	tst_resm(TPASS, "send() from client to server - SUCCESS");
    209 
    210 	test_recv(acpt_sk, message_rcv, msg_count, flag);
    211 
    212 	strncpy(message_rcv,"\0",512);
    213 
    214 	/*send() TEST7: Sending data from accept socket to client socket*/
    215 	count = send(acpt_sk, message, msg_count, flag);
    216 	if (count != msg_count)
    217 		tst_brkm(TBROK, tst_exit, "send from accept socket to client "
    218                          "count:%d, errno:%d", count, errno);
    219 
    220 	tst_resm(TPASS, "send() from accept socket to client - SUCCESS");
    221 
    222 	test_recv(sk, message_rcv, msg_count, flag);
    223 
    224 	/*send() TEST8: Sending less number of data from the buffer*/
    225 	/*Sending only 5 bytes so that only hello is received*/
    226 	test_send(sk, message, 5 , flag);
    227 	test_recv(acpt_sk, message_rcv, 5, flag);
    228 
    229 	tst_resm(TPASS, "send() partial data from a buffer - SUCCESS");
    230 
    231 	/* TEST9: sctp_send with no sinfo */
    232 	test_sctp_send(sk, message, strlen(message) + 1 , NULL, flag);
    233 	test_recv(acpt_sk, message_rcv, strlen(message) + 1, flag);
    234 	tst_resm(TPASS, "sctp_send() with no sinfo - SUCCESS");
    235 
    236 	close(sk1);
    237 	close(lstn_sk);
    238 	close(acpt_sk);
    239 
    240 	return 0;
    241 }
    242