iptests.c revision 92691
122514Sdarrenr/*
253024Sguido * Copyright (C) 1993-1998 by Darren Reed.
322514Sdarrenr *
480490Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
522514Sdarrenr */
692691Sdarrenr#ifdef __sgi
792691Sdarrenr# include <sys/ptimers.h>
892691Sdarrenr#endif
922514Sdarrenr#include <stdio.h>
1022514Sdarrenr#include <unistd.h>
1122514Sdarrenr#include <stdlib.h>
1222514Sdarrenr#include <string.h>
1322514Sdarrenr#include <sys/types.h>
1422514Sdarrenr#include <sys/time.h>
1522514Sdarrenr#include <sys/param.h>
1653024Sguido#define _KERNEL
1753024Sguido#define KERNEL
1831183Speter#if !defined(solaris) && !defined(linux) && !defined(__sgi)
1922514Sdarrenr# include <sys/file.h>
2053024Sguido#else
2153024Sguido# ifdef solaris
2253024Sguido#  include <sys/dditypes.h>
2353024Sguido# endif
2453024Sguido#endif
2553024Sguido#undef  _KERNEL
2653024Sguido#undef  KERNEL
2753024Sguido#if !defined(solaris) && !defined(linux) && !defined(__sgi)
2822514Sdarrenr# include <nlist.h>
2922514Sdarrenr# include <sys/user.h>
3022514Sdarrenr# include <sys/proc.h>
3122514Sdarrenr#endif
3231183Speter#if !defined(ultrix) && !defined(hpux) && !defined(linux) && !defined(__sgi)
3331183Speter# include <kvm.h>
3431183Speter#endif
3531183Speter#ifndef	ultrix
3631183Speter# include <sys/socket.h>
3731183Speter#endif
3826119Sdarrenr#if defined(solaris)
3926119Sdarrenr# include <sys/stream.h>
4026119Sdarrenr#endif
4122514Sdarrenr#include <sys/socketvar.h>
4222514Sdarrenr#ifdef sun
4322514Sdarrenr#include <sys/systm.h>
4422514Sdarrenr#include <sys/session.h>
4522514Sdarrenr#endif
4622514Sdarrenr#if BSD >= 199103
4731183Speter# include <sys/sysctl.h>
4831183Speter# include <sys/filedesc.h>
4931183Speter# include <paths.h>
5022514Sdarrenr#endif
5122514Sdarrenr#include <netinet/in_systm.h>
5222514Sdarrenr#include <sys/socket.h>
5322514Sdarrenr#include <net/if.h>
5431183Speter#if defined(linux) && (LINUX >= 0200)
5531183Speter# include <asm/atomic.h>
5631183Speter#endif
5731183Speter#if !defined(linux)
5831183Speter# include <net/route.h>
5931183Speter#else
6031183Speter# define __KERNEL__	/* because there's a macro not wrapped by this */
6131183Speter# include <net/route.h>	/* in this file :-/ */
6231183Speter#endif
6322514Sdarrenr#include <netinet/in.h>
6422514Sdarrenr#include <arpa/inet.h>
6522514Sdarrenr#include <netinet/ip.h>
6622514Sdarrenr#include <netinet/tcp.h>
6722514Sdarrenr#include <netinet/udp.h>
6822514Sdarrenr#include <netinet/ip_icmp.h>
6931183Speter#ifndef linux
7031183Speter# include <netinet/ip_var.h>
7131183Speter# include <netinet/in_pcb.h>
7231183Speter# include <netinet/tcp_timer.h>
7331183Speter# include <netinet/tcp_var.h>
7431183Speter#endif
7531183Speter#if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
7631183Speter# include <sys/sysmacros.h>
7731183Speter#endif
7824583Sdarrenr#include "ipsend.h"
7922514Sdarrenr
8084843Sbde#if 0
8180490Sdarrenr#if !defined(lint)
8280490Sdarrenrstatic const char sccsid[] = "%W% %G% (C)1995 Darren Reed";
8392691Sdarrenrstatic const char rcsid[] = "@(#)$Id: iptests.c,v 2.1.4.5 2002/02/22 15:32:58 darrenr Exp $";
8480490Sdarrenr#endif
8584843Sbde#endif
8624583Sdarrenr
8784843Sbde__FBSDID("$FreeBSD: head/contrib/ipfilter/ipsend/iptests.c 92691 2002-03-19 11:48:16Z darrenr $");
8880490Sdarrenr
8984843Sbde
9022514Sdarrenr#define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
9122514Sdarrenr		  (void) select(0, NULL, NULL, NULL, &tv)
9222514Sdarrenr
9322514Sdarrenr
9422514Sdarrenrvoid	ip_test1(dev, mtu, ip, gwip, ptest)
9522514Sdarrenrchar	*dev;
9622514Sdarrenrint	mtu;
9722514Sdarrenrip_t	*ip;
9822514Sdarrenrstruct	in_addr	gwip;
9922514Sdarrenrint	ptest;
10022514Sdarrenr{
10122514Sdarrenr	struct	timeval	tv;
10222514Sdarrenr	udphdr_t *u;
10331183Speter	int	nfd, i = 0, len, id = getpid();
10422514Sdarrenr
10522514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
10622514Sdarrenr	ip->ip_v = IPVERSION;
10722514Sdarrenr	ip->ip_tos = 0;
10822514Sdarrenr	ip->ip_off = 0;
10922514Sdarrenr	ip->ip_ttl = 60;
11022514Sdarrenr	ip->ip_p = IPPROTO_UDP;
11122514Sdarrenr	ip->ip_sum = 0;
11222514Sdarrenr	u = (udphdr_t *)(ip + 1);
11337074Speter	u->uh_sport = htons(1);
11437074Speter	u->uh_dport = htons(9);
11522514Sdarrenr	u->uh_sum = 0;
11637074Speter	u->uh_ulen = htons(sizeof(*u) + 4);
11737074Speter	ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen);
11822514Sdarrenr	len = ip->ip_len;
11922514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
12022514Sdarrenr
12122514Sdarrenr	if (!ptest || (ptest == 1)) {
12222514Sdarrenr		/*
12322514Sdarrenr		 * Part1: hl < len
12422514Sdarrenr		 */
12522514Sdarrenr		ip->ip_id = 0;
12622514Sdarrenr		printf("1.1. sending packets with ip_hl < ip_len\n");
12737074Speter		for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) {
12822514Sdarrenr			ip->ip_hl = i >> 2;
12922514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
13022514Sdarrenr			printf("%d\r", i);
13122514Sdarrenr			fflush(stdout);
13222514Sdarrenr			PAUSE();
13322514Sdarrenr		}
13422514Sdarrenr		putchar('\n');
13522514Sdarrenr	}
13622514Sdarrenr
13722514Sdarrenr	if (!ptest || (ptest == 2)) {
13822514Sdarrenr		/*
13922514Sdarrenr		 * Part2: hl > len
14022514Sdarrenr		 */
14122514Sdarrenr		ip->ip_id = 0;
14222514Sdarrenr		printf("1.2. sending packets with ip_hl > ip_len\n");
14337074Speter		for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) {
14422514Sdarrenr			ip->ip_hl = i >> 2;
14522514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
14622514Sdarrenr			printf("%d\r", i);
14722514Sdarrenr			fflush(stdout);
14822514Sdarrenr			PAUSE();
14922514Sdarrenr		}
15022514Sdarrenr		putchar('\n');
15122514Sdarrenr	}
15222514Sdarrenr
15322514Sdarrenr	if (!ptest || (ptest == 3)) {
15422514Sdarrenr		/*
15522514Sdarrenr		 * Part3: v < 4
15622514Sdarrenr		 */
15722514Sdarrenr		ip->ip_id = 0;
15822514Sdarrenr		printf("1.3. ip_v < 4\n");
15922514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
16022514Sdarrenr		for (i = 0; i < 4; i++) {
16122514Sdarrenr			ip->ip_v = i;
16222514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
16322514Sdarrenr			printf("%d\r", i);
16422514Sdarrenr			fflush(stdout);
16522514Sdarrenr			PAUSE();
16622514Sdarrenr		}
16722514Sdarrenr		putchar('\n');
16822514Sdarrenr	}
16922514Sdarrenr
17022514Sdarrenr	if (!ptest || (ptest == 4)) {
17122514Sdarrenr		/*
17222514Sdarrenr		 * Part4: v > 4
17322514Sdarrenr		 */
17422514Sdarrenr		ip->ip_id = 0;
17522514Sdarrenr		printf("1.4. ip_v > 4\n");
17622514Sdarrenr		for (i = 5; i < 16; i++) {
17722514Sdarrenr			ip->ip_v = i;
17822514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
17922514Sdarrenr			printf("%d\r", i);
18022514Sdarrenr			fflush(stdout);
18122514Sdarrenr			PAUSE();
18222514Sdarrenr		}
18322514Sdarrenr		putchar('\n');
18422514Sdarrenr	}
18522514Sdarrenr
18622514Sdarrenr	if (!ptest || (ptest == 5)) {
18722514Sdarrenr		/*
18822514Sdarrenr		 * Part5: len < packet
18922514Sdarrenr		 */
19022514Sdarrenr		ip->ip_id = 0;
19122514Sdarrenr		ip->ip_v = IPVERSION;
19222514Sdarrenr		i = ip->ip_len + 1;
19322514Sdarrenr		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
19437074Speter		for (; i < (ip->ip_len * 2); i++) {
19522514Sdarrenr			ip->ip_id = htons(id++);
19622514Sdarrenr			ip->ip_sum = 0;
19724583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
19824583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
19922514Sdarrenr			printf("%d\r", i);
20022514Sdarrenr			fflush(stdout);
20122514Sdarrenr			PAUSE();
20222514Sdarrenr		}
20322514Sdarrenr		putchar('\n');
20422514Sdarrenr		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
20522514Sdarrenr		for (i = len; i > 0; i--) {
20622514Sdarrenr			ip->ip_id = htons(id++);
20737074Speter			ip->ip_len = i;
20822514Sdarrenr			ip->ip_sum = 0;
20924583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
21024583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
21122514Sdarrenr			printf("%d\r", i);
21222514Sdarrenr			fflush(stdout);
21322514Sdarrenr			PAUSE();
21422514Sdarrenr		}
21522514Sdarrenr		putchar('\n');
21622514Sdarrenr	}
21722514Sdarrenr
21822514Sdarrenr	if (!ptest || (ptest == 6)) {
21922514Sdarrenr		/*
22022514Sdarrenr		 * Part6: len > packet
22122514Sdarrenr		 */
22222514Sdarrenr		ip->ip_id = 0;
22322514Sdarrenr		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
22422514Sdarrenr		for (i = len + 1; i < (len * 2); i++) {
22522514Sdarrenr			ip->ip_id = htons(id++);
22637074Speter			ip->ip_len = i;
22722514Sdarrenr			ip->ip_sum = 0;
22824583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
22924583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
23022514Sdarrenr			printf("%d\r", i);
23122514Sdarrenr			fflush(stdout);
23222514Sdarrenr			PAUSE();
23322514Sdarrenr		}
23422514Sdarrenr		putchar('\n');
23537074Speter		ip->ip_len = len;
23622514Sdarrenr		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
23722514Sdarrenr		for (i = len; i > 0; i--) {
23822514Sdarrenr			ip->ip_id = htons(id++);
23922514Sdarrenr			ip->ip_sum = 0;
24024583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
24124583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
24222514Sdarrenr			printf("%d\r", i);
24322514Sdarrenr			fflush(stdout);
24422514Sdarrenr			PAUSE();
24522514Sdarrenr		}
24622514Sdarrenr		putchar('\n');
24722514Sdarrenr	}
24822514Sdarrenr
24922514Sdarrenr	if (!ptest || (ptest == 7)) {
25022514Sdarrenr		/*
25122514Sdarrenr		 * Part7: 0 length fragment
25222514Sdarrenr		 */
25322514Sdarrenr		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
25422514Sdarrenr		ip->ip_id = 0;
25522514Sdarrenr		ip->ip_len = sizeof(*ip);
25622514Sdarrenr		ip->ip_off = htons(IP_MF);
25722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
25822514Sdarrenr		fflush(stdout);
25922514Sdarrenr		PAUSE();
26022514Sdarrenr
26122514Sdarrenr		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
26222514Sdarrenr		ip->ip_id = 0;
26322514Sdarrenr		ip->ip_len = sizeof(*ip);
26422514Sdarrenr		ip->ip_off = htons(IP_MF);
26522514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
26622514Sdarrenr		fflush(stdout);
26722514Sdarrenr		PAUSE();
26822514Sdarrenr
26922514Sdarrenr		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
27022514Sdarrenr		ip->ip_id = 0;
27122514Sdarrenr		ip->ip_len = sizeof(*ip);
27222514Sdarrenr		ip->ip_off = htons(0xa000);
27322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
27422514Sdarrenr		fflush(stdout);
27522514Sdarrenr		PAUSE();
27622514Sdarrenr
27722514Sdarrenr		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
27822514Sdarrenr		ip->ip_id = 0;
27922514Sdarrenr		ip->ip_len = sizeof(*ip);
28022514Sdarrenr		ip->ip_off = htons(0x0100);
28122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
28222514Sdarrenr		fflush(stdout);
28322514Sdarrenr		PAUSE();
28422514Sdarrenr	}
28522514Sdarrenr
28622514Sdarrenr	if (!ptest || (ptest == 8)) {
28722514Sdarrenr		struct	timeval	tv;
28822514Sdarrenr
28922514Sdarrenr		gettimeofday(&tv, NULL);
29022514Sdarrenr		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
29122514Sdarrenr		/*
29222514Sdarrenr		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
29322514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
29422514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
29522514Sdarrenr		 * about that here.
29622514Sdarrenr		 */
29722514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
29837074Speter		ip->ip_off = htons(IP_MF);
29922514Sdarrenr		u->uh_dport = htons(9);
30022514Sdarrenr		ip->ip_id = htons(id++);
30122514Sdarrenr		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
30222514Sdarrenr		ip->ip_len = 768 + 20 + 8;
30322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
30422514Sdarrenr		printf("%d\r", i);
30522514Sdarrenr
30622514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
30722514Sdarrenr		i = 512;
30822514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
30992691Sdarrenr			ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff));
31022514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
31122514Sdarrenr			printf("%d\r", i);
31222514Sdarrenr			fflush(stdout);
31322514Sdarrenr			PAUSE();
31422514Sdarrenr		}
31522514Sdarrenr		ip->ip_len = 896 + 20;
31692691Sdarrenr		ip->ip_off = htons((i >> 3) & 0x1fff);
31722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
31822514Sdarrenr		printf("%d\r", i);
31922514Sdarrenr		putchar('\n');
32022514Sdarrenr		fflush(stdout);
32122514Sdarrenr
32222514Sdarrenr		/*
32322514Sdarrenr		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
32422514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
32522514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
32622514Sdarrenr		 * about that here.  (Lossage here)
32722514Sdarrenr		 */
32822514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
32937074Speter		ip->ip_off = htons(IP_MF);
33022514Sdarrenr		u->uh_dport = htons(9);
33122514Sdarrenr		ip->ip_id = htons(id++);
33222514Sdarrenr		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
33322514Sdarrenr		ip->ip_len = 768 + 20 + 8;
33422514Sdarrenr		if ((rand() & 0x1f) != 0) {
33522514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
33622514Sdarrenr			printf("%d\r", i);
33722514Sdarrenr		} else
33822514Sdarrenr			printf("skip 0\n");
33922514Sdarrenr
34022514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
34122514Sdarrenr		i = 512;
34222514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
34392691Sdarrenr			ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff));
34422514Sdarrenr			if ((rand() & 0x1f) != 0) {
34522514Sdarrenr				(void) send_ip(nfd, mtu, ip, gwip, 1);
34622514Sdarrenr				printf("%d\r", i);
34722514Sdarrenr			} else
34822514Sdarrenr				printf("skip %d\n", i);
34922514Sdarrenr			fflush(stdout);
35022514Sdarrenr			PAUSE();
35122514Sdarrenr		}
35222514Sdarrenr		ip->ip_len = 896 + 20;
35392691Sdarrenr		ip->ip_off = htons((i >> 3) & 0x1fff);
35422514Sdarrenr		if ((rand() & 0x1f) != 0) {
35522514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
35622514Sdarrenr			printf("%d\r", i);
35722514Sdarrenr		} else
35822514Sdarrenr			printf("skip\n");
35922514Sdarrenr		putchar('\n');
36022514Sdarrenr		fflush(stdout);
36122514Sdarrenr
36222514Sdarrenr		/*
36322514Sdarrenr		 * Part8.3: 33k packet - test for not dealing with -ve length
36422514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
36522514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
36622514Sdarrenr		 * about that here.
36722514Sdarrenr		 */
36822514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
36937074Speter		ip->ip_off = htons(IP_MF);
37022514Sdarrenr		u->uh_dport = htons(9);
37122514Sdarrenr		ip->ip_id = htons(id++);
37222514Sdarrenr		printf("1.8.3 33k packet\n");
37322514Sdarrenr		ip->ip_len = 768 + 20 + 8;
37422514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
37522514Sdarrenr		printf("%d\r", i);
37622514Sdarrenr
37722514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
37822514Sdarrenr		i = 512;
37922514Sdarrenr		for (; i < (32 * 1024 + 768); i += 768) {
38092691Sdarrenr			ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff));
38122514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
38222514Sdarrenr			printf("%d\r", i);
38322514Sdarrenr			fflush(stdout);
38422514Sdarrenr			PAUSE();
38522514Sdarrenr		}
38622514Sdarrenr		ip->ip_len = 896 + 20;
38792691Sdarrenr		ip->ip_off = htons((i >> 3) & 0x1fff);
38822514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
38922514Sdarrenr		printf("%d\r", i);
39022514Sdarrenr		putchar('\n');
39122514Sdarrenr		fflush(stdout);
39222514Sdarrenr	}
39322514Sdarrenr
39422514Sdarrenr	ip->ip_len = len;
39522514Sdarrenr	ip->ip_off = 0;
39622514Sdarrenr	if (!ptest || (ptest == 9)) {
39722514Sdarrenr		/*
39822514Sdarrenr		 * Part9: off & 0x8000 == 0x8000
39922514Sdarrenr		 */
40022514Sdarrenr		ip->ip_id = 0;
40137074Speter		ip->ip_off = htons(0x8000);
40222514Sdarrenr		printf("1.9. ip_off & 0x8000 == 0x8000\n");
40322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
40422514Sdarrenr		fflush(stdout);
40522514Sdarrenr		PAUSE();
40622514Sdarrenr	}
40722514Sdarrenr
40822514Sdarrenr	ip->ip_off = 0;
40922514Sdarrenr
41022514Sdarrenr	if (!ptest || (ptest == 10)) {
41122514Sdarrenr		/*
41222514Sdarrenr		 * Part10: ttl = 255
41322514Sdarrenr		 */
41422514Sdarrenr		ip->ip_id = 0;
41522514Sdarrenr		ip->ip_ttl = 255;
41622514Sdarrenr		printf("1.10.0 ip_ttl = 255\n");
41722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
41822514Sdarrenr		fflush(stdout);
41922514Sdarrenr		PAUSE();
42022514Sdarrenr
42122514Sdarrenr		ip->ip_ttl = 128;
42222514Sdarrenr		printf("1.10.1 ip_ttl = 128\n");
42322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
42422514Sdarrenr		fflush(stdout);
42522514Sdarrenr		PAUSE();
42622514Sdarrenr
42722514Sdarrenr		ip->ip_ttl = 0;
42822514Sdarrenr		printf("1.10.2 ip_ttl = 0\n");
42922514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
43022514Sdarrenr		fflush(stdout);
43122514Sdarrenr		PAUSE();
43222514Sdarrenr	}
43322514Sdarrenr
43422514Sdarrenr	(void) close(nfd);
43522514Sdarrenr}
43622514Sdarrenr
43722514Sdarrenr
43822514Sdarrenrvoid	ip_test2(dev, mtu, ip, gwip, ptest)
43922514Sdarrenrchar	*dev;
44022514Sdarrenrint	mtu;
44122514Sdarrenrip_t	*ip;
44222514Sdarrenrstruct	in_addr	gwip;
44322514Sdarrenrint	ptest;
44422514Sdarrenr{
44522514Sdarrenr	struct	timeval	tv;
44622514Sdarrenr	int	nfd;
44722514Sdarrenr	u_char	*s;
44822514Sdarrenr
44922514Sdarrenr	s = (u_char *)(ip + 1);
45037074Speter	nfd = initdevice(dev, htons(1), 1);
45122514Sdarrenr
45222514Sdarrenr	ip->ip_hl = 6;
45322514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
45422514Sdarrenr	s[IPOPT_OPTVAL] = IPOPT_NOP;
45522514Sdarrenr	s++;
45622514Sdarrenr	if (!ptest || (ptest == 1)) {
45722514Sdarrenr		/*
45822514Sdarrenr		 * Test 1: option length > packet length,
45922514Sdarrenr		 *                header length == packet length
46022514Sdarrenr		 */
46122514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
46222514Sdarrenr		s[IPOPT_OLEN] = 4;
46322514Sdarrenr		s[IPOPT_OFFSET] = IPOPT_MINOFF;
46422514Sdarrenr		ip->ip_p = IPPROTO_IP;
46522514Sdarrenr		printf("2.1 option length > packet length\n");
46622514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
46722514Sdarrenr		fflush(stdout);
46822514Sdarrenr		PAUSE();
46922514Sdarrenr	}
47022514Sdarrenr
47122514Sdarrenr	ip->ip_hl = 7;
47222514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
47322514Sdarrenr	if (!ptest || (ptest == 1)) {
47422514Sdarrenr		/*
47522514Sdarrenr		 * Test 2: options have length = 0
47622514Sdarrenr		 */
47722514Sdarrenr		printf("2.2.1 option length = 0, RR\n");
47822514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_RR;
47922514Sdarrenr		s[IPOPT_OLEN] = 0;
48022514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48122514Sdarrenr		fflush(stdout);
48222514Sdarrenr		PAUSE();
48322514Sdarrenr
48422514Sdarrenr		printf("2.2.2 option length = 0, TS\n");
48522514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
48622514Sdarrenr		s[IPOPT_OLEN] = 0;
48722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48822514Sdarrenr		fflush(stdout);
48922514Sdarrenr		PAUSE();
49022514Sdarrenr
49122514Sdarrenr		printf("2.2.3 option length = 0, SECURITY\n");
49222514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
49322514Sdarrenr		s[IPOPT_OLEN] = 0;
49422514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
49522514Sdarrenr		fflush(stdout);
49622514Sdarrenr		PAUSE();
49722514Sdarrenr
49822514Sdarrenr		printf("2.2.4 option length = 0, LSRR\n");
49922514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_LSRR;
50022514Sdarrenr		s[IPOPT_OLEN] = 0;
50122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
50222514Sdarrenr		fflush(stdout);
50322514Sdarrenr		PAUSE();
50422514Sdarrenr
50522514Sdarrenr		printf("2.2.5 option length = 0, SATID\n");
50622514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SATID;
50722514Sdarrenr		s[IPOPT_OLEN] = 0;
50822514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
50922514Sdarrenr		fflush(stdout);
51022514Sdarrenr		PAUSE();
51122514Sdarrenr
51222514Sdarrenr		printf("2.2.6 option length = 0, SSRR\n");
51322514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SSRR;
51422514Sdarrenr		s[IPOPT_OLEN] = 0;
51522514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
51622514Sdarrenr		fflush(stdout);
51722514Sdarrenr		PAUSE();
51822514Sdarrenr	}
51922514Sdarrenr
52022514Sdarrenr	(void) close(nfd);
52122514Sdarrenr}
52222514Sdarrenr
52322514Sdarrenr
52422514Sdarrenr/*
52522514Sdarrenr * test 3 (ICMP)
52622514Sdarrenr */
52722514Sdarrenrvoid	ip_test3(dev, mtu, ip, gwip, ptest)
52822514Sdarrenrchar	*dev;
52922514Sdarrenrint	mtu;
53022514Sdarrenrip_t	*ip;
53122514Sdarrenrstruct	in_addr	gwip;
53222514Sdarrenrint	ptest;
53322514Sdarrenr{
53422514Sdarrenr	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
53522514Sdarrenr	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
53622514Sdarrenr	struct	timeval	tv;
53722514Sdarrenr	struct	icmp	*icp;
53822514Sdarrenr	int	nfd, i;
53922514Sdarrenr
54022514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
54122514Sdarrenr	ip->ip_v = IPVERSION;
54222514Sdarrenr	ip->ip_tos = 0;
54322514Sdarrenr	ip->ip_off = 0;
54422514Sdarrenr	ip->ip_ttl = 60;
54522514Sdarrenr	ip->ip_p = IPPROTO_ICMP;
54622514Sdarrenr	ip->ip_sum = 0;
54722514Sdarrenr	ip->ip_len = sizeof(*ip) + sizeof(*icp);
54822514Sdarrenr	icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2));
54937074Speter	nfd = initdevice(dev, htons(1), 1);
55022514Sdarrenr
55122514Sdarrenr	if (!ptest || (ptest == 1)) {
55222514Sdarrenr		/*
55322514Sdarrenr		 * Type 0 - 31, 255, code = 0
55422514Sdarrenr		 */
55522514Sdarrenr		bzero((char *)icp, sizeof(*icp));
55622514Sdarrenr		for (i = 0; i < 32; i++) {
55722514Sdarrenr			icp->icmp_type = i;
55822514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
55922514Sdarrenr			PAUSE();
56022514Sdarrenr			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
56122514Sdarrenr		}
56222514Sdarrenr		icp->icmp_type = 255;
56322514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
56422514Sdarrenr		PAUSE();
56522514Sdarrenr		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
56622514Sdarrenr		putchar('\n');
56722514Sdarrenr	}
56822514Sdarrenr
56922514Sdarrenr	if (!ptest || (ptest == 2)) {
57022514Sdarrenr		/*
57122514Sdarrenr		 * Type 3, code = 0 - 31
57222514Sdarrenr		 */
57322514Sdarrenr		icp->icmp_type = 3;
57422514Sdarrenr		for (i = 0; i < 32; i++) {
57522514Sdarrenr			icp->icmp_code = i;
57622514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
57722514Sdarrenr			PAUSE();
57822514Sdarrenr			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
57922514Sdarrenr		}
58022514Sdarrenr	}
58122514Sdarrenr
58222514Sdarrenr	if (!ptest || (ptest == 3)) {
58322514Sdarrenr		/*
58422514Sdarrenr		 * Type 4, code = 0,127,128,255
58522514Sdarrenr		 */
58622514Sdarrenr		icp->icmp_type = 4;
58722514Sdarrenr		icp->icmp_code = 0;
58822514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
58922514Sdarrenr		PAUSE();
59022514Sdarrenr		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
59122514Sdarrenr		icp->icmp_code = 127;
59222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59322514Sdarrenr		PAUSE();
59422514Sdarrenr		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
59522514Sdarrenr		icp->icmp_code = 128;
59622514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59722514Sdarrenr		PAUSE();
59822514Sdarrenr		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
59922514Sdarrenr		icp->icmp_code = 255;
60022514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
60122514Sdarrenr		PAUSE();
60222514Sdarrenr		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
60322514Sdarrenr	}
60422514Sdarrenr
60522514Sdarrenr	if (!ptest || (ptest == 4)) {
60622514Sdarrenr		/*
60722514Sdarrenr		 * Type 5, code = 0,127,128,255
60822514Sdarrenr		 */
60922514Sdarrenr		icp->icmp_type = 5;
61022514Sdarrenr		icp->icmp_code = 0;
61122514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
61222514Sdarrenr		PAUSE();
61322514Sdarrenr		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
61422514Sdarrenr		icp->icmp_code = 127;
61522514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
61622514Sdarrenr		PAUSE();
61722514Sdarrenr		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
61822514Sdarrenr		icp->icmp_code = 128;
61922514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
62022514Sdarrenr		PAUSE();
62122514Sdarrenr		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
62222514Sdarrenr		icp->icmp_code = 255;
62322514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
62422514Sdarrenr		PAUSE();
62522514Sdarrenr		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
62622514Sdarrenr	}
62722514Sdarrenr
62822514Sdarrenr	if (!ptest || (ptest == 5)) {
62922514Sdarrenr		/*
63022514Sdarrenr		 * Type 8-10;13-18, code - 0,127,128,255
63122514Sdarrenr		 */
63222514Sdarrenr		for (i = 0; ict1[i]; i++) {
63322514Sdarrenr			icp->icmp_type = ict1[i];
63422514Sdarrenr			icp->icmp_code = 0;
63522514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
63622514Sdarrenr			PAUSE();
63722514Sdarrenr			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
63822514Sdarrenr				i * 4);
63922514Sdarrenr			icp->icmp_code = 127;
64022514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
64122514Sdarrenr			PAUSE();
64222514Sdarrenr			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
64322514Sdarrenr				i * 4 + 1);
64422514Sdarrenr			icp->icmp_code = 128;
64522514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
64622514Sdarrenr			PAUSE();
64722514Sdarrenr			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
64822514Sdarrenr				i * 4 + 2);
64922514Sdarrenr			icp->icmp_code = 255;
65022514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
65122514Sdarrenr			PAUSE();
65222514Sdarrenr			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
65322514Sdarrenr				i * 4 + 3);
65422514Sdarrenr		}
65522514Sdarrenr		putchar('\n');
65622514Sdarrenr	}
65722514Sdarrenr
65822514Sdarrenr	if (!ptest || (ptest == 6)) {
65922514Sdarrenr		/*
66022514Sdarrenr		 * Type 12, code - 0,127,128,129,255
66122514Sdarrenr		 */
66222514Sdarrenr		icp->icmp_type = 12;
66322514Sdarrenr		icp->icmp_code = 0;
66422514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
66522514Sdarrenr		PAUSE();
66622514Sdarrenr		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
66722514Sdarrenr		icp->icmp_code = 127;
66822514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
66922514Sdarrenr		PAUSE();
67022514Sdarrenr		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
67122514Sdarrenr		icp->icmp_code = 128;
67222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
67322514Sdarrenr		PAUSE();
67422514Sdarrenr		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
67522514Sdarrenr		icp->icmp_code = 129;
67622514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
67722514Sdarrenr		PAUSE();
67822514Sdarrenr		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
67922514Sdarrenr		icp->icmp_code = 255;
68022514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
68122514Sdarrenr		PAUSE();
68222514Sdarrenr		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
68322514Sdarrenr		putchar('\n');
68422514Sdarrenr	}
68522514Sdarrenr
68622514Sdarrenr	if (!ptest || (ptest == 7)) {
68722514Sdarrenr		/*
68822514Sdarrenr		 * Type 3;9-10;13-14;17-18 - shorter packets
68922514Sdarrenr		 */
69022514Sdarrenr		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
69122514Sdarrenr		for (i = 0; ict2[i]; i++) {
69222514Sdarrenr			icp->icmp_type = ict1[i];
69322514Sdarrenr			icp->icmp_code = 0;
69422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
69522514Sdarrenr			PAUSE();
69622514Sdarrenr			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
69722514Sdarrenr				i * 4, icp->icmp_type);
69822514Sdarrenr			icp->icmp_code = 127;
69922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
70022514Sdarrenr			PAUSE();
70122514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
70222514Sdarrenr				i * 4 + 1, icp->icmp_type);
70322514Sdarrenr			icp->icmp_code = 128;
70422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
70522514Sdarrenr			PAUSE();
70622514Sdarrenr			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
70722514Sdarrenr				i * 4 + 2, icp->icmp_type);
70822514Sdarrenr			icp->icmp_code = 255;
70922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
71022514Sdarrenr			PAUSE();
71122514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
71222514Sdarrenr				i * 4 + 3, icp->icmp_type);
71322514Sdarrenr		}
71422514Sdarrenr		putchar('\n');
71522514Sdarrenr	}
71622514Sdarrenr}
71722514Sdarrenr
71822514Sdarrenr
71922514Sdarrenr/* Perform test 4 (UDP) */
72022514Sdarrenr
72122514Sdarrenrvoid	ip_test4(dev, mtu, ip, gwip, ptest)
72222514Sdarrenrchar	*dev;
72322514Sdarrenrint	mtu;
72422514Sdarrenrip_t	*ip;
72522514Sdarrenrstruct	in_addr	gwip;
72622514Sdarrenrint	ptest;
72722514Sdarrenr{
72822514Sdarrenr	struct	timeval	tv;
72931183Speter	udphdr_t	*u;
73022514Sdarrenr	int	nfd, i;
73122514Sdarrenr
73222514Sdarrenr
73322514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
73422514Sdarrenr	ip->ip_v = IPVERSION;
73522514Sdarrenr	ip->ip_tos = 0;
73622514Sdarrenr	ip->ip_off = 0;
73722514Sdarrenr	ip->ip_ttl = 60;
73822514Sdarrenr	ip->ip_p = IPPROTO_UDP;
73922514Sdarrenr	ip->ip_sum = 0;
74022514Sdarrenr	u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2));
74137074Speter	u->uh_sport = htons(1);
74237074Speter	u->uh_dport = htons(1);
74337074Speter	u->uh_ulen = htons(sizeof(*u) + 4);
74422514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
74522514Sdarrenr
74622514Sdarrenr	if (!ptest || (ptest == 1)) {
74722514Sdarrenr		/*
74822514Sdarrenr		 * Test 1. ulen > packet
74922514Sdarrenr		 */
75037074Speter		u->uh_ulen = htons(sizeof(*u) + 4);
75137074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
75222514Sdarrenr		printf("4.1 UDP uh_ulen > packet size - short packets\n");
75337074Speter		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
75437074Speter			u->uh_ulen = htons(i);
75522514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
75622514Sdarrenr			printf("%d\r", i);
75722514Sdarrenr			fflush(stdout);
75822514Sdarrenr			PAUSE();
75922514Sdarrenr		}
76022514Sdarrenr		putchar('\n');
76122514Sdarrenr	}
76222514Sdarrenr
76322514Sdarrenr	if (!ptest || (ptest == 2)) {
76422514Sdarrenr		/*
76522514Sdarrenr		 * Test 2. ulen < packet
76622514Sdarrenr		 */
76737074Speter		u->uh_ulen = htons(sizeof(*u) + 4);
76837074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
76922514Sdarrenr		printf("4.2 UDP uh_ulen < packet size - short packets\n");
77037074Speter		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
77122514Sdarrenr			ip->ip_len = i;
77222514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
77322514Sdarrenr			printf("%d\r", i);
77422514Sdarrenr			fflush(stdout);
77522514Sdarrenr			PAUSE();
77622514Sdarrenr		}
77722514Sdarrenr		putchar('\n');
77822514Sdarrenr	}
77922514Sdarrenr
78022514Sdarrenr	if (!ptest || (ptest == 3)) {
78122514Sdarrenr		/*
78222514Sdarrenr		 * Test 3: sport = 0, sport = 1, sport = 32767
78322514Sdarrenr		 *         sport = 32768, sport = 65535
78422514Sdarrenr		 */
78522514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
78637074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
78722514Sdarrenr		printf("4.3.1 UDP sport = 0\n");
78822514Sdarrenr		u->uh_sport = 0;
78922514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
79022514Sdarrenr		printf("0\n");
79122514Sdarrenr		fflush(stdout);
79222514Sdarrenr		PAUSE();
79322514Sdarrenr		printf("4.3.2 UDP sport = 1\n");
79437074Speter		u->uh_sport = htons(1);
79522514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
79622514Sdarrenr		printf("1\n");
79722514Sdarrenr		fflush(stdout);
79822514Sdarrenr		PAUSE();
79922514Sdarrenr		printf("4.3.3 UDP sport = 32767\n");
80037074Speter		u->uh_sport = htons(32767);
80122514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
80222514Sdarrenr		printf("32767\n");
80322514Sdarrenr		fflush(stdout);
80422514Sdarrenr		PAUSE();
80522514Sdarrenr		printf("4.3.4 UDP sport = 32768\n");
80637074Speter		u->uh_sport = htons(32768);
80722514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
80822514Sdarrenr		printf("32768\n");
80922514Sdarrenr		putchar('\n');
81022514Sdarrenr		fflush(stdout);
81122514Sdarrenr		PAUSE();
81222514Sdarrenr		printf("4.3.5 UDP sport = 65535\n");
81337074Speter		u->uh_sport = htons(65535);
81422514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
81522514Sdarrenr		printf("65535\n");
81622514Sdarrenr		fflush(stdout);
81722514Sdarrenr		PAUSE();
81822514Sdarrenr	}
81922514Sdarrenr
82022514Sdarrenr	if (!ptest || (ptest == 4)) {
82122514Sdarrenr		/*
82222514Sdarrenr		 * Test 4: dport = 0, dport = 1, dport = 32767
82322514Sdarrenr		 *         dport = 32768, dport = 65535
82422514Sdarrenr		 */
82537074Speter		u->uh_ulen = ntohs(sizeof(*u) + 4);
82637074Speter		u->uh_sport = htons(1);
82737074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
82822514Sdarrenr		printf("4.4.1 UDP dport = 0\n");
82922514Sdarrenr		u->uh_dport = 0;
83022514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
83122514Sdarrenr		printf("0\n");
83222514Sdarrenr		fflush(stdout);
83322514Sdarrenr		PAUSE();
83422514Sdarrenr		printf("4.4.2 UDP dport = 1\n");
83537074Speter		u->uh_dport = htons(1);
83622514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
83722514Sdarrenr		printf("1\n");
83822514Sdarrenr		fflush(stdout);
83922514Sdarrenr		PAUSE();
84022514Sdarrenr		printf("4.4.3 UDP dport = 32767\n");
84137074Speter		u->uh_dport = htons(32767);
84222514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
84322514Sdarrenr		printf("32767\n");
84422514Sdarrenr		fflush(stdout);
84522514Sdarrenr		PAUSE();
84622514Sdarrenr		printf("4.4.4 UDP dport = 32768\n");
84737074Speter		u->uh_dport = htons(32768);
84822514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
84922514Sdarrenr		printf("32768\n");
85022514Sdarrenr		fflush(stdout);
85122514Sdarrenr		PAUSE();
85222514Sdarrenr		printf("4.4.5 UDP dport = 65535\n");
85337074Speter		u->uh_dport = htons(65535);
85422514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
85522514Sdarrenr		printf("65535\n");
85622514Sdarrenr		fflush(stdout);
85722514Sdarrenr		PAUSE();
85822514Sdarrenr	}
85922514Sdarrenr
86031183Speter	if (!ptest || (ptest == 5)) {
86122514Sdarrenr		/*
86231183Speter		 * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) +
86331183Speter		 * sizeof(ip_t)
86422514Sdarrenr		 */
86522514Sdarrenr		printf("4.5 UDP 20 <= MTU <= 32\n");
86637074Speter		for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) {
86722514Sdarrenr			(void) send_udp(nfd, i, ip, gwip);
86822514Sdarrenr			printf("%d\r", i);
86922514Sdarrenr			fflush(stdout);
87022514Sdarrenr			PAUSE();
87122514Sdarrenr		}
87222514Sdarrenr		putchar('\n');
87322514Sdarrenr	}
87422514Sdarrenr}
87522514Sdarrenr
87622514Sdarrenr
87722514Sdarrenr/* Perform test 5 (TCP) */
87822514Sdarrenr
87922514Sdarrenrvoid	ip_test5(dev, mtu, ip, gwip, ptest)
88022514Sdarrenrchar	*dev;
88122514Sdarrenrint	mtu;
88222514Sdarrenrip_t	*ip;
88322514Sdarrenrstruct	in_addr	gwip;
88422514Sdarrenrint	ptest;
88522514Sdarrenr{
88622514Sdarrenr	struct	timeval	tv;
88722514Sdarrenr	tcphdr_t *t;
88822514Sdarrenr	int	nfd, i;
88922514Sdarrenr
89022514Sdarrenr	t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2));
89131183Speter#ifndef	linux
89222514Sdarrenr	t->th_x2 = 0;
89331183Speter#endif
89422514Sdarrenr	t->th_off = 0;
89537074Speter	t->th_sport = htons(1);
89637074Speter	t->th_dport = htons(1);
89737074Speter	t->th_win = htons(4096);
89822514Sdarrenr	t->th_urp = 0;
89922514Sdarrenr	t->th_sum = 0;
90037074Speter	t->th_seq = htonl(1);
90122514Sdarrenr	t->th_ack = 0;
90234739Speter	ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
90322514Sdarrenr	nfd = initdevice(dev, t->th_sport, 1);
90422514Sdarrenr
90522514Sdarrenr	if (!ptest || (ptest == 1)) {
90622514Sdarrenr		/*
90722514Sdarrenr		 * Test 1: flags variations, 0 - 3f
90822514Sdarrenr		 */
90922514Sdarrenr		t->th_off = sizeof(*t) >> 2;
91022514Sdarrenr		printf("5.1 Test TCP flag combinations\n");
91122514Sdarrenr		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
91222514Sdarrenr		     i++) {
91322514Sdarrenr			t->th_flags = i;
91422514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
91522514Sdarrenr			printf("%d\r", i);
91622514Sdarrenr			fflush(stdout);
91722514Sdarrenr			PAUSE();
91822514Sdarrenr		}
91922514Sdarrenr		putchar('\n');
92022514Sdarrenr	}
92122514Sdarrenr
92222514Sdarrenr	if (!ptest || (ptest == 2)) {
92322514Sdarrenr		t->th_flags = TH_SYN;
92422514Sdarrenr		/*
92522514Sdarrenr		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
92622514Sdarrenr		 *         seq = 0xa000000, seq = 0xffffffff
92722514Sdarrenr		 */
92822514Sdarrenr		printf("5.2.1 TCP seq = 0\n");
92937074Speter		t->th_seq = htonl(0);
93022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93122514Sdarrenr		fflush(stdout);
93222514Sdarrenr		PAUSE();
93322514Sdarrenr
93422514Sdarrenr		printf("5.2.2 TCP seq = 1\n");
93537074Speter		t->th_seq = htonl(1);
93622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93722514Sdarrenr		fflush(stdout);
93822514Sdarrenr		PAUSE();
93922514Sdarrenr
94022514Sdarrenr		printf("5.2.3 TCP seq = 0x7fffffff\n");
94137074Speter		t->th_seq = htonl(0x7fffffff);
94222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
94322514Sdarrenr		fflush(stdout);
94422514Sdarrenr		PAUSE();
94522514Sdarrenr
94622514Sdarrenr		printf("5.2.4 TCP seq = 0x80000000\n");
94737074Speter		t->th_seq = htonl(0x80000000);
94822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
94922514Sdarrenr		fflush(stdout);
95022514Sdarrenr		PAUSE();
95122514Sdarrenr
95222514Sdarrenr		printf("5.2.5 TCP seq = 0xc0000000\n");
95337074Speter		t->th_seq = htonl(0xc0000000);
95422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
95522514Sdarrenr		fflush(stdout);
95622514Sdarrenr		PAUSE();
95722514Sdarrenr
95822514Sdarrenr		printf("5.2.6 TCP seq = 0xffffffff\n");
95937074Speter		t->th_seq = htonl(0xffffffff);
96022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
96122514Sdarrenr		fflush(stdout);
96222514Sdarrenr		PAUSE();
96322514Sdarrenr	}
96422514Sdarrenr
96522514Sdarrenr	if (!ptest || (ptest == 3)) {
96622514Sdarrenr		t->th_flags = TH_ACK;
96722514Sdarrenr		/*
96822514Sdarrenr		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
96922514Sdarrenr		 *         ack = 0xa000000, ack = 0xffffffff
97022514Sdarrenr		 */
97122514Sdarrenr		printf("5.3.1 TCP ack = 0\n");
97222514Sdarrenr		t->th_ack = 0;
97322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
97422514Sdarrenr		fflush(stdout);
97522514Sdarrenr		PAUSE();
97622514Sdarrenr
97722514Sdarrenr		printf("5.3.2 TCP ack = 1\n");
97837074Speter		t->th_ack = htonl(1);
97922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
98022514Sdarrenr		fflush(stdout);
98122514Sdarrenr		PAUSE();
98222514Sdarrenr
98322514Sdarrenr		printf("5.3.3 TCP ack = 0x7fffffff\n");
98437074Speter		t->th_ack = htonl(0x7fffffff);
98522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
98622514Sdarrenr		fflush(stdout);
98722514Sdarrenr		PAUSE();
98822514Sdarrenr
98922514Sdarrenr		printf("5.3.4 TCP ack = 0x80000000\n");
99037074Speter		t->th_ack = htonl(0x80000000);
99122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99222514Sdarrenr		fflush(stdout);
99322514Sdarrenr		PAUSE();
99422514Sdarrenr
99522514Sdarrenr		printf("5.3.5 TCP ack = 0xc0000000\n");
99637074Speter		t->th_ack = htonl(0xc0000000);
99722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99822514Sdarrenr		fflush(stdout);
99922514Sdarrenr		PAUSE();
100022514Sdarrenr
100122514Sdarrenr		printf("5.3.6 TCP ack = 0xffffffff\n");
100237074Speter		t->th_ack = htonl(0xffffffff);
100322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
100422514Sdarrenr		fflush(stdout);
100522514Sdarrenr		PAUSE();
100622514Sdarrenr	}
100722514Sdarrenr
100822514Sdarrenr	if (!ptest || (ptest == 4)) {
100922514Sdarrenr		t->th_flags = TH_SYN;
101022514Sdarrenr		/*
101122514Sdarrenr		 * Test 4: win = 0, win = 32768, win = 65535
101222514Sdarrenr		 */
101322514Sdarrenr		printf("5.4.1 TCP win = 0\n");
101437074Speter		t->th_seq = htonl(0);
101522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
101622514Sdarrenr		fflush(stdout);
101722514Sdarrenr		PAUSE();
101822514Sdarrenr
101922514Sdarrenr		printf("5.4.2 TCP win = 32768\n");
102037074Speter		t->th_seq = htonl(0x7fff);
102122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
102222514Sdarrenr		fflush(stdout);
102322514Sdarrenr		PAUSE();
102422514Sdarrenr
102522514Sdarrenr		printf("5.4.3 TCP win = 65535\n");
102637074Speter		t->th_win = htons(0xffff);
102722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
102822514Sdarrenr		fflush(stdout);
102922514Sdarrenr		PAUSE();
103022514Sdarrenr	}
103122514Sdarrenr
103234739Speter#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \
103334739Speter    !defined(__sgi)
103422514Sdarrenr	{
103534739Speter	struct tcpcb *tcbp, tcb;
103622514Sdarrenr	struct tcpiphdr ti;
103722514Sdarrenr	struct sockaddr_in sin;
103822514Sdarrenr	int fd, slen;
103922514Sdarrenr
104092691Sdarrenr	fd = -1;
104122514Sdarrenr	bzero((char *)&sin, sizeof(sin));
104222514Sdarrenr
104322514Sdarrenr	for (i = 1; i < 63; i++) {
104422514Sdarrenr		fd = socket(AF_INET, SOCK_STREAM, 0);
104534739Speter		bzero((char *)&sin, sizeof(sin));
104622514Sdarrenr		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
104722514Sdarrenr		sin.sin_port = htons(i);
104834739Speter		sin.sin_family = AF_INET;
104922514Sdarrenr		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
105022514Sdarrenr			break;
105134739Speter		close(fd);
105222514Sdarrenr	}
105322514Sdarrenr
105422514Sdarrenr	if (i == 63) {
105522514Sdarrenr		printf("Couldn't open a TCP socket between ports 1 and 63\n");
105622514Sdarrenr		printf("to host %s for test 5 and 6 - skipping.\n",
105722514Sdarrenr			inet_ntoa(ip->ip_dst));
105822514Sdarrenr		goto skip_five_and_six;
105922514Sdarrenr	}
106022514Sdarrenr
106122514Sdarrenr	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
106234739Speter	t->th_dport = htons(i);
106322514Sdarrenr	slen = sizeof(sin);
106422514Sdarrenr	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
106534739Speter		t->th_sport = sin.sin_port;
106634739Speter	if (!(tcbp = find_tcp(fd, &ti))) {
106722514Sdarrenr		printf("Can't find PCB\n");
106822514Sdarrenr		goto skip_five_and_six;
106922514Sdarrenr	}
107034739Speter	KMCPY(&tcb, tcbp, sizeof(tcb));
107122514Sdarrenr	ti.ti_win = tcb.rcv_adv;
107237074Speter	ti.ti_seq = htonl(tcb.snd_nxt - 1);
107322514Sdarrenr	ti.ti_ack = tcb.rcv_nxt;
107422514Sdarrenr
107522514Sdarrenr	if (!ptest || (ptest == 5)) {
107622514Sdarrenr		/*
107722514Sdarrenr		 * Test 5: urp
107822514Sdarrenr		 */
107934739Speter		t->th_flags = TH_ACK|TH_URG;
108034739Speter		printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n",
108134739Speter			ntohs(t->th_sport), ntohs(t->th_dport));
108234739Speter		t->th_urp = htons(1);
108322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
108422514Sdarrenr		PAUSE();
108534739Speter
108637074Speter		t->th_seq = htonl(tcb.snd_nxt);
108734739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1;
108834739Speter		t->th_urp = htons(0x7fff);
108922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
109022514Sdarrenr		PAUSE();
109134739Speter		t->th_urp = htons(0x8000);
109222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
109322514Sdarrenr		PAUSE();
109434739Speter		t->th_urp = htons(0xffff);
109522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
109622514Sdarrenr		PAUSE();
109737074Speter		t->th_urp = 0;
109834739Speter		t->th_flags &= ~TH_URG;
109934739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
110022514Sdarrenr	}
110122514Sdarrenr
110222514Sdarrenr	if (!ptest || (ptest == 6)) {
110322514Sdarrenr		/*
110422514Sdarrenr		 * Test 6: data offset, off = 0, off is inside, off is outside
110522514Sdarrenr		 */
110634739Speter		t->th_flags = TH_ACK;
110734739Speter		printf("5.6.1 TCP off = 1-15, len = 40\n");
110834739Speter		for (i = 1; i < 16; i++) {
110922514Sdarrenr			ti.ti_off = ntohs(i);
111022514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
111122514Sdarrenr			printf("%d\r", i);
111222514Sdarrenr			fflush(stdout);
111322514Sdarrenr			PAUSE();
111422514Sdarrenr		}
111522514Sdarrenr		putchar('\n');
111634739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
111722514Sdarrenr	}
111822514Sdarrenr
111922514Sdarrenr	(void) close(fd);
112022514Sdarrenr	}
112122514Sdarrenrskip_five_and_six:
112222514Sdarrenr#endif
112337074Speter	t->th_seq = htonl(1);
112437074Speter	t->th_ack = htonl(1);
112534739Speter	t->th_off = 0;
112622514Sdarrenr
112722514Sdarrenr	if (!ptest || (ptest == 7)) {
112822514Sdarrenr		t->th_flags = TH_SYN;
112922514Sdarrenr		/*
113022514Sdarrenr		 * Test 7: sport = 0, sport = 1, sport = 32767
113122514Sdarrenr		 *         sport = 32768, sport = 65535
113222514Sdarrenr		 */
113322514Sdarrenr		printf("5.7.1 TCP sport = 0\n");
113422514Sdarrenr		t->th_sport = 0;
113522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
113622514Sdarrenr		fflush(stdout);
113722514Sdarrenr		PAUSE();
113822514Sdarrenr
113922514Sdarrenr		printf("5.7.2 TCP sport = 1\n");
114037074Speter		t->th_sport = htons(1);
114122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114222514Sdarrenr		fflush(stdout);
114322514Sdarrenr		PAUSE();
114422514Sdarrenr
114522514Sdarrenr		printf("5.7.3 TCP sport = 32767\n");
114637074Speter		t->th_sport = htons(32767);
114722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114822514Sdarrenr		fflush(stdout);
114922514Sdarrenr		PAUSE();
115022514Sdarrenr
115122514Sdarrenr		printf("5.7.4 TCP sport = 32768\n");
115237074Speter		t->th_sport = htons(32768);
115322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
115422514Sdarrenr		fflush(stdout);
115522514Sdarrenr		PAUSE();
115622514Sdarrenr
115722514Sdarrenr		printf("5.7.5 TCP sport = 65535\n");
115837074Speter		t->th_sport = htons(65535);
115922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
116022514Sdarrenr		fflush(stdout);
116122514Sdarrenr		PAUSE();
116222514Sdarrenr	}
116322514Sdarrenr
116422514Sdarrenr	if (!ptest || (ptest == 8)) {
116537074Speter		t->th_sport = htons(1);
116634739Speter		t->th_flags = TH_SYN;
116722514Sdarrenr		/*
116822514Sdarrenr		 * Test 8: dport = 0, dport = 1, dport = 32767
116922514Sdarrenr		 *         dport = 32768, dport = 65535
117022514Sdarrenr		 */
117122514Sdarrenr		printf("5.8.1 TCP dport = 0\n");
117222514Sdarrenr		t->th_dport = 0;
117322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
117422514Sdarrenr		fflush(stdout);
117522514Sdarrenr		PAUSE();
117622514Sdarrenr
117722514Sdarrenr		printf("5.8.2 TCP dport = 1\n");
117837074Speter		t->th_dport = htons(1);
117922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
118022514Sdarrenr		fflush(stdout);
118122514Sdarrenr		PAUSE();
118222514Sdarrenr
118322514Sdarrenr		printf("5.8.3 TCP dport = 32767\n");
118437074Speter		t->th_dport = htons(32767);
118522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
118622514Sdarrenr		fflush(stdout);
118722514Sdarrenr		PAUSE();
118822514Sdarrenr
118922514Sdarrenr		printf("5.8.4 TCP dport = 32768\n");
119037074Speter		t->th_dport = htons(32768);
119122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
119222514Sdarrenr		fflush(stdout);
119322514Sdarrenr		PAUSE();
119422514Sdarrenr
119522514Sdarrenr		printf("5.8.5 TCP dport = 65535\n");
119637074Speter		t->th_dport = htons(65535);
119722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
119822514Sdarrenr		fflush(stdout);
119922514Sdarrenr		PAUSE();
120022514Sdarrenr	}
120134739Speter
120234739Speter	/* LAND attack - self connect, so make src & dst ip/port the same */
120334739Speter	if (!ptest || (ptest == 9)) {
120434739Speter		printf("5.9 TCP LAND attack. sport = 25, dport = 25\n");
120534739Speter		/* chose SMTP port 25 */
120634739Speter		t->th_sport = htons(25);
120734739Speter		t->th_dport = htons(25);
120834739Speter		t->th_flags = TH_SYN;
120934739Speter		ip->ip_src = ip->ip_dst;
121034739Speter		(void) send_tcp(nfd, mtu, ip, gwip);
121134739Speter		fflush(stdout);
121234739Speter		PAUSE();
121334739Speter	}
121434739Speter
121522514Sdarrenr	/* TCP options header checking */
121622514Sdarrenr	/* 0 length options, etc */
121722514Sdarrenr}
121822514Sdarrenr
121922514Sdarrenr
122022514Sdarrenr/* Perform test 6 (exhaust mbuf test) */
122122514Sdarrenr
122222514Sdarrenrvoid	ip_test6(dev, mtu, ip, gwip, ptest)
122322514Sdarrenrchar	*dev;
122422514Sdarrenrint	mtu;
122522514Sdarrenrip_t	*ip;
122622514Sdarrenrstruct	in_addr	gwip;
122722514Sdarrenrint	ptest;
122822514Sdarrenr{
122922514Sdarrenr	struct	timeval	tv;
123022514Sdarrenr	udphdr_t *u;
123122514Sdarrenr	int	nfd, i, j, k;
123222514Sdarrenr
123322514Sdarrenr	ip->ip_v = IPVERSION;
123422514Sdarrenr	ip->ip_tos = 0;
123522514Sdarrenr	ip->ip_off = 0;
123622514Sdarrenr	ip->ip_ttl = 60;
123722514Sdarrenr	ip->ip_p = IPPROTO_UDP;
123822514Sdarrenr	ip->ip_sum = 0;
123922514Sdarrenr	u = (udphdr_t *)(ip + 1);
124037074Speter	u->uh_sport = htons(1);
124137074Speter	u->uh_dport = htons(9);
124222514Sdarrenr	u->uh_sum = 0;
124322514Sdarrenr
124422514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
124537074Speter	u->uh_ulen = htons(7168);
124622514Sdarrenr
124734739Speter	printf("6. Exhaustive mbuf test.\n");
124834739Speter	printf("   Send 7k packet in 768 & 128 byte fragments, 128 times.\n");
124934739Speter	printf("   Total of around 8,900 packets\n");
125022514Sdarrenr	for (i = 0; i < 128; i++) {
125122514Sdarrenr		/*
125222514Sdarrenr		 * First send the entire packet in 768 byte chunks.
125322514Sdarrenr		 */
125422514Sdarrenr		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
125522514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
125637074Speter		ip->ip_off = htons(IP_MF);
125722514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
125822514Sdarrenr		printf("%d %d\r", i, 0);
125922514Sdarrenr		fflush(stdout);
126022514Sdarrenr		PAUSE();
126122514Sdarrenr		/*
126222514Sdarrenr		 * And again using 128 byte chunks.
126322514Sdarrenr		 */
126422514Sdarrenr		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
126537074Speter		ip->ip_off = htons(IP_MF);
126622514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
126722514Sdarrenr		printf("%d %d\r", i, 0);
126822514Sdarrenr		fflush(stdout);
126922514Sdarrenr		PAUSE();
127022514Sdarrenr
127122514Sdarrenr		for (j = 768; j < 3584; j += 768) {
127222514Sdarrenr			ip->ip_len = sizeof(*ip) + 768;
127392691Sdarrenr			ip->ip_off = htons(IP_MF|((j>>3) & 0x1fff));
127422514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
127522514Sdarrenr			printf("%d %d\r", i, j);
127622514Sdarrenr			fflush(stdout);
127722514Sdarrenr			PAUSE();
127822514Sdarrenr
127922514Sdarrenr			ip->ip_len = sizeof(*ip) + 128;
128022514Sdarrenr			for (k = j - 768; k < j; k += 128) {
128192691Sdarrenr				ip->ip_off = htons(IP_MF|((k>>3) & 0x1fff));
128222514Sdarrenr				(void) send_ip(nfd, 1500, ip, gwip, 1);
128322514Sdarrenr				printf("%d %d\r", i, k);
128422514Sdarrenr				fflush(stdout);
128522514Sdarrenr				PAUSE();
128622514Sdarrenr			}
128722514Sdarrenr		}
128822514Sdarrenr	}
128922514Sdarrenr	putchar('\n');
129022514Sdarrenr}
129122514Sdarrenr
129222514Sdarrenr
129322514Sdarrenr/* Perform test 7 (random packets) */
129422514Sdarrenr
129522514Sdarrenrstatic	u_long	tbuf[64];
129622514Sdarrenr
129722514Sdarrenrvoid	ip_test7(dev, mtu, ip, gwip, ptest)
129822514Sdarrenrchar	*dev;
129922514Sdarrenrint	mtu;
130022514Sdarrenrip_t	*ip;
130122514Sdarrenrstruct	in_addr	gwip;
130222514Sdarrenrint	ptest;
130322514Sdarrenr{
130422514Sdarrenr	ip_t	*pip;
130522514Sdarrenr	struct	timeval	tv;
130622514Sdarrenr	int	nfd, i, j;
130722514Sdarrenr	u_char	*s;
130822514Sdarrenr
130922514Sdarrenr	nfd = initdevice(dev, 0, 1);
131022514Sdarrenr	pip = (ip_t *)tbuf;
131122514Sdarrenr
131222514Sdarrenr	srand(time(NULL) ^ (getpid() * getppid()));
131322514Sdarrenr
131422514Sdarrenr	printf("7. send 1024 random IP packets.\n");
131522514Sdarrenr
131622514Sdarrenr	for (i = 0; i < 512; i++) {
131722514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
131822514Sdarrenr			*s = (rand() >> 13) & 0xff;
131922514Sdarrenr		pip->ip_v = IPVERSION;
132022514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
132122514Sdarrenr		      sizeof(struct in_addr));
132222514Sdarrenr		pip->ip_sum = 0;
132322514Sdarrenr		pip->ip_len &= 0xff;
132422514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
132522514Sdarrenr		printf("%d\r", i);
132622514Sdarrenr		fflush(stdout);
132722514Sdarrenr		PAUSE();
132822514Sdarrenr	}
132922514Sdarrenr	putchar('\n');
133022514Sdarrenr
133122514Sdarrenr	for (i = 0; i < 512; i++) {
133222514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
133322514Sdarrenr			*s = (rand() >> 13) & 0xff;
133422514Sdarrenr		pip->ip_v = IPVERSION;
133537074Speter		pip->ip_off &= htons(0xc000);
133622514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
133722514Sdarrenr		      sizeof(struct in_addr));
133822514Sdarrenr		pip->ip_sum = 0;
133922514Sdarrenr		pip->ip_len &= 0xff;
134022514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
134122514Sdarrenr		printf("%d\r", i);
134222514Sdarrenr		fflush(stdout);
134322514Sdarrenr		PAUSE();
134422514Sdarrenr	}
134522514Sdarrenr	putchar('\n');
134622514Sdarrenr}
1347