Home | History | Annotate | Line # | Download | only in ipsend
iptests.c revision 1.2
      1 /*	$NetBSD: iptests.c,v 1.2 2012/03/24 02:08:34 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2009 by Darren Reed.
      5  *
      6  * See the IPFILTER.LICENCE file for details on licencing.
      7  *
      8  */
      9 #if !defined(lint)
     10 static const char sccsid[] = "%W% %G% (C)1995 Darren Reed";
     11 static const char rcsid[] = "@(#)Id: iptests.c,v 2.21.2.1 2012/01/26 05:29:15 darrenr Exp";
     12 #endif
     13 #include <sys/param.h>
     14 #include <sys/types.h>
     15 #include <stdbool.h>
     16 #if defined(__NetBSD__) && defined(__vax__)
     17 /*
     18  * XXX need to declare boolean_t for _KERNEL <sys/files.h>
     19  * which ends up including <sys/device.h> for vax.  See PR#32907
     20  * for further details.
     21  */
     22 typedef	int	boolean_t;
     23 #endif
     24 #include <sys/time.h>
     25 #if !defined(__osf__)
     26 # ifdef __NetBSD__
     27 #  include <machine/lock.h>
     28 #  include <sys/mutex.h>
     29 # endif
     30 # define _KERNEL
     31 # define KERNEL
     32 # if !defined(solaris) && !defined(linux) && !defined(__sgi) && !defined(hpux)
     33 #  include <sys/file.h>
     34 # else
     35 #  ifdef solaris
     36 #   include <sys/dditypes.h>
     37 #  endif
     38 # endif
     39 # undef  _KERNEL
     40 # undef  KERNEL
     41 #endif
     42 #if !defined(solaris) && !defined(linux) && !defined(__sgi)
     43 # include <nlist.h>
     44 # include <sys/user.h>
     45 # include <sys/proc.h>
     46 #endif
     47 #if !defined(ultrix) && !defined(hpux) && !defined(linux) && \
     48     !defined(__sgi) && !defined(__osf__) && !defined(_AIX51)
     49 # include <kvm.h>
     50 #endif
     51 #ifndef	ultrix
     52 # include <sys/socket.h>
     53 #endif
     54 #if defined(solaris)
     55 # include <sys/stream.h>
     56 #else
     57 # include <sys/socketvar.h>
     58 #endif
     59 #ifdef sun
     60 #include <sys/systm.h>
     61 #include <sys/session.h>
     62 #endif
     63 #if BSD >= 199103
     64 # include <sys/sysctl.h>
     65 # include <sys/filedesc.h>
     66 # include <paths.h>
     67 #endif
     68 #include <netinet/in_systm.h>
     69 #include <sys/socket.h>
     70 #ifdef __hpux
     71 # define _NET_ROUTE_INCLUDED
     72 #endif
     73 #include <net/if.h>
     74 #if defined(linux) && (LINUX >= 0200)
     75 # include <asm/atomic.h>
     76 #endif
     77 #if !defined(linux)
     78 # if defined(__FreeBSD__)
     79 #  include "radix_ipf.h"
     80 # endif
     81 # if !defined(solaris)
     82 #  include <net/route.h>
     83 # endif
     84 #else
     85 # define __KERNEL__	/* because there's a macro not wrapped by this */
     86 # include <net/route.h>	/* in this file :-/ */
     87 #endif
     88 #include <netinet/in.h>
     89 #include <arpa/inet.h>
     90 #include <netinet/ip.h>
     91 #if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
     92 # include <sys/sysmacros.h>
     93 #endif
     94 #include <stdio.h>
     95 #include <unistd.h>
     96 #include <stdlib.h>
     97 #include <string.h>
     98 #ifdef __hpux
     99 # undef _NET_ROUTE_INCLUDED
    100 #endif
    101 #if !defined(linux)
    102 # include <netinet/ip_var.h>
    103 # if !defined(__hpux) && !defined(solaris)
    104 #  include <netinet/in_pcb.h>
    105 # endif
    106 #endif
    107 #include "ipsend.h"
    108 #if !defined(linux) && !defined(__hpux)
    109 # include <netinet/tcp_timer.h>
    110 # include <netinet/tcp_var.h>
    111 #endif
    112 #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000000)
    113 # define USE_NANOSLEEP
    114 #endif
    115 
    116 
    117 #ifdef USE_NANOSLEEP
    118 # define	PAUSE() ts.tv_sec = 0; ts.tv_nsec = 10000000; \
    119 		  (void) nanosleep(&ts, NULL)
    120 #else
    121 # define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
    122 		  (void) select(0, NULL, NULL, NULL, &tv)
    123 #endif
    124 
    125 
    126 void	ip_test1(dev, mtu, ip, gwip, ptest)
    127 	char	*dev;
    128 	int	mtu;
    129 	ip_t	*ip;
    130 	struct	in_addr	gwip;
    131 	int	ptest;
    132 {
    133 #ifdef USE_NANOSLEEP
    134 	struct	timespec ts;
    135 #else
    136 	struct	timeval	tv;
    137 #endif
    138 	udphdr_t *u;
    139 	int	nfd, i = 0, len, id = getpid();
    140 
    141 	IP_HL_A(ip, sizeof(*ip) >> 2);
    142 	IP_V_A(ip, IPVERSION);
    143 	ip->ip_tos = 0;
    144 	ip->ip_off = 0;
    145 	ip->ip_ttl = 60;
    146 	ip->ip_p = IPPROTO_UDP;
    147 	ip->ip_sum = 0;
    148 	u = (udphdr_t *)(ip + 1);
    149 	u->uh_sport = htons(1);
    150 	u->uh_dport = htons(9);
    151 	u->uh_sum = 0;
    152 	u->uh_ulen = htons(sizeof(*u) + 4);
    153 	ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen);
    154 	len = ip->ip_len;
    155 
    156 	nfd = initdevice(dev, 1);
    157 	if (nfd == -1)
    158 		return;
    159 
    160 	if (!ptest || (ptest == 1)) {
    161 		/*
    162 		 * Part1: hl < len
    163 		 */
    164 		ip->ip_id = 0;
    165 		printf("1.1. sending packets with ip_hl < ip_len\n");
    166 		for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) {
    167 			IP_HL_A(ip, i >> 2);
    168 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    169 			printf("%d\r", i);
    170 			fflush(stdout);
    171 			PAUSE();
    172 		}
    173 		putchar('\n');
    174 	}
    175 
    176 	if (!ptest || (ptest == 2)) {
    177 		/*
    178 		 * Part2: hl > len
    179 		 */
    180 		ip->ip_id = 0;
    181 		printf("1.2. sending packets with ip_hl > ip_len\n");
    182 		for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) {
    183 			IP_HL_A(ip, i >> 2);
    184 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    185 			printf("%d\r", i);
    186 			fflush(stdout);
    187 			PAUSE();
    188 		}
    189 		putchar('\n');
    190 	}
    191 
    192 	if (!ptest || (ptest == 3)) {
    193 		/*
    194 		 * Part3: v < 4
    195 		 */
    196 		ip->ip_id = 0;
    197 		printf("1.3. ip_v < 4\n");
    198 		IP_HL_A(ip, sizeof(*ip) >> 2);
    199 		for (i = 0; i < 4; i++) {
    200 			IP_V_A(ip, i);
    201 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    202 			printf("%d\r", i);
    203 			fflush(stdout);
    204 			PAUSE();
    205 		}
    206 		putchar('\n');
    207 	}
    208 
    209 	if (!ptest || (ptest == 4)) {
    210 		/*
    211 		 * Part4: v > 4
    212 		 */
    213 		ip->ip_id = 0;
    214 		printf("1.4. ip_v > 4\n");
    215 		for (i = 5; i < 16; i++) {
    216 			IP_V_A(ip, i);
    217 			(void) send_ip(nfd, 1500, ip, gwip, 1);
    218 			printf("%d\r", i);
    219 			fflush(stdout);
    220 			PAUSE();
    221 		}
    222 		putchar('\n');
    223 	}
    224 
    225 	if (!ptest || (ptest == 5)) {
    226 		/*
    227 		 * Part5: len < packet
    228 		 */
    229 		ip->ip_id = 0;
    230 		IP_V_A(ip, IPVERSION);
    231 		i = ip->ip_len + 1;
    232 		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
    233 		for (; i < (ip->ip_len * 2); i++) {
    234 			ip->ip_id = htons(id++);
    235 			ip->ip_sum = 0;
    236 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    237 			(void) send_ether(nfd, (char *)ip, i, gwip);
    238 			printf("%d\r", i);
    239 			fflush(stdout);
    240 			PAUSE();
    241 		}
    242 		putchar('\n');
    243 		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
    244 		for (i = len; i > 0; i--) {
    245 			ip->ip_id = htons(id++);
    246 			ip->ip_len = i;
    247 			ip->ip_sum = 0;
    248 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    249 			(void) send_ether(nfd, (char *)ip, len, gwip);
    250 			printf("%d\r", i);
    251 			fflush(stdout);
    252 			PAUSE();
    253 		}
    254 		putchar('\n');
    255 	}
    256 
    257 	if (!ptest || (ptest == 6)) {
    258 		/*
    259 		 * Part6: len > packet
    260 		 */
    261 		ip->ip_id = 0;
    262 		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
    263 		for (i = len + 1; i < (len * 2); i++) {
    264 			ip->ip_id = htons(id++);
    265 			ip->ip_len = i;
    266 			ip->ip_sum = 0;
    267 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    268 			(void) send_ether(nfd, (char *)ip, len, gwip);
    269 			printf("%d\r", i);
    270 			fflush(stdout);
    271 			PAUSE();
    272 		}
    273 		putchar('\n');
    274 		ip->ip_len = len;
    275 		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
    276 		for (i = len; i > 0; i--) {
    277 			ip->ip_id = htons(id++);
    278 			ip->ip_sum = 0;
    279 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
    280 			(void) send_ether(nfd, (char *)ip, i, gwip);
    281 			printf("%d\r", i);
    282 			fflush(stdout);
    283 			PAUSE();
    284 		}
    285 		putchar('\n');
    286 	}
    287 
    288 	if (!ptest || (ptest == 7)) {
    289 		/*
    290 		 * Part7: 0 length fragment
    291 		 */
    292 		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
    293 		ip->ip_id = 0;
    294 		ip->ip_len = sizeof(*ip);
    295 		ip->ip_off = htons(IP_MF);
    296 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    297 		fflush(stdout);
    298 		PAUSE();
    299 
    300 		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
    301 		ip->ip_id = 0;
    302 		ip->ip_len = sizeof(*ip);
    303 		ip->ip_off = htons(IP_MF);
    304 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    305 		fflush(stdout);
    306 		PAUSE();
    307 
    308 		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
    309 		ip->ip_id = 0;
    310 		ip->ip_len = sizeof(*ip);
    311 		ip->ip_off = htons(0xa000);
    312 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    313 		fflush(stdout);
    314 		PAUSE();
    315 
    316 		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
    317 		ip->ip_id = 0;
    318 		ip->ip_len = sizeof(*ip);
    319 		ip->ip_off = htons(0x0100);
    320 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    321 		fflush(stdout);
    322 		PAUSE();
    323 	}
    324 
    325 	if (!ptest || (ptest == 8)) {
    326 		struct	timeval	tv;
    327 
    328 		gettimeofday(&tv, NULL);
    329 		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
    330 		/*
    331 		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
    332 		 * Mark it as being ICMP (so it doesn't get junked), but
    333 		 * don't bother about the ICMP header, we're not worrying
    334 		 * about that here.
    335 		 */
    336 		ip->ip_p = IPPROTO_ICMP;
    337 		ip->ip_off = htons(IP_MF);
    338 		u->uh_dport = htons(9);
    339 		ip->ip_id = htons(id++);
    340 		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
    341 		ip->ip_len = 768 + 20 + 8;
    342 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    343 		printf("%d\r", i);
    344 
    345 		ip->ip_len = MIN(768 + 20, mtu - 68);
    346 		i = 512;
    347 		for (; i < (63 * 1024 + 768); i += 768) {
    348 			ip->ip_off = htons(IP_MF | (i >> 3));
    349 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    350 			printf("%d\r", i);
    351 			fflush(stdout);
    352 			PAUSE();
    353 		}
    354 		ip->ip_len = 896 + 20;
    355 		ip->ip_off = htons(i >> 3);
    356 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    357 		printf("%d\r", i);
    358 		putchar('\n');
    359 		fflush(stdout);
    360 
    361 		/*
    362 		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
    363 		 * Mark it as being ICMP (so it doesn't get junked), but
    364 		 * don't bother about the ICMP header, we're not worrying
    365 		 * about that here.  (Lossage here)
    366 		 */
    367 		ip->ip_p = IPPROTO_ICMP;
    368 		ip->ip_off = htons(IP_MF);
    369 		u->uh_dport = htons(9);
    370 		ip->ip_id = htons(id++);
    371 		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
    372 		ip->ip_len = 768 + 20 + 8;
    373 		if ((rand() & 0x1f) != 0) {
    374 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    375 			printf("%d\r", i);
    376 		} else
    377 			printf("skip 0\n");
    378 
    379 		ip->ip_len = MIN(768 + 20, mtu - 68);
    380 		i = 512;
    381 		for (; i < (63 * 1024 + 768); i += 768) {
    382 			ip->ip_off = htons(IP_MF | (i >> 3));
    383 			if ((rand() & 0x1f) != 0) {
    384 				(void) send_ip(nfd, mtu, ip, gwip, 1);
    385 				printf("%d\r", i);
    386 			} else
    387 				printf("skip %d\n", i);
    388 			fflush(stdout);
    389 			PAUSE();
    390 		}
    391 		ip->ip_len = 896 + 20;
    392 		ip->ip_off = htons(i >> 3);
    393 		if ((rand() & 0x1f) != 0) {
    394 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    395 			printf("%d\r", i);
    396 		} else
    397 			printf("skip\n");
    398 		putchar('\n');
    399 		fflush(stdout);
    400 
    401 		/*
    402 		 * Part8.3: 33k packet - test for not dealing with -ve length
    403 		 * Mark it as being ICMP (so it doesn't get junked), but
    404 		 * don't bother about the ICMP header, we're not worrying
    405 		 * about that here.
    406 		 */
    407 		ip->ip_p = IPPROTO_ICMP;
    408 		ip->ip_off = htons(IP_MF);
    409 		u->uh_dport = htons(9);
    410 		ip->ip_id = htons(id++);
    411 		printf("1.8.3 33k packet\n");
    412 		ip->ip_len = 768 + 20 + 8;
    413 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    414 		printf("%d\r", i);
    415 
    416 		ip->ip_len = MIN(768 + 20, mtu - 68);
    417 		i = 512;
    418 		for (; i < (32 * 1024 + 768); i += 768) {
    419 			ip->ip_off = htons(IP_MF | (i >> 3));
    420 			(void) send_ip(nfd, mtu, ip, gwip, 1);
    421 			printf("%d\r", i);
    422 			fflush(stdout);
    423 			PAUSE();
    424 		}
    425 		ip->ip_len = 896 + 20;
    426 		ip->ip_off = htons(i >> 3);
    427 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    428 		printf("%d\r", i);
    429 		putchar('\n');
    430 		fflush(stdout);
    431 	}
    432 
    433 	ip->ip_len = len;
    434 	ip->ip_off = 0;
    435 	if (!ptest || (ptest == 9)) {
    436 		/*
    437 		 * Part9: off & 0x8000 == 0x8000
    438 		 */
    439 		ip->ip_id = 0;
    440 		ip->ip_off = htons(0x8000);
    441 		printf("1.9. ip_off & 0x8000 == 0x8000\n");
    442 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    443 		fflush(stdout);
    444 		PAUSE();
    445 	}
    446 
    447 	ip->ip_off = 0;
    448 
    449 	if (!ptest || (ptest == 10)) {
    450 		/*
    451 		 * Part10: ttl = 255
    452 		 */
    453 		ip->ip_id = 0;
    454 		ip->ip_ttl = 255;
    455 		printf("1.10.0 ip_ttl = 255\n");
    456 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    457 		fflush(stdout);
    458 		PAUSE();
    459 
    460 		ip->ip_ttl = 128;
    461 		printf("1.10.1 ip_ttl = 128\n");
    462 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    463 		fflush(stdout);
    464 		PAUSE();
    465 
    466 		ip->ip_ttl = 0;
    467 		printf("1.10.2 ip_ttl = 0\n");
    468 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    469 		fflush(stdout);
    470 		PAUSE();
    471 	}
    472 
    473 	(void) close(nfd);
    474 }
    475 
    476 
    477 void	ip_test2(dev, mtu, ip, gwip, ptest)
    478 	char	*dev;
    479 	int	mtu;
    480 	ip_t	*ip;
    481 	struct	in_addr	gwip;
    482 	int	ptest;
    483 {
    484 #ifdef USE_NANOSLEEP
    485 	struct	timespec ts;
    486 #else
    487 	struct	timeval	tv;
    488 #endif
    489 	int	nfd;
    490 	u_char	*s;
    491 
    492 
    493 	nfd = initdevice(dev, 1);
    494 	if (nfd == -1)
    495 		return;
    496 
    497 	IP_HL_A(ip, 6);
    498 	ip->ip_len = IP_HL(ip) << 2;
    499 	s = (u_char *)(ip + 1);
    500 	s[IPOPT_OPTVAL] = IPOPT_NOP;
    501 	s++;
    502 	if (!ptest || (ptest == 1)) {
    503 		/*
    504 		 * Test 1: option length > packet length,
    505 		 *                header length == packet length
    506 		 */
    507 		s[IPOPT_OPTVAL] = IPOPT_TS;
    508 		s[IPOPT_OLEN] = 4;
    509 		s[IPOPT_OFFSET] = IPOPT_MINOFF;
    510 		ip->ip_p = IPPROTO_IP;
    511 		printf("2.1 option length > packet length\n");
    512 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    513 		fflush(stdout);
    514 		PAUSE();
    515 	}
    516 
    517 	IP_HL_A(ip, 7);
    518 	ip->ip_len = IP_HL(ip) << 2;
    519 	if (!ptest || (ptest == 1)) {
    520 		/*
    521 		 * Test 2: options have length = 0
    522 		 */
    523 		printf("2.2.1 option length = 0, RR\n");
    524 		s[IPOPT_OPTVAL] = IPOPT_RR;
    525 		s[IPOPT_OLEN] = 0;
    526 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    527 		fflush(stdout);
    528 		PAUSE();
    529 
    530 		printf("2.2.2 option length = 0, TS\n");
    531 		s[IPOPT_OPTVAL] = IPOPT_TS;
    532 		s[IPOPT_OLEN] = 0;
    533 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    534 		fflush(stdout);
    535 		PAUSE();
    536 
    537 		printf("2.2.3 option length = 0, SECURITY\n");
    538 		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
    539 		s[IPOPT_OLEN] = 0;
    540 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    541 		fflush(stdout);
    542 		PAUSE();
    543 
    544 		printf("2.2.4 option length = 0, LSRR\n");
    545 		s[IPOPT_OPTVAL] = IPOPT_LSRR;
    546 		s[IPOPT_OLEN] = 0;
    547 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    548 		fflush(stdout);
    549 		PAUSE();
    550 
    551 		printf("2.2.5 option length = 0, SATID\n");
    552 		s[IPOPT_OPTVAL] = IPOPT_SATID;
    553 		s[IPOPT_OLEN] = 0;
    554 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    555 		fflush(stdout);
    556 		PAUSE();
    557 
    558 		printf("2.2.6 option length = 0, SSRR\n");
    559 		s[IPOPT_OPTVAL] = IPOPT_SSRR;
    560 		s[IPOPT_OLEN] = 0;
    561 		(void) send_ip(nfd, mtu, ip, gwip, 1);
    562 		fflush(stdout);
    563 		PAUSE();
    564 	}
    565 
    566 	(void) close(nfd);
    567 }
    568 
    569 
    570 /*
    571  * test 3 (ICMP)
    572  */
    573 void	ip_test3(dev, mtu, ip, gwip, ptest)
    574 	char	*dev;
    575 	int	mtu;
    576 	ip_t	*ip;
    577 	struct	in_addr	gwip;
    578 	int	ptest;
    579 {
    580 	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
    581 	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
    582 #ifdef USE_NANOSLEEP
    583 	struct	timespec ts;
    584 #else
    585 	struct	timeval	tv;
    586 #endif
    587 	struct	icmp	*icp;
    588 	int	nfd, i;
    589 
    590 	IP_HL_A(ip, sizeof(*ip) >> 2);
    591 	IP_V_A(ip, IPVERSION);
    592 	ip->ip_tos = 0;
    593 	ip->ip_off = 0;
    594 	ip->ip_ttl = 60;
    595 	ip->ip_p = IPPROTO_ICMP;
    596 	ip->ip_sum = 0;
    597 	ip->ip_len = sizeof(*ip) + sizeof(*icp);
    598 	icp = (struct icmp *)((char *)ip + (IP_HL(ip) << 2));
    599 
    600 	nfd = initdevice(dev, 1);
    601 	if (nfd == -1)
    602 		return;
    603 
    604 	if (!ptest || (ptest == 1)) {
    605 		/*
    606 		 * Type 0 - 31, 255, code = 0
    607 		 */
    608 		bzero((char *)icp, sizeof(*icp));
    609 		for (i = 0; i < 32; i++) {
    610 			icp->icmp_type = i;
    611 			(void) send_icmp(nfd, mtu, ip, gwip);
    612 			PAUSE();
    613 			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
    614 		}
    615 		icp->icmp_type = 255;
    616 		(void) send_icmp(nfd, mtu, ip, gwip);
    617 		PAUSE();
    618 		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
    619 		putchar('\n');
    620 	}
    621 
    622 	if (!ptest || (ptest == 2)) {
    623 		/*
    624 		 * Type 3, code = 0 - 31
    625 		 */
    626 		icp->icmp_type = 3;
    627 		for (i = 0; i < 32; i++) {
    628 			icp->icmp_code = i;
    629 			(void) send_icmp(nfd, mtu, ip, gwip);
    630 			PAUSE();
    631 			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
    632 		}
    633 	}
    634 
    635 	if (!ptest || (ptest == 3)) {
    636 		/*
    637 		 * Type 4, code = 0,127,128,255
    638 		 */
    639 		icp->icmp_type = 4;
    640 		icp->icmp_code = 0;
    641 		(void) send_icmp(nfd, mtu, ip, gwip);
    642 		PAUSE();
    643 		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
    644 		icp->icmp_code = 127;
    645 		(void) send_icmp(nfd, mtu, ip, gwip);
    646 		PAUSE();
    647 		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
    648 		icp->icmp_code = 128;
    649 		(void) send_icmp(nfd, mtu, ip, gwip);
    650 		PAUSE();
    651 		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
    652 		icp->icmp_code = 255;
    653 		(void) send_icmp(nfd, mtu, ip, gwip);
    654 		PAUSE();
    655 		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
    656 	}
    657 
    658 	if (!ptest || (ptest == 4)) {
    659 		/*
    660 		 * Type 5, code = 0,127,128,255
    661 		 */
    662 		icp->icmp_type = 5;
    663 		icp->icmp_code = 0;
    664 		(void) send_icmp(nfd, mtu, ip, gwip);
    665 		PAUSE();
    666 		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
    667 		icp->icmp_code = 127;
    668 		(void) send_icmp(nfd, mtu, ip, gwip);
    669 		PAUSE();
    670 		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
    671 		icp->icmp_code = 128;
    672 		(void) send_icmp(nfd, mtu, ip, gwip);
    673 		PAUSE();
    674 		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
    675 		icp->icmp_code = 255;
    676 		(void) send_icmp(nfd, mtu, ip, gwip);
    677 		PAUSE();
    678 		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
    679 	}
    680 
    681 	if (!ptest || (ptest == 5)) {
    682 		/*
    683 		 * Type 8-10;13-18, code - 0,127,128,255
    684 		 */
    685 		for (i = 0; ict1[i]; i++) {
    686 			icp->icmp_type = ict1[i];
    687 			icp->icmp_code = 0;
    688 			(void) send_icmp(nfd, mtu, ip, gwip);
    689 			PAUSE();
    690 			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
    691 				i * 4);
    692 			icp->icmp_code = 127;
    693 			(void) send_icmp(nfd, mtu, ip, gwip);
    694 			PAUSE();
    695 			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
    696 				i * 4 + 1);
    697 			icp->icmp_code = 128;
    698 			(void) send_icmp(nfd, mtu, ip, gwip);
    699 			PAUSE();
    700 			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
    701 				i * 4 + 2);
    702 			icp->icmp_code = 255;
    703 			(void) send_icmp(nfd, mtu, ip, gwip);
    704 			PAUSE();
    705 			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
    706 				i * 4 + 3);
    707 		}
    708 		putchar('\n');
    709 	}
    710 
    711 	if (!ptest || (ptest == 6)) {
    712 		/*
    713 		 * Type 12, code - 0,127,128,129,255
    714 		 */
    715 		icp->icmp_type = 12;
    716 		icp->icmp_code = 0;
    717 		(void) send_icmp(nfd, mtu, ip, gwip);
    718 		PAUSE();
    719 		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
    720 		icp->icmp_code = 127;
    721 		(void) send_icmp(nfd, mtu, ip, gwip);
    722 		PAUSE();
    723 		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
    724 		icp->icmp_code = 128;
    725 		(void) send_icmp(nfd, mtu, ip, gwip);
    726 		PAUSE();
    727 		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
    728 		icp->icmp_code = 129;
    729 		(void) send_icmp(nfd, mtu, ip, gwip);
    730 		PAUSE();
    731 		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
    732 		icp->icmp_code = 255;
    733 		(void) send_icmp(nfd, mtu, ip, gwip);
    734 		PAUSE();
    735 		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
    736 		putchar('\n');
    737 	}
    738 
    739 	if (!ptest || (ptest == 7)) {
    740 		/*
    741 		 * Type 3;9-10;13-14;17-18 - shorter packets
    742 		 */
    743 		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
    744 		for (i = 0; ict2[i]; i++) {
    745 			icp->icmp_type = ict1[i];
    746 			icp->icmp_code = 0;
    747 			(void) send_icmp(nfd, mtu, ip, gwip);
    748 			PAUSE();
    749 			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
    750 				i * 4, icp->icmp_type);
    751 			icp->icmp_code = 127;
    752 			(void) send_icmp(nfd, mtu, ip, gwip);
    753 			PAUSE();
    754 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
    755 				i * 4 + 1, icp->icmp_type);
    756 			icp->icmp_code = 128;
    757 			(void) send_icmp(nfd, mtu, ip, gwip);
    758 			PAUSE();
    759 			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
    760 				i * 4 + 2, icp->icmp_type);
    761 			icp->icmp_code = 255;
    762 			(void) send_icmp(nfd, mtu, ip, gwip);
    763 			PAUSE();
    764 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
    765 				i * 4 + 3, icp->icmp_type);
    766 		}
    767 		putchar('\n');
    768 	}
    769 }
    770 
    771 
    772 /* Perform test 4 (UDP) */
    773 
    774 void	ip_test4(dev, mtu, ip, gwip, ptest)
    775 	char	*dev;
    776 	int	mtu;
    777 	ip_t	*ip;
    778 	struct	in_addr	gwip;
    779 	int	ptest;
    780 {
    781 #ifdef USE_NANOSLEEP
    782 	struct	timespec ts;
    783 #else
    784 	struct	timeval	tv;
    785 #endif
    786 	udphdr_t	*u;
    787 	int	nfd, i;
    788 
    789 
    790 	IP_HL_A(ip, sizeof(*ip) >> 2);
    791 	IP_V_A(ip, IPVERSION);
    792 	ip->ip_tos = 0;
    793 	ip->ip_off = 0;
    794 	ip->ip_ttl = 60;
    795 	ip->ip_p = IPPROTO_UDP;
    796 	ip->ip_sum = 0;
    797 	u = (udphdr_t *)((char *)ip + (IP_HL(ip) << 2));
    798 	u->uh_sport = htons(1);
    799 	u->uh_dport = htons(1);
    800 	u->uh_ulen = htons(sizeof(*u) + 4);
    801 
    802 	nfd = initdevice(dev, 1);
    803 	if (nfd == -1)
    804 		return;
    805 
    806 	if (!ptest || (ptest == 1)) {
    807 		/*
    808 		 * Test 1. ulen > packet
    809 		 */
    810 		u->uh_ulen = htons(sizeof(*u) + 4);
    811 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    812 		printf("4.1 UDP uh_ulen > packet size - short packets\n");
    813 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
    814 			u->uh_ulen = htons(i);
    815 			(void) send_udp(nfd, 1500, ip, gwip);
    816 			printf("%d\r", i);
    817 			fflush(stdout);
    818 			PAUSE();
    819 		}
    820 		putchar('\n');
    821 	}
    822 
    823 	if (!ptest || (ptest == 2)) {
    824 		/*
    825 		 * Test 2. ulen < packet
    826 		 */
    827 		u->uh_ulen = htons(sizeof(*u) + 4);
    828 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    829 		printf("4.2 UDP uh_ulen < packet size - short packets\n");
    830 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
    831 			ip->ip_len = i;
    832 			(void) send_udp(nfd, 1500, ip, gwip);
    833 			printf("%d\r", i);
    834 			fflush(stdout);
    835 			PAUSE();
    836 		}
    837 		putchar('\n');
    838 	}
    839 
    840 	if (!ptest || (ptest == 3)) {
    841 		/*
    842 		 * Test 3: sport = 0, sport = 1, sport = 32767
    843 		 *         sport = 32768, sport = 65535
    844 		 */
    845 		u->uh_ulen = sizeof(*u) + 4;
    846 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    847 		printf("4.3.1 UDP sport = 0\n");
    848 		u->uh_sport = 0;
    849 		(void) send_udp(nfd, 1500, ip, gwip);
    850 		printf("0\n");
    851 		fflush(stdout);
    852 		PAUSE();
    853 		printf("4.3.2 UDP sport = 1\n");
    854 		u->uh_sport = htons(1);
    855 		(void) send_udp(nfd, 1500, ip, gwip);
    856 		printf("1\n");
    857 		fflush(stdout);
    858 		PAUSE();
    859 		printf("4.3.3 UDP sport = 32767\n");
    860 		u->uh_sport = htons(32767);
    861 		(void) send_udp(nfd, 1500, ip, gwip);
    862 		printf("32767\n");
    863 		fflush(stdout);
    864 		PAUSE();
    865 		printf("4.3.4 UDP sport = 32768\n");
    866 		u->uh_sport = htons(32768);
    867 		(void) send_udp(nfd, 1500, ip, gwip);
    868 		printf("32768\n");
    869 		putchar('\n');
    870 		fflush(stdout);
    871 		PAUSE();
    872 		printf("4.3.5 UDP sport = 65535\n");
    873 		u->uh_sport = htons(65535);
    874 		(void) send_udp(nfd, 1500, ip, gwip);
    875 		printf("65535\n");
    876 		fflush(stdout);
    877 		PAUSE();
    878 	}
    879 
    880 	if (!ptest || (ptest == 4)) {
    881 		/*
    882 		 * Test 4: dport = 0, dport = 1, dport = 32767
    883 		 *         dport = 32768, dport = 65535
    884 		 */
    885 		u->uh_ulen = ntohs(sizeof(*u) + 4);
    886 		u->uh_sport = htons(1);
    887 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
    888 		printf("4.4.1 UDP dport = 0\n");
    889 		u->uh_dport = 0;
    890 		(void) send_udp(nfd, 1500, ip, gwip);
    891 		printf("0\n");
    892 		fflush(stdout);
    893 		PAUSE();
    894 		printf("4.4.2 UDP dport = 1\n");
    895 		u->uh_dport = htons(1);
    896 		(void) send_udp(nfd, 1500, ip, gwip);
    897 		printf("1\n");
    898 		fflush(stdout);
    899 		PAUSE();
    900 		printf("4.4.3 UDP dport = 32767\n");
    901 		u->uh_dport = htons(32767);
    902 		(void) send_udp(nfd, 1500, ip, gwip);
    903 		printf("32767\n");
    904 		fflush(stdout);
    905 		PAUSE();
    906 		printf("4.4.4 UDP dport = 32768\n");
    907 		u->uh_dport = htons(32768);
    908 		(void) send_udp(nfd, 1500, ip, gwip);
    909 		printf("32768\n");
    910 		fflush(stdout);
    911 		PAUSE();
    912 		printf("4.4.5 UDP dport = 65535\n");
    913 		u->uh_dport = htons(65535);
    914 		(void) send_udp(nfd, 1500, ip, gwip);
    915 		printf("65535\n");
    916 		fflush(stdout);
    917 		PAUSE();
    918 	}
    919 
    920 	if (!ptest || (ptest == 5)) {
    921 		/*
    922 		 * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) +
    923 		 * sizeof(ip_t)
    924 		 */
    925 		printf("4.5 UDP 20 <= MTU <= 32\n");
    926 		for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) {
    927 			(void) send_udp(nfd, i, ip, gwip);
    928 			printf("%d\r", i);
    929 			fflush(stdout);
    930 			PAUSE();
    931 		}
    932 		putchar('\n');
    933 	}
    934 }
    935 
    936 
    937 /* Perform test 5 (TCP) */
    938 
    939 void	ip_test5(dev, mtu, ip, gwip, ptest)
    940 	char	*dev;
    941 	int	mtu;
    942 	ip_t	*ip;
    943 	struct	in_addr	gwip;
    944 	int	ptest;
    945 {
    946 #ifdef USE_NANOSLEEP
    947 	struct	timespec ts;
    948 #else
    949 	struct	timeval	tv;
    950 #endif
    951 	tcphdr_t *t;
    952 	int	nfd, i;
    953 
    954 	t = (tcphdr_t *)((char *)ip + (IP_HL(ip) << 2));
    955 #if !defined(linux) && !defined(__osf__)
    956 	t->th_x2 = 0;
    957 #endif
    958 	TCP_OFF_A(t, 0);
    959 	t->th_sport = htons(1);
    960 	t->th_dport = htons(1);
    961 	t->th_win = htons(4096);
    962 	t->th_urp = 0;
    963 	t->th_sum = 0;
    964 	t->th_seq = htonl(1);
    965 	t->th_ack = 0;
    966 	ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
    967 
    968 	nfd = initdevice(dev, 1);
    969 	if (nfd == -1)
    970 		return;
    971 
    972 	if (!ptest || (ptest == 1)) {
    973 		/*
    974 		 * Test 1: flags variations, 0 - 3f
    975 		 */
    976 		TCP_OFF_A(t, sizeof(*t) >> 2);
    977 		printf("5.1 Test TCP flag combinations\n");
    978 		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
    979 		     i++) {
    980 			t->th_flags = i;
    981 			(void) send_tcp(nfd, mtu, ip, gwip);
    982 			printf("%d\r", i);
    983 			fflush(stdout);
    984 			PAUSE();
    985 		}
    986 		putchar('\n');
    987 	}
    988 
    989 	if (!ptest || (ptest == 2)) {
    990 		t->th_flags = TH_SYN;
    991 		/*
    992 		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
    993 		 *         seq = 0xa000000, seq = 0xffffffff
    994 		 */
    995 		printf("5.2.1 TCP seq = 0\n");
    996 		t->th_seq = htonl(0);
    997 		(void) send_tcp(nfd, mtu, ip, gwip);
    998 		fflush(stdout);
    999 		PAUSE();
   1000 
   1001 		printf("5.2.2 TCP seq = 1\n");
   1002 		t->th_seq = htonl(1);
   1003 		(void) send_tcp(nfd, mtu, ip, gwip);
   1004 		fflush(stdout);
   1005 		PAUSE();
   1006 
   1007 		printf("5.2.3 TCP seq = 0x7fffffff\n");
   1008 		t->th_seq = htonl(0x7fffffff);
   1009 		(void) send_tcp(nfd, mtu, ip, gwip);
   1010 		fflush(stdout);
   1011 		PAUSE();
   1012 
   1013 		printf("5.2.4 TCP seq = 0x80000000\n");
   1014 		t->th_seq = htonl(0x80000000);
   1015 		(void) send_tcp(nfd, mtu, ip, gwip);
   1016 		fflush(stdout);
   1017 		PAUSE();
   1018 
   1019 		printf("5.2.5 TCP seq = 0xc0000000\n");
   1020 		t->th_seq = htonl(0xc0000000);
   1021 		(void) send_tcp(nfd, mtu, ip, gwip);
   1022 		fflush(stdout);
   1023 		PAUSE();
   1024 
   1025 		printf("5.2.6 TCP seq = 0xffffffff\n");
   1026 		t->th_seq = htonl(0xffffffff);
   1027 		(void) send_tcp(nfd, mtu, ip, gwip);
   1028 		fflush(stdout);
   1029 		PAUSE();
   1030 	}
   1031 
   1032 	if (!ptest || (ptest == 3)) {
   1033 		t->th_flags = TH_ACK;
   1034 		/*
   1035 		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
   1036 		 *         ack = 0xa000000, ack = 0xffffffff
   1037 		 */
   1038 		printf("5.3.1 TCP ack = 0\n");
   1039 		t->th_ack = 0;
   1040 		(void) send_tcp(nfd, mtu, ip, gwip);
   1041 		fflush(stdout);
   1042 		PAUSE();
   1043 
   1044 		printf("5.3.2 TCP ack = 1\n");
   1045 		t->th_ack = htonl(1);
   1046 		(void) send_tcp(nfd, mtu, ip, gwip);
   1047 		fflush(stdout);
   1048 		PAUSE();
   1049 
   1050 		printf("5.3.3 TCP ack = 0x7fffffff\n");
   1051 		t->th_ack = htonl(0x7fffffff);
   1052 		(void) send_tcp(nfd, mtu, ip, gwip);
   1053 		fflush(stdout);
   1054 		PAUSE();
   1055 
   1056 		printf("5.3.4 TCP ack = 0x80000000\n");
   1057 		t->th_ack = htonl(0x80000000);
   1058 		(void) send_tcp(nfd, mtu, ip, gwip);
   1059 		fflush(stdout);
   1060 		PAUSE();
   1061 
   1062 		printf("5.3.5 TCP ack = 0xc0000000\n");
   1063 		t->th_ack = htonl(0xc0000000);
   1064 		(void) send_tcp(nfd, mtu, ip, gwip);
   1065 		fflush(stdout);
   1066 		PAUSE();
   1067 
   1068 		printf("5.3.6 TCP ack = 0xffffffff\n");
   1069 		t->th_ack = htonl(0xffffffff);
   1070 		(void) send_tcp(nfd, mtu, ip, gwip);
   1071 		fflush(stdout);
   1072 		PAUSE();
   1073 	}
   1074 
   1075 	if (!ptest || (ptest == 4)) {
   1076 		t->th_flags = TH_SYN;
   1077 		/*
   1078 		 * Test 4: win = 0, win = 32768, win = 65535
   1079 		 */
   1080 		printf("5.4.1 TCP win = 0\n");
   1081 		t->th_seq = htonl(0);
   1082 		(void) send_tcp(nfd, mtu, ip, gwip);
   1083 		fflush(stdout);
   1084 		PAUSE();
   1085 
   1086 		printf("5.4.2 TCP win = 32768\n");
   1087 		t->th_seq = htonl(0x7fff);
   1088 		(void) send_tcp(nfd, mtu, ip, gwip);
   1089 		fflush(stdout);
   1090 		PAUSE();
   1091 
   1092 		printf("5.4.3 TCP win = 65535\n");
   1093 		t->th_win = htons(0xffff);
   1094 		(void) send_tcp(nfd, mtu, ip, gwip);
   1095 		fflush(stdout);
   1096 		PAUSE();
   1097 	}
   1098 
   1099 #if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \
   1100     !defined(__sgi) && !defined(__hpux) && !defined(__osf__)
   1101 	{
   1102 	struct tcpcb *tcbp, tcb;
   1103 	struct tcpiphdr ti;
   1104 	struct sockaddr_in sin;
   1105 	int fd;
   1106 	socklen_t slen;
   1107 
   1108 	bzero((char *)&sin, sizeof(sin));
   1109 
   1110 	for (i = 1; i < 63; i++) {
   1111 		fd = socket(AF_INET, SOCK_STREAM, 0);
   1112 		bzero((char *)&sin, sizeof(sin));
   1113 		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
   1114 		sin.sin_port = htons(i);
   1115 		sin.sin_family = AF_INET;
   1116 		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
   1117 			break;
   1118 		close(fd);
   1119 	}
   1120 
   1121 	if (i == 63) {
   1122 		printf("Couldn't open a TCP socket between ports 1 and 63\n");
   1123 		printf("to host %s for test 5 and 6 - skipping.\n",
   1124 			inet_ntoa(ip->ip_dst));
   1125 		goto skip_five_and_six;
   1126 	}
   1127 
   1128 	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
   1129 	t->th_dport = htons(i);
   1130 	slen = sizeof(sin);
   1131 	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
   1132 		t->th_sport = sin.sin_port;
   1133 	if (!(tcbp = find_tcp(fd, &ti))) {
   1134 		printf("Can't find PCB\n");
   1135 		goto skip_five_and_six;
   1136 	}
   1137 	KMCPY(&tcb, tcbp, sizeof(tcb));
   1138 	ti.ti_win = tcb.rcv_adv;
   1139 	ti.ti_seq = htonl(tcb.snd_nxt - 1);
   1140 	ti.ti_ack = tcb.rcv_nxt;
   1141 
   1142 	if (!ptest || (ptest == 5)) {
   1143 		/*
   1144 		 * Test 5: urp
   1145 		 */
   1146 		t->th_flags = TH_ACK|TH_URG;
   1147 		printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n",
   1148 			ntohs(t->th_sport), ntohs(t->th_dport));
   1149 		t->th_urp = htons(1);
   1150 		(void) send_tcp(nfd, mtu, ip, gwip);
   1151 		PAUSE();
   1152 
   1153 		t->th_seq = htonl(tcb.snd_nxt);
   1154 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1;
   1155 		t->th_urp = htons(0x7fff);
   1156 		(void) send_tcp(nfd, mtu, ip, gwip);
   1157 		PAUSE();
   1158 		t->th_urp = htons(0x8000);
   1159 		(void) send_tcp(nfd, mtu, ip, gwip);
   1160 		PAUSE();
   1161 		t->th_urp = htons(0xffff);
   1162 		(void) send_tcp(nfd, mtu, ip, gwip);
   1163 		PAUSE();
   1164 		t->th_urp = 0;
   1165 		t->th_flags &= ~TH_URG;
   1166 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
   1167 	}
   1168 
   1169 	if (!ptest || (ptest == 6)) {
   1170 		/*
   1171 		 * Test 6: data offset, off = 0, off is inside, off is outside
   1172 		 */
   1173 		t->th_flags = TH_ACK;
   1174 		printf("5.6.1 TCP off = 1-15, len = 40\n");
   1175 		for (i = 1; i < 16; i++) {
   1176 			TCP_OFF_A(t, ntohs(i));
   1177 			(void) send_tcp(nfd, mtu, ip, gwip);
   1178 			printf("%d\r", i);
   1179 			fflush(stdout);
   1180 			PAUSE();
   1181 		}
   1182 		putchar('\n');
   1183 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
   1184 	}
   1185 
   1186 	(void) close(fd);
   1187 	}
   1188 skip_five_and_six:
   1189 #endif
   1190 	t->th_seq = htonl(1);
   1191 	t->th_ack = htonl(1);
   1192 	TCP_OFF_A(t, 0);
   1193 
   1194 	if (!ptest || (ptest == 7)) {
   1195 		t->th_flags = TH_SYN;
   1196 		/*
   1197 		 * Test 7: sport = 0, sport = 1, sport = 32767
   1198 		 *         sport = 32768, sport = 65535
   1199 		 */
   1200 		printf("5.7.1 TCP sport = 0\n");
   1201 		t->th_sport = 0;
   1202 		(void) send_tcp(nfd, mtu, ip, gwip);
   1203 		fflush(stdout);
   1204 		PAUSE();
   1205 
   1206 		printf("5.7.2 TCP sport = 1\n");
   1207 		t->th_sport = htons(1);
   1208 		(void) send_tcp(nfd, mtu, ip, gwip);
   1209 		fflush(stdout);
   1210 		PAUSE();
   1211 
   1212 		printf("5.7.3 TCP sport = 32767\n");
   1213 		t->th_sport = htons(32767);
   1214 		(void) send_tcp(nfd, mtu, ip, gwip);
   1215 		fflush(stdout);
   1216 		PAUSE();
   1217 
   1218 		printf("5.7.4 TCP sport = 32768\n");
   1219 		t->th_sport = htons(32768);
   1220 		(void) send_tcp(nfd, mtu, ip, gwip);
   1221 		fflush(stdout);
   1222 		PAUSE();
   1223 
   1224 		printf("5.7.5 TCP sport = 65535\n");
   1225 		t->th_sport = htons(65535);
   1226 		(void) send_tcp(nfd, mtu, ip, gwip);
   1227 		fflush(stdout);
   1228 		PAUSE();
   1229 	}
   1230 
   1231 	if (!ptest || (ptest == 8)) {
   1232 		t->th_sport = htons(1);
   1233 		t->th_flags = TH_SYN;
   1234 		/*
   1235 		 * Test 8: dport = 0, dport = 1, dport = 32767
   1236 		 *         dport = 32768, dport = 65535
   1237 		 */
   1238 		printf("5.8.1 TCP dport = 0\n");
   1239 		t->th_dport = 0;
   1240 		(void) send_tcp(nfd, mtu, ip, gwip);
   1241 		fflush(stdout);
   1242 		PAUSE();
   1243 
   1244 		printf("5.8.2 TCP dport = 1\n");
   1245 		t->th_dport = htons(1);
   1246 		(void) send_tcp(nfd, mtu, ip, gwip);
   1247 		fflush(stdout);
   1248 		PAUSE();
   1249 
   1250 		printf("5.8.3 TCP dport = 32767\n");
   1251 		t->th_dport = htons(32767);
   1252 		(void) send_tcp(nfd, mtu, ip, gwip);
   1253 		fflush(stdout);
   1254 		PAUSE();
   1255 
   1256 		printf("5.8.4 TCP dport = 32768\n");
   1257 		t->th_dport = htons(32768);
   1258 		(void) send_tcp(nfd, mtu, ip, gwip);
   1259 		fflush(stdout);
   1260 		PAUSE();
   1261 
   1262 		printf("5.8.5 TCP dport = 65535\n");
   1263 		t->th_dport = htons(65535);
   1264 		(void) send_tcp(nfd, mtu, ip, gwip);
   1265 		fflush(stdout);
   1266 		PAUSE();
   1267 	}
   1268 
   1269 	/* LAND attack - self connect, so make src & dst ip/port the same */
   1270 	if (!ptest || (ptest == 9)) {
   1271 		printf("5.9 TCP LAND attack. sport = 25, dport = 25\n");
   1272 		/* chose SMTP port 25 */
   1273 		t->th_sport = htons(25);
   1274 		t->th_dport = htons(25);
   1275 		t->th_flags = TH_SYN;
   1276 		ip->ip_src = ip->ip_dst;
   1277 		(void) send_tcp(nfd, mtu, ip, gwip);
   1278 		fflush(stdout);
   1279 		PAUSE();
   1280 	}
   1281 
   1282 	/* TCP options header checking */
   1283 	/* 0 length options, etc */
   1284 }
   1285 
   1286 
   1287 /* Perform test 6 (exhaust mbuf test) */
   1288 
   1289 void	ip_test6(dev, mtu, ip, gwip, ptest)
   1290 	char	*dev;
   1291 	int	mtu;
   1292 	ip_t	*ip;
   1293 	struct	in_addr	gwip;
   1294 	int	ptest;
   1295 {
   1296 #ifdef USE_NANOSLEEP
   1297 	struct	timespec ts;
   1298 #else
   1299 	struct	timeval	tv;
   1300 #endif
   1301 	udphdr_t *u;
   1302 	int	nfd, i, j, k;
   1303 
   1304 	IP_V_A(ip, IPVERSION);
   1305 	ip->ip_tos = 0;
   1306 	ip->ip_off = 0;
   1307 	ip->ip_ttl = 60;
   1308 	ip->ip_p = IPPROTO_UDP;
   1309 	ip->ip_sum = 0;
   1310 	u = (udphdr_t *)(ip + 1);
   1311 	u->uh_sport = htons(1);
   1312 	u->uh_dport = htons(9);
   1313 	u->uh_sum = 0;
   1314 
   1315 	nfd = initdevice(dev, 1);
   1316 	if (nfd == -1)
   1317 		return;
   1318 
   1319 	u->uh_ulen = htons(7168);
   1320 
   1321 	printf("6. Exhaustive mbuf test.\n");
   1322 	printf("   Send 7k packet in 768 & 128 byte fragments, 128 times.\n");
   1323 	printf("   Total of around 8,900 packets\n");
   1324 	for (i = 0; i < 128; i++) {
   1325 		/*
   1326 		 * First send the entire packet in 768 byte chunks.
   1327 		 */
   1328 		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
   1329 		IP_HL_A(ip, sizeof(*ip) >> 2);
   1330 		ip->ip_off = htons(IP_MF);
   1331 		(void) send_ip(nfd, 1500, ip, gwip, 1);
   1332 		printf("%d %d\r", i, 0);
   1333 		fflush(stdout);
   1334 		PAUSE();
   1335 		/*
   1336 		 * And again using 128 byte chunks.
   1337 		 */
   1338 		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
   1339 		ip->ip_off = htons(IP_MF);
   1340 		(void) send_ip(nfd, 1500, ip, gwip, 1);
   1341 		printf("%d %d\r", i, 0);
   1342 		fflush(stdout);
   1343 		PAUSE();
   1344 
   1345 		for (j = 768; j < 3584; j += 768) {
   1346 			ip->ip_len = sizeof(*ip) + 768;
   1347 			ip->ip_off = htons(IP_MF|(j>>3));
   1348 			(void) send_ip(nfd, 1500, ip, gwip, 1);
   1349 			printf("%d %d\r", i, j);
   1350 			fflush(stdout);
   1351 			PAUSE();
   1352 
   1353 			ip->ip_len = sizeof(*ip) + 128;
   1354 			for (k = j - 768; k < j; k += 128) {
   1355 				ip->ip_off = htons(IP_MF|(k>>3));
   1356 				(void) send_ip(nfd, 1500, ip, gwip, 1);
   1357 				printf("%d %d\r", i, k);
   1358 				fflush(stdout);
   1359 				PAUSE();
   1360 			}
   1361 		}
   1362 	}
   1363 	putchar('\n');
   1364 }
   1365 
   1366 
   1367 /* Perform test 7 (random packets) */
   1368 
   1369 static	u_long	tbuf[64];
   1370 
   1371 void	ip_test7(dev, mtu, ip, gwip, ptest)
   1372 	char	*dev;
   1373 	int	mtu;
   1374 	ip_t	*ip;
   1375 	struct	in_addr	gwip;
   1376 	int	ptest;
   1377 {
   1378 	ip_t	*pip;
   1379 #ifdef USE_NANOSLEEP
   1380 	struct	timespec ts;
   1381 #else
   1382 	struct	timeval	tv;
   1383 #endif
   1384 	int	nfd, i, j;
   1385 	u_char	*s;
   1386 
   1387 	nfd = initdevice(dev, 1);
   1388 	if (nfd == -1)
   1389 		return;
   1390 
   1391 	pip = (ip_t *)tbuf;
   1392 
   1393 	srand(time(NULL) ^ (getpid() * getppid()));
   1394 
   1395 	printf("7. send 1024 random IP packets.\n");
   1396 
   1397 	for (i = 0; i < 512; i++) {
   1398 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
   1399 			*s = (rand() >> 13) & 0xff;
   1400 		IP_V_A(pip, IPVERSION);
   1401 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
   1402 		      sizeof(struct in_addr));
   1403 		pip->ip_sum = 0;
   1404 		pip->ip_len &= 0xff;
   1405 		(void) send_ip(nfd, mtu, pip, gwip, 0);
   1406 		printf("%d\r", i);
   1407 		fflush(stdout);
   1408 		PAUSE();
   1409 	}
   1410 	putchar('\n');
   1411 
   1412 	for (i = 0; i < 512; i++) {
   1413 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
   1414 			*s = (rand() >> 13) & 0xff;
   1415 		IP_V_A(pip, IPVERSION);
   1416 		pip->ip_off &= htons(0xc000);
   1417 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
   1418 		      sizeof(struct in_addr));
   1419 		pip->ip_sum = 0;
   1420 		pip->ip_len &= 0xff;
   1421 		(void) send_ip(nfd, mtu, pip, gwip, 0);
   1422 		printf("%d\r", i);
   1423 		fflush(stdout);
   1424 		PAUSE();
   1425 	}
   1426 	putchar('\n');
   1427 }
   1428