iptests.c revision 53024
122514Sdarrenr/*
253024Sguido * Copyright (C) 1993-1998 by Darren Reed.
322514Sdarrenr *
431183Speter * Redistribution and use in source and binary forms are permitted
531183Speter * provided that this notice is preserved and due credit is given
631183Speter * to the original author and the contributors.
722514Sdarrenr */
831183Speter#if !defined(lint)
931183Speterstatic const char sccsid[] = "%W% %G% (C)1995 Darren Reed";
1053024Sguidostatic const char rcsid[] = "@(#)$Id: iptests.c,v 2.1 1999/08/04 17:31:09 darrenr Exp $";
1122514Sdarrenr#endif
1222514Sdarrenr#include <stdio.h>
1322514Sdarrenr#include <unistd.h>
1422514Sdarrenr#include <stdlib.h>
1522514Sdarrenr#include <string.h>
1622514Sdarrenr#include <sys/types.h>
1722514Sdarrenr#include <sys/time.h>
1822514Sdarrenr#include <sys/param.h>
1953024Sguido#define _KERNEL
2053024Sguido#define KERNEL
2131183Speter#if !defined(solaris) && !defined(linux) && !defined(__sgi)
2222514Sdarrenr# include <sys/file.h>
2353024Sguido#else
2453024Sguido# ifdef solaris
2553024Sguido#  include <sys/dditypes.h>
2653024Sguido# endif
2753024Sguido#endif
2853024Sguido#undef  _KERNEL
2953024Sguido#undef  KERNEL
3053024Sguido#if !defined(solaris) && !defined(linux) && !defined(__sgi)
3122514Sdarrenr# include <nlist.h>
3222514Sdarrenr# include <sys/user.h>
3322514Sdarrenr# include <sys/proc.h>
3422514Sdarrenr#endif
3531183Speter#if !defined(ultrix) && !defined(hpux) && !defined(linux) && !defined(__sgi)
3631183Speter# include <kvm.h>
3731183Speter#endif
3831183Speter#ifndef	ultrix
3931183Speter# include <sys/socket.h>
4031183Speter#endif
4126119Sdarrenr#if defined(solaris)
4226119Sdarrenr# include <sys/stream.h>
4326119Sdarrenr#endif
4422514Sdarrenr#include <sys/socketvar.h>
4522514Sdarrenr#ifdef sun
4622514Sdarrenr#include <sys/systm.h>
4722514Sdarrenr#include <sys/session.h>
4822514Sdarrenr#endif
4922514Sdarrenr#if BSD >= 199103
5031183Speter# include <sys/sysctl.h>
5131183Speter# include <sys/filedesc.h>
5231183Speter# include <paths.h>
5322514Sdarrenr#endif
5422514Sdarrenr#include <netinet/in_systm.h>
5522514Sdarrenr#include <sys/socket.h>
5622514Sdarrenr#include <net/if.h>
5731183Speter#if defined(linux) && (LINUX >= 0200)
5831183Speter# include <asm/atomic.h>
5931183Speter#endif
6031183Speter#if !defined(linux)
6131183Speter# include <net/route.h>
6231183Speter#else
6331183Speter# define __KERNEL__	/* because there's a macro not wrapped by this */
6431183Speter# include <net/route.h>	/* in this file :-/ */
6531183Speter#endif
6622514Sdarrenr#include <netinet/in.h>
6722514Sdarrenr#include <arpa/inet.h>
6822514Sdarrenr#include <netinet/ip.h>
6922514Sdarrenr#include <netinet/tcp.h>
7022514Sdarrenr#include <netinet/udp.h>
7122514Sdarrenr#include <netinet/ip_icmp.h>
7231183Speter#ifndef linux
7331183Speter# include <netinet/ip_var.h>
7431183Speter# include <netinet/in_pcb.h>
7531183Speter# include <netinet/tcp_timer.h>
7631183Speter# include <netinet/tcp_var.h>
7731183Speter#endif
7831183Speter#if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
7931183Speter# include <sys/sysmacros.h>
8031183Speter#endif
8124583Sdarrenr#include "ipsend.h"
8222514Sdarrenr
8324583Sdarrenr
8422514Sdarrenr#define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
8522514Sdarrenr		  (void) select(0, NULL, NULL, NULL, &tv)
8622514Sdarrenr
8722514Sdarrenr
8822514Sdarrenrvoid	ip_test1(dev, mtu, ip, gwip, ptest)
8922514Sdarrenrchar	*dev;
9022514Sdarrenrint	mtu;
9122514Sdarrenrip_t	*ip;
9222514Sdarrenrstruct	in_addr	gwip;
9322514Sdarrenrint	ptest;
9422514Sdarrenr{
9522514Sdarrenr	struct	timeval	tv;
9622514Sdarrenr	udphdr_t *u;
9731183Speter	int	nfd, i = 0, len, id = getpid();
9822514Sdarrenr
9922514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
10022514Sdarrenr	ip->ip_v = IPVERSION;
10122514Sdarrenr	ip->ip_tos = 0;
10222514Sdarrenr	ip->ip_off = 0;
10322514Sdarrenr	ip->ip_ttl = 60;
10422514Sdarrenr	ip->ip_p = IPPROTO_UDP;
10522514Sdarrenr	ip->ip_sum = 0;
10622514Sdarrenr	u = (udphdr_t *)(ip + 1);
10737074Speter	u->uh_sport = htons(1);
10837074Speter	u->uh_dport = htons(9);
10922514Sdarrenr	u->uh_sum = 0;
11037074Speter	u->uh_ulen = htons(sizeof(*u) + 4);
11137074Speter	ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen);
11222514Sdarrenr	len = ip->ip_len;
11322514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
11422514Sdarrenr
11522514Sdarrenr	if (!ptest || (ptest == 1)) {
11622514Sdarrenr		/*
11722514Sdarrenr		 * Part1: hl < len
11822514Sdarrenr		 */
11922514Sdarrenr		ip->ip_id = 0;
12022514Sdarrenr		printf("1.1. sending packets with ip_hl < ip_len\n");
12137074Speter		for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) {
12222514Sdarrenr			ip->ip_hl = i >> 2;
12322514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
12422514Sdarrenr			printf("%d\r", i);
12522514Sdarrenr			fflush(stdout);
12622514Sdarrenr			PAUSE();
12722514Sdarrenr		}
12822514Sdarrenr		putchar('\n');
12922514Sdarrenr	}
13022514Sdarrenr
13122514Sdarrenr	if (!ptest || (ptest == 2)) {
13222514Sdarrenr		/*
13322514Sdarrenr		 * Part2: hl > len
13422514Sdarrenr		 */
13522514Sdarrenr		ip->ip_id = 0;
13622514Sdarrenr		printf("1.2. sending packets with ip_hl > ip_len\n");
13737074Speter		for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) {
13822514Sdarrenr			ip->ip_hl = i >> 2;
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 == 3)) {
14822514Sdarrenr		/*
14922514Sdarrenr		 * Part3: v < 4
15022514Sdarrenr		 */
15122514Sdarrenr		ip->ip_id = 0;
15222514Sdarrenr		printf("1.3. ip_v < 4\n");
15322514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
15422514Sdarrenr		for (i = 0; i < 4; i++) {
15522514Sdarrenr			ip->ip_v = i;
15622514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
15722514Sdarrenr			printf("%d\r", i);
15822514Sdarrenr			fflush(stdout);
15922514Sdarrenr			PAUSE();
16022514Sdarrenr		}
16122514Sdarrenr		putchar('\n');
16222514Sdarrenr	}
16322514Sdarrenr
16422514Sdarrenr	if (!ptest || (ptest == 4)) {
16522514Sdarrenr		/*
16622514Sdarrenr		 * Part4: v > 4
16722514Sdarrenr		 */
16822514Sdarrenr		ip->ip_id = 0;
16922514Sdarrenr		printf("1.4. ip_v > 4\n");
17022514Sdarrenr		for (i = 5; i < 16; i++) {
17122514Sdarrenr			ip->ip_v = i;
17222514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
17322514Sdarrenr			printf("%d\r", i);
17422514Sdarrenr			fflush(stdout);
17522514Sdarrenr			PAUSE();
17622514Sdarrenr		}
17722514Sdarrenr		putchar('\n');
17822514Sdarrenr	}
17922514Sdarrenr
18022514Sdarrenr	if (!ptest || (ptest == 5)) {
18122514Sdarrenr		/*
18222514Sdarrenr		 * Part5: len < packet
18322514Sdarrenr		 */
18422514Sdarrenr		ip->ip_id = 0;
18522514Sdarrenr		ip->ip_v = IPVERSION;
18622514Sdarrenr		i = ip->ip_len + 1;
18722514Sdarrenr		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
18837074Speter		for (; i < (ip->ip_len * 2); i++) {
18922514Sdarrenr			ip->ip_id = htons(id++);
19022514Sdarrenr			ip->ip_sum = 0;
19124583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
19224583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
19322514Sdarrenr			printf("%d\r", i);
19422514Sdarrenr			fflush(stdout);
19522514Sdarrenr			PAUSE();
19622514Sdarrenr		}
19722514Sdarrenr		putchar('\n');
19822514Sdarrenr		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
19922514Sdarrenr		for (i = len; i > 0; i--) {
20022514Sdarrenr			ip->ip_id = htons(id++);
20137074Speter			ip->ip_len = i;
20222514Sdarrenr			ip->ip_sum = 0;
20324583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
20424583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
20522514Sdarrenr			printf("%d\r", i);
20622514Sdarrenr			fflush(stdout);
20722514Sdarrenr			PAUSE();
20822514Sdarrenr		}
20922514Sdarrenr		putchar('\n');
21022514Sdarrenr	}
21122514Sdarrenr
21222514Sdarrenr	if (!ptest || (ptest == 6)) {
21322514Sdarrenr		/*
21422514Sdarrenr		 * Part6: len > packet
21522514Sdarrenr		 */
21622514Sdarrenr		ip->ip_id = 0;
21722514Sdarrenr		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
21822514Sdarrenr		for (i = len + 1; i < (len * 2); i++) {
21922514Sdarrenr			ip->ip_id = htons(id++);
22037074Speter			ip->ip_len = i;
22122514Sdarrenr			ip->ip_sum = 0;
22224583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
22324583Sdarrenr			(void) send_ether(nfd, (char *)ip, len, gwip);
22422514Sdarrenr			printf("%d\r", i);
22522514Sdarrenr			fflush(stdout);
22622514Sdarrenr			PAUSE();
22722514Sdarrenr		}
22822514Sdarrenr		putchar('\n');
22937074Speter		ip->ip_len = len;
23022514Sdarrenr		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
23122514Sdarrenr		for (i = len; i > 0; i--) {
23222514Sdarrenr			ip->ip_id = htons(id++);
23322514Sdarrenr			ip->ip_sum = 0;
23424583Sdarrenr			ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2);
23524583Sdarrenr			(void) send_ether(nfd, (char *)ip, i, gwip);
23622514Sdarrenr			printf("%d\r", i);
23722514Sdarrenr			fflush(stdout);
23822514Sdarrenr			PAUSE();
23922514Sdarrenr		}
24022514Sdarrenr		putchar('\n');
24122514Sdarrenr	}
24222514Sdarrenr
24322514Sdarrenr	if (!ptest || (ptest == 7)) {
24422514Sdarrenr		/*
24522514Sdarrenr		 * Part7: 0 length fragment
24622514Sdarrenr		 */
24722514Sdarrenr		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
24822514Sdarrenr		ip->ip_id = 0;
24922514Sdarrenr		ip->ip_len = sizeof(*ip);
25022514Sdarrenr		ip->ip_off = htons(IP_MF);
25122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
25222514Sdarrenr		fflush(stdout);
25322514Sdarrenr		PAUSE();
25422514Sdarrenr
25522514Sdarrenr		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
25622514Sdarrenr		ip->ip_id = 0;
25722514Sdarrenr		ip->ip_len = sizeof(*ip);
25822514Sdarrenr		ip->ip_off = htons(IP_MF);
25922514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
26022514Sdarrenr		fflush(stdout);
26122514Sdarrenr		PAUSE();
26222514Sdarrenr
26322514Sdarrenr		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
26422514Sdarrenr		ip->ip_id = 0;
26522514Sdarrenr		ip->ip_len = sizeof(*ip);
26622514Sdarrenr		ip->ip_off = htons(0xa000);
26722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
26822514Sdarrenr		fflush(stdout);
26922514Sdarrenr		PAUSE();
27022514Sdarrenr
27122514Sdarrenr		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
27222514Sdarrenr		ip->ip_id = 0;
27322514Sdarrenr		ip->ip_len = sizeof(*ip);
27422514Sdarrenr		ip->ip_off = htons(0x0100);
27522514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
27622514Sdarrenr		fflush(stdout);
27722514Sdarrenr		PAUSE();
27822514Sdarrenr	}
27922514Sdarrenr
28022514Sdarrenr	if (!ptest || (ptest == 8)) {
28122514Sdarrenr		struct	timeval	tv;
28222514Sdarrenr
28322514Sdarrenr		gettimeofday(&tv, NULL);
28422514Sdarrenr		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
28522514Sdarrenr		/*
28622514Sdarrenr		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
28722514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
28822514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
28922514Sdarrenr		 * about that here.
29022514Sdarrenr		 */
29122514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
29237074Speter		ip->ip_off = htons(IP_MF);
29322514Sdarrenr		u->uh_dport = htons(9);
29422514Sdarrenr		ip->ip_id = htons(id++);
29522514Sdarrenr		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
29622514Sdarrenr		ip->ip_len = 768 + 20 + 8;
29722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
29822514Sdarrenr		printf("%d\r", i);
29922514Sdarrenr
30022514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
30122514Sdarrenr		i = 512;
30222514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
30337074Speter			ip->ip_off = htons(IP_MF | (i >> 3));
30422514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
30522514Sdarrenr			printf("%d\r", i);
30622514Sdarrenr			fflush(stdout);
30722514Sdarrenr			PAUSE();
30822514Sdarrenr		}
30922514Sdarrenr		ip->ip_len = 896 + 20;
31037074Speter		ip->ip_off = htons(i >> 3);
31122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
31222514Sdarrenr		printf("%d\r", i);
31322514Sdarrenr		putchar('\n');
31422514Sdarrenr		fflush(stdout);
31522514Sdarrenr
31622514Sdarrenr		/*
31722514Sdarrenr		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
31822514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
31922514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
32022514Sdarrenr		 * about that here.  (Lossage here)
32122514Sdarrenr		 */
32222514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
32337074Speter		ip->ip_off = htons(IP_MF);
32422514Sdarrenr		u->uh_dport = htons(9);
32522514Sdarrenr		ip->ip_id = htons(id++);
32622514Sdarrenr		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
32722514Sdarrenr		ip->ip_len = 768 + 20 + 8;
32822514Sdarrenr		if ((rand() & 0x1f) != 0) {
32922514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
33022514Sdarrenr			printf("%d\r", i);
33122514Sdarrenr		} else
33222514Sdarrenr			printf("skip 0\n");
33322514Sdarrenr
33422514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
33522514Sdarrenr		i = 512;
33622514Sdarrenr		for (; i < (63 * 1024 + 768); i += 768) {
33737074Speter			ip->ip_off = htons(IP_MF | (i >> 3));
33822514Sdarrenr			if ((rand() & 0x1f) != 0) {
33922514Sdarrenr				(void) send_ip(nfd, mtu, ip, gwip, 1);
34022514Sdarrenr				printf("%d\r", i);
34122514Sdarrenr			} else
34222514Sdarrenr				printf("skip %d\n", i);
34322514Sdarrenr			fflush(stdout);
34422514Sdarrenr			PAUSE();
34522514Sdarrenr		}
34622514Sdarrenr		ip->ip_len = 896 + 20;
34737074Speter		ip->ip_off = htons(i >> 3);
34822514Sdarrenr		if ((rand() & 0x1f) != 0) {
34922514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
35022514Sdarrenr			printf("%d\r", i);
35122514Sdarrenr		} else
35222514Sdarrenr			printf("skip\n");
35322514Sdarrenr		putchar('\n');
35422514Sdarrenr		fflush(stdout);
35522514Sdarrenr
35622514Sdarrenr		/*
35722514Sdarrenr		 * Part8.3: 33k packet - test for not dealing with -ve length
35822514Sdarrenr		 * Mark it as being ICMP (so it doesn't get junked), but
35922514Sdarrenr		 * don't bother about the ICMP header, we're not worrying
36022514Sdarrenr		 * about that here.
36122514Sdarrenr		 */
36222514Sdarrenr		ip->ip_p = IPPROTO_ICMP;
36337074Speter		ip->ip_off = htons(IP_MF);
36422514Sdarrenr		u->uh_dport = htons(9);
36522514Sdarrenr		ip->ip_id = htons(id++);
36622514Sdarrenr		printf("1.8.3 33k packet\n");
36722514Sdarrenr		ip->ip_len = 768 + 20 + 8;
36822514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
36922514Sdarrenr		printf("%d\r", i);
37022514Sdarrenr
37122514Sdarrenr		ip->ip_len = MIN(768 + 20, mtu - 68);
37222514Sdarrenr		i = 512;
37322514Sdarrenr		for (; i < (32 * 1024 + 768); i += 768) {
37437074Speter			ip->ip_off = htons(IP_MF | (i >> 3));
37522514Sdarrenr			(void) send_ip(nfd, mtu, ip, gwip, 1);
37622514Sdarrenr			printf("%d\r", i);
37722514Sdarrenr			fflush(stdout);
37822514Sdarrenr			PAUSE();
37922514Sdarrenr		}
38022514Sdarrenr		ip->ip_len = 896 + 20;
38137074Speter		ip->ip_off = htons(i >> 3);
38222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
38322514Sdarrenr		printf("%d\r", i);
38422514Sdarrenr		putchar('\n');
38522514Sdarrenr		fflush(stdout);
38622514Sdarrenr	}
38722514Sdarrenr
38822514Sdarrenr	ip->ip_len = len;
38922514Sdarrenr	ip->ip_off = 0;
39022514Sdarrenr	if (!ptest || (ptest == 9)) {
39122514Sdarrenr		/*
39222514Sdarrenr		 * Part9: off & 0x8000 == 0x8000
39322514Sdarrenr		 */
39422514Sdarrenr		ip->ip_id = 0;
39537074Speter		ip->ip_off = htons(0x8000);
39622514Sdarrenr		printf("1.9. ip_off & 0x8000 == 0x8000\n");
39722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
39822514Sdarrenr		fflush(stdout);
39922514Sdarrenr		PAUSE();
40022514Sdarrenr	}
40122514Sdarrenr
40222514Sdarrenr	ip->ip_off = 0;
40322514Sdarrenr
40422514Sdarrenr	if (!ptest || (ptest == 10)) {
40522514Sdarrenr		/*
40622514Sdarrenr		 * Part10: ttl = 255
40722514Sdarrenr		 */
40822514Sdarrenr		ip->ip_id = 0;
40922514Sdarrenr		ip->ip_ttl = 255;
41022514Sdarrenr		printf("1.10.0 ip_ttl = 255\n");
41122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
41222514Sdarrenr		fflush(stdout);
41322514Sdarrenr		PAUSE();
41422514Sdarrenr
41522514Sdarrenr		ip->ip_ttl = 128;
41622514Sdarrenr		printf("1.10.1 ip_ttl = 128\n");
41722514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
41822514Sdarrenr		fflush(stdout);
41922514Sdarrenr		PAUSE();
42022514Sdarrenr
42122514Sdarrenr		ip->ip_ttl = 0;
42222514Sdarrenr		printf("1.10.2 ip_ttl = 0\n");
42322514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
42422514Sdarrenr		fflush(stdout);
42522514Sdarrenr		PAUSE();
42622514Sdarrenr	}
42722514Sdarrenr
42822514Sdarrenr	(void) close(nfd);
42922514Sdarrenr}
43022514Sdarrenr
43122514Sdarrenr
43222514Sdarrenrvoid	ip_test2(dev, mtu, ip, gwip, ptest)
43322514Sdarrenrchar	*dev;
43422514Sdarrenrint	mtu;
43522514Sdarrenrip_t	*ip;
43622514Sdarrenrstruct	in_addr	gwip;
43722514Sdarrenrint	ptest;
43822514Sdarrenr{
43922514Sdarrenr	struct	timeval	tv;
44022514Sdarrenr	int	nfd;
44122514Sdarrenr	u_char	*s;
44222514Sdarrenr
44322514Sdarrenr	s = (u_char *)(ip + 1);
44437074Speter	nfd = initdevice(dev, htons(1), 1);
44522514Sdarrenr
44622514Sdarrenr	ip->ip_hl = 6;
44722514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
44822514Sdarrenr	s[IPOPT_OPTVAL] = IPOPT_NOP;
44922514Sdarrenr	s++;
45022514Sdarrenr	if (!ptest || (ptest == 1)) {
45122514Sdarrenr		/*
45222514Sdarrenr		 * Test 1: option length > packet length,
45322514Sdarrenr		 *                header length == packet length
45422514Sdarrenr		 */
45522514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
45622514Sdarrenr		s[IPOPT_OLEN] = 4;
45722514Sdarrenr		s[IPOPT_OFFSET] = IPOPT_MINOFF;
45822514Sdarrenr		ip->ip_p = IPPROTO_IP;
45922514Sdarrenr		printf("2.1 option length > packet length\n");
46022514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
46122514Sdarrenr		fflush(stdout);
46222514Sdarrenr		PAUSE();
46322514Sdarrenr	}
46422514Sdarrenr
46522514Sdarrenr	ip->ip_hl = 7;
46622514Sdarrenr	ip->ip_len = ip->ip_hl << 2;
46722514Sdarrenr	if (!ptest || (ptest == 1)) {
46822514Sdarrenr		/*
46922514Sdarrenr		 * Test 2: options have length = 0
47022514Sdarrenr		 */
47122514Sdarrenr		printf("2.2.1 option length = 0, RR\n");
47222514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_RR;
47322514Sdarrenr		s[IPOPT_OLEN] = 0;
47422514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
47522514Sdarrenr		fflush(stdout);
47622514Sdarrenr		PAUSE();
47722514Sdarrenr
47822514Sdarrenr		printf("2.2.2 option length = 0, TS\n");
47922514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_TS;
48022514Sdarrenr		s[IPOPT_OLEN] = 0;
48122514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48222514Sdarrenr		fflush(stdout);
48322514Sdarrenr		PAUSE();
48422514Sdarrenr
48522514Sdarrenr		printf("2.2.3 option length = 0, SECURITY\n");
48622514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
48722514Sdarrenr		s[IPOPT_OLEN] = 0;
48822514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
48922514Sdarrenr		fflush(stdout);
49022514Sdarrenr		PAUSE();
49122514Sdarrenr
49222514Sdarrenr		printf("2.2.4 option length = 0, LSRR\n");
49322514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_LSRR;
49422514Sdarrenr		s[IPOPT_OLEN] = 0;
49522514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
49622514Sdarrenr		fflush(stdout);
49722514Sdarrenr		PAUSE();
49822514Sdarrenr
49922514Sdarrenr		printf("2.2.5 option length = 0, SATID\n");
50022514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SATID;
50122514Sdarrenr		s[IPOPT_OLEN] = 0;
50222514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
50322514Sdarrenr		fflush(stdout);
50422514Sdarrenr		PAUSE();
50522514Sdarrenr
50622514Sdarrenr		printf("2.2.6 option length = 0, SSRR\n");
50722514Sdarrenr		s[IPOPT_OPTVAL] = IPOPT_SSRR;
50822514Sdarrenr		s[IPOPT_OLEN] = 0;
50922514Sdarrenr		(void) send_ip(nfd, mtu, ip, gwip, 1);
51022514Sdarrenr		fflush(stdout);
51122514Sdarrenr		PAUSE();
51222514Sdarrenr	}
51322514Sdarrenr
51422514Sdarrenr	(void) close(nfd);
51522514Sdarrenr}
51622514Sdarrenr
51722514Sdarrenr
51822514Sdarrenr/*
51922514Sdarrenr * test 3 (ICMP)
52022514Sdarrenr */
52122514Sdarrenrvoid	ip_test3(dev, mtu, ip, gwip, ptest)
52222514Sdarrenrchar	*dev;
52322514Sdarrenrint	mtu;
52422514Sdarrenrip_t	*ip;
52522514Sdarrenrstruct	in_addr	gwip;
52622514Sdarrenrint	ptest;
52722514Sdarrenr{
52822514Sdarrenr	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
52922514Sdarrenr	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
53022514Sdarrenr	struct	timeval	tv;
53122514Sdarrenr	struct	icmp	*icp;
53222514Sdarrenr	int	nfd, i;
53322514Sdarrenr
53422514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
53522514Sdarrenr	ip->ip_v = IPVERSION;
53622514Sdarrenr	ip->ip_tos = 0;
53722514Sdarrenr	ip->ip_off = 0;
53822514Sdarrenr	ip->ip_ttl = 60;
53922514Sdarrenr	ip->ip_p = IPPROTO_ICMP;
54022514Sdarrenr	ip->ip_sum = 0;
54122514Sdarrenr	ip->ip_len = sizeof(*ip) + sizeof(*icp);
54222514Sdarrenr	icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2));
54337074Speter	nfd = initdevice(dev, htons(1), 1);
54422514Sdarrenr
54522514Sdarrenr	if (!ptest || (ptest == 1)) {
54622514Sdarrenr		/*
54722514Sdarrenr		 * Type 0 - 31, 255, code = 0
54822514Sdarrenr		 */
54922514Sdarrenr		bzero((char *)icp, sizeof(*icp));
55022514Sdarrenr		for (i = 0; i < 32; i++) {
55122514Sdarrenr			icp->icmp_type = i;
55222514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
55322514Sdarrenr			PAUSE();
55422514Sdarrenr			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
55522514Sdarrenr		}
55622514Sdarrenr		icp->icmp_type = 255;
55722514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
55822514Sdarrenr		PAUSE();
55922514Sdarrenr		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
56022514Sdarrenr		putchar('\n');
56122514Sdarrenr	}
56222514Sdarrenr
56322514Sdarrenr	if (!ptest || (ptest == 2)) {
56422514Sdarrenr		/*
56522514Sdarrenr		 * Type 3, code = 0 - 31
56622514Sdarrenr		 */
56722514Sdarrenr		icp->icmp_type = 3;
56822514Sdarrenr		for (i = 0; i < 32; i++) {
56922514Sdarrenr			icp->icmp_code = i;
57022514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
57122514Sdarrenr			PAUSE();
57222514Sdarrenr			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
57322514Sdarrenr		}
57422514Sdarrenr	}
57522514Sdarrenr
57622514Sdarrenr	if (!ptest || (ptest == 3)) {
57722514Sdarrenr		/*
57822514Sdarrenr		 * Type 4, code = 0,127,128,255
57922514Sdarrenr		 */
58022514Sdarrenr		icp->icmp_type = 4;
58122514Sdarrenr		icp->icmp_code = 0;
58222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
58322514Sdarrenr		PAUSE();
58422514Sdarrenr		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
58522514Sdarrenr		icp->icmp_code = 127;
58622514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
58722514Sdarrenr		PAUSE();
58822514Sdarrenr		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
58922514Sdarrenr		icp->icmp_code = 128;
59022514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59122514Sdarrenr		PAUSE();
59222514Sdarrenr		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
59322514Sdarrenr		icp->icmp_code = 255;
59422514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
59522514Sdarrenr		PAUSE();
59622514Sdarrenr		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
59722514Sdarrenr	}
59822514Sdarrenr
59922514Sdarrenr	if (!ptest || (ptest == 4)) {
60022514Sdarrenr		/*
60122514Sdarrenr		 * Type 5, code = 0,127,128,255
60222514Sdarrenr		 */
60322514Sdarrenr		icp->icmp_type = 5;
60422514Sdarrenr		icp->icmp_code = 0;
60522514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
60622514Sdarrenr		PAUSE();
60722514Sdarrenr		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
60822514Sdarrenr		icp->icmp_code = 127;
60922514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
61022514Sdarrenr		PAUSE();
61122514Sdarrenr		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
61222514Sdarrenr		icp->icmp_code = 128;
61322514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
61422514Sdarrenr		PAUSE();
61522514Sdarrenr		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
61622514Sdarrenr		icp->icmp_code = 255;
61722514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
61822514Sdarrenr		PAUSE();
61922514Sdarrenr		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
62022514Sdarrenr	}
62122514Sdarrenr
62222514Sdarrenr	if (!ptest || (ptest == 5)) {
62322514Sdarrenr		/*
62422514Sdarrenr		 * Type 8-10;13-18, code - 0,127,128,255
62522514Sdarrenr		 */
62622514Sdarrenr		for (i = 0; ict1[i]; i++) {
62722514Sdarrenr			icp->icmp_type = ict1[i];
62822514Sdarrenr			icp->icmp_code = 0;
62922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
63022514Sdarrenr			PAUSE();
63122514Sdarrenr			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
63222514Sdarrenr				i * 4);
63322514Sdarrenr			icp->icmp_code = 127;
63422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
63522514Sdarrenr			PAUSE();
63622514Sdarrenr			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
63722514Sdarrenr				i * 4 + 1);
63822514Sdarrenr			icp->icmp_code = 128;
63922514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
64022514Sdarrenr			PAUSE();
64122514Sdarrenr			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
64222514Sdarrenr				i * 4 + 2);
64322514Sdarrenr			icp->icmp_code = 255;
64422514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
64522514Sdarrenr			PAUSE();
64622514Sdarrenr			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
64722514Sdarrenr				i * 4 + 3);
64822514Sdarrenr		}
64922514Sdarrenr		putchar('\n');
65022514Sdarrenr	}
65122514Sdarrenr
65222514Sdarrenr	if (!ptest || (ptest == 6)) {
65322514Sdarrenr		/*
65422514Sdarrenr		 * Type 12, code - 0,127,128,129,255
65522514Sdarrenr		 */
65622514Sdarrenr		icp->icmp_type = 12;
65722514Sdarrenr		icp->icmp_code = 0;
65822514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
65922514Sdarrenr		PAUSE();
66022514Sdarrenr		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
66122514Sdarrenr		icp->icmp_code = 127;
66222514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
66322514Sdarrenr		PAUSE();
66422514Sdarrenr		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
66522514Sdarrenr		icp->icmp_code = 128;
66622514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
66722514Sdarrenr		PAUSE();
66822514Sdarrenr		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
66922514Sdarrenr		icp->icmp_code = 129;
67022514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
67122514Sdarrenr		PAUSE();
67222514Sdarrenr		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
67322514Sdarrenr		icp->icmp_code = 255;
67422514Sdarrenr		(void) send_icmp(nfd, mtu, ip, gwip);
67522514Sdarrenr		PAUSE();
67622514Sdarrenr		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
67722514Sdarrenr		putchar('\n');
67822514Sdarrenr	}
67922514Sdarrenr
68022514Sdarrenr	if (!ptest || (ptest == 7)) {
68122514Sdarrenr		/*
68222514Sdarrenr		 * Type 3;9-10;13-14;17-18 - shorter packets
68322514Sdarrenr		 */
68422514Sdarrenr		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
68522514Sdarrenr		for (i = 0; ict2[i]; i++) {
68622514Sdarrenr			icp->icmp_type = ict1[i];
68722514Sdarrenr			icp->icmp_code = 0;
68822514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
68922514Sdarrenr			PAUSE();
69022514Sdarrenr			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
69122514Sdarrenr				i * 4, icp->icmp_type);
69222514Sdarrenr			icp->icmp_code = 127;
69322514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
69422514Sdarrenr			PAUSE();
69522514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
69622514Sdarrenr				i * 4 + 1, icp->icmp_type);
69722514Sdarrenr			icp->icmp_code = 128;
69822514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
69922514Sdarrenr			PAUSE();
70022514Sdarrenr			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
70122514Sdarrenr				i * 4 + 2, icp->icmp_type);
70222514Sdarrenr			icp->icmp_code = 255;
70322514Sdarrenr			(void) send_icmp(nfd, mtu, ip, gwip);
70422514Sdarrenr			PAUSE();
70522514Sdarrenr			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
70622514Sdarrenr				i * 4 + 3, icp->icmp_type);
70722514Sdarrenr		}
70822514Sdarrenr		putchar('\n');
70922514Sdarrenr	}
71022514Sdarrenr}
71122514Sdarrenr
71222514Sdarrenr
71322514Sdarrenr/* Perform test 4 (UDP) */
71422514Sdarrenr
71522514Sdarrenrvoid	ip_test4(dev, mtu, ip, gwip, ptest)
71622514Sdarrenrchar	*dev;
71722514Sdarrenrint	mtu;
71822514Sdarrenrip_t	*ip;
71922514Sdarrenrstruct	in_addr	gwip;
72022514Sdarrenrint	ptest;
72122514Sdarrenr{
72222514Sdarrenr	struct	timeval	tv;
72331183Speter	udphdr_t	*u;
72422514Sdarrenr	int	nfd, i;
72522514Sdarrenr
72622514Sdarrenr
72722514Sdarrenr	ip->ip_hl = sizeof(*ip) >> 2;
72822514Sdarrenr	ip->ip_v = IPVERSION;
72922514Sdarrenr	ip->ip_tos = 0;
73022514Sdarrenr	ip->ip_off = 0;
73122514Sdarrenr	ip->ip_ttl = 60;
73222514Sdarrenr	ip->ip_p = IPPROTO_UDP;
73322514Sdarrenr	ip->ip_sum = 0;
73422514Sdarrenr	u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2));
73537074Speter	u->uh_sport = htons(1);
73637074Speter	u->uh_dport = htons(1);
73737074Speter	u->uh_ulen = htons(sizeof(*u) + 4);
73822514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
73922514Sdarrenr
74022514Sdarrenr	if (!ptest || (ptest == 1)) {
74122514Sdarrenr		/*
74222514Sdarrenr		 * Test 1. ulen > packet
74322514Sdarrenr		 */
74437074Speter		u->uh_ulen = htons(sizeof(*u) + 4);
74537074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
74622514Sdarrenr		printf("4.1 UDP uh_ulen > packet size - short packets\n");
74737074Speter		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
74837074Speter			u->uh_ulen = htons(i);
74922514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
75022514Sdarrenr			printf("%d\r", i);
75122514Sdarrenr			fflush(stdout);
75222514Sdarrenr			PAUSE();
75322514Sdarrenr		}
75422514Sdarrenr		putchar('\n');
75522514Sdarrenr	}
75622514Sdarrenr
75722514Sdarrenr	if (!ptest || (ptest == 2)) {
75822514Sdarrenr		/*
75922514Sdarrenr		 * Test 2. ulen < packet
76022514Sdarrenr		 */
76137074Speter		u->uh_ulen = htons(sizeof(*u) + 4);
76237074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
76322514Sdarrenr		printf("4.2 UDP uh_ulen < packet size - short packets\n");
76437074Speter		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
76522514Sdarrenr			ip->ip_len = i;
76622514Sdarrenr			(void) send_udp(nfd, 1500, ip, gwip);
76722514Sdarrenr			printf("%d\r", i);
76822514Sdarrenr			fflush(stdout);
76922514Sdarrenr			PAUSE();
77022514Sdarrenr		}
77122514Sdarrenr		putchar('\n');
77222514Sdarrenr	}
77322514Sdarrenr
77422514Sdarrenr	if (!ptest || (ptest == 3)) {
77522514Sdarrenr		/*
77622514Sdarrenr		 * Test 3: sport = 0, sport = 1, sport = 32767
77722514Sdarrenr		 *         sport = 32768, sport = 65535
77822514Sdarrenr		 */
77922514Sdarrenr		u->uh_ulen = sizeof(*u) + 4;
78037074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
78122514Sdarrenr		printf("4.3.1 UDP sport = 0\n");
78222514Sdarrenr		u->uh_sport = 0;
78322514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
78422514Sdarrenr		printf("0\n");
78522514Sdarrenr		fflush(stdout);
78622514Sdarrenr		PAUSE();
78722514Sdarrenr		printf("4.3.2 UDP sport = 1\n");
78837074Speter		u->uh_sport = htons(1);
78922514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
79022514Sdarrenr		printf("1\n");
79122514Sdarrenr		fflush(stdout);
79222514Sdarrenr		PAUSE();
79322514Sdarrenr		printf("4.3.3 UDP sport = 32767\n");
79437074Speter		u->uh_sport = htons(32767);
79522514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
79622514Sdarrenr		printf("32767\n");
79722514Sdarrenr		fflush(stdout);
79822514Sdarrenr		PAUSE();
79922514Sdarrenr		printf("4.3.4 UDP sport = 32768\n");
80037074Speter		u->uh_sport = htons(32768);
80122514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
80222514Sdarrenr		printf("32768\n");
80322514Sdarrenr		putchar('\n');
80422514Sdarrenr		fflush(stdout);
80522514Sdarrenr		PAUSE();
80622514Sdarrenr		printf("4.3.5 UDP sport = 65535\n");
80737074Speter		u->uh_sport = htons(65535);
80822514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
80922514Sdarrenr		printf("65535\n");
81022514Sdarrenr		fflush(stdout);
81122514Sdarrenr		PAUSE();
81222514Sdarrenr	}
81322514Sdarrenr
81422514Sdarrenr	if (!ptest || (ptest == 4)) {
81522514Sdarrenr		/*
81622514Sdarrenr		 * Test 4: dport = 0, dport = 1, dport = 32767
81722514Sdarrenr		 *         dport = 32768, dport = 65535
81822514Sdarrenr		 */
81937074Speter		u->uh_ulen = ntohs(sizeof(*u) + 4);
82037074Speter		u->uh_sport = htons(1);
82137074Speter		ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen);
82222514Sdarrenr		printf("4.4.1 UDP dport = 0\n");
82322514Sdarrenr		u->uh_dport = 0;
82422514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
82522514Sdarrenr		printf("0\n");
82622514Sdarrenr		fflush(stdout);
82722514Sdarrenr		PAUSE();
82822514Sdarrenr		printf("4.4.2 UDP dport = 1\n");
82937074Speter		u->uh_dport = htons(1);
83022514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
83122514Sdarrenr		printf("1\n");
83222514Sdarrenr		fflush(stdout);
83322514Sdarrenr		PAUSE();
83422514Sdarrenr		printf("4.4.3 UDP dport = 32767\n");
83537074Speter		u->uh_dport = htons(32767);
83622514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
83722514Sdarrenr		printf("32767\n");
83822514Sdarrenr		fflush(stdout);
83922514Sdarrenr		PAUSE();
84022514Sdarrenr		printf("4.4.4 UDP dport = 32768\n");
84137074Speter		u->uh_dport = htons(32768);
84222514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
84322514Sdarrenr		printf("32768\n");
84422514Sdarrenr		fflush(stdout);
84522514Sdarrenr		PAUSE();
84622514Sdarrenr		printf("4.4.5 UDP dport = 65535\n");
84737074Speter		u->uh_dport = htons(65535);
84822514Sdarrenr		(void) send_udp(nfd, 1500, ip, gwip);
84922514Sdarrenr		printf("65535\n");
85022514Sdarrenr		fflush(stdout);
85122514Sdarrenr		PAUSE();
85222514Sdarrenr	}
85322514Sdarrenr
85431183Speter	if (!ptest || (ptest == 5)) {
85522514Sdarrenr		/*
85631183Speter		 * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) +
85731183Speter		 * sizeof(ip_t)
85822514Sdarrenr		 */
85922514Sdarrenr		printf("4.5 UDP 20 <= MTU <= 32\n");
86037074Speter		for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) {
86122514Sdarrenr			(void) send_udp(nfd, i, ip, gwip);
86222514Sdarrenr			printf("%d\r", i);
86322514Sdarrenr			fflush(stdout);
86422514Sdarrenr			PAUSE();
86522514Sdarrenr		}
86622514Sdarrenr		putchar('\n');
86722514Sdarrenr	}
86822514Sdarrenr}
86922514Sdarrenr
87022514Sdarrenr
87122514Sdarrenr/* Perform test 5 (TCP) */
87222514Sdarrenr
87322514Sdarrenrvoid	ip_test5(dev, mtu, ip, gwip, ptest)
87422514Sdarrenrchar	*dev;
87522514Sdarrenrint	mtu;
87622514Sdarrenrip_t	*ip;
87722514Sdarrenrstruct	in_addr	gwip;
87822514Sdarrenrint	ptest;
87922514Sdarrenr{
88022514Sdarrenr	struct	timeval	tv;
88122514Sdarrenr	tcphdr_t *t;
88222514Sdarrenr	int	nfd, i;
88322514Sdarrenr
88422514Sdarrenr	t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2));
88531183Speter#ifndef	linux
88622514Sdarrenr	t->th_x2 = 0;
88731183Speter#endif
88822514Sdarrenr	t->th_off = 0;
88937074Speter	t->th_sport = htons(1);
89037074Speter	t->th_dport = htons(1);
89137074Speter	t->th_win = htons(4096);
89222514Sdarrenr	t->th_urp = 0;
89322514Sdarrenr	t->th_sum = 0;
89437074Speter	t->th_seq = htonl(1);
89522514Sdarrenr	t->th_ack = 0;
89634739Speter	ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
89722514Sdarrenr	nfd = initdevice(dev, t->th_sport, 1);
89822514Sdarrenr
89922514Sdarrenr	if (!ptest || (ptest == 1)) {
90022514Sdarrenr		/*
90122514Sdarrenr		 * Test 1: flags variations, 0 - 3f
90222514Sdarrenr		 */
90322514Sdarrenr		t->th_off = sizeof(*t) >> 2;
90422514Sdarrenr		printf("5.1 Test TCP flag combinations\n");
90522514Sdarrenr		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
90622514Sdarrenr		     i++) {
90722514Sdarrenr			t->th_flags = i;
90822514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
90922514Sdarrenr			printf("%d\r", i);
91022514Sdarrenr			fflush(stdout);
91122514Sdarrenr			PAUSE();
91222514Sdarrenr		}
91322514Sdarrenr		putchar('\n');
91422514Sdarrenr	}
91522514Sdarrenr
91622514Sdarrenr	if (!ptest || (ptest == 2)) {
91722514Sdarrenr		t->th_flags = TH_SYN;
91822514Sdarrenr		/*
91922514Sdarrenr		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
92022514Sdarrenr		 *         seq = 0xa000000, seq = 0xffffffff
92122514Sdarrenr		 */
92222514Sdarrenr		printf("5.2.1 TCP seq = 0\n");
92337074Speter		t->th_seq = htonl(0);
92422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
92522514Sdarrenr		fflush(stdout);
92622514Sdarrenr		PAUSE();
92722514Sdarrenr
92822514Sdarrenr		printf("5.2.2 TCP seq = 1\n");
92937074Speter		t->th_seq = htonl(1);
93022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93122514Sdarrenr		fflush(stdout);
93222514Sdarrenr		PAUSE();
93322514Sdarrenr
93422514Sdarrenr		printf("5.2.3 TCP seq = 0x7fffffff\n");
93537074Speter		t->th_seq = htonl(0x7fffffff);
93622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
93722514Sdarrenr		fflush(stdout);
93822514Sdarrenr		PAUSE();
93922514Sdarrenr
94022514Sdarrenr		printf("5.2.4 TCP seq = 0x80000000\n");
94137074Speter		t->th_seq = htonl(0x80000000);
94222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
94322514Sdarrenr		fflush(stdout);
94422514Sdarrenr		PAUSE();
94522514Sdarrenr
94622514Sdarrenr		printf("5.2.5 TCP seq = 0xc0000000\n");
94737074Speter		t->th_seq = htonl(0xc0000000);
94822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
94922514Sdarrenr		fflush(stdout);
95022514Sdarrenr		PAUSE();
95122514Sdarrenr
95222514Sdarrenr		printf("5.2.6 TCP seq = 0xffffffff\n");
95337074Speter		t->th_seq = htonl(0xffffffff);
95422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
95522514Sdarrenr		fflush(stdout);
95622514Sdarrenr		PAUSE();
95722514Sdarrenr	}
95822514Sdarrenr
95922514Sdarrenr	if (!ptest || (ptest == 3)) {
96022514Sdarrenr		t->th_flags = TH_ACK;
96122514Sdarrenr		/*
96222514Sdarrenr		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
96322514Sdarrenr		 *         ack = 0xa000000, ack = 0xffffffff
96422514Sdarrenr		 */
96522514Sdarrenr		printf("5.3.1 TCP ack = 0\n");
96622514Sdarrenr		t->th_ack = 0;
96722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
96822514Sdarrenr		fflush(stdout);
96922514Sdarrenr		PAUSE();
97022514Sdarrenr
97122514Sdarrenr		printf("5.3.2 TCP ack = 1\n");
97237074Speter		t->th_ack = htonl(1);
97322514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
97422514Sdarrenr		fflush(stdout);
97522514Sdarrenr		PAUSE();
97622514Sdarrenr
97722514Sdarrenr		printf("5.3.3 TCP ack = 0x7fffffff\n");
97837074Speter		t->th_ack = htonl(0x7fffffff);
97922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
98022514Sdarrenr		fflush(stdout);
98122514Sdarrenr		PAUSE();
98222514Sdarrenr
98322514Sdarrenr		printf("5.3.4 TCP ack = 0x80000000\n");
98437074Speter		t->th_ack = htonl(0x80000000);
98522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
98622514Sdarrenr		fflush(stdout);
98722514Sdarrenr		PAUSE();
98822514Sdarrenr
98922514Sdarrenr		printf("5.3.5 TCP ack = 0xc0000000\n");
99037074Speter		t->th_ack = htonl(0xc0000000);
99122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99222514Sdarrenr		fflush(stdout);
99322514Sdarrenr		PAUSE();
99422514Sdarrenr
99522514Sdarrenr		printf("5.3.6 TCP ack = 0xffffffff\n");
99637074Speter		t->th_ack = htonl(0xffffffff);
99722514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
99822514Sdarrenr		fflush(stdout);
99922514Sdarrenr		PAUSE();
100022514Sdarrenr	}
100122514Sdarrenr
100222514Sdarrenr	if (!ptest || (ptest == 4)) {
100322514Sdarrenr		t->th_flags = TH_SYN;
100422514Sdarrenr		/*
100522514Sdarrenr		 * Test 4: win = 0, win = 32768, win = 65535
100622514Sdarrenr		 */
100722514Sdarrenr		printf("5.4.1 TCP win = 0\n");
100837074Speter		t->th_seq = htonl(0);
100922514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
101022514Sdarrenr		fflush(stdout);
101122514Sdarrenr		PAUSE();
101222514Sdarrenr
101322514Sdarrenr		printf("5.4.2 TCP win = 32768\n");
101437074Speter		t->th_seq = htonl(0x7fff);
101522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
101622514Sdarrenr		fflush(stdout);
101722514Sdarrenr		PAUSE();
101822514Sdarrenr
101922514Sdarrenr		printf("5.4.3 TCP win = 65535\n");
102037074Speter		t->th_win = htons(0xffff);
102122514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
102222514Sdarrenr		fflush(stdout);
102322514Sdarrenr		PAUSE();
102422514Sdarrenr	}
102522514Sdarrenr
102634739Speter#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \
102734739Speter    !defined(__sgi)
102822514Sdarrenr	{
102934739Speter	struct tcpcb *tcbp, tcb;
103022514Sdarrenr	struct tcpiphdr ti;
103122514Sdarrenr	struct sockaddr_in sin;
103222514Sdarrenr	int fd, slen;
103322514Sdarrenr
103422514Sdarrenr	bzero((char *)&sin, sizeof(sin));
103522514Sdarrenr
103622514Sdarrenr	for (i = 1; i < 63; i++) {
103722514Sdarrenr		fd = socket(AF_INET, SOCK_STREAM, 0);
103834739Speter		bzero((char *)&sin, sizeof(sin));
103922514Sdarrenr		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
104022514Sdarrenr		sin.sin_port = htons(i);
104134739Speter		sin.sin_family = AF_INET;
104222514Sdarrenr		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
104322514Sdarrenr			break;
104434739Speter		close(fd);
104522514Sdarrenr	}
104622514Sdarrenr
104722514Sdarrenr	if (i == 63) {
104822514Sdarrenr		printf("Couldn't open a TCP socket between ports 1 and 63\n");
104922514Sdarrenr		printf("to host %s for test 5 and 6 - skipping.\n",
105022514Sdarrenr			inet_ntoa(ip->ip_dst));
105122514Sdarrenr		goto skip_five_and_six;
105222514Sdarrenr	}
105322514Sdarrenr
105422514Sdarrenr	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
105534739Speter	t->th_dport = htons(i);
105622514Sdarrenr	slen = sizeof(sin);
105722514Sdarrenr	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
105834739Speter		t->th_sport = sin.sin_port;
105934739Speter	if (!(tcbp = find_tcp(fd, &ti))) {
106022514Sdarrenr		printf("Can't find PCB\n");
106122514Sdarrenr		goto skip_five_and_six;
106222514Sdarrenr	}
106334739Speter	KMCPY(&tcb, tcbp, sizeof(tcb));
106422514Sdarrenr	ti.ti_win = tcb.rcv_adv;
106537074Speter	ti.ti_seq = htonl(tcb.snd_nxt - 1);
106622514Sdarrenr	ti.ti_ack = tcb.rcv_nxt;
106722514Sdarrenr
106822514Sdarrenr	if (!ptest || (ptest == 5)) {
106922514Sdarrenr		/*
107022514Sdarrenr		 * Test 5: urp
107122514Sdarrenr		 */
107234739Speter		t->th_flags = TH_ACK|TH_URG;
107334739Speter		printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n",
107434739Speter			ntohs(t->th_sport), ntohs(t->th_dport));
107534739Speter		t->th_urp = htons(1);
107622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
107722514Sdarrenr		PAUSE();
107834739Speter
107937074Speter		t->th_seq = htonl(tcb.snd_nxt);
108034739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1;
108134739Speter		t->th_urp = htons(0x7fff);
108222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
108322514Sdarrenr		PAUSE();
108434739Speter		t->th_urp = htons(0x8000);
108522514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
108622514Sdarrenr		PAUSE();
108734739Speter		t->th_urp = htons(0xffff);
108822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
108922514Sdarrenr		PAUSE();
109037074Speter		t->th_urp = 0;
109134739Speter		t->th_flags &= ~TH_URG;
109234739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
109322514Sdarrenr	}
109422514Sdarrenr
109522514Sdarrenr	if (!ptest || (ptest == 6)) {
109622514Sdarrenr		/*
109722514Sdarrenr		 * Test 6: data offset, off = 0, off is inside, off is outside
109822514Sdarrenr		 */
109934739Speter		t->th_flags = TH_ACK;
110034739Speter		printf("5.6.1 TCP off = 1-15, len = 40\n");
110134739Speter		for (i = 1; i < 16; i++) {
110222514Sdarrenr			ti.ti_off = ntohs(i);
110322514Sdarrenr			(void) send_tcp(nfd, mtu, ip, gwip);
110422514Sdarrenr			printf("%d\r", i);
110522514Sdarrenr			fflush(stdout);
110622514Sdarrenr			PAUSE();
110722514Sdarrenr		}
110822514Sdarrenr		putchar('\n');
110934739Speter		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
111022514Sdarrenr	}
111122514Sdarrenr
111222514Sdarrenr	(void) close(fd);
111322514Sdarrenr	}
111422514Sdarrenrskip_five_and_six:
111522514Sdarrenr#endif
111637074Speter	t->th_seq = htonl(1);
111737074Speter	t->th_ack = htonl(1);
111834739Speter	t->th_off = 0;
111922514Sdarrenr
112022514Sdarrenr	if (!ptest || (ptest == 7)) {
112122514Sdarrenr		t->th_flags = TH_SYN;
112222514Sdarrenr		/*
112322514Sdarrenr		 * Test 7: sport = 0, sport = 1, sport = 32767
112422514Sdarrenr		 *         sport = 32768, sport = 65535
112522514Sdarrenr		 */
112622514Sdarrenr		printf("5.7.1 TCP sport = 0\n");
112722514Sdarrenr		t->th_sport = 0;
112822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
112922514Sdarrenr		fflush(stdout);
113022514Sdarrenr		PAUSE();
113122514Sdarrenr
113222514Sdarrenr		printf("5.7.2 TCP sport = 1\n");
113337074Speter		t->th_sport = htons(1);
113422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
113522514Sdarrenr		fflush(stdout);
113622514Sdarrenr		PAUSE();
113722514Sdarrenr
113822514Sdarrenr		printf("5.7.3 TCP sport = 32767\n");
113937074Speter		t->th_sport = htons(32767);
114022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114122514Sdarrenr		fflush(stdout);
114222514Sdarrenr		PAUSE();
114322514Sdarrenr
114422514Sdarrenr		printf("5.7.4 TCP sport = 32768\n");
114537074Speter		t->th_sport = htons(32768);
114622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
114722514Sdarrenr		fflush(stdout);
114822514Sdarrenr		PAUSE();
114922514Sdarrenr
115022514Sdarrenr		printf("5.7.5 TCP sport = 65535\n");
115137074Speter		t->th_sport = htons(65535);
115222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
115322514Sdarrenr		fflush(stdout);
115422514Sdarrenr		PAUSE();
115522514Sdarrenr	}
115622514Sdarrenr
115722514Sdarrenr	if (!ptest || (ptest == 8)) {
115837074Speter		t->th_sport = htons(1);
115934739Speter		t->th_flags = TH_SYN;
116022514Sdarrenr		/*
116122514Sdarrenr		 * Test 8: dport = 0, dport = 1, dport = 32767
116222514Sdarrenr		 *         dport = 32768, dport = 65535
116322514Sdarrenr		 */
116422514Sdarrenr		printf("5.8.1 TCP dport = 0\n");
116522514Sdarrenr		t->th_dport = 0;
116622514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
116722514Sdarrenr		fflush(stdout);
116822514Sdarrenr		PAUSE();
116922514Sdarrenr
117022514Sdarrenr		printf("5.8.2 TCP dport = 1\n");
117137074Speter		t->th_dport = htons(1);
117222514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
117322514Sdarrenr		fflush(stdout);
117422514Sdarrenr		PAUSE();
117522514Sdarrenr
117622514Sdarrenr		printf("5.8.3 TCP dport = 32767\n");
117737074Speter		t->th_dport = htons(32767);
117822514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
117922514Sdarrenr		fflush(stdout);
118022514Sdarrenr		PAUSE();
118122514Sdarrenr
118222514Sdarrenr		printf("5.8.4 TCP dport = 32768\n");
118337074Speter		t->th_dport = htons(32768);
118422514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
118522514Sdarrenr		fflush(stdout);
118622514Sdarrenr		PAUSE();
118722514Sdarrenr
118822514Sdarrenr		printf("5.8.5 TCP dport = 65535\n");
118937074Speter		t->th_dport = htons(65535);
119022514Sdarrenr		(void) send_tcp(nfd, mtu, ip, gwip);
119122514Sdarrenr		fflush(stdout);
119222514Sdarrenr		PAUSE();
119322514Sdarrenr	}
119434739Speter
119534739Speter	/* LAND attack - self connect, so make src & dst ip/port the same */
119634739Speter	if (!ptest || (ptest == 9)) {
119734739Speter		printf("5.9 TCP LAND attack. sport = 25, dport = 25\n");
119834739Speter		/* chose SMTP port 25 */
119934739Speter		t->th_sport = htons(25);
120034739Speter		t->th_dport = htons(25);
120134739Speter		t->th_flags = TH_SYN;
120234739Speter		ip->ip_src = ip->ip_dst;
120334739Speter		(void) send_tcp(nfd, mtu, ip, gwip);
120434739Speter		fflush(stdout);
120534739Speter		PAUSE();
120634739Speter	}
120734739Speter
120822514Sdarrenr	/* TCP options header checking */
120922514Sdarrenr	/* 0 length options, etc */
121022514Sdarrenr}
121122514Sdarrenr
121222514Sdarrenr
121322514Sdarrenr/* Perform test 6 (exhaust mbuf test) */
121422514Sdarrenr
121522514Sdarrenrvoid	ip_test6(dev, mtu, ip, gwip, ptest)
121622514Sdarrenrchar	*dev;
121722514Sdarrenrint	mtu;
121822514Sdarrenrip_t	*ip;
121922514Sdarrenrstruct	in_addr	gwip;
122022514Sdarrenrint	ptest;
122122514Sdarrenr{
122222514Sdarrenr	struct	timeval	tv;
122322514Sdarrenr	udphdr_t *u;
122422514Sdarrenr	int	nfd, i, j, k;
122522514Sdarrenr
122622514Sdarrenr	ip->ip_v = IPVERSION;
122722514Sdarrenr	ip->ip_tos = 0;
122822514Sdarrenr	ip->ip_off = 0;
122922514Sdarrenr	ip->ip_ttl = 60;
123022514Sdarrenr	ip->ip_p = IPPROTO_UDP;
123122514Sdarrenr	ip->ip_sum = 0;
123222514Sdarrenr	u = (udphdr_t *)(ip + 1);
123337074Speter	u->uh_sport = htons(1);
123437074Speter	u->uh_dport = htons(9);
123522514Sdarrenr	u->uh_sum = 0;
123622514Sdarrenr
123722514Sdarrenr	nfd = initdevice(dev, u->uh_sport, 1);
123837074Speter	u->uh_ulen = htons(7168);
123922514Sdarrenr
124034739Speter	printf("6. Exhaustive mbuf test.\n");
124134739Speter	printf("   Send 7k packet in 768 & 128 byte fragments, 128 times.\n");
124234739Speter	printf("   Total of around 8,900 packets\n");
124322514Sdarrenr	for (i = 0; i < 128; i++) {
124422514Sdarrenr		/*
124522514Sdarrenr		 * First send the entire packet in 768 byte chunks.
124622514Sdarrenr		 */
124722514Sdarrenr		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
124822514Sdarrenr		ip->ip_hl = sizeof(*ip) >> 2;
124937074Speter		ip->ip_off = htons(IP_MF);
125022514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
125122514Sdarrenr		printf("%d %d\r", i, 0);
125222514Sdarrenr		fflush(stdout);
125322514Sdarrenr		PAUSE();
125422514Sdarrenr		/*
125522514Sdarrenr		 * And again using 128 byte chunks.
125622514Sdarrenr		 */
125722514Sdarrenr		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
125837074Speter		ip->ip_off = htons(IP_MF);
125922514Sdarrenr		(void) send_ip(nfd, 1500, ip, gwip, 1);
126022514Sdarrenr		printf("%d %d\r", i, 0);
126122514Sdarrenr		fflush(stdout);
126222514Sdarrenr		PAUSE();
126322514Sdarrenr
126422514Sdarrenr		for (j = 768; j < 3584; j += 768) {
126522514Sdarrenr			ip->ip_len = sizeof(*ip) + 768;
126637074Speter			ip->ip_off = htons(IP_MF|(j>>3));
126722514Sdarrenr			(void) send_ip(nfd, 1500, ip, gwip, 1);
126822514Sdarrenr			printf("%d %d\r", i, j);
126922514Sdarrenr			fflush(stdout);
127022514Sdarrenr			PAUSE();
127122514Sdarrenr
127222514Sdarrenr			ip->ip_len = sizeof(*ip) + 128;
127322514Sdarrenr			for (k = j - 768; k < j; k += 128) {
127437074Speter				ip->ip_off = htons(IP_MF|(k>>3));
127522514Sdarrenr				(void) send_ip(nfd, 1500, ip, gwip, 1);
127622514Sdarrenr				printf("%d %d\r", i, k);
127722514Sdarrenr				fflush(stdout);
127822514Sdarrenr				PAUSE();
127922514Sdarrenr			}
128022514Sdarrenr		}
128122514Sdarrenr	}
128222514Sdarrenr	putchar('\n');
128322514Sdarrenr}
128422514Sdarrenr
128522514Sdarrenr
128622514Sdarrenr/* Perform test 7 (random packets) */
128722514Sdarrenr
128822514Sdarrenrstatic	u_long	tbuf[64];
128922514Sdarrenr
129022514Sdarrenrvoid	ip_test7(dev, mtu, ip, gwip, ptest)
129122514Sdarrenrchar	*dev;
129222514Sdarrenrint	mtu;
129322514Sdarrenrip_t	*ip;
129422514Sdarrenrstruct	in_addr	gwip;
129522514Sdarrenrint	ptest;
129622514Sdarrenr{
129722514Sdarrenr	ip_t	*pip;
129822514Sdarrenr	struct	timeval	tv;
129922514Sdarrenr	int	nfd, i, j;
130022514Sdarrenr	u_char	*s;
130122514Sdarrenr
130222514Sdarrenr	nfd = initdevice(dev, 0, 1);
130322514Sdarrenr	pip = (ip_t *)tbuf;
130422514Sdarrenr
130522514Sdarrenr	srand(time(NULL) ^ (getpid() * getppid()));
130622514Sdarrenr
130722514Sdarrenr	printf("7. send 1024 random IP packets.\n");
130822514Sdarrenr
130922514Sdarrenr	for (i = 0; i < 512; i++) {
131022514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
131122514Sdarrenr			*s = (rand() >> 13) & 0xff;
131222514Sdarrenr		pip->ip_v = IPVERSION;
131322514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
131422514Sdarrenr		      sizeof(struct in_addr));
131522514Sdarrenr		pip->ip_sum = 0;
131622514Sdarrenr		pip->ip_len &= 0xff;
131722514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
131822514Sdarrenr		printf("%d\r", i);
131922514Sdarrenr		fflush(stdout);
132022514Sdarrenr		PAUSE();
132122514Sdarrenr	}
132222514Sdarrenr	putchar('\n');
132322514Sdarrenr
132422514Sdarrenr	for (i = 0; i < 512; i++) {
132522514Sdarrenr		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
132622514Sdarrenr			*s = (rand() >> 13) & 0xff;
132722514Sdarrenr		pip->ip_v = IPVERSION;
132837074Speter		pip->ip_off &= htons(0xc000);
132922514Sdarrenr		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
133022514Sdarrenr		      sizeof(struct in_addr));
133122514Sdarrenr		pip->ip_sum = 0;
133222514Sdarrenr		pip->ip_len &= 0xff;
133322514Sdarrenr		(void) send_ip(nfd, mtu, pip, gwip, 0);
133422514Sdarrenr		printf("%d\r", i);
133522514Sdarrenr		fflush(stdout);
133622514Sdarrenr		PAUSE();
133722514Sdarrenr	}
133822514Sdarrenr	putchar('\n');
133922514Sdarrenr}
1340