Home | History | Annotate | Download | only in testlib
      1 /* SCTP kernel Implementation
      2  * (C) Copyright IBM Corp. 2001, 2003
      3  * Copyright (c) 1999-2000 Cisco, Inc.
      4  * Copyright (c) 1999-2001 Motorola, Inc.
      5  * Copyright (c) 2001 Intel Corp.
      6  * Copyright (c) 2001 Nokia, Inc.
      7  * Copyright (c) 2001 La Monte H.P. Yarroll
      8  *
      9  * The SCTP implementation is free software;
     10  * you can redistribute it and/or modify it under the terms of
     11  * the GNU General Public License as published by
     12  * the Free Software Foundation; either version 2, or (at your option)
     13  * any later version.
     14  *
     15  * The SCTP implementation is distributed in the hope that it
     16  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
     17  *                 ************************
     18  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     19  * See the GNU General Public License for more details.
     20  *
     21  * You should have received a copy of the GNU General Public License
     22  * along with GNU CC; see the file COPYING.  If not, write to
     23  * the Free Software Foundation, 59 Temple Place - Suite 330,
     24  * Boston, MA 02111-1307, USA.
     25  *
     26  * Please send any bug reports or fixes you make to the
     27  * email address(es):
     28  *    lksctp developers <lksctp-developers (at) lists.sourceforge.net>
     29  *
     30  * Or submit a bug report through the following website:
     31  *    http://www.sf.net/projects/lksctp
     32  *
     33  * Any bugs reported to us we will try to fix... any fixes shared will
     34  * be incorporated into the next SCTP release.
     35  *
     36  * Written or modified by:
     37  *    La Monte H.P. Yarroll <piggy (at) acm.org>
     38  *    Karl Knutson <karl (at) athena.chicago.il.us>
     39  *    Randall Stewart <randall (at) stewart.chicago.il.us>
     40  *    Ken Morneau <kmorneau (at) cisco.com>
     41  *    Qiaobing Xie <qxie1 (at) motorola.com>
     42  *    Daisy Chang <daisyc (at) us.ibm.com>
     43  *    Jon Grimm <jgrimm (at) us.ibm.com>
     44  *    Sridhar Samudrala <samudrala (at) us.ibm.com>
     45  *    Hui Huang <hui.huang (at) nokia.com>
     46  */
     47 
     48 #ifndef __sctputil_h__
     49 #define __sctputil_h__
     50 
     51 #ifdef LTP
     52 #include <test.h>
     53 #include <usctest.h>
     54 #endif
     55 
     56 #include <string.h>
     57 
     58 typedef union {
     59 	struct sockaddr_in v4;
     60 	struct sockaddr_in6 v6;
     61 	struct sockaddr sa;
     62 } sockaddr_storage_t;
     63 
     64 
     65 #define REALLY_BIG 65536
     66 
     67 /* Literal defines.  */
     68 #ifdef PROT_SOCK
     69 #define SCTP_TESTPORT_1 PROT_SOCK
     70 #else
     71 #define SCTP_TESTPORT_1 1024
     72 #endif
     73 #define SCTP_TESTPORT_2 (SCTP_TESTPORT_1+1)
     74 
     75 #define SCTP_IP_BCAST  	htonl(0xffffffff)
     76 #define SCTP_IP_LOOPBACK  htonl(0x7f000001)
     77 
     78 /* These are stolen from <netinet/in.h>.  */
     79 #define SCTP_IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
     80 #define SCTP_IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
     81 
     82 /* Display an IPv4 address in readable format.  */
     83 #define NIPQUAD(addr) \
     84         ((unsigned char *)&addr)[0], \
     85         ((unsigned char *)&addr)[1], \
     86         ((unsigned char *)&addr)[2], \
     87         ((unsigned char *)&addr)[3]
     88 
     89 /* Display an IPv6 address in readable format.  */
     90 #define NIP6(addr) \
     91         ntohs((addr).s6_addr16[0]), \
     92         ntohs((addr).s6_addr16[1]), \
     93         ntohs((addr).s6_addr16[2]), \
     94         ntohs((addr).s6_addr16[3]), \
     95         ntohs((addr).s6_addr16[4]), \
     96         ntohs((addr).s6_addr16[5]), \
     97         ntohs((addr).s6_addr16[6]), \
     98         ntohs((addr).s6_addr16[7])
     99 
    100 #define DUMP_CORE { 					 \
    101 	char *diediedie = 0;				 \
    102 	printf("DUMP_CORE %s: %d\n", __FILE__, __LINE__);\
    103 	*diediedie = 0;					 \
    104 }
    105 
    106 #ifndef LTP
    107 enum {
    108 	TPASS,
    109 	TINFO,
    110 };
    111 
    112 extern char *TCID;
    113 extern int TST_TOTAL;
    114 extern int TST_CNT;
    115 
    116 #define tst_brkm(a1, a2, whatever...) \
    117 	{ \
    118 		printf("%s %2d BROK : ", TCID, ++TST_CNT); \
    119 		printf(whatever); \
    120 		printf("\n"); \
    121 		DUMP_CORE \
    122 	}
    123 #define tst_resm(a1, whatever...) \
    124 	{ \
    125 		printf("%s %2d %s : ", TCID, \
    126 			 (a1 == TPASS)?++TST_CNT:0, \
    127 			 (a1 == TPASS)?"PASS":"INFO"); \
    128 		printf(whatever); \
    129 		printf("\n"); \
    130 	}
    131 #endif
    132 
    133 static inline int test_socket(int domain, int type, int protocol)
    134 {
    135 	int sk = socket(domain, type, protocol);
    136         if (-1 == sk)
    137                 tst_brkm(TBROK, tst_exit, "socket: %s", strerror(errno));
    138 	return sk;
    139 }
    140 
    141 static inline int test_bind(int sk, struct sockaddr *addr, socklen_t addrlen)
    142 {
    143 	int error = bind(sk, addr, addrlen);
    144         if (-1 == error)
    145                 tst_brkm(TBROK, tst_exit, "bind: %s", strerror(errno));
    146 	return error;
    147 }
    148 
    149 static inline int test_bindx_add(int sk, struct sockaddr *addr, int count)
    150 {
    151 	int error = sctp_bindx(sk, addr, count, SCTP_BINDX_ADD_ADDR);
    152         if (-1 == error)
    153                 tst_brkm(TBROK, tst_exit, "bindx (add): %s", strerror(errno));
    154 	return error;
    155 }
    156 
    157 static inline int test_listen(int sk, int backlog)
    158 {
    159 	int error = listen(sk, backlog);
    160         if (-1 == error)
    161                 tst_brkm(TBROK, tst_exit, "listen: %s", strerror(errno));
    162 	return error;
    163 }
    164 
    165 static inline int test_connect(int sk, struct sockaddr *addr, socklen_t addrlen)
    166 {
    167 	int error = connect(sk, addr, addrlen);
    168         if (-1 == error)
    169                 tst_brkm(TBROK, tst_exit, "connect: %s", strerror(errno));
    170 	return error;
    171 }
    172 
    173 static inline int test_connectx(int sk, struct sockaddr *addr, int count)
    174 {
    175 	int error = sctp_connectx(sk, addr, count, NULL);
    176         if (-1 == error)
    177                 tst_brkm(TBROK, tst_exit, "connectx: %s", strerror(errno));
    178 	return error;
    179 }
    180 
    181 static inline int test_accept(int sk, struct sockaddr *addr, socklen_t *addrlen)
    182 {
    183 	int error = accept(sk, addr, addrlen);
    184         if (-1 == error)
    185                 tst_brkm(TBROK, tst_exit, "accept: %s", strerror(errno));
    186 	return error;
    187 }
    188 
    189 static inline int test_send(int sk, const void *msg, size_t len, int flags)
    190 {
    191 	int error = send(sk, msg, len, flags);
    192         if (len != error)
    193                 tst_brkm(TBROK, tst_exit, "send: error:%d errno:%d",
    194 			 error, errno);
    195 	return error;
    196 }
    197 
    198 static inline int test_sendto(int sk, const void *msg, size_t len, int flags,
    199 			      const struct sockaddr *to, socklen_t tolen)
    200 {
    201 	int error = sendto(sk, msg, len, flags, to, tolen);
    202         if (len != error)
    203                 tst_brkm(TBROK, tst_exit, "sendto: error:%d errno:%d",
    204 			 error, errno);
    205 	return error;
    206 }
    207 
    208 static inline int test_sendmsg(int sk, const struct msghdr *msg, int flags,
    209 			       int msglen)
    210 {
    211 	int error = sendmsg(sk, msg, flags);
    212         if (msglen != error)
    213                 tst_brkm(TBROK, tst_exit, "sendmsg: error:%d errno:%d",
    214 			 error, errno);
    215 	return error;
    216 }
    217 
    218 static inline int test_recv(int sk, void *buf, size_t len, int flags)
    219 {
    220 	int error = recv(sk, buf, len, flags);
    221         if (-1 == error)
    222                 tst_brkm(TBROK, tst_exit, "recv: %s", strerror(errno));
    223 	return error;
    224 }
    225 
    226 static inline int test_recvmsg(int sk, struct msghdr *msg, int flags)
    227 {
    228 	int error = recvmsg(sk, msg, flags);
    229         if (-1 == error)
    230                 tst_brkm(TBROK, tst_exit, "recvmsg: %s", strerror(errno));
    231 	return error;
    232 }
    233 
    234 static inline int test_shutdown(int sk, int how)
    235 {
    236 	int error = shutdown(sk, how);
    237         if (-1 == error)
    238                 tst_brkm(TBROK, tst_exit, "shutdown: %s", strerror(errno));
    239 	return error;
    240 }
    241 
    242 static inline int test_getsockopt(int sk, int optname, void *optval,
    243 				  socklen_t *optlen)
    244 {
    245 	int error = getsockopt(sk, SOL_SCTP, optname, optval, optlen);
    246 	if (error)
    247 		tst_brkm(TBROK, tst_exit, "getsockopt(%d): %s", optname,
    248 			 strerror(errno));
    249 	return error;
    250 }
    251 
    252 static inline int test_setsockopt(int sk, int optname, const void *optval,
    253 				  socklen_t optlen)
    254 {
    255 	int error = setsockopt(sk, SOL_SCTP, optname, optval, optlen);
    256 	if (error)
    257 		tst_brkm(TBROK, tst_exit, "setsockopt(%d): %s", optname,
    258 			 strerror(errno));
    259 	return error;
    260 }
    261 
    262 static inline int test_sctp_peeloff(int sk, sctp_assoc_t assoc_id)
    263 {
    264 	int error = sctp_peeloff(sk, assoc_id);
    265         if (-1 == error)
    266                 tst_brkm(TBROK, tst_exit, "sctp_peeloff: %s", strerror(errno));
    267 	return error;
    268 }
    269 
    270 static inline int test_sctp_sendmsg(int s, const void *msg, size_t len,
    271 				    struct sockaddr *to, socklen_t tolen,
    272 				    uint32_t ppid, uint32_t flags,
    273 				    uint16_t stream_no, uint32_t timetolive,
    274 				    uint32_t context)
    275 {
    276 	int error = sctp_sendmsg(s, msg, len, to, tolen, ppid, flags, stream_no,
    277 	  		         timetolive, context);
    278 	if (len != error)
    279 		tst_brkm(TBROK, tst_exit, "sctp_sendmsg: error:%d errno:%d",
    280 			 error, errno);
    281 	return error;
    282 }
    283 
    284 static inline int test_sctp_send(int s, const void *msg, size_t len,
    285 				 const struct sctp_sndrcvinfo *sinfo,
    286 				 int flags)
    287 {
    288 	int error = sctp_send(s, msg, len, sinfo, flags);
    289 	if (len != error)
    290 		tst_brkm(TBROK, tst_exit, "sctp_send: error:%d errno:%d",
    291 			 error, errno);
    292 	return error;
    293 }
    294 
    295 static inline int test_sctp_recvmsg(int sk, void *msg, size_t len,
    296 				    struct sockaddr *from, socklen_t *fromlen,
    297 				    struct sctp_sndrcvinfo *sinfo,
    298 				    int *msg_flags)
    299 {
    300 	int error = sctp_recvmsg(sk, msg, len, from, fromlen, sinfo, msg_flags);
    301 	if (-1 == error)
    302 		tst_brkm(TBROK, tst_exit, "sctp_recvmsg: %s", strerror(errno));
    303 	return error;
    304 }
    305 
    306 static inline void *test_malloc(size_t size)
    307 {
    308 	void *buf = malloc(size);
    309         if (NULL == buf)
    310                 tst_brkm(TBROK, tst_exit, "malloc failed");
    311 	return buf;
    312 }
    313 
    314 void test_check_msg_notification(struct msghdr *, int, int, uint16_t, uint32_t);
    315 void test_check_buf_notification(void *, int, int, int, uint16_t, uint32_t);
    316 void test_check_msg_data(struct msghdr *, int, int, int, uint16_t, uint32_t);
    317 void test_check_buf_data(void *, int, int, struct sctp_sndrcvinfo *, int, int,
    318 			 uint16_t, uint32_t);
    319 void *test_build_msg(int);
    320 void test_enable_assoc_change(int);
    321 void test_print_message(int sk, struct msghdr *msg, size_t msg_len);
    322 int test_peer_addr(int sk, sctp_assoc_t asoc, sockaddr_storage_t *peers, int count);
    323 
    324 #endif /* __sctputil_h__ */
    325