iptests.c revision 26119
122514Sdarrenr/*
222514Sdarrenr * (C)opyright 1993, 1994, 1995 by Darren Reed.
322514Sdarrenr *
422514Sdarrenr * This code may be freely distributed as long as it retains this notice
522514Sdarrenr * and is not changed in any way.  The author accepts no responsibility
622514Sdarrenr * for the use of this software.  I hate legaleese, don't you ?
722514Sdarrenr */
822514Sdarrenr#if !defined(lint) && defined(LIBC_SCCS)
922514Sdarrenrstatic	char	sccsid[] = "%W% %G% (C)1995 Darren Reed";
1022514Sdarrenr#endif
1122514Sdarrenr#include <stdio.h>
1222514Sdarrenr#include <unistd.h>
1322514Sdarrenr#include <stdlib.h>
1422514Sdarrenr#include <string.h>
1522514Sdarrenr#include <sys/types.h>
1622514Sdarrenr#include <sys/time.h>
1722514Sdarrenr#include <sys/param.h>
1822514Sdarrenr#if !defined(solaris)
1922514Sdarrenr# define _KERNEL
2022514Sdarrenr# define KERNEL
2122514Sdarrenr# include <sys/file.h>
2222514Sdarrenr# undef  _KERNEL
2322514Sdarrenr# undef  KERNEL
2422514Sdarrenr# include <nlist.h>
2522514Sdarrenr# include <sys/user.h>
2622514Sdarrenr# include <sys/proc.h>
2722514Sdarrenr#endif
2822514Sdarrenr#include <kvm.h>
2922514Sdarrenr#include <sys/socket.h>
3026119Sdarrenr#if defined(solaris)
3126119Sdarrenr# include <sys/stream.h>
3226119Sdarrenr#endif
3322514Sdarrenr#include <sys/socketvar.h>
3422514Sdarrenr#ifdef sun
3522514Sdarrenr#include <sys/systm.h>
3622514Sdarrenr#include <sys/session.h>
3722514Sdarrenr#endif
3822514Sdarrenr#if BSD >= 199103
3922514Sdarrenr#include <sys/sysctl.h>
4022514Sdarrenr#include <sys/filedesc.h>
4122514Sdarrenr#include <paths.h>
4222514Sdarrenr#endif
4322514Sdarrenr#include <netinet/in_systm.h>
4422514Sdarrenr#include <sys/socket.h>
4522514Sdarrenr#include <net/if.h>
4622514Sdarrenr#include <net/route.h>
4722514Sdarrenr#include <netinet/in.h>
4822514Sdarrenr#include <arpa/inet.h>
4922514Sdarrenr#include <netinet/ip.h>
5022514Sdarrenr#include <netinet/tcp.h>
5122514Sdarrenr#include <netinet/udp.h>
5222514Sdarrenr#include <netinet/ip_icmp.h>
5322514Sdarrenr#include <netinet/if_ether.h>
5422514Sdarrenr#include <netinet/ip_var.h>
5522514Sdarrenr#include <netinet/in_pcb.h>
5622514Sdarrenr#include <netinet/tcp_timer.h>
5722514Sdarrenr#include <netinet/tcp_var.h>
5822514Sdarrenr# if defined(__SVR4) || defined(__svr4__)
5922514Sdarrenr#include <sys/sysmacros.h>
6022514Sdarrenr# endif
6124583Sdarrenr#include "ipsend.h"
6222514Sdarrenr
6324583Sdarrenr
6422514Sdarrenr#define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
6522514Sdarrenr		  (void) select(0, NULL, NULL, NULL, &tv)
6622514Sdarrenr
6722514Sdarrenr
6822514Sdarrenrvoid	ip_test1(dev, mtu, ip, gwip, ptest)
6922514Sdarrenrchar	*dev;
7022514Sdarrenrint	mtu;
7122514Sdarrenrip_t	*ip;
7222514Sdarrenrstruct	in_addr	gwip;
7322514Sdarrenrint	ptest;
7422514Sdarrenr{
7522514Sdarrenr	struct	timeval	tv;
7622514Sdarrenr	udphdr_t *u;
7722514Sdarrenr	int	nfd, i, len, id = getpid();
7822514Sdarrenr
7922514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
8022514Sdarrenr	ip->ip_v = IPVERSION;
8122514Sdarrenr	ip->ip_tos = 0;
8222514Sdarrenr	ip->ip_off = 0;
8322514Sdarrenr	ip->ip_ttl = 60;
8422514Sdarrenr	ip->ip_p = IPPROTO_UDP;
8522514Sdarrenr	ip->ip_sum = 0;
8622514Sdarrenr	u = (udphdr_t *)(ip + 1);
8722514Sdarrenr	u->uh_sport = 1;
8822514Sdarrenr	u->uh_dport = 9;
8922514Sdarrenr	u->uh_sum = 0;
9022514Sdarrenr	u->uh_ulen = sizeof(*u) + 4;
9122514Sdarrenr	ip->ip_len = sizeof(*ip) + u->uh_ulen;
9222514Sdarrenr	len = ip->ip_len;
9322514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
9422514Sdarrenr
9522514Sdarrenr	u->uh_sport = htons(u->uh_sport);
9622514Sdarrenr	u->uh_dport = htons(u->uh_dport);
9722514Sdarrenr	u->uh_ulen = htons(u->uh_ulen);
9822514Sdarrenr	if (!ptest || (ptest == 1)) {
9922514Sdarrenr		/*
10022514Sdarrenr		 * Part1: hl < len
10122514Sdarrenr		 */
10222514Sdarrenr		ip->ip_id = 0;
10322514Sdarrenr		printf("1.1. sending packets with ip_hl < ip_len\n");
10422514Sdarrenr		for (i = 0; i < ((sizeof(*ip) + u->uh_ulen) >> 2); i++) {
10522514Sdarrenr			ip->ip_hl = i >> 2;
10622514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
10722514Sdarrenr			printf("%d\r", i);
10822514Sdarrenr			fflush(stdout);
10922514Sdarrenr			PAUSE();
11022514Sdarrenr		}
11122514Sdarrenr		putchar('\n');
11222514Sdarrenr	}
11322514Sdarrenr
11422514Sdarrenr	if (!ptest || (ptest == 2)) {
11522514Sdarrenr		/*
11622514Sdarrenr		 * Part2: hl > len
11722514Sdarrenr		 */
11822514Sdarrenr		ip->ip_id = 0;
11922514Sdarrenr		printf("1.2. sending packets with ip_hl > ip_len\n");
12022514Sdarrenr		for (; i < ((sizeof(*ip) * 2 + u->uh_ulen) >> 2); i++) {
12122514Sdarrenr			ip->ip_hl = i >> 2;
12222514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
12322514Sdarrenr			printf("%d\r", i);
12422514Sdarrenr			fflush(stdout);
12522514Sdarrenr			PAUSE();
12622514Sdarrenr		}
12722514Sdarrenr		putchar('\n');
12822514Sdarrenr	}
12922514Sdarrenr
13022514Sdarrenr	if (!ptest || (ptest == 3)) {
13122514Sdarrenr		/*
13222514Sdarrenr		 * Part3: v < 4
13322514Sdarrenr		 */
13422514Sdarrenr		ip->ip_id = 0;
13522514Sdarrenr		printf("1.3. ip_v < 4\n");
13622514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
13722514Sdarrenr		for (i = 0; i < 4; i++) {
13822514Sdarrenr			ip->ip_v = i;
13922514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
14022514Sdarrenr			printf("%d\r", i);
14122514Sdarrenr			fflush(stdout);
14222514Sdarrenr			PAUSE();
14322514Sdarrenr		}
14422514Sdarrenr		putchar('\n');
14522514Sdarrenr	}
14622514Sdarrenr
14722514Sdarrenr	if (!ptest || (ptest == 4)) {
14822514Sdarrenr		/*
14922514Sdarrenr		 * Part4: v > 4
15022514Sdarrenr		 */
15122514Sdarrenr		ip->ip_id = 0;
15222514Sdarrenr		printf("1.4. ip_v > 4\n");
15322514Sdarrenr		for (i = 5; i < 16; i++) {
15422514Sdarrenr			ip->ip_v = i;
15522514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
15622514Sdarrenr			printf("%d\r", i);
15722514Sdarrenr			fflush(stdout);
15822514Sdarrenr			PAUSE();
15922514Sdarrenr		}
16022514Sdarrenr		putchar('\n');
16122514Sdarrenr	}
16222514Sdarrenr
16322514Sdarrenr	if (!ptest || (ptest == 5)) {
16422514Sdarrenr		/*
16522514Sdarrenr		 * Part5: len < packet
16622514Sdarrenr		 */
16722514Sdarrenr		ip->ip_id = 0;
16822514Sdarrenr		ip->ip_v = IPVERSION;
16922514Sdarrenr		i = ip->ip_len + 1;
17022514Sdarrenr		ip->ip_len = htons(ip->ip_len);
17122514Sdarrenr		ip->ip_off = htons(ip->ip_off);
17222514Sdarrenr		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
17322514Sdarrenr		for (; i < (ntohs(ip->ip_len) * 2); i++) {
17422514Sdarrenr			ip->ip_id = htons(id++);
17522514Sdarrenr			ip->ip_sum = 0;
17624583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
17724583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
17822514Sdarrenr			printf("%d\r", i);
17922514Sdarrenr			fflush(stdout);
18022514Sdarrenr			PAUSE();
18122514Sdarrenr		}
18222514Sdarrenr		putchar('\n');
18322514Sdarrenr		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
18422514Sdarrenr		for (i = len; i > 0; i--) {
18522514Sdarrenr			ip->ip_id = htons(id++);
18622514Sdarrenr			ip->ip_len = htons(i);
18722514Sdarrenr			ip->ip_sum = 0;
18824583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
18924583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
19022514Sdarrenr			printf("%d\r", i);
19122514Sdarrenr			fflush(stdout);
19222514Sdarrenr			PAUSE();
19322514Sdarrenr		}
19422514Sdarrenr		putchar('\n');
19522514Sdarrenr	}
19622514Sdarrenr
19722514Sdarrenr	if (!ptest || (ptest == 6)) {
19822514Sdarrenr		/*
19922514Sdarrenr		 * Part6: len > packet
20022514Sdarrenr		 */
20122514Sdarrenr		ip->ip_id = 0;
20222514Sdarrenr		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
20322514Sdarrenr		for (i = len + 1; i < (len * 2); i++) {
20422514Sdarrenr			ip->ip_id = htons(id++);
20522514Sdarrenr			ip->ip_len = htons(i);
20622514Sdarrenr			ip->ip_sum = 0;
20724583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
20824583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
20922514Sdarrenr			printf("%d\r", i);
21022514Sdarrenr			fflush(stdout);
21122514Sdarrenr			PAUSE();
21222514Sdarrenr		}
21322514Sdarrenr		putchar('\n');
21422514Sdarrenr		ip->ip_len = htons(len);
21522514Sdarrenr		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
21622514Sdarrenr		for (i = len; i > 0; i--) {
21722514Sdarrenr			ip->ip_id = htons(id++);
21822514Sdarrenr			ip->ip_sum = 0;
21924583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
22024583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
22122514Sdarrenr			printf("%d\r", i);
22222514Sdarrenr			fflush(stdout);
22322514Sdarrenr			PAUSE();
22422514Sdarrenr		}
22522514Sdarrenr		putchar('\n');
22622514Sdarrenr	}
22722514Sdarrenr
22822514Sdarrenr	if (!ptest || (ptest == 7)) {
22922514Sdarrenr		/*
23022514Sdarrenr		 * Part7: 0 length fragment
23122514Sdarrenr		 */
23222514Sdarrenr		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
23322514Sdarrenr		ip->ip_id = 0;
23422514Sdarrenr		ip->ip_len = sizeof(*ip);
23522514Sdarrenr		ip->ip_off = htons(IP_MF);
23622514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
23722514Sdarrenr		fflush(stdout);
23822514Sdarrenr		PAUSE();
23922514Sdarrenr
24022514Sdarrenr		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
24122514Sdarrenr		ip->ip_id = 0;
24222514Sdarrenr		ip->ip_len = sizeof(*ip);
24322514Sdarrenr		ip->ip_off = htons(IP_MF);
24422514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
24522514Sdarrenr		fflush(stdout);
24622514Sdarrenr		PAUSE();
24722514Sdarrenr
24822514Sdarrenr		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
24922514Sdarrenr		ip->ip_id = 0;
25022514Sdarrenr		ip->ip_len = sizeof(*ip);
25122514Sdarrenr		ip->ip_off = htons(0xa000);
25222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
25322514Sdarrenr		fflush(stdout);
25422514Sdarrenr		PAUSE();
25522514Sdarrenr
25622514Sdarrenr		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
25722514Sdarrenr		ip->ip_id = 0;
25822514Sdarrenr		ip->ip_len = sizeof(*ip);
25922514Sdarrenr		ip->ip_off = htons(0x0100);
26022514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
26122514Sdarrenr		fflush(stdout);
26222514Sdarrenr		PAUSE();
26322514Sdarrenr	}
26422514Sdarrenr
26522514Sdarrenr	if (!ptest || (ptest == 8)) {
26622514Sdarrenr		struct	timeval	tv;
26722514Sdarrenr
26822514Sdarrenr		gettimeofday(&tv, NULL);
26922514Sdarrenr		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
27022514Sdarrenr		/*
27122514Sdarrenr		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
27222514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
27322514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
27422514Sdarrenr		 * about that here.
27522514Sdarrenr		 */
27622514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
27722514Sdarrenr		ip->ip_off = IP_MF;
27822514Sdarrenr		u->uh_dport = htons(9);
27922514Sdarrenr		ip->ip_id = htons(id++);
28022514Sdarrenr		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
28122514Sdarrenr		ip->ip_len = 768 + 20 + 8;
28222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
28322514Sdarrenr		printf("%d\r", i);
28422514Sdarrenr
28522514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
28622514Sdarrenr		i = 512;
28722514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
28822514Sdarrenr			ip->ip_off = IP_MF | (i >> 3);
28922514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
29022514Sdarrenr			printf("%d\r", i);
29122514Sdarrenr			fflush(stdout);
29222514Sdarrenr			PAUSE();
29322514Sdarrenr		}
29422514Sdarrenr		ip->ip_len = 896 + 20;
29522514Sdarrenr		ip->ip_off = (i >> 3);
29622514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
29722514Sdarrenr		printf("%d\r", i);
29822514Sdarrenr		putchar('\n');
29922514Sdarrenr		fflush(stdout);
30022514Sdarrenr
30122514Sdarrenr		/*
30222514Sdarrenr		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
30322514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
30422514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
30522514Sdarrenr		 * about that here.  (Lossage here)
30622514Sdarrenr		 */
30722514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
30822514Sdarrenr		ip->ip_off = IP_MF;
30922514Sdarrenr		u->uh_dport = htons(9);
31022514Sdarrenr		ip->ip_id = htons(id++);
31122514Sdarrenr		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
31222514Sdarrenr		ip->ip_len = 768 + 20 + 8;
31322514Sdarrenr		if ((rand() & 0x1f) != 0) {
31422514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
31522514Sdarrenr			printf("%d\r", i);
31622514Sdarrenr		} else
31722514Sdarrenr			printf("skip 0\n");
31822514Sdarrenr
31922514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
32022514Sdarrenr		i = 512;
32122514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
32222514Sdarrenr			ip->ip_off = IP_MF | (i >> 3);
32322514Sdarrenr			if ((rand() & 0x1f) != 0) {
32422514Sdarrenr				(void) send_ip(nfd, mtu, ip, gwip, 1);
32522514Sdarrenr				printf("%d\r", i);
32622514Sdarrenr			} else
32722514Sdarrenr				printf("skip %d\n", i);
32822514Sdarrenr			fflush(stdout);
32922514Sdarrenr			PAUSE();
33022514Sdarrenr		}
33122514Sdarrenr		ip->ip_len = 896 + 20;
33222514Sdarrenr		ip->ip_off = (i >> 3);
33322514Sdarrenr		if ((rand() & 0x1f) != 0) {
33422514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
33522514Sdarrenr			printf("%d\r", i);
33622514Sdarrenr		} else
33722514Sdarrenr			printf("skip\n");
33822514Sdarrenr		putchar('\n');
33922514Sdarrenr		fflush(stdout);
34022514Sdarrenr
34122514Sdarrenr		/*
34222514Sdarrenr		 * Part8.3: 33k packet - test for not dealing with -ve length
34322514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
34422514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
34522514Sdarrenr		 * about that here.
34622514Sdarrenr		 */
34722514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
34822514Sdarrenr		ip->ip_off = IP_MF;
34922514Sdarrenr		u->uh_dport = htons(9);
35022514Sdarrenr		ip->ip_id = htons(id++);
35122514Sdarrenr		printf("1.8.3 33k packet\n");
35222514Sdarrenr		ip->ip_len = 768 + 20 + 8;
35322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
35422514Sdarrenr		printf("%d\r", i);
35522514Sdarrenr
35622514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
35722514Sdarrenr		i = 512;
35822514Sdarrenr		for (; i < (32 * 1024 + 768); i += 768) {
35922514Sdarrenr			ip->ip_off = IP_MF | (i >> 3);
36022514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
36122514Sdarrenr			printf("%d\r", i);
36222514Sdarrenr			fflush(stdout);
36322514Sdarrenr			PAUSE();
36422514Sdarrenr		}
36522514Sdarrenr		ip->ip_len = 896 + 20;
36622514Sdarrenr		ip->ip_off = (i >> 3);
36722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
36822514Sdarrenr		printf("%d\r", i);
36922514Sdarrenr		putchar('\n');
37022514Sdarrenr		fflush(stdout);
37122514Sdarrenr	}
37222514Sdarrenr
37322514Sdarrenr	ip->ip_len = len;
37422514Sdarrenr	ip->ip_off = 0;
37522514Sdarrenr	if (!ptest || (ptest == 9)) {
37622514Sdarrenr		/*
37722514Sdarrenr		 * Part9: off & 0x8000 == 0x8000
37822514Sdarrenr		 */
37922514Sdarrenr		ip->ip_id = 0;
38022514Sdarrenr		ip->ip_off = 0x8000;
38122514Sdarrenr		printf("1.9. ip_off & 0x8000 == 0x8000\n");
38222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
38322514Sdarrenr		fflush(stdout);
38422514Sdarrenr		PAUSE();
38522514Sdarrenr	}
38622514Sdarrenr
38722514Sdarrenr	ip->ip_off = 0;
38822514Sdarrenr
38922514Sdarrenr	if (!ptest || (ptest == 10)) {
39022514Sdarrenr		/*
39122514Sdarrenr		 * Part10: ttl = 255
39222514Sdarrenr		 */
39322514Sdarrenr		ip->ip_id = 0;
39422514Sdarrenr		ip->ip_ttl = 255;
39522514Sdarrenr		printf("1.10.0 ip_ttl = 255\n");
39622514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
39722514Sdarrenr		fflush(stdout);
39822514Sdarrenr		PAUSE();
39922514Sdarrenr
40022514Sdarrenr		ip->ip_ttl = 128;
40122514Sdarrenr		printf("1.10.1 ip_ttl = 128\n");
40222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
40322514Sdarrenr		fflush(stdout);
40422514Sdarrenr		PAUSE();
40522514Sdarrenr
40622514Sdarrenr		ip->ip_ttl = 0;
40722514Sdarrenr		printf("1.10.2 ip_ttl = 0\n");
40822514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
40922514Sdarrenr		fflush(stdout);
41022514Sdarrenr		PAUSE();
41122514Sdarrenr	}
41222514Sdarrenr
41322514Sdarrenr	(void) close(nfd);
41422514Sdarrenr}
41522514Sdarrenr
41622514Sdarrenr
41722514Sdarrenrvoid	ip_test2(dev, mtu, ip, gwip, ptest)
41822514Sdarrenrchar	*dev;
41922514Sdarrenrint	mtu;
42022514Sdarrenrip_t	*ip;
42122514Sdarrenrstruct	in_addr	gwip;
42222514Sdarrenrint	ptest;
42322514Sdarrenr{
42422514Sdarrenr	struct	timeval	tv;
42522514Sdarrenr	int	nfd;
42622514Sdarrenr	u_char	*s;
42722514Sdarrenr
42822514Sdarrenr	s = (u_char *)(ip + 1);
42922514Sdarrenr	nfd = initdevice(dev, 1, 1);
43022514Sdarrenr
43122514Sdarrenr	ip->ip_hl = 6;
43222514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
43322514Sdarrenr	s[IPOPT_OPTVAL] = IPOPT_NOP;
43422514Sdarrenr	s++;
43522514Sdarrenr	if (!ptest || (ptest == 1)) {
43622514Sdarrenr		/*
43722514Sdarrenr		 * Test 1: option length > packet length,
43822514Sdarrenr		 *                header length == packet length
43922514Sdarrenr		 */
44022514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
44122514Sdarrenr		s[IPOPT_OLEN] = 4;
44222514Sdarrenr		s[IPOPT_OFFSET] = IPOPT_MINOFF;
44322514Sdarrenr		ip->ip_p = IPPROTO_IP;
44422514Sdarrenr		printf("2.1 option length > packet length\n");
44522514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
44622514Sdarrenr		fflush(stdout);
44722514Sdarrenr		PAUSE();
44822514Sdarrenr	}
44922514Sdarrenr
45022514Sdarrenr	ip->ip_hl = 7;
45122514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
45222514Sdarrenr	if (!ptest || (ptest == 1)) {
45322514Sdarrenr		/*
45422514Sdarrenr		 * Test 2: options have length = 0
45522514Sdarrenr		 */
45622514Sdarrenr		printf("2.2.1 option length = 0, RR\n");
45722514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_RR;
45822514Sdarrenr		s[IPOPT_OLEN] = 0;
45922514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
46022514Sdarrenr		fflush(stdout);
46122514Sdarrenr		PAUSE();
46222514Sdarrenr
46322514Sdarrenr		printf("2.2.2 option length = 0, TS\n");
46422514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
46522514Sdarrenr		s[IPOPT_OLEN] = 0;
46622514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
46722514Sdarrenr		fflush(stdout);
46822514Sdarrenr		PAUSE();
46922514Sdarrenr
47022514Sdarrenr		printf("2.2.3 option length = 0, SECURITY\n");
47122514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
47222514Sdarrenr		s[IPOPT_OLEN] = 0;
47322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
47422514Sdarrenr		fflush(stdout);
47522514Sdarrenr		PAUSE();
47622514Sdarrenr
47722514Sdarrenr		printf("2.2.4 option length = 0, LSRR\n");
47822514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_LSRR;
47922514Sdarrenr		s[IPOPT_OLEN] = 0;
48022514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48122514Sdarrenr		fflush(stdout);
48222514Sdarrenr		PAUSE();
48322514Sdarrenr
48422514Sdarrenr		printf("2.2.5 option length = 0, SATID\n");
48522514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SATID;
48622514Sdarrenr		s[IPOPT_OLEN] = 0;
48722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48822514Sdarrenr		fflush(stdout);
48922514Sdarrenr		PAUSE();
49022514Sdarrenr
49122514Sdarrenr		printf("2.2.6 option length = 0, SSRR\n");
49222514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SSRR;
49322514Sdarrenr		s[IPOPT_OLEN] = 0;
49422514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
49522514Sdarrenr		fflush(stdout);
49622514Sdarrenr		PAUSE();
49722514Sdarrenr	}
49822514Sdarrenr
49922514Sdarrenr	(void) close(nfd);
50022514Sdarrenr}
50122514Sdarrenr
50222514Sdarrenr
50322514Sdarrenr/*
50422514Sdarrenr * test 3 (ICMP)
50522514Sdarrenr */
50622514Sdarrenrvoid	ip_test3(dev, mtu, ip, gwip, ptest)
50722514Sdarrenrchar	*dev;
50822514Sdarrenrint	mtu;
50922514Sdarrenrip_t	*ip;
51022514Sdarrenrstruct	in_addr	gwip;
51122514Sdarrenrint	ptest;
51222514Sdarrenr{
51322514Sdarrenr	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
51422514Sdarrenr	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
51522514Sdarrenr	struct	timeval	tv;
51622514Sdarrenr	struct	icmp	*icp;
51722514Sdarrenr	int	nfd, i;
51822514Sdarrenr
51922514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
52022514Sdarrenr	ip->ip_v = IPVERSION;
52122514Sdarrenr	ip->ip_tos = 0;
52222514Sdarrenr	ip->ip_off = 0;
52322514Sdarrenr	ip->ip_ttl = 60;
52422514Sdarrenr	ip->ip_p = IPPROTO_ICMP;
52522514Sdarrenr	ip->ip_sum = 0;
52622514Sdarrenr	ip->ip_len = sizeof(*ip) + sizeof(*icp);
52722514Sdarrenr	icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2));
52822514Sdarrenr	nfd = initdevice(dev, 1, 1);
52922514Sdarrenr
53022514Sdarrenr	if (!ptest || (ptest == 1)) {
53122514Sdarrenr		/*
53222514Sdarrenr		 * Type 0 - 31, 255, code = 0
53322514Sdarrenr		 */
53422514Sdarrenr		bzero((char *)icp, sizeof(*icp));
53522514Sdarrenr		for (i = 0; i < 32; i++) {
53622514Sdarrenr			icp->icmp_type = i;
53722514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
53822514Sdarrenr			PAUSE();
53922514Sdarrenr			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
54022514Sdarrenr		}
54122514Sdarrenr		icp->icmp_type = 255;
54222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
54322514Sdarrenr		PAUSE();
54422514Sdarrenr		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
54522514Sdarrenr		putchar('\n');
54622514Sdarrenr	}
54722514Sdarrenr
54822514Sdarrenr	if (!ptest || (ptest == 2)) {
54922514Sdarrenr		/*
55022514Sdarrenr		 * Type 3, code = 0 - 31
55122514Sdarrenr		 */
55222514Sdarrenr		icp->icmp_type = 3;
55322514Sdarrenr		for (i = 0; i < 32; i++) {
55422514Sdarrenr			icp->icmp_code = i;
55522514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
55622514Sdarrenr			PAUSE();
55722514Sdarrenr			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
55822514Sdarrenr		}
55922514Sdarrenr	}
56022514Sdarrenr
56122514Sdarrenr	if (!ptest || (ptest == 3)) {
56222514Sdarrenr		/*
56322514Sdarrenr		 * Type 4, code = 0,127,128,255
56422514Sdarrenr		 */
56522514Sdarrenr		icp->icmp_type = 4;
56622514Sdarrenr		icp->icmp_code = 0;
56722514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
56822514Sdarrenr		PAUSE();
56922514Sdarrenr		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
57022514Sdarrenr		icp->icmp_code = 127;
57122514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
57222514Sdarrenr		PAUSE();
57322514Sdarrenr		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
57422514Sdarrenr		icp->icmp_code = 128;
57522514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
57622514Sdarrenr		PAUSE();
57722514Sdarrenr		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
57822514Sdarrenr		icp->icmp_code = 255;
57922514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
58022514Sdarrenr		PAUSE();
58122514Sdarrenr		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
58222514Sdarrenr	}
58322514Sdarrenr
58422514Sdarrenr	if (!ptest || (ptest == 4)) {
58522514Sdarrenr		/*
58622514Sdarrenr		 * Type 5, code = 0,127,128,255
58722514Sdarrenr		 */
58822514Sdarrenr		icp->icmp_type = 5;
58922514Sdarrenr		icp->icmp_code = 0;
59022514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59122514Sdarrenr		PAUSE();
59222514Sdarrenr		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
59322514Sdarrenr		icp->icmp_code = 127;
59422514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59522514Sdarrenr		PAUSE();
59622514Sdarrenr		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
59722514Sdarrenr		icp->icmp_code = 128;
59822514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59922514Sdarrenr		PAUSE();
60022514Sdarrenr		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
60122514Sdarrenr		icp->icmp_code = 255;
60222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
60322514Sdarrenr		PAUSE();
60422514Sdarrenr		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
60522514Sdarrenr	}
60622514Sdarrenr
60722514Sdarrenr	if (!ptest || (ptest == 5)) {
60822514Sdarrenr		/*
60922514Sdarrenr		 * Type 8-10;13-18, code - 0,127,128,255
61022514Sdarrenr		 */
61122514Sdarrenr		for (i = 0; ict1[i]; i++) {
61222514Sdarrenr			icp->icmp_type = ict1[i];
61322514Sdarrenr			icp->icmp_code = 0;
61422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
61522514Sdarrenr			PAUSE();
61622514Sdarrenr			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
61722514Sdarrenr				i * 4);
61822514Sdarrenr			icp->icmp_code = 127;
61922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
62022514Sdarrenr			PAUSE();
62122514Sdarrenr			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
62222514Sdarrenr				i * 4 + 1);
62322514Sdarrenr			icp->icmp_code = 128;
62422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
62522514Sdarrenr			PAUSE();
62622514Sdarrenr			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
62722514Sdarrenr				i * 4 + 2);
62822514Sdarrenr			icp->icmp_code = 255;
62922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
63022514Sdarrenr			PAUSE();
63122514Sdarrenr			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
63222514Sdarrenr				i * 4 + 3);
63322514Sdarrenr		}
63422514Sdarrenr		putchar('\n');
63522514Sdarrenr	}
63622514Sdarrenr
63722514Sdarrenr	if (!ptest || (ptest == 6)) {
63822514Sdarrenr		/*
63922514Sdarrenr		 * Type 12, code - 0,127,128,129,255
64022514Sdarrenr		 */
64122514Sdarrenr		icp->icmp_type = 12;
64222514Sdarrenr		icp->icmp_code = 0;
64322514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
64422514Sdarrenr		PAUSE();
64522514Sdarrenr		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
64622514Sdarrenr		icp->icmp_code = 127;
64722514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
64822514Sdarrenr		PAUSE();
64922514Sdarrenr		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
65022514Sdarrenr		icp->icmp_code = 128;
65122514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
65222514Sdarrenr		PAUSE();
65322514Sdarrenr		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
65422514Sdarrenr		icp->icmp_code = 129;
65522514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
65622514Sdarrenr		PAUSE();
65722514Sdarrenr		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
65822514Sdarrenr		icp->icmp_code = 255;
65922514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
66022514Sdarrenr		PAUSE();
66122514Sdarrenr		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
66222514Sdarrenr		putchar('\n');
66322514Sdarrenr	}
66422514Sdarrenr
66522514Sdarrenr	if (!ptest || (ptest == 7)) {
66622514Sdarrenr		/*
66722514Sdarrenr		 * Type 3;9-10;13-14;17-18 - shorter packets
66822514Sdarrenr		 */
66922514Sdarrenr		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
67022514Sdarrenr		for (i = 0; ict2[i]; i++) {
67122514Sdarrenr			icp->icmp_type = ict1[i];
67222514Sdarrenr			icp->icmp_code = 0;
67322514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
67422514Sdarrenr			PAUSE();
67522514Sdarrenr			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
67622514Sdarrenr				i * 4, icp->icmp_type);
67722514Sdarrenr			icp->icmp_code = 127;
67822514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
67922514Sdarrenr			PAUSE();
68022514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
68122514Sdarrenr				i * 4 + 1, icp->icmp_type);
68222514Sdarrenr			icp->icmp_code = 128;
68322514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
68422514Sdarrenr			PAUSE();
68522514Sdarrenr			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
68622514Sdarrenr				i * 4 + 2, icp->icmp_type);
68722514Sdarrenr			icp->icmp_code = 255;
68822514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
68922514Sdarrenr			PAUSE();
69022514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
69122514Sdarrenr				i * 4 + 3, icp->icmp_type);
69222514Sdarrenr		}
69322514Sdarrenr		putchar('\n');
69422514Sdarrenr	}
69522514Sdarrenr}
69622514Sdarrenr
69722514Sdarrenr
69822514Sdarrenr/* Perform test 4 (UDP) */
69922514Sdarrenr
70022514Sdarrenrvoid	ip_test4(dev, mtu, ip, gwip, ptest)
70122514Sdarrenrchar	*dev;
70222514Sdarrenrint	mtu;
70322514Sdarrenrip_t	*ip;
70422514Sdarrenrstruct	in_addr	gwip;
70522514Sdarrenrint	ptest;
70622514Sdarrenr{
70722514Sdarrenr	struct	timeval	tv;
70822514Sdarrenr	struct	udphdr	*u;
70922514Sdarrenr	int	nfd, i;
71022514Sdarrenr
71122514Sdarrenr
71222514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
71322514Sdarrenr	ip->ip_v = IPVERSION;
71422514Sdarrenr	ip->ip_tos = 0;
71522514Sdarrenr	ip->ip_off = 0;
71622514Sdarrenr	ip->ip_ttl = 60;
71722514Sdarrenr	ip->ip_p = IPPROTO_UDP;
71822514Sdarrenr	ip->ip_sum = 0;
71922514Sdarrenr	u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2));
72022514Sdarrenr	u->uh_sport = 1;
72122514Sdarrenr	u->uh_dport = 1;
72222514Sdarrenr	u->uh_ulen = sizeof(*u) + 4;
72322514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
72422514Sdarrenr
72522514Sdarrenr	if (!ptest || (ptest == 1)) {
72622514Sdarrenr		/*
72722514Sdarrenr		 * Test 1. ulen > packet
72822514Sdarrenr		 */
72922514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
73022514Sdarrenr		ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen;
73122514Sdarrenr		printf("4.1 UDP uh_ulen > packet size - short packets\n");
73222514Sdarrenr		for (i = u->uh_ulen * 2; i > sizeof(*u) + 4; i--) {
73322514Sdarrenr			u->uh_ulen = i;
73422514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
73522514Sdarrenr			printf("%d\r", i);
73622514Sdarrenr			fflush(stdout);
73722514Sdarrenr			PAUSE();
73822514Sdarrenr		}
73922514Sdarrenr		putchar('\n');
74022514Sdarrenr	}
74122514Sdarrenr
74222514Sdarrenr	if (!ptest || (ptest == 2)) {
74322514Sdarrenr		/*
74422514Sdarrenr		 * Test 2. ulen < packet
74522514Sdarrenr		 */
74622514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
74722514Sdarrenr		ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen;
74822514Sdarrenr		printf("4.2 UDP uh_ulen < packet size - short packets\n");
74922514Sdarrenr		for (i = u->uh_ulen * 2; i > sizeof(*u) + 4; i--) {
75022514Sdarrenr			ip->ip_len = i;
75122514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
75222514Sdarrenr			printf("%d\r", i);
75322514Sdarrenr			fflush(stdout);
75422514Sdarrenr			PAUSE();
75522514Sdarrenr		}
75622514Sdarrenr		putchar('\n');
75722514Sdarrenr	}
75822514Sdarrenr
75922514Sdarrenr	if (!ptest || (ptest == 3)) {
76022514Sdarrenr		/*
76122514Sdarrenr		 * Test 3: sport = 0, sport = 1, sport = 32767
76222514Sdarrenr		 *         sport = 32768, sport = 65535
76322514Sdarrenr		 */
76422514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
76522514Sdarrenr		ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen;
76622514Sdarrenr		printf("4.3.1 UDP sport = 0\n");
76722514Sdarrenr		u->uh_sport = 0;
76822514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
76922514Sdarrenr		printf("0\n");
77022514Sdarrenr		fflush(stdout);
77122514Sdarrenr		PAUSE();
77222514Sdarrenr		printf("4.3.2 UDP sport = 1\n");
77322514Sdarrenr		u->uh_sport = 1;
77422514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
77522514Sdarrenr		printf("1\n");
77622514Sdarrenr		fflush(stdout);
77722514Sdarrenr		PAUSE();
77822514Sdarrenr		printf("4.3.3 UDP sport = 32767\n");
77922514Sdarrenr		u->uh_sport = 32767;
78022514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
78122514Sdarrenr		printf("32767\n");
78222514Sdarrenr		fflush(stdout);
78322514Sdarrenr		PAUSE();
78422514Sdarrenr		printf("4.3.4 UDP sport = 32768\n");
78522514Sdarrenr		u->uh_sport = 32768;
78622514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
78722514Sdarrenr		printf("32768\n");
78822514Sdarrenr		putchar('\n');
78922514Sdarrenr		fflush(stdout);
79022514Sdarrenr		PAUSE();
79122514Sdarrenr		printf("4.3.5 UDP sport = 65535\n");
79222514Sdarrenr		u->uh_sport = 65535;
79322514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
79422514Sdarrenr		printf("65535\n");
79522514Sdarrenr		fflush(stdout);
79622514Sdarrenr		PAUSE();
79722514Sdarrenr	}
79822514Sdarrenr
79922514Sdarrenr	if (!ptest || (ptest == 4)) {
80022514Sdarrenr		/*
80122514Sdarrenr		 * Test 4: dport = 0, dport = 1, dport = 32767
80222514Sdarrenr		 *         dport = 32768, dport = 65535
80322514Sdarrenr		 */
80422514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
80522514Sdarrenr		u->uh_sport = 1;
80622514Sdarrenr		ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen;
80722514Sdarrenr		printf("4.4.1 UDP dport = 0\n");
80822514Sdarrenr		u->uh_dport = 0;
80922514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
81022514Sdarrenr		printf("0\n");
81122514Sdarrenr		fflush(stdout);
81222514Sdarrenr		PAUSE();
81322514Sdarrenr		printf("4.4.2 UDP dport = 1\n");
81422514Sdarrenr		u->uh_dport = 1;
81522514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
81622514Sdarrenr		printf("1\n");
81722514Sdarrenr		fflush(stdout);
81822514Sdarrenr		PAUSE();
81922514Sdarrenr		printf("4.4.3 UDP dport = 32767\n");
82022514Sdarrenr		u->uh_dport = 32767;
82122514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
82222514Sdarrenr		printf("32767\n");
82322514Sdarrenr		fflush(stdout);
82422514Sdarrenr		PAUSE();
82522514Sdarrenr		printf("4.4.4 UDP dport = 32768\n");
82622514Sdarrenr		u->uh_dport = 32768;
82722514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
82822514Sdarrenr		printf("32768\n");
82922514Sdarrenr		fflush(stdout);
83022514Sdarrenr		PAUSE();
83122514Sdarrenr		printf("4.4.5 UDP dport = 65535\n");
83222514Sdarrenr		u->uh_dport = 65535;
83322514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
83422514Sdarrenr		printf("65535\n");
83522514Sdarrenr		fflush(stdout);
83622514Sdarrenr		PAUSE();
83722514Sdarrenr	}
83822514Sdarrenr
83922514Sdarrenr	if (!ptest || (ptest == 4)) {
84022514Sdarrenr		/*
84122514Sdarrenr		 * Test 5: sizeof(struct ip) <= MTU <= sizeof(struct udphdr) +
84222514Sdarrenr		 * sizeof(struct ip)
84322514Sdarrenr		 */
84422514Sdarrenr		printf("4.5 UDP 20 <= MTU <= 32\n");
84522514Sdarrenr		for (i = sizeof(*ip); i <= u->uh_ulen; i++) {
84622514Sdarrenr			(void) send_udp(nfd, i, ip, gwip);
84722514Sdarrenr			printf("%d\r", i);
84822514Sdarrenr			fflush(stdout);
84922514Sdarrenr			PAUSE();
85022514Sdarrenr		}
85122514Sdarrenr		putchar('\n');
85222514Sdarrenr	}
85322514Sdarrenr}
85422514Sdarrenr
85522514Sdarrenr
85622514Sdarrenr/* Perform test 5 (TCP) */
85722514Sdarrenr
85822514Sdarrenrvoid	ip_test5(dev, mtu, ip, gwip, ptest)
85922514Sdarrenrchar	*dev;
86022514Sdarrenrint	mtu;
86122514Sdarrenrip_t	*ip;
86222514Sdarrenrstruct	in_addr	gwip;
86322514Sdarrenrint	ptest;
86422514Sdarrenr{
86522514Sdarrenr	struct	timeval	tv;
86622514Sdarrenr	tcphdr_t *t;
86722514Sdarrenr	int	nfd, i;
86822514Sdarrenr
86922514Sdarrenr	t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2));
87022514Sdarrenr	t->th_x2 = 0;
87122514Sdarrenr	t->th_off = 0;
87222514Sdarrenr	t->th_sport = 1;
87322514Sdarrenr	t->th_dport = 1;
87422514Sdarrenr	t->th_win = 4096;
87522514Sdarrenr	t->th_urp = 0;
87622514Sdarrenr	t->th_sum = 0;
87722514Sdarrenr	t->th_seq = 1;
87822514Sdarrenr	t->th_ack = 0;
87922514Sdarrenr	nfd = initdevice(dev, t->th_sport, 1);
88022514Sdarrenr
88122514Sdarrenr	if (!ptest || (ptest == 1)) {
88222514Sdarrenr		/*
88322514Sdarrenr		 * Test 1: flags variations, 0 - 3f
88422514Sdarrenr		 */
88522514Sdarrenr		t->th_off = sizeof(*t) >> 2;
88622514Sdarrenr		printf("5.1 Test TCP flag combinations\n");
88722514Sdarrenr		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
88822514Sdarrenr		     i++) {
88922514Sdarrenr			t->th_flags = i;
89022514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
89122514Sdarrenr			printf("%d\r", i);
89222514Sdarrenr			fflush(stdout);
89322514Sdarrenr			PAUSE();
89422514Sdarrenr		}
89522514Sdarrenr		putchar('\n');
89622514Sdarrenr	}
89722514Sdarrenr
89822514Sdarrenr	if (!ptest || (ptest == 2)) {
89922514Sdarrenr		t->th_flags = TH_SYN;
90022514Sdarrenr		/*
90122514Sdarrenr		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
90222514Sdarrenr		 *         seq = 0xa000000, seq = 0xffffffff
90322514Sdarrenr		 */
90422514Sdarrenr		printf("5.2.1 TCP seq = 0\n");
90522514Sdarrenr		t->th_seq = 0;
90622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
90722514Sdarrenr		fflush(stdout);
90822514Sdarrenr		PAUSE();
90922514Sdarrenr
91022514Sdarrenr		printf("5.2.2 TCP seq = 1\n");
91122514Sdarrenr		t->th_seq = 1;
91222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
91322514Sdarrenr		fflush(stdout);
91422514Sdarrenr		PAUSE();
91522514Sdarrenr
91622514Sdarrenr		printf("5.2.3 TCP seq = 0x7fffffff\n");
91722514Sdarrenr		t->th_seq = 0x7fffffff;
91822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
91922514Sdarrenr		fflush(stdout);
92022514Sdarrenr		PAUSE();
92122514Sdarrenr
92222514Sdarrenr		printf("5.2.4 TCP seq = 0x80000000\n");
92322514Sdarrenr		t->th_seq = 0x80000000;
92422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
92522514Sdarrenr		fflush(stdout);
92622514Sdarrenr		PAUSE();
92722514Sdarrenr
92822514Sdarrenr		printf("5.2.5 TCP seq = 0xc0000000\n");
92922514Sdarrenr		t->th_seq = 0xc0000000;
93022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93122514Sdarrenr		fflush(stdout);
93222514Sdarrenr		PAUSE();
93322514Sdarrenr
93422514Sdarrenr		printf("5.2.6 TCP seq = 0xffffffff\n");
93522514Sdarrenr		t->th_seq = 0xffffffff;
93622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93722514Sdarrenr		fflush(stdout);
93822514Sdarrenr		PAUSE();
93922514Sdarrenr	}
94022514Sdarrenr
94122514Sdarrenr	if (!ptest || (ptest == 3)) {
94222514Sdarrenr		t->th_flags = TH_ACK;
94322514Sdarrenr		/*
94422514Sdarrenr		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
94522514Sdarrenr		 *         ack = 0xa000000, ack = 0xffffffff
94622514Sdarrenr		 */
94722514Sdarrenr		printf("5.3.1 TCP ack = 0\n");
94822514Sdarrenr		t->th_ack = 0;
94922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
95022514Sdarrenr		fflush(stdout);
95122514Sdarrenr		PAUSE();
95222514Sdarrenr
95322514Sdarrenr		printf("5.3.2 TCP ack = 1\n");
95422514Sdarrenr		t->th_ack = 1;
95522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
95622514Sdarrenr		fflush(stdout);
95722514Sdarrenr		PAUSE();
95822514Sdarrenr
95922514Sdarrenr		printf("5.3.3 TCP ack = 0x7fffffff\n");
96022514Sdarrenr		t->th_ack = 0x7fffffff;
96122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
96222514Sdarrenr		fflush(stdout);
96322514Sdarrenr		PAUSE();
96422514Sdarrenr
96522514Sdarrenr		printf("5.3.4 TCP ack = 0x80000000\n");
96622514Sdarrenr		t->th_ack = 0x80000000;
96722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
96822514Sdarrenr		fflush(stdout);
96922514Sdarrenr		PAUSE();
97022514Sdarrenr
97122514Sdarrenr		printf("5.3.5 TCP ack = 0xc0000000\n");
97222514Sdarrenr		t->th_ack = 0xc0000000;
97322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
97422514Sdarrenr		fflush(stdout);
97522514Sdarrenr		PAUSE();
97622514Sdarrenr
97722514Sdarrenr		printf("5.3.6 TCP ack = 0xffffffff\n");
97822514Sdarrenr		t->th_ack = 0xffffffff;
97922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
98022514Sdarrenr		fflush(stdout);
98122514Sdarrenr		PAUSE();
98222514Sdarrenr	}
98322514Sdarrenr
98422514Sdarrenr	if (!ptest || (ptest == 4)) {
98522514Sdarrenr		t->th_flags = TH_SYN;
98622514Sdarrenr		/*
98722514Sdarrenr		 * Test 4: win = 0, win = 32768, win = 65535
98822514Sdarrenr		 */
98922514Sdarrenr		printf("5.4.1 TCP win = 0\n");
99022514Sdarrenr		t->th_seq = 0;
99122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99222514Sdarrenr		fflush(stdout);
99322514Sdarrenr		PAUSE();
99422514Sdarrenr
99522514Sdarrenr		printf("5.4.2 TCP win = 32768\n");
99622514Sdarrenr		t->th_seq = 0x7fff;
99722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99822514Sdarrenr		fflush(stdout);
99922514Sdarrenr		PAUSE();
100022514Sdarrenr
100122514Sdarrenr		printf("5.4.3 TCP win = 65535\n");
100222514Sdarrenr		t->th_win = 0xffff;
100322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
100422514Sdarrenr		fflush(stdout);
100522514Sdarrenr		PAUSE();
100622514Sdarrenr	}
100722514Sdarrenr
100822514Sdarrenr#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__)
100922514Sdarrenr	{
101022514Sdarrenr	struct tcpcb *t, tcb;
101122514Sdarrenr	struct tcpiphdr ti;
101222514Sdarrenr	struct sockaddr_in sin;
101322514Sdarrenr	int fd, slen;
101422514Sdarrenr
101522514Sdarrenr	bzero((char *)&sin, sizeof(sin));
101622514Sdarrenr
101722514Sdarrenr	for (i = 1; i < 63; i++) {
101822514Sdarrenr		fd = socket(AF_INET, SOCK_STREAM, 0);
101922514Sdarrenr		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
102022514Sdarrenr		sin.sin_port = htons(i);
102122514Sdarrenr		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
102222514Sdarrenr			break;
102322514Sdarrenr	}
102422514Sdarrenr
102522514Sdarrenr	if (i == 63) {
102622514Sdarrenr		printf("Couldn't open a TCP socket between ports 1 and 63\n");
102722514Sdarrenr		printf("to host %s for test 5 and 6 - skipping.\n",
102822514Sdarrenr			inet_ntoa(ip->ip_dst));
102922514Sdarrenr		goto skip_five_and_six;
103022514Sdarrenr	}
103122514Sdarrenr
103222514Sdarrenr	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
103322514Sdarrenr	ti.ti_dport = i;
103422514Sdarrenr	slen = sizeof(sin);
103522514Sdarrenr	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
103622514Sdarrenr		ti.ti_sport = sin.sin_port;
103722514Sdarrenr	if (!(t = find_tcp(fd, &ti))) {
103822514Sdarrenr		printf("Can't find PCB\n");
103922514Sdarrenr		goto skip_five_and_six;
104022514Sdarrenr	}
104124583Sdarrenr	KMCPY(&tcb, t, sizeof(tcb));
104222514Sdarrenr	ti.ti_win = tcb.rcv_adv;
104322514Sdarrenr	ti.ti_seq = tcb.snd_nxt - 1;
104422514Sdarrenr	ti.ti_ack = tcb.rcv_nxt;
104522514Sdarrenr
104622514Sdarrenr	if (!ptest || (ptest == 5)) {
104722514Sdarrenr		/*
104822514Sdarrenr		 * Test 5: urp
104922514Sdarrenr		 */
105022514Sdarrenr		printf("5.1 TCP Urgent pointer\n");
105122514Sdarrenr		ti.ti_urp = 1;
105222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
105322514Sdarrenr		PAUSE();
105422514Sdarrenr		ti.ti_urp = 0x7fff;
105522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
105622514Sdarrenr		PAUSE();
105722514Sdarrenr		ti.ti_urp = 0x8000;
105822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
105922514Sdarrenr		PAUSE();
106022514Sdarrenr		ti.ti_urp = 0xffff;
106122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
106222514Sdarrenr		PAUSE();
106322514Sdarrenr	}
106422514Sdarrenr
106522514Sdarrenr	if (!ptest || (ptest == 6)) {
106622514Sdarrenr		/*
106722514Sdarrenr		 * Test 6: data offset, off = 0, off is inside, off is outside
106822514Sdarrenr		 */
106922514Sdarrenr		printf("6.1 TCP off = 0-15, len = 40\n");
107022514Sdarrenr		for (i = 0; i < 16; i++) {
107122514Sdarrenr			ti.ti_off = ntohs(i);
107222514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
107322514Sdarrenr			printf("%d\r", i);
107422514Sdarrenr			fflush(stdout);
107522514Sdarrenr			PAUSE();
107622514Sdarrenr		}
107722514Sdarrenr		putchar('\n');
107822514Sdarrenr	}
107922514Sdarrenr
108022514Sdarrenr	(void) close(fd);
108122514Sdarrenr	}
108222514Sdarrenrskip_five_and_six:
108322514Sdarrenr#endif
108422514Sdarrenr	t->th_seq = 1;
108522514Sdarrenr	t->th_ack = 1;
108622514Sdarrenr
108722514Sdarrenr	if (!ptest || (ptest == 7)) {
108822514Sdarrenr		t->th_off = 0;
108922514Sdarrenr		t->th_flags = TH_SYN;
109022514Sdarrenr		/*
109122514Sdarrenr		 * Test 7: sport = 0, sport = 1, sport = 32767
109222514Sdarrenr		 *         sport = 32768, sport = 65535
109322514Sdarrenr		 */
109422514Sdarrenr		printf("5.7.1 TCP sport = 0\n");
109522514Sdarrenr		t->th_sport = 0;
109622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
109722514Sdarrenr		fflush(stdout);
109822514Sdarrenr		PAUSE();
109922514Sdarrenr
110022514Sdarrenr		printf("5.7.2 TCP sport = 1\n");
110122514Sdarrenr		t->th_sport = 1;
110222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
110322514Sdarrenr		fflush(stdout);
110422514Sdarrenr		PAUSE();
110522514Sdarrenr
110622514Sdarrenr		printf("5.7.3 TCP sport = 32767\n");
110722514Sdarrenr		t->th_sport = 32767;
110822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
110922514Sdarrenr		fflush(stdout);
111022514Sdarrenr		PAUSE();
111122514Sdarrenr
111222514Sdarrenr		printf("5.7.4 TCP sport = 32768\n");
111322514Sdarrenr		t->th_sport = 32768;
111422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
111522514Sdarrenr		fflush(stdout);
111622514Sdarrenr		PAUSE();
111722514Sdarrenr
111822514Sdarrenr		printf("5.7.5 TCP sport = 65535\n");
111922514Sdarrenr		t->th_sport = 65535;
112022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
112122514Sdarrenr		fflush(stdout);
112222514Sdarrenr		PAUSE();
112322514Sdarrenr	}
112422514Sdarrenr
112522514Sdarrenr	if (!ptest || (ptest == 8)) {
112622514Sdarrenr		t->th_sport = 1;
112722514Sdarrenr		/*
112822514Sdarrenr		 * Test 8: dport = 0, dport = 1, dport = 32767
112922514Sdarrenr		 *         dport = 32768, dport = 65535
113022514Sdarrenr		 */
113122514Sdarrenr		printf("5.8.1 TCP dport = 0\n");
113222514Sdarrenr		t->th_dport = 0;
113322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
113422514Sdarrenr		fflush(stdout);
113522514Sdarrenr		PAUSE();
113622514Sdarrenr
113722514Sdarrenr		printf("5.8.2 TCP dport = 1\n");
113822514Sdarrenr		t->th_dport = 1;
113922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114022514Sdarrenr		fflush(stdout);
114122514Sdarrenr		PAUSE();
114222514Sdarrenr
114322514Sdarrenr		printf("5.8.3 TCP dport = 32767\n");
114422514Sdarrenr		t->th_dport = 32767;
114522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114622514Sdarrenr		fflush(stdout);
114722514Sdarrenr		PAUSE();
114822514Sdarrenr
114922514Sdarrenr		printf("5.8.4 TCP dport = 32768\n");
115022514Sdarrenr		t->th_dport = 32768;
115122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
115222514Sdarrenr		fflush(stdout);
115322514Sdarrenr		PAUSE();
115422514Sdarrenr
115522514Sdarrenr		printf("5.8.5 TCP dport = 65535\n");
115622514Sdarrenr		t->th_dport = 65535;
115722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
115822514Sdarrenr		fflush(stdout);
115922514Sdarrenr		PAUSE();
116022514Sdarrenr	}
116122514Sdarrenr	/* TCP options header checking */
116222514Sdarrenr	/* 0 length options, etc */
116322514Sdarrenr}
116422514Sdarrenr
116522514Sdarrenr
116622514Sdarrenr/* Perform test 6 (exhaust mbuf test) */
116722514Sdarrenr
116822514Sdarrenrvoid	ip_test6(dev, mtu, ip, gwip, ptest)
116922514Sdarrenrchar	*dev;
117022514Sdarrenrint	mtu;
117122514Sdarrenrip_t	*ip;
117222514Sdarrenrstruct	in_addr	gwip;
117322514Sdarrenrint	ptest;
117422514Sdarrenr{
117522514Sdarrenr	struct	timeval	tv;
117622514Sdarrenr	udphdr_t *u;
117722514Sdarrenr	int	nfd, i, j, k;
117822514Sdarrenr
117922514Sdarrenr	ip->ip_v = IPVERSION;
118022514Sdarrenr	ip->ip_tos = 0;
118122514Sdarrenr	ip->ip_off = 0;
118222514Sdarrenr	ip->ip_ttl = 60;
118322514Sdarrenr	ip->ip_p = IPPROTO_UDP;
118422514Sdarrenr	ip->ip_sum = 0;
118522514Sdarrenr	u = (udphdr_t *)(ip + 1);
118622514Sdarrenr	u->uh_sport = 1;
118722514Sdarrenr	u->uh_dport = 9;
118822514Sdarrenr	u->uh_sum = 0;
118922514Sdarrenr
119022514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
119122514Sdarrenr	u->uh_sport = htons(u->uh_sport);
119222514Sdarrenr	u->uh_dport = htons(u->uh_dport);
119322514Sdarrenr	u->uh_ulen = 7168;
119422514Sdarrenr
119522514Sdarrenr	for (i = 0; i < 128; i++) {
119622514Sdarrenr		/*
119722514Sdarrenr		 * First send the entire packet in 768 byte chunks.
119822514Sdarrenr		 */
119922514Sdarrenr		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
120022514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
120122514Sdarrenr		ip->ip_off = IP_MF;
120222514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
120322514Sdarrenr		printf("%d %d\r", i, 0);
120422514Sdarrenr		fflush(stdout);
120522514Sdarrenr		PAUSE();
120622514Sdarrenr		/*
120722514Sdarrenr		 * And again using 128 byte chunks.
120822514Sdarrenr		 */
120922514Sdarrenr		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
121022514Sdarrenr		ip->ip_off = IP_MF;
121122514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
121222514Sdarrenr		printf("%d %d\r", i, 0);
121322514Sdarrenr		fflush(stdout);
121422514Sdarrenr		PAUSE();
121522514Sdarrenr
121622514Sdarrenr		for (j = 768; j < 3584; j += 768) {
121722514Sdarrenr			ip->ip_len = sizeof(*ip) + 768;
121822514Sdarrenr			ip->ip_off = IP_MF|(j>>3);
121922514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
122022514Sdarrenr			printf("%d %d\r", i, j);
122122514Sdarrenr			fflush(stdout);
122222514Sdarrenr			PAUSE();
122322514Sdarrenr
122422514Sdarrenr			ip->ip_len = sizeof(*ip) + 128;
122522514Sdarrenr			for (k = j - 768; k < j; k += 128) {
122622514Sdarrenr				ip->ip_off = IP_MF|(k>>3);
122722514Sdarrenr				(void) send_ip(nfd, 1500, ip, gwip, 1);
122822514Sdarrenr				printf("%d %d\r", i, k);
122922514Sdarrenr				fflush(stdout);
123022514Sdarrenr				PAUSE();
123122514Sdarrenr			}
123222514Sdarrenr		}
123322514Sdarrenr	}
123422514Sdarrenr	putchar('\n');
123522514Sdarrenr}
123622514Sdarrenr
123722514Sdarrenr
123822514Sdarrenr/* Perform test 7 (random packets) */
123922514Sdarrenr
124022514Sdarrenrstatic	u_long	tbuf[64];
124122514Sdarrenr
124222514Sdarrenrvoid	ip_test7(dev, mtu, ip, gwip, ptest)
124322514Sdarrenrchar	*dev;
124422514Sdarrenrint	mtu;
124522514Sdarrenrip_t	*ip;
124622514Sdarrenrstruct	in_addr	gwip;
124722514Sdarrenrint	ptest;
124822514Sdarrenr{
124922514Sdarrenr	ip_t	*pip;
125022514Sdarrenr	struct	timeval	tv;
125122514Sdarrenr	int	nfd, i, j;
125222514Sdarrenr	u_char	*s;
125322514Sdarrenr
125422514Sdarrenr	nfd = initdevice(dev, 0, 1);
125522514Sdarrenr	pip = (ip_t *)tbuf;
125622514Sdarrenr
125722514Sdarrenr	srand(time(NULL) ^ (getpid() * getppid()));
125822514Sdarrenr
125922514Sdarrenr	printf("7. send 1024 random IP packets.\n");
126022514Sdarrenr
126122514Sdarrenr	for (i = 0; i < 512; i++) {
126222514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
126322514Sdarrenr			*s = (rand() >> 13) & 0xff;
126422514Sdarrenr		pip->ip_v = IPVERSION;
126522514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
126622514Sdarrenr		      sizeof(struct in_addr));
126722514Sdarrenr		pip->ip_sum = 0;
126822514Sdarrenr		pip->ip_len &= 0xff;
126922514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
127022514Sdarrenr		printf("%d\r", i);
127122514Sdarrenr		fflush(stdout);
127222514Sdarrenr		PAUSE();
127322514Sdarrenr	}
127422514Sdarrenr	putchar('\n');
127522514Sdarrenr
127622514Sdarrenr	for (i = 0; i < 512; i++) {
127722514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
127822514Sdarrenr			*s = (rand() >> 13) & 0xff;
127922514Sdarrenr		pip->ip_v = IPVERSION;
128022514Sdarrenr		pip->ip_off &= 0xc000;
128122514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
128222514Sdarrenr		      sizeof(struct in_addr));
128322514Sdarrenr		pip->ip_sum = 0;
128422514Sdarrenr		pip->ip_len &= 0xff;
128522514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
128622514Sdarrenr		printf("%d\r", i);
128722514Sdarrenr		fflush(stdout);
128822514Sdarrenr		PAUSE();
128922514Sdarrenr	}
129022514Sdarrenr	putchar('\n');
129122514Sdarrenr}
1292