xref: /freebsd/sbin/ipf/ipsend/iptests.c (revision 5b31cc94b10d4bb7109c6b27940a0fc76a44a331)
141edb306SCy Schubert 
241edb306SCy Schubert /*
341edb306SCy Schubert  * Copyright (C) 2012 by Darren Reed.
441edb306SCy Schubert  *
541edb306SCy Schubert  * See the IPFILTER.LICENCE file for details on licencing.
641edb306SCy Schubert  *
741edb306SCy Schubert  */
841edb306SCy Schubert #include <sys/param.h>
941edb306SCy Schubert #include <sys/types.h>
1041edb306SCy Schubert #if defined(__NetBSD__) && defined(__vax__)
1141edb306SCy Schubert /*
1241edb306SCy Schubert  * XXX need to declare boolean_t for _KERNEL <sys/files.h>
1341edb306SCy Schubert  * which ends up including <sys/device.h> for vax.  See PR#32907
1441edb306SCy Schubert  * for further details.
1541edb306SCy Schubert  */
1641edb306SCy Schubert typedef	int	boolean_t;
1741edb306SCy Schubert #endif
1841edb306SCy Schubert #include <sys/time.h>
1941edb306SCy Schubert # ifdef __NetBSD__
2041edb306SCy Schubert #  include <machine/lock.h>
2141edb306SCy Schubert #  include <machine/mutex.h>
2241edb306SCy Schubert # endif
2341edb306SCy Schubert # define _KERNEL
2441edb306SCy Schubert # define KERNEL
2541edb306SCy Schubert # if !defined(solaris)
2641edb306SCy Schubert #  include <sys/file.h>
2741edb306SCy Schubert # else
2841edb306SCy Schubert #  ifdef solaris
2941edb306SCy Schubert #   include <sys/dditypes.h>
3041edb306SCy Schubert #  endif
3141edb306SCy Schubert # endif
3241edb306SCy Schubert # undef  _KERNEL
3341edb306SCy Schubert # undef  KERNEL
3441edb306SCy Schubert #if !defined(solaris)
3541edb306SCy Schubert # include <nlist.h>
3641edb306SCy Schubert # include <sys/user.h>
3741edb306SCy Schubert # include <sys/proc.h>
3841edb306SCy Schubert #endif
3941edb306SCy Schubert # include <kvm.h>
4041edb306SCy Schubert # include <sys/socket.h>
4141edb306SCy Schubert #if defined(solaris)
4241edb306SCy Schubert # include <sys/stream.h>
4341edb306SCy Schubert #else
4441edb306SCy Schubert # include <sys/socketvar.h>
4541edb306SCy Schubert #endif
4641edb306SCy Schubert #ifdef sun
4741edb306SCy Schubert #include <sys/systm.h>
4841edb306SCy Schubert #include <sys/session.h>
4941edb306SCy Schubert #endif
5041edb306SCy Schubert # include <sys/sysctl.h>
5141edb306SCy Schubert # include <sys/filedesc.h>
5241edb306SCy Schubert # include <paths.h>
5341edb306SCy Schubert #include <netinet/in_systm.h>
5441edb306SCy Schubert #include <sys/socket.h>
5541edb306SCy Schubert #include <net/if.h>
5641edb306SCy Schubert # if defined(__FreeBSD__)
5741edb306SCy Schubert #  include "radix_ipf.h"
5841edb306SCy Schubert # endif
5941edb306SCy Schubert # if !defined(solaris)
6041edb306SCy Schubert #  include <net/route.h>
6141edb306SCy Schubert # endif
6241edb306SCy Schubert #include <netinet/in.h>
6341edb306SCy Schubert #include <arpa/inet.h>
6441edb306SCy Schubert #include <netinet/ip.h>
6541edb306SCy Schubert #if defined(__SVR4) || defined(__svr4__)
6641edb306SCy Schubert # include <sys/sysmacros.h>
6741edb306SCy Schubert #endif
6841edb306SCy Schubert #include <stdio.h>
6941edb306SCy Schubert #include <unistd.h>
7041edb306SCy Schubert #include <stdlib.h>
7141edb306SCy Schubert #include <string.h>
7241edb306SCy Schubert # include <netinet/ip_var.h>
7341edb306SCy Schubert # if !defined(solaris)
7441edb306SCy Schubert #  include <netinet/in_pcb.h>
7541edb306SCy Schubert # endif
7641edb306SCy Schubert #include "ipsend.h"
7741edb306SCy Schubert # include <netinet/tcp_timer.h>
7841edb306SCy Schubert # include <netinet/tcp_var.h>
7941edb306SCy Schubert #if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000000)
8041edb306SCy Schubert # define USE_NANOSLEEP
8141edb306SCy Schubert #endif
8241edb306SCy Schubert 
8341edb306SCy Schubert 
8441edb306SCy Schubert #ifdef USE_NANOSLEEP
8541edb306SCy Schubert # define	PAUSE() ts.tv_sec = 0; ts.tv_nsec = 10000000; \
8641edb306SCy Schubert 		  (void) nanosleep(&ts, NULL)
8741edb306SCy Schubert #else
8841edb306SCy Schubert # define	PAUSE()	tv.tv_sec = 0; tv.tv_usec = 10000; \
8941edb306SCy Schubert 		  (void) select(0, NULL, NULL, NULL, &tv)
9041edb306SCy Schubert #endif
9141edb306SCy Schubert 
9241edb306SCy Schubert 
93*efeb8bffSCy Schubert void
ip_test1(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)94*efeb8bffSCy Schubert ip_test1(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
9541edb306SCy Schubert {
9641edb306SCy Schubert #ifdef USE_NANOSLEEP
9741edb306SCy Schubert 	struct	timespec ts;
9841edb306SCy Schubert #else
9941edb306SCy Schubert 	struct	timeval	tv;
10041edb306SCy Schubert #endif
10141edb306SCy Schubert 	udphdr_t *u;
10241edb306SCy Schubert 	int	nfd, i = 0, len, id = getpid();
10341edb306SCy Schubert 
10441edb306SCy Schubert 	IP_HL_A(ip, sizeof(*ip) >> 2);
10541edb306SCy Schubert 	IP_V_A(ip, IPVERSION);
10641edb306SCy Schubert 	ip->ip_tos = 0;
10741edb306SCy Schubert 	ip->ip_off = 0;
10841edb306SCy Schubert 	ip->ip_ttl = 60;
10941edb306SCy Schubert 	ip->ip_p = IPPROTO_UDP;
11041edb306SCy Schubert 	ip->ip_sum = 0;
11141edb306SCy Schubert 	u = (udphdr_t *)(ip + 1);
11241edb306SCy Schubert 	u->uh_sport = htons(1);
11341edb306SCy Schubert 	u->uh_dport = htons(9);
11441edb306SCy Schubert 	u->uh_sum = 0;
11541edb306SCy Schubert 	u->uh_ulen = htons(sizeof(*u) + 4);
11641edb306SCy Schubert 	ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen);
11741edb306SCy Schubert 	len = ip->ip_len;
11841edb306SCy Schubert 
11941edb306SCy Schubert 	nfd = initdevice(dev, 1);
12041edb306SCy Schubert 	if (nfd == -1)
12141edb306SCy Schubert 		return;
12241edb306SCy Schubert 
12341edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
12441edb306SCy Schubert 		/*
12541edb306SCy Schubert 		 * Part1: hl < len
12641edb306SCy Schubert 		 */
12741edb306SCy Schubert 		ip->ip_id = 0;
12841edb306SCy Schubert 		printf("1.1. sending packets with ip_hl < ip_len\n");
12941edb306SCy Schubert 		for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) {
13041edb306SCy Schubert 			IP_HL_A(ip, i >> 2);
13141edb306SCy Schubert 			(void) send_ip(nfd, 1500, ip, gwip, 1);
13241edb306SCy Schubert 			printf("%d\r", i);
13341edb306SCy Schubert 			fflush(stdout);
13441edb306SCy Schubert 			PAUSE();
13541edb306SCy Schubert 		}
13641edb306SCy Schubert 		putchar('\n');
13741edb306SCy Schubert 	}
13841edb306SCy Schubert 
13941edb306SCy Schubert 	if (!ptest || (ptest == 2)) {
14041edb306SCy Schubert 		/*
14141edb306SCy Schubert 		 * Part2: hl > len
14241edb306SCy Schubert 		 */
14341edb306SCy Schubert 		ip->ip_id = 0;
14441edb306SCy Schubert 		printf("1.2. sending packets with ip_hl > ip_len\n");
14541edb306SCy Schubert 		for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) {
14641edb306SCy Schubert 			IP_HL_A(ip, i >> 2);
14741edb306SCy Schubert 			(void) send_ip(nfd, 1500, ip, gwip, 1);
14841edb306SCy Schubert 			printf("%d\r", i);
14941edb306SCy Schubert 			fflush(stdout);
15041edb306SCy Schubert 			PAUSE();
15141edb306SCy Schubert 		}
15241edb306SCy Schubert 		putchar('\n');
15341edb306SCy Schubert 	}
15441edb306SCy Schubert 
15541edb306SCy Schubert 	if (!ptest || (ptest == 3)) {
15641edb306SCy Schubert 		/*
15741edb306SCy Schubert 		 * Part3: v < 4
15841edb306SCy Schubert 		 */
15941edb306SCy Schubert 		ip->ip_id = 0;
16041edb306SCy Schubert 		printf("1.3. ip_v < 4\n");
16141edb306SCy Schubert 		IP_HL_A(ip, sizeof(*ip) >> 2);
16241edb306SCy Schubert 		for (i = 0; i < 4; i++) {
16341edb306SCy Schubert 			IP_V_A(ip, i);
16441edb306SCy Schubert 			(void) send_ip(nfd, 1500, ip, gwip, 1);
16541edb306SCy Schubert 			printf("%d\r", i);
16641edb306SCy Schubert 			fflush(stdout);
16741edb306SCy Schubert 			PAUSE();
16841edb306SCy Schubert 		}
16941edb306SCy Schubert 		putchar('\n');
17041edb306SCy Schubert 	}
17141edb306SCy Schubert 
17241edb306SCy Schubert 	if (!ptest || (ptest == 4)) {
17341edb306SCy Schubert 		/*
17441edb306SCy Schubert 		 * Part4: v > 4
17541edb306SCy Schubert 		 */
17641edb306SCy Schubert 		ip->ip_id = 0;
17741edb306SCy Schubert 		printf("1.4. ip_v > 4\n");
17841edb306SCy Schubert 		for (i = 5; i < 16; i++) {
17941edb306SCy Schubert 			IP_V_A(ip, i);
18041edb306SCy Schubert 			(void) send_ip(nfd, 1500, ip, gwip, 1);
18141edb306SCy Schubert 			printf("%d\r", i);
18241edb306SCy Schubert 			fflush(stdout);
18341edb306SCy Schubert 			PAUSE();
18441edb306SCy Schubert 		}
18541edb306SCy Schubert 		putchar('\n');
18641edb306SCy Schubert 	}
18741edb306SCy Schubert 
18841edb306SCy Schubert 	if (!ptest || (ptest == 5)) {
18941edb306SCy Schubert 		/*
19041edb306SCy Schubert 		 * Part5: len < packet
19141edb306SCy Schubert 		 */
19241edb306SCy Schubert 		ip->ip_id = 0;
19341edb306SCy Schubert 		IP_V_A(ip, IPVERSION);
19441edb306SCy Schubert 		i = ip->ip_len + 1;
19541edb306SCy Schubert 		printf("1.5.0 ip_len < packet size (size++, long packets)\n");
19641edb306SCy Schubert 		for (; i < (ip->ip_len * 2); i++) {
19741edb306SCy Schubert 			ip->ip_id = htons(id++);
19841edb306SCy Schubert 			ip->ip_sum = 0;
19941edb306SCy Schubert 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
20041edb306SCy Schubert 			(void) send_ether(nfd, (char *)ip, i, gwip);
20141edb306SCy Schubert 			printf("%d\r", i);
20241edb306SCy Schubert 			fflush(stdout);
20341edb306SCy Schubert 			PAUSE();
20441edb306SCy Schubert 		}
20541edb306SCy Schubert 		putchar('\n');
20641edb306SCy Schubert 		printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n");
20741edb306SCy Schubert 		for (i = len; i > 0; i--) {
20841edb306SCy Schubert 			ip->ip_id = htons(id++);
20941edb306SCy Schubert 			ip->ip_len = i;
21041edb306SCy Schubert 			ip->ip_sum = 0;
21141edb306SCy Schubert 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
21241edb306SCy Schubert 			(void) send_ether(nfd, (char *)ip, len, gwip);
21341edb306SCy Schubert 			printf("%d\r", i);
21441edb306SCy Schubert 			fflush(stdout);
21541edb306SCy Schubert 			PAUSE();
21641edb306SCy Schubert 		}
21741edb306SCy Schubert 		putchar('\n');
21841edb306SCy Schubert 	}
21941edb306SCy Schubert 
22041edb306SCy Schubert 	if (!ptest || (ptest == 6)) {
22141edb306SCy Schubert 		/*
22241edb306SCy Schubert 		 * Part6: len > packet
22341edb306SCy Schubert 		 */
22441edb306SCy Schubert 		ip->ip_id = 0;
22541edb306SCy Schubert 		printf("1.6.0 ip_len > packet size (increase ip_len)\n");
22641edb306SCy Schubert 		for (i = len + 1; i < (len * 2); i++) {
22741edb306SCy Schubert 			ip->ip_id = htons(id++);
22841edb306SCy Schubert 			ip->ip_len = i;
22941edb306SCy Schubert 			ip->ip_sum = 0;
23041edb306SCy Schubert 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
23141edb306SCy Schubert 			(void) send_ether(nfd, (char *)ip, len, gwip);
23241edb306SCy Schubert 			printf("%d\r", i);
23341edb306SCy Schubert 			fflush(stdout);
23441edb306SCy Schubert 			PAUSE();
23541edb306SCy Schubert 		}
23641edb306SCy Schubert 		putchar('\n');
23741edb306SCy Schubert 		ip->ip_len = len;
23841edb306SCy Schubert 		printf("1.6.1 ip_len > packet size (size--, short packets)\n");
23941edb306SCy Schubert 		for (i = len; i > 0; i--) {
24041edb306SCy Schubert 			ip->ip_id = htons(id++);
24141edb306SCy Schubert 			ip->ip_sum = 0;
24241edb306SCy Schubert 			ip->ip_sum = chksum((u_short *)ip, IP_HL(ip) << 2);
24341edb306SCy Schubert 			(void) send_ether(nfd, (char *)ip, i, gwip);
24441edb306SCy Schubert 			printf("%d\r", i);
24541edb306SCy Schubert 			fflush(stdout);
24641edb306SCy Schubert 			PAUSE();
24741edb306SCy Schubert 		}
24841edb306SCy Schubert 		putchar('\n');
24941edb306SCy Schubert 	}
25041edb306SCy Schubert 
25141edb306SCy Schubert 	if (!ptest || (ptest == 7)) {
25241edb306SCy Schubert 		/*
25341edb306SCy Schubert 		 * Part7: 0 length fragment
25441edb306SCy Schubert 		 */
25541edb306SCy Schubert 		printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n");
25641edb306SCy Schubert 		ip->ip_id = 0;
25741edb306SCy Schubert 		ip->ip_len = sizeof(*ip);
25841edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
25941edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
26041edb306SCy Schubert 		fflush(stdout);
26141edb306SCy Schubert 		PAUSE();
26241edb306SCy Schubert 
26341edb306SCy Schubert 		printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n");
26441edb306SCy Schubert 		ip->ip_id = 0;
26541edb306SCy Schubert 		ip->ip_len = sizeof(*ip);
26641edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
26741edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
26841edb306SCy Schubert 		fflush(stdout);
26941edb306SCy Schubert 		PAUSE();
27041edb306SCy Schubert 
27141edb306SCy Schubert 		printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n");
27241edb306SCy Schubert 		ip->ip_id = 0;
27341edb306SCy Schubert 		ip->ip_len = sizeof(*ip);
27441edb306SCy Schubert 		ip->ip_off = htons(0xa000);
27541edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
27641edb306SCy Schubert 		fflush(stdout);
27741edb306SCy Schubert 		PAUSE();
27841edb306SCy Schubert 
27941edb306SCy Schubert 		printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n");
28041edb306SCy Schubert 		ip->ip_id = 0;
28141edb306SCy Schubert 		ip->ip_len = sizeof(*ip);
28241edb306SCy Schubert 		ip->ip_off = htons(0x0100);
28341edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
28441edb306SCy Schubert 		fflush(stdout);
28541edb306SCy Schubert 		PAUSE();
28641edb306SCy Schubert 	}
28741edb306SCy Schubert 
28841edb306SCy Schubert 	if (!ptest || (ptest == 8)) {
28941edb306SCy Schubert 		struct	timeval	tv;
29041edb306SCy Schubert 
29141edb306SCy Schubert 		gettimeofday(&tv, NULL);
29241edb306SCy Schubert 		srand(tv.tv_sec ^ getpid() ^ tv.tv_usec);
29341edb306SCy Schubert 		/*
29441edb306SCy Schubert 		 * Part8.1: 63k packet + 1k fragment at offset 0x1ffe
29541edb306SCy Schubert 		 * Mark it as being ICMP (so it doesn't get junked), but
29641edb306SCy Schubert 		 * don't bother about the ICMP header, we're not worrying
29741edb306SCy Schubert 		 * about that here.
29841edb306SCy Schubert 		 */
29941edb306SCy Schubert 		ip->ip_p = IPPROTO_ICMP;
30041edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
30141edb306SCy Schubert 		u->uh_dport = htons(9);
30241edb306SCy Schubert 		ip->ip_id = htons(id++);
30341edb306SCy Schubert 		printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n");
30441edb306SCy Schubert 		ip->ip_len = 768 + 20 + 8;
30541edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
30641edb306SCy Schubert 		printf("%d\r", i);
30741edb306SCy Schubert 
30841edb306SCy Schubert 		ip->ip_len = MIN(768 + 20, mtu - 68);
30941edb306SCy Schubert 		i = 512;
31041edb306SCy Schubert 		for (; i < (63 * 1024 + 768); i += 768) {
31141edb306SCy Schubert 			ip->ip_off = htons(IP_MF | (i >> 3));
31241edb306SCy Schubert 			(void) send_ip(nfd, mtu, ip, gwip, 1);
31341edb306SCy Schubert 			printf("%d\r", i);
31441edb306SCy Schubert 			fflush(stdout);
31541edb306SCy Schubert 			PAUSE();
31641edb306SCy Schubert 		}
31741edb306SCy Schubert 		ip->ip_len = 896 + 20;
31841edb306SCy Schubert 		ip->ip_off = htons(i >> 3);
31941edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
32041edb306SCy Schubert 		printf("%d\r", i);
32141edb306SCy Schubert 		putchar('\n');
32241edb306SCy Schubert 		fflush(stdout);
32341edb306SCy Schubert 
32441edb306SCy Schubert 		/*
32541edb306SCy Schubert 		 * Part8.2: 63k packet + 1k fragment at offset 0x1ffe
32641edb306SCy Schubert 		 * Mark it as being ICMP (so it doesn't get junked), but
32741edb306SCy Schubert 		 * don't bother about the ICMP header, we're not worrying
32841edb306SCy Schubert 		 * about that here.  (Lossage here)
32941edb306SCy Schubert 		 */
33041edb306SCy Schubert 		ip->ip_p = IPPROTO_ICMP;
33141edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
33241edb306SCy Schubert 		u->uh_dport = htons(9);
33341edb306SCy Schubert 		ip->ip_id = htons(id++);
33441edb306SCy Schubert 		printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n");
33541edb306SCy Schubert 		ip->ip_len = 768 + 20 + 8;
33641edb306SCy Schubert 		if ((rand() & 0x1f) != 0) {
33741edb306SCy Schubert 			(void) send_ip(nfd, mtu, ip, gwip, 1);
33841edb306SCy Schubert 			printf("%d\r", i);
33941edb306SCy Schubert 		} else
34041edb306SCy Schubert 			printf("skip 0\n");
34141edb306SCy Schubert 
34241edb306SCy Schubert 		ip->ip_len = MIN(768 + 20, mtu - 68);
34341edb306SCy Schubert 		i = 512;
34441edb306SCy Schubert 		for (; i < (63 * 1024 + 768); i += 768) {
34541edb306SCy Schubert 			ip->ip_off = htons(IP_MF | (i >> 3));
34641edb306SCy Schubert 			if ((rand() & 0x1f) != 0) {
34741edb306SCy Schubert 				(void) send_ip(nfd, mtu, ip, gwip, 1);
34841edb306SCy Schubert 				printf("%d\r", i);
34941edb306SCy Schubert 			} else
35041edb306SCy Schubert 				printf("skip %d\n", i);
35141edb306SCy Schubert 			fflush(stdout);
35241edb306SCy Schubert 			PAUSE();
35341edb306SCy Schubert 		}
35441edb306SCy Schubert 		ip->ip_len = 896 + 20;
35541edb306SCy Schubert 		ip->ip_off = htons(i >> 3);
35641edb306SCy Schubert 		if ((rand() & 0x1f) != 0) {
35741edb306SCy Schubert 			(void) send_ip(nfd, mtu, ip, gwip, 1);
35841edb306SCy Schubert 			printf("%d\r", i);
35941edb306SCy Schubert 		} else
36041edb306SCy Schubert 			printf("skip\n");
36141edb306SCy Schubert 		putchar('\n');
36241edb306SCy Schubert 		fflush(stdout);
36341edb306SCy Schubert 
36441edb306SCy Schubert 		/*
36541edb306SCy Schubert 		 * Part8.3: 33k packet - test for not dealing with -ve length
36641edb306SCy Schubert 		 * Mark it as being ICMP (so it doesn't get junked), but
36741edb306SCy Schubert 		 * don't bother about the ICMP header, we're not worrying
36841edb306SCy Schubert 		 * about that here.
36941edb306SCy Schubert 		 */
37041edb306SCy Schubert 		ip->ip_p = IPPROTO_ICMP;
37141edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
37241edb306SCy Schubert 		u->uh_dport = htons(9);
37341edb306SCy Schubert 		ip->ip_id = htons(id++);
37441edb306SCy Schubert 		printf("1.8.3 33k packet\n");
37541edb306SCy Schubert 		ip->ip_len = 768 + 20 + 8;
37641edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
37741edb306SCy Schubert 		printf("%d\r", i);
37841edb306SCy Schubert 
37941edb306SCy Schubert 		ip->ip_len = MIN(768 + 20, mtu - 68);
38041edb306SCy Schubert 		i = 512;
38141edb306SCy Schubert 		for (; i < (32 * 1024 + 768); i += 768) {
38241edb306SCy Schubert 			ip->ip_off = htons(IP_MF | (i >> 3));
38341edb306SCy Schubert 			(void) send_ip(nfd, mtu, ip, gwip, 1);
38441edb306SCy Schubert 			printf("%d\r", i);
38541edb306SCy Schubert 			fflush(stdout);
38641edb306SCy Schubert 			PAUSE();
38741edb306SCy Schubert 		}
38841edb306SCy Schubert 		ip->ip_len = 896 + 20;
38941edb306SCy Schubert 		ip->ip_off = htons(i >> 3);
39041edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
39141edb306SCy Schubert 		printf("%d\r", i);
39241edb306SCy Schubert 		putchar('\n');
39341edb306SCy Schubert 		fflush(stdout);
39441edb306SCy Schubert 	}
39541edb306SCy Schubert 
39641edb306SCy Schubert 	ip->ip_len = len;
39741edb306SCy Schubert 	ip->ip_off = 0;
39841edb306SCy Schubert 	if (!ptest || (ptest == 9)) {
39941edb306SCy Schubert 		/*
40041edb306SCy Schubert 		 * Part9: off & 0x8000 == 0x8000
40141edb306SCy Schubert 		 */
40241edb306SCy Schubert 		ip->ip_id = 0;
40341edb306SCy Schubert 		ip->ip_off = htons(0x8000);
40441edb306SCy Schubert 		printf("1.9. ip_off & 0x8000 == 0x8000\n");
40541edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
40641edb306SCy Schubert 		fflush(stdout);
40741edb306SCy Schubert 		PAUSE();
40841edb306SCy Schubert 	}
40941edb306SCy Schubert 
41041edb306SCy Schubert 	ip->ip_off = 0;
41141edb306SCy Schubert 
41241edb306SCy Schubert 	if (!ptest || (ptest == 10)) {
41341edb306SCy Schubert 		/*
41441edb306SCy Schubert 		 * Part10: ttl = 255
41541edb306SCy Schubert 		 */
41641edb306SCy Schubert 		ip->ip_id = 0;
41741edb306SCy Schubert 		ip->ip_ttl = 255;
41841edb306SCy Schubert 		printf("1.10.0 ip_ttl = 255\n");
41941edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
42041edb306SCy Schubert 		fflush(stdout);
42141edb306SCy Schubert 		PAUSE();
42241edb306SCy Schubert 
42341edb306SCy Schubert 		ip->ip_ttl = 128;
42441edb306SCy Schubert 		printf("1.10.1 ip_ttl = 128\n");
42541edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
42641edb306SCy Schubert 		fflush(stdout);
42741edb306SCy Schubert 		PAUSE();
42841edb306SCy Schubert 
42941edb306SCy Schubert 		ip->ip_ttl = 0;
43041edb306SCy Schubert 		printf("1.10.2 ip_ttl = 0\n");
43141edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
43241edb306SCy Schubert 		fflush(stdout);
43341edb306SCy Schubert 		PAUSE();
43441edb306SCy Schubert 	}
43541edb306SCy Schubert 
43641edb306SCy Schubert 	(void) close(nfd);
43741edb306SCy Schubert }
43841edb306SCy Schubert 
43941edb306SCy Schubert 
ip_test2(dev,mtu,ip,gwip,ptest)44041edb306SCy Schubert void	ip_test2(dev, mtu, ip, gwip, ptest)
44141edb306SCy Schubert 	char	*dev;
44241edb306SCy Schubert 	int	mtu;
44341edb306SCy Schubert 	ip_t	*ip;
44441edb306SCy Schubert 	struct	in_addr	gwip;
44541edb306SCy Schubert 	int	ptest;
44641edb306SCy Schubert {
44741edb306SCy Schubert #ifdef USE_NANOSLEEP
44841edb306SCy Schubert 	struct	timespec ts;
44941edb306SCy Schubert #else
45041edb306SCy Schubert 	struct	timeval	tv;
45141edb306SCy Schubert #endif
45241edb306SCy Schubert 	int	nfd;
45341edb306SCy Schubert 	u_char	*s;
45441edb306SCy Schubert 
45541edb306SCy Schubert 
45641edb306SCy Schubert 	nfd = initdevice(dev, 1);
45741edb306SCy Schubert 	if (nfd == -1)
45841edb306SCy Schubert 		return;
45941edb306SCy Schubert 
46041edb306SCy Schubert 	IP_HL_A(ip, 6);
46141edb306SCy Schubert 	ip->ip_len = IP_HL(ip) << 2;
46241edb306SCy Schubert 	s = (u_char *)(ip + 1);
46341edb306SCy Schubert 	s[IPOPT_OPTVAL] = IPOPT_NOP;
46441edb306SCy Schubert 	s++;
46541edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
46641edb306SCy Schubert 		/*
46741edb306SCy Schubert 		 * Test 1: option length > packet length,
46841edb306SCy Schubert 		 *                header length == packet length
46941edb306SCy Schubert 		 */
47041edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_TS;
47141edb306SCy Schubert 		s[IPOPT_OLEN] = 4;
47241edb306SCy Schubert 		s[IPOPT_OFFSET] = IPOPT_MINOFF;
47341edb306SCy Schubert 		ip->ip_p = IPPROTO_IP;
47441edb306SCy Schubert 		printf("2.1 option length > packet length\n");
47541edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
47641edb306SCy Schubert 		fflush(stdout);
47741edb306SCy Schubert 		PAUSE();
47841edb306SCy Schubert 	}
47941edb306SCy Schubert 
48041edb306SCy Schubert 	IP_HL_A(ip, 7);
48141edb306SCy Schubert 	ip->ip_len = IP_HL(ip) << 2;
48241edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
48341edb306SCy Schubert 		/*
48441edb306SCy Schubert 		 * Test 2: options have length = 0
48541edb306SCy Schubert 		 */
48641edb306SCy Schubert 		printf("2.2.1 option length = 0, RR\n");
48741edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_RR;
48841edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
48941edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
49041edb306SCy Schubert 		fflush(stdout);
49141edb306SCy Schubert 		PAUSE();
49241edb306SCy Schubert 
49341edb306SCy Schubert 		printf("2.2.2 option length = 0, TS\n");
49441edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_TS;
49541edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
49641edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
49741edb306SCy Schubert 		fflush(stdout);
49841edb306SCy Schubert 		PAUSE();
49941edb306SCy Schubert 
50041edb306SCy Schubert 		printf("2.2.3 option length = 0, SECURITY\n");
50141edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_SECURITY;
50241edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
50341edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
50441edb306SCy Schubert 		fflush(stdout);
50541edb306SCy Schubert 		PAUSE();
50641edb306SCy Schubert 
50741edb306SCy Schubert 		printf("2.2.4 option length = 0, LSRR\n");
50841edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_LSRR;
50941edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
51041edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
51141edb306SCy Schubert 		fflush(stdout);
51241edb306SCy Schubert 		PAUSE();
51341edb306SCy Schubert 
51441edb306SCy Schubert 		printf("2.2.5 option length = 0, SATID\n");
51541edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_SATID;
51641edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
51741edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
51841edb306SCy Schubert 		fflush(stdout);
51941edb306SCy Schubert 		PAUSE();
52041edb306SCy Schubert 
52141edb306SCy Schubert 		printf("2.2.6 option length = 0, SSRR\n");
52241edb306SCy Schubert 		s[IPOPT_OPTVAL] = IPOPT_SSRR;
52341edb306SCy Schubert 		s[IPOPT_OLEN] = 0;
52441edb306SCy Schubert 		(void) send_ip(nfd, mtu, ip, gwip, 1);
52541edb306SCy Schubert 		fflush(stdout);
52641edb306SCy Schubert 		PAUSE();
52741edb306SCy Schubert 	}
52841edb306SCy Schubert 
52941edb306SCy Schubert 	(void) close(nfd);
53041edb306SCy Schubert }
53141edb306SCy Schubert 
53241edb306SCy Schubert 
53341edb306SCy Schubert /*
53441edb306SCy Schubert  * test 3 (ICMP)
53541edb306SCy Schubert  */
536*efeb8bffSCy Schubert void
ip_test3(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)537*efeb8bffSCy Schubert ip_test3(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
53841edb306SCy Schubert {
53941edb306SCy Schubert 	static	int	ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 };
54041edb306SCy Schubert 	static	int	ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 };
54141edb306SCy Schubert #ifdef USE_NANOSLEEP
54241edb306SCy Schubert 	struct	timespec ts;
54341edb306SCy Schubert #else
54441edb306SCy Schubert 	struct	timeval	tv;
54541edb306SCy Schubert #endif
54641edb306SCy Schubert 	struct	icmp	*icp;
54741edb306SCy Schubert 	int	nfd, i;
54841edb306SCy Schubert 
54941edb306SCy Schubert 	IP_HL_A(ip, sizeof(*ip) >> 2);
55041edb306SCy Schubert 	IP_V_A(ip, IPVERSION);
55141edb306SCy Schubert 	ip->ip_tos = 0;
55241edb306SCy Schubert 	ip->ip_off = 0;
55341edb306SCy Schubert 	ip->ip_ttl = 60;
55441edb306SCy Schubert 	ip->ip_p = IPPROTO_ICMP;
55541edb306SCy Schubert 	ip->ip_sum = 0;
55641edb306SCy Schubert 	ip->ip_len = sizeof(*ip) + sizeof(*icp);
55741edb306SCy Schubert 	icp = (struct icmp *)((char *)ip + (IP_HL(ip) << 2));
55841edb306SCy Schubert 
55941edb306SCy Schubert 	nfd = initdevice(dev, 1);
56041edb306SCy Schubert 	if (nfd == -1)
56141edb306SCy Schubert 		return;
56241edb306SCy Schubert 
56341edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
56441edb306SCy Schubert 		/*
56541edb306SCy Schubert 		 * Type 0 - 31, 255, code = 0
56641edb306SCy Schubert 		 */
56741edb306SCy Schubert 		bzero((char *)icp, sizeof(*icp));
56841edb306SCy Schubert 		for (i = 0; i < 32; i++) {
56941edb306SCy Schubert 			icp->icmp_type = i;
57041edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
57141edb306SCy Schubert 			PAUSE();
57241edb306SCy Schubert 			printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i);
57341edb306SCy Schubert 		}
57441edb306SCy Schubert 		icp->icmp_type = 255;
57541edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
57641edb306SCy Schubert 		PAUSE();
57741edb306SCy Schubert 		printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255);
57841edb306SCy Schubert 		putchar('\n');
57941edb306SCy Schubert 	}
58041edb306SCy Schubert 
58141edb306SCy Schubert 	if (!ptest || (ptest == 2)) {
58241edb306SCy Schubert 		/*
58341edb306SCy Schubert 		 * Type 3, code = 0 - 31
58441edb306SCy Schubert 		 */
58541edb306SCy Schubert 		icp->icmp_type = 3;
58641edb306SCy Schubert 		for (i = 0; i < 32; i++) {
58741edb306SCy Schubert 			icp->icmp_code = i;
58841edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
58941edb306SCy Schubert 			PAUSE();
59041edb306SCy Schubert 			printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i);
59141edb306SCy Schubert 		}
59241edb306SCy Schubert 	}
59341edb306SCy Schubert 
59441edb306SCy Schubert 	if (!ptest || (ptest == 3)) {
59541edb306SCy Schubert 		/*
59641edb306SCy Schubert 		 * Type 4, code = 0,127,128,255
59741edb306SCy Schubert 		 */
59841edb306SCy Schubert 		icp->icmp_type = 4;
59941edb306SCy Schubert 		icp->icmp_code = 0;
60041edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
60141edb306SCy Schubert 		PAUSE();
60241edb306SCy Schubert 		printf("3.3.1 ICMP type 4 code 0 (all 0's)\r");
60341edb306SCy Schubert 		icp->icmp_code = 127;
60441edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
60541edb306SCy Schubert 		PAUSE();
60641edb306SCy Schubert 		printf("3.3.2 ICMP type 4 code 127 (all 0's)\r");
60741edb306SCy Schubert 		icp->icmp_code = 128;
60841edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
60941edb306SCy Schubert 		PAUSE();
61041edb306SCy Schubert 		printf("3.3.3 ICMP type 4 code 128 (all 0's)\r");
61141edb306SCy Schubert 		icp->icmp_code = 255;
61241edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
61341edb306SCy Schubert 		PAUSE();
61441edb306SCy Schubert 		printf("3.3.4 ICMP type 4 code 255 (all 0's)\r");
61541edb306SCy Schubert 	}
61641edb306SCy Schubert 
61741edb306SCy Schubert 	if (!ptest || (ptest == 4)) {
61841edb306SCy Schubert 		/*
61941edb306SCy Schubert 		 * Type 5, code = 0,127,128,255
62041edb306SCy Schubert 		 */
62141edb306SCy Schubert 		icp->icmp_type = 5;
62241edb306SCy Schubert 		icp->icmp_code = 0;
62341edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
62441edb306SCy Schubert 		PAUSE();
62541edb306SCy Schubert 		printf("3.4.1 ICMP type 5 code 0 (all 0's)\r");
62641edb306SCy Schubert 		icp->icmp_code = 127;
62741edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
62841edb306SCy Schubert 		PAUSE();
62941edb306SCy Schubert 		printf("3.4.2 ICMP type 5 code 127 (all 0's)\r");
63041edb306SCy Schubert 		icp->icmp_code = 128;
63141edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
63241edb306SCy Schubert 		PAUSE();
63341edb306SCy Schubert 		printf("3.4.3 ICMP type 5 code 128 (all 0's)\r");
63441edb306SCy Schubert 		icp->icmp_code = 255;
63541edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
63641edb306SCy Schubert 		PAUSE();
63741edb306SCy Schubert 		printf("3.4.4 ICMP type 5 code 255 (all 0's)\r");
63841edb306SCy Schubert 	}
63941edb306SCy Schubert 
64041edb306SCy Schubert 	if (!ptest || (ptest == 5)) {
64141edb306SCy Schubert 		/*
64241edb306SCy Schubert 		 * Type 8-10;13-18, code - 0,127,128,255
64341edb306SCy Schubert 		 */
64441edb306SCy Schubert 		for (i = 0; ict1[i]; i++) {
64541edb306SCy Schubert 			icp->icmp_type = ict1[i];
64641edb306SCy Schubert 			icp->icmp_code = 0;
64741edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
64841edb306SCy Schubert 			PAUSE();
64941edb306SCy Schubert 			printf("3.5.%d ICMP type 5 code 0 (all 0's)\r",
65041edb306SCy Schubert 				i * 4);
65141edb306SCy Schubert 			icp->icmp_code = 127;
65241edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
65341edb306SCy Schubert 			PAUSE();
65441edb306SCy Schubert 			printf("3.5.%d ICMP type 5 code 127 (all 0's)\r",
65541edb306SCy Schubert 				i * 4 + 1);
65641edb306SCy Schubert 			icp->icmp_code = 128;
65741edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
65841edb306SCy Schubert 			PAUSE();
65941edb306SCy Schubert 			printf("3.5.%d ICMP type 5 code 128 (all 0's)\r",
66041edb306SCy Schubert 				i * 4 + 2);
66141edb306SCy Schubert 			icp->icmp_code = 255;
66241edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
66341edb306SCy Schubert 			PAUSE();
66441edb306SCy Schubert 			printf("3.5.%d ICMP type 5 code 255 (all 0's)\r",
66541edb306SCy Schubert 				i * 4 + 3);
66641edb306SCy Schubert 		}
66741edb306SCy Schubert 		putchar('\n');
66841edb306SCy Schubert 	}
66941edb306SCy Schubert 
67041edb306SCy Schubert 	if (!ptest || (ptest == 6)) {
67141edb306SCy Schubert 		/*
67241edb306SCy Schubert 		 * Type 12, code - 0,127,128,129,255
67341edb306SCy Schubert 		 */
67441edb306SCy Schubert 		icp->icmp_type = 12;
67541edb306SCy Schubert 		icp->icmp_code = 0;
67641edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
67741edb306SCy Schubert 		PAUSE();
67841edb306SCy Schubert 		printf("3.6.1 ICMP type 12 code 0 (all 0's)\r");
67941edb306SCy Schubert 		icp->icmp_code = 127;
68041edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
68141edb306SCy Schubert 		PAUSE();
68241edb306SCy Schubert 		printf("3.6.2 ICMP type 12 code 127 (all 0's)\r");
68341edb306SCy Schubert 		icp->icmp_code = 128;
68441edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
68541edb306SCy Schubert 		PAUSE();
68641edb306SCy Schubert 		printf("3.6.3 ICMP type 12 code 128 (all 0's)\r");
68741edb306SCy Schubert 		icp->icmp_code = 129;
68841edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
68941edb306SCy Schubert 		PAUSE();
69041edb306SCy Schubert 		printf("3.6.4 ICMP type 12 code 129 (all 0's)\r");
69141edb306SCy Schubert 		icp->icmp_code = 255;
69241edb306SCy Schubert 		(void) send_icmp(nfd, mtu, ip, gwip);
69341edb306SCy Schubert 		PAUSE();
69441edb306SCy Schubert 		printf("3.6.5 ICMP type 12 code 255 (all 0's)\r");
69541edb306SCy Schubert 		putchar('\n');
69641edb306SCy Schubert 	}
69741edb306SCy Schubert 
69841edb306SCy Schubert 	if (!ptest || (ptest == 7)) {
69941edb306SCy Schubert 		/*
70041edb306SCy Schubert 		 * Type 3;9-10;13-14;17-18 - shorter packets
70141edb306SCy Schubert 		 */
70241edb306SCy Schubert 		ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2;
70341edb306SCy Schubert 		for (i = 0; ict2[i]; i++) {
70441edb306SCy Schubert 			icp->icmp_type = ict1[i];
70541edb306SCy Schubert 			icp->icmp_code = 0;
70641edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
70741edb306SCy Schubert 			PAUSE();
70841edb306SCy Schubert 			printf("3.5.%d ICMP type %d code 0 (all 0's)\r",
70941edb306SCy Schubert 				i * 4, icp->icmp_type);
71041edb306SCy Schubert 			icp->icmp_code = 127;
71141edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
71241edb306SCy Schubert 			PAUSE();
71341edb306SCy Schubert 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
71441edb306SCy Schubert 				i * 4 + 1, icp->icmp_type);
71541edb306SCy Schubert 			icp->icmp_code = 128;
71641edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
71741edb306SCy Schubert 			PAUSE();
71841edb306SCy Schubert 			printf("3.5.%d ICMP type %d code 128 (all 0's)\r",
71941edb306SCy Schubert 				i * 4 + 2, icp->icmp_type);
72041edb306SCy Schubert 			icp->icmp_code = 255;
72141edb306SCy Schubert 			(void) send_icmp(nfd, mtu, ip, gwip);
72241edb306SCy Schubert 			PAUSE();
72341edb306SCy Schubert 			printf("3.5.%d ICMP type %d code 127 (all 0's)\r",
72441edb306SCy Schubert 				i * 4 + 3, icp->icmp_type);
72541edb306SCy Schubert 		}
72641edb306SCy Schubert 		putchar('\n');
72741edb306SCy Schubert 	}
72841edb306SCy Schubert }
72941edb306SCy Schubert 
73041edb306SCy Schubert 
73141edb306SCy Schubert /* Perform test 4 (UDP) */
73241edb306SCy Schubert 
733*efeb8bffSCy Schubert void
ip_test4(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)734*efeb8bffSCy Schubert ip_test4(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
73541edb306SCy Schubert {
73641edb306SCy Schubert #ifdef USE_NANOSLEEP
73741edb306SCy Schubert 	struct	timespec ts;
73841edb306SCy Schubert #else
73941edb306SCy Schubert 	struct	timeval	tv;
74041edb306SCy Schubert #endif
74141edb306SCy Schubert 	udphdr_t	*u;
74241edb306SCy Schubert 	int	nfd, i;
74341edb306SCy Schubert 
74441edb306SCy Schubert 
74541edb306SCy Schubert 	IP_HL_A(ip, sizeof(*ip) >> 2);
74641edb306SCy Schubert 	IP_V_A(ip, IPVERSION);
74741edb306SCy Schubert 	ip->ip_tos = 0;
74841edb306SCy Schubert 	ip->ip_off = 0;
74941edb306SCy Schubert 	ip->ip_ttl = 60;
75041edb306SCy Schubert 	ip->ip_p = IPPROTO_UDP;
75141edb306SCy Schubert 	ip->ip_sum = 0;
75241edb306SCy Schubert 	u = (udphdr_t *)((char *)ip + (IP_HL(ip) << 2));
75341edb306SCy Schubert 	u->uh_sport = htons(1);
75441edb306SCy Schubert 	u->uh_dport = htons(1);
75541edb306SCy Schubert 	u->uh_ulen = htons(sizeof(*u) + 4);
75641edb306SCy Schubert 
75741edb306SCy Schubert 	nfd = initdevice(dev, 1);
75841edb306SCy Schubert 	if (nfd == -1)
75941edb306SCy Schubert 		return;
76041edb306SCy Schubert 
76141edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
76241edb306SCy Schubert 		/*
76341edb306SCy Schubert 		 * Test 1. ulen > packet
76441edb306SCy Schubert 		 */
76541edb306SCy Schubert 		u->uh_ulen = htons(sizeof(*u) + 4);
76641edb306SCy Schubert 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
76741edb306SCy Schubert 		printf("4.1 UDP uh_ulen > packet size - short packets\n");
76841edb306SCy Schubert 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
76941edb306SCy Schubert 			u->uh_ulen = htons(i);
77041edb306SCy Schubert 			(void) send_udp(nfd, 1500, ip, gwip);
77141edb306SCy Schubert 			printf("%d\r", i);
77241edb306SCy Schubert 			fflush(stdout);
77341edb306SCy Schubert 			PAUSE();
77441edb306SCy Schubert 		}
77541edb306SCy Schubert 		putchar('\n');
77641edb306SCy Schubert 	}
77741edb306SCy Schubert 
77841edb306SCy Schubert 	if (!ptest || (ptest == 2)) {
77941edb306SCy Schubert 		/*
78041edb306SCy Schubert 		 * Test 2. ulen < packet
78141edb306SCy Schubert 		 */
78241edb306SCy Schubert 		u->uh_ulen = htons(sizeof(*u) + 4);
78341edb306SCy Schubert 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
78441edb306SCy Schubert 		printf("4.2 UDP uh_ulen < packet size - short packets\n");
78541edb306SCy Schubert 		for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) {
78641edb306SCy Schubert 			ip->ip_len = i;
78741edb306SCy Schubert 			(void) send_udp(nfd, 1500, ip, gwip);
78841edb306SCy Schubert 			printf("%d\r", i);
78941edb306SCy Schubert 			fflush(stdout);
79041edb306SCy Schubert 			PAUSE();
79141edb306SCy Schubert 		}
79241edb306SCy Schubert 		putchar('\n');
79341edb306SCy Schubert 	}
79441edb306SCy Schubert 
79541edb306SCy Schubert 	if (!ptest || (ptest == 3)) {
79641edb306SCy Schubert 		/*
79741edb306SCy Schubert 		 * Test 3: sport = 0, sport = 1, sport = 32767
79841edb306SCy Schubert 		 *         sport = 32768, sport = 65535
79941edb306SCy Schubert 		 */
80041edb306SCy Schubert 		u->uh_ulen = sizeof(*u) + 4;
80141edb306SCy Schubert 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
80241edb306SCy Schubert 		printf("4.3.1 UDP sport = 0\n");
80341edb306SCy Schubert 		u->uh_sport = 0;
80441edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
80541edb306SCy Schubert 		printf("0\n");
80641edb306SCy Schubert 		fflush(stdout);
80741edb306SCy Schubert 		PAUSE();
80841edb306SCy Schubert 		printf("4.3.2 UDP sport = 1\n");
80941edb306SCy Schubert 		u->uh_sport = htons(1);
81041edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
81141edb306SCy Schubert 		printf("1\n");
81241edb306SCy Schubert 		fflush(stdout);
81341edb306SCy Schubert 		PAUSE();
81441edb306SCy Schubert 		printf("4.3.3 UDP sport = 32767\n");
81541edb306SCy Schubert 		u->uh_sport = htons(32767);
81641edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
81741edb306SCy Schubert 		printf("32767\n");
81841edb306SCy Schubert 		fflush(stdout);
81941edb306SCy Schubert 		PAUSE();
82041edb306SCy Schubert 		printf("4.3.4 UDP sport = 32768\n");
82141edb306SCy Schubert 		u->uh_sport = htons(32768);
82241edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
82341edb306SCy Schubert 		printf("32768\n");
82441edb306SCy Schubert 		putchar('\n');
82541edb306SCy Schubert 		fflush(stdout);
82641edb306SCy Schubert 		PAUSE();
82741edb306SCy Schubert 		printf("4.3.5 UDP sport = 65535\n");
82841edb306SCy Schubert 		u->uh_sport = htons(65535);
82941edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
83041edb306SCy Schubert 		printf("65535\n");
83141edb306SCy Schubert 		fflush(stdout);
83241edb306SCy Schubert 		PAUSE();
83341edb306SCy Schubert 	}
83441edb306SCy Schubert 
83541edb306SCy Schubert 	if (!ptest || (ptest == 4)) {
83641edb306SCy Schubert 		/*
83741edb306SCy Schubert 		 * Test 4: dport = 0, dport = 1, dport = 32767
83841edb306SCy Schubert 		 *         dport = 32768, dport = 65535
83941edb306SCy Schubert 		 */
84041edb306SCy Schubert 		u->uh_ulen = ntohs(sizeof(*u) + 4);
84141edb306SCy Schubert 		u->uh_sport = htons(1);
84241edb306SCy Schubert 		ip->ip_len = (IP_HL(ip) << 2) + ntohs(u->uh_ulen);
84341edb306SCy Schubert 		printf("4.4.1 UDP dport = 0\n");
84441edb306SCy Schubert 		u->uh_dport = 0;
84541edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
84641edb306SCy Schubert 		printf("0\n");
84741edb306SCy Schubert 		fflush(stdout);
84841edb306SCy Schubert 		PAUSE();
84941edb306SCy Schubert 		printf("4.4.2 UDP dport = 1\n");
85041edb306SCy Schubert 		u->uh_dport = htons(1);
85141edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
85241edb306SCy Schubert 		printf("1\n");
85341edb306SCy Schubert 		fflush(stdout);
85441edb306SCy Schubert 		PAUSE();
85541edb306SCy Schubert 		printf("4.4.3 UDP dport = 32767\n");
85641edb306SCy Schubert 		u->uh_dport = htons(32767);
85741edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
85841edb306SCy Schubert 		printf("32767\n");
85941edb306SCy Schubert 		fflush(stdout);
86041edb306SCy Schubert 		PAUSE();
86141edb306SCy Schubert 		printf("4.4.4 UDP dport = 32768\n");
86241edb306SCy Schubert 		u->uh_dport = htons(32768);
86341edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
86441edb306SCy Schubert 		printf("32768\n");
86541edb306SCy Schubert 		fflush(stdout);
86641edb306SCy Schubert 		PAUSE();
86741edb306SCy Schubert 		printf("4.4.5 UDP dport = 65535\n");
86841edb306SCy Schubert 		u->uh_dport = htons(65535);
86941edb306SCy Schubert 		(void) send_udp(nfd, 1500, ip, gwip);
87041edb306SCy Schubert 		printf("65535\n");
87141edb306SCy Schubert 		fflush(stdout);
87241edb306SCy Schubert 		PAUSE();
87341edb306SCy Schubert 	}
87441edb306SCy Schubert 
87541edb306SCy Schubert 	if (!ptest || (ptest == 5)) {
87641edb306SCy Schubert 		/*
87741edb306SCy Schubert 		 * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) +
87841edb306SCy Schubert 		 * sizeof(ip_t)
87941edb306SCy Schubert 		 */
88041edb306SCy Schubert 		printf("4.5 UDP 20 <= MTU <= 32\n");
88141edb306SCy Schubert 		for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) {
88241edb306SCy Schubert 			(void) send_udp(nfd, i, ip, gwip);
88341edb306SCy Schubert 			printf("%d\r", i);
88441edb306SCy Schubert 			fflush(stdout);
88541edb306SCy Schubert 			PAUSE();
88641edb306SCy Schubert 		}
88741edb306SCy Schubert 		putchar('\n');
88841edb306SCy Schubert 	}
88941edb306SCy Schubert }
89041edb306SCy Schubert 
89141edb306SCy Schubert 
89241edb306SCy Schubert /* Perform test 5 (TCP) */
89341edb306SCy Schubert 
894*efeb8bffSCy Schubert void
ip_test5(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)895*efeb8bffSCy Schubert ip_test5(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
89641edb306SCy Schubert {
89741edb306SCy Schubert #ifdef USE_NANOSLEEP
89841edb306SCy Schubert 	struct	timespec ts;
89941edb306SCy Schubert #else
90041edb306SCy Schubert 	struct	timeval	tv;
90141edb306SCy Schubert #endif
90241edb306SCy Schubert 	tcphdr_t *t;
90341edb306SCy Schubert 	int	nfd, i;
90441edb306SCy Schubert 
90541edb306SCy Schubert 	t = (tcphdr_t *)((char *)ip + (IP_HL(ip) << 2));
90641edb306SCy Schubert 	t->th_x2 = 0;
90741edb306SCy Schubert 	TCP_OFF_A(t, 0);
90841edb306SCy Schubert 	t->th_sport = htons(1);
90941edb306SCy Schubert 	t->th_dport = htons(1);
91041edb306SCy Schubert 	t->th_win = htons(4096);
91141edb306SCy Schubert 	t->th_urp = 0;
91241edb306SCy Schubert 	t->th_sum = 0;
91341edb306SCy Schubert 	t->th_seq = htonl(1);
91441edb306SCy Schubert 	t->th_ack = 0;
91541edb306SCy Schubert 	ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
91641edb306SCy Schubert 
91741edb306SCy Schubert 	nfd = initdevice(dev, 1);
91841edb306SCy Schubert 	if (nfd == -1)
91941edb306SCy Schubert 		return;
92041edb306SCy Schubert 
92141edb306SCy Schubert 	if (!ptest || (ptest == 1)) {
92241edb306SCy Schubert 		/*
92341edb306SCy Schubert 		 * Test 1: flags variations, 0 - 3f
92441edb306SCy Schubert 		 */
92541edb306SCy Schubert 		TCP_OFF_A(t, sizeof(*t) >> 2);
92641edb306SCy Schubert 		printf("5.1 Test TCP flag combinations\n");
92741edb306SCy Schubert 		for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN);
92841edb306SCy Schubert 		     i++) {
92941edb306SCy Schubert 			t->th_flags = i;
93041edb306SCy Schubert 			(void) send_tcp(nfd, mtu, ip, gwip);
93141edb306SCy Schubert 			printf("%d\r", i);
93241edb306SCy Schubert 			fflush(stdout);
93341edb306SCy Schubert 			PAUSE();
93441edb306SCy Schubert 		}
93541edb306SCy Schubert 		putchar('\n');
93641edb306SCy Schubert 	}
93741edb306SCy Schubert 
93841edb306SCy Schubert 	if (!ptest || (ptest == 2)) {
93941edb306SCy Schubert 		t->th_flags = TH_SYN;
94041edb306SCy Schubert 		/*
94141edb306SCy Schubert 		 * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000,
94241edb306SCy Schubert 		 *         seq = 0xa000000, seq = 0xffffffff
94341edb306SCy Schubert 		 */
94441edb306SCy Schubert 		printf("5.2.1 TCP seq = 0\n");
94541edb306SCy Schubert 		t->th_seq = htonl(0);
94641edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
94741edb306SCy Schubert 		fflush(stdout);
94841edb306SCy Schubert 		PAUSE();
94941edb306SCy Schubert 
95041edb306SCy Schubert 		printf("5.2.2 TCP seq = 1\n");
95141edb306SCy Schubert 		t->th_seq = htonl(1);
95241edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
95341edb306SCy Schubert 		fflush(stdout);
95441edb306SCy Schubert 		PAUSE();
95541edb306SCy Schubert 
95641edb306SCy Schubert 		printf("5.2.3 TCP seq = 0x7fffffff\n");
95741edb306SCy Schubert 		t->th_seq = htonl(0x7fffffff);
95841edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
95941edb306SCy Schubert 		fflush(stdout);
96041edb306SCy Schubert 		PAUSE();
96141edb306SCy Schubert 
96241edb306SCy Schubert 		printf("5.2.4 TCP seq = 0x80000000\n");
96341edb306SCy Schubert 		t->th_seq = htonl(0x80000000);
96441edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
96541edb306SCy Schubert 		fflush(stdout);
96641edb306SCy Schubert 		PAUSE();
96741edb306SCy Schubert 
96841edb306SCy Schubert 		printf("5.2.5 TCP seq = 0xc0000000\n");
96941edb306SCy Schubert 		t->th_seq = htonl(0xc0000000);
97041edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
97141edb306SCy Schubert 		fflush(stdout);
97241edb306SCy Schubert 		PAUSE();
97341edb306SCy Schubert 
97441edb306SCy Schubert 		printf("5.2.6 TCP seq = 0xffffffff\n");
97541edb306SCy Schubert 		t->th_seq = htonl(0xffffffff);
97641edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
97741edb306SCy Schubert 		fflush(stdout);
97841edb306SCy Schubert 		PAUSE();
97941edb306SCy Schubert 	}
98041edb306SCy Schubert 
98141edb306SCy Schubert 	if (!ptest || (ptest == 3)) {
98241edb306SCy Schubert 		t->th_flags = TH_ACK;
98341edb306SCy Schubert 		/*
98441edb306SCy Schubert 		 * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000
98541edb306SCy Schubert 		 *         ack = 0xa000000, ack = 0xffffffff
98641edb306SCy Schubert 		 */
98741edb306SCy Schubert 		printf("5.3.1 TCP ack = 0\n");
98841edb306SCy Schubert 		t->th_ack = 0;
98941edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
99041edb306SCy Schubert 		fflush(stdout);
99141edb306SCy Schubert 		PAUSE();
99241edb306SCy Schubert 
99341edb306SCy Schubert 		printf("5.3.2 TCP ack = 1\n");
99441edb306SCy Schubert 		t->th_ack = htonl(1);
99541edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
99641edb306SCy Schubert 		fflush(stdout);
99741edb306SCy Schubert 		PAUSE();
99841edb306SCy Schubert 
99941edb306SCy Schubert 		printf("5.3.3 TCP ack = 0x7fffffff\n");
100041edb306SCy Schubert 		t->th_ack = htonl(0x7fffffff);
100141edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
100241edb306SCy Schubert 		fflush(stdout);
100341edb306SCy Schubert 		PAUSE();
100441edb306SCy Schubert 
100541edb306SCy Schubert 		printf("5.3.4 TCP ack = 0x80000000\n");
100641edb306SCy Schubert 		t->th_ack = htonl(0x80000000);
100741edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
100841edb306SCy Schubert 		fflush(stdout);
100941edb306SCy Schubert 		PAUSE();
101041edb306SCy Schubert 
101141edb306SCy Schubert 		printf("5.3.5 TCP ack = 0xc0000000\n");
101241edb306SCy Schubert 		t->th_ack = htonl(0xc0000000);
101341edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
101441edb306SCy Schubert 		fflush(stdout);
101541edb306SCy Schubert 		PAUSE();
101641edb306SCy Schubert 
101741edb306SCy Schubert 		printf("5.3.6 TCP ack = 0xffffffff\n");
101841edb306SCy Schubert 		t->th_ack = htonl(0xffffffff);
101941edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
102041edb306SCy Schubert 		fflush(stdout);
102141edb306SCy Schubert 		PAUSE();
102241edb306SCy Schubert 	}
102341edb306SCy Schubert 
102441edb306SCy Schubert 	if (!ptest || (ptest == 4)) {
102541edb306SCy Schubert 		t->th_flags = TH_SYN;
102641edb306SCy Schubert 		/*
102741edb306SCy Schubert 		 * Test 4: win = 0, win = 32768, win = 65535
102841edb306SCy Schubert 		 */
102941edb306SCy Schubert 		printf("5.4.1 TCP win = 0\n");
103041edb306SCy Schubert 		t->th_seq = htonl(0);
103141edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
103241edb306SCy Schubert 		fflush(stdout);
103341edb306SCy Schubert 		PAUSE();
103441edb306SCy Schubert 
103541edb306SCy Schubert 		printf("5.4.2 TCP win = 32768\n");
103641edb306SCy Schubert 		t->th_seq = htonl(0x7fff);
103741edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
103841edb306SCy Schubert 		fflush(stdout);
103941edb306SCy Schubert 		PAUSE();
104041edb306SCy Schubert 
104141edb306SCy Schubert 		printf("5.4.3 TCP win = 65535\n");
104241edb306SCy Schubert 		t->th_win = htons(0xffff);
104341edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
104441edb306SCy Schubert 		fflush(stdout);
104541edb306SCy Schubert 		PAUSE();
104641edb306SCy Schubert 	}
104741edb306SCy Schubert 
104841edb306SCy Schubert #if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \
104941edb306SCy Schubert     !defined(__sgi) && !defined(__hpux) && !defined(__osf__)
105041edb306SCy Schubert 	{
105141edb306SCy Schubert 	struct tcpcb *tcbp, tcb;
105241edb306SCy Schubert 	struct tcpiphdr ti;
105341edb306SCy Schubert 	struct sockaddr_in sin;
105441edb306SCy Schubert 	int fd;
105541edb306SCy Schubert 	socklen_t slen;
105641edb306SCy Schubert 
105741edb306SCy Schubert 	bzero((char *)&sin, sizeof(sin));
105841edb306SCy Schubert 
105941edb306SCy Schubert 	for (i = 1; i < 63; i++) {
106041edb306SCy Schubert 		fd = socket(AF_INET, SOCK_STREAM, 0);
106141edb306SCy Schubert 		bzero((char *)&sin, sizeof(sin));
106241edb306SCy Schubert 		sin.sin_addr.s_addr = ip->ip_dst.s_addr;
106341edb306SCy Schubert 		sin.sin_port = htons(i);
106441edb306SCy Schubert 		sin.sin_family = AF_INET;
106541edb306SCy Schubert 		if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
106641edb306SCy Schubert 			break;
106741edb306SCy Schubert 		close(fd);
106841edb306SCy Schubert 	}
106941edb306SCy Schubert 
107041edb306SCy Schubert 	if (i == 63) {
107141edb306SCy Schubert 		printf("Couldn't open a TCP socket between ports 1 and 63\n");
107241edb306SCy Schubert 		printf("to host %s for test 5 and 6 - skipping.\n",
107341edb306SCy Schubert 			inet_ntoa(ip->ip_dst));
107441edb306SCy Schubert 		goto skip_five_and_six;
107541edb306SCy Schubert 	}
107641edb306SCy Schubert 
107741edb306SCy Schubert 	bcopy((char *)ip, (char *)&ti, sizeof(*ip));
107841edb306SCy Schubert 	t->th_dport = htons(i);
107941edb306SCy Schubert 	slen = sizeof(sin);
108041edb306SCy Schubert 	if (!getsockname(fd, (struct sockaddr *)&sin, &slen))
108141edb306SCy Schubert 		t->th_sport = sin.sin_port;
108241edb306SCy Schubert 	if (!(tcbp = find_tcp(fd, &ti))) {
108341edb306SCy Schubert 		printf("Can't find PCB\n");
108441edb306SCy Schubert 		goto skip_five_and_six;
108541edb306SCy Schubert 	}
108641edb306SCy Schubert 	KMCPY(&tcb, tcbp, sizeof(tcb));
108741edb306SCy Schubert 	ti.ti_win = tcb.rcv_adv;
108841edb306SCy Schubert 	ti.ti_seq = htonl(tcb.snd_nxt - 1);
108941edb306SCy Schubert 	ti.ti_ack = tcb.rcv_nxt;
109041edb306SCy Schubert 
109141edb306SCy Schubert 	if (!ptest || (ptest == 5)) {
109241edb306SCy Schubert 		/*
109341edb306SCy Schubert 		 * Test 5: urp
109441edb306SCy Schubert 		 */
109541edb306SCy Schubert 		t->th_flags = TH_ACK|TH_URG;
109641edb306SCy Schubert 		printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n",
109741edb306SCy Schubert 			ntohs(t->th_sport), ntohs(t->th_dport));
109841edb306SCy Schubert 		t->th_urp = htons(1);
109941edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
110041edb306SCy Schubert 		PAUSE();
110141edb306SCy Schubert 
110241edb306SCy Schubert 		t->th_seq = htonl(tcb.snd_nxt);
110341edb306SCy Schubert 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1;
110441edb306SCy Schubert 		t->th_urp = htons(0x7fff);
110541edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
110641edb306SCy Schubert 		PAUSE();
110741edb306SCy Schubert 		t->th_urp = htons(0x8000);
110841edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
110941edb306SCy Schubert 		PAUSE();
111041edb306SCy Schubert 		t->th_urp = htons(0xffff);
111141edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
111241edb306SCy Schubert 		PAUSE();
111341edb306SCy Schubert 		t->th_urp = 0;
111441edb306SCy Schubert 		t->th_flags &= ~TH_URG;
111541edb306SCy Schubert 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
111641edb306SCy Schubert 	}
111741edb306SCy Schubert 
111841edb306SCy Schubert 	if (!ptest || (ptest == 6)) {
111941edb306SCy Schubert 		/*
112041edb306SCy Schubert 		 * Test 6: data offset, off = 0, off is inside, off is outside
112141edb306SCy Schubert 		 */
112241edb306SCy Schubert 		t->th_flags = TH_ACK;
112341edb306SCy Schubert 		printf("5.6.1 TCP off = 1-15, len = 40\n");
112441edb306SCy Schubert 		for (i = 1; i < 16; i++) {
112541edb306SCy Schubert 			TCP_OFF_A(t, ntohs(i));
112641edb306SCy Schubert 			(void) send_tcp(nfd, mtu, ip, gwip);
112741edb306SCy Schubert 			printf("%d\r", i);
112841edb306SCy Schubert 			fflush(stdout);
112941edb306SCy Schubert 			PAUSE();
113041edb306SCy Schubert 		}
113141edb306SCy Schubert 		putchar('\n');
113241edb306SCy Schubert 		ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t);
113341edb306SCy Schubert 	}
113441edb306SCy Schubert 
113541edb306SCy Schubert 	(void) close(fd);
113641edb306SCy Schubert 	}
113741edb306SCy Schubert skip_five_and_six:
113841edb306SCy Schubert #endif
113941edb306SCy Schubert 	t->th_seq = htonl(1);
114041edb306SCy Schubert 	t->th_ack = htonl(1);
114141edb306SCy Schubert 	TCP_OFF_A(t, 0);
114241edb306SCy Schubert 
114341edb306SCy Schubert 	if (!ptest || (ptest == 7)) {
114441edb306SCy Schubert 		t->th_flags = TH_SYN;
114541edb306SCy Schubert 		/*
114641edb306SCy Schubert 		 * Test 7: sport = 0, sport = 1, sport = 32767
114741edb306SCy Schubert 		 *         sport = 32768, sport = 65535
114841edb306SCy Schubert 		 */
114941edb306SCy Schubert 		printf("5.7.1 TCP sport = 0\n");
115041edb306SCy Schubert 		t->th_sport = 0;
115141edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
115241edb306SCy Schubert 		fflush(stdout);
115341edb306SCy Schubert 		PAUSE();
115441edb306SCy Schubert 
115541edb306SCy Schubert 		printf("5.7.2 TCP sport = 1\n");
115641edb306SCy Schubert 		t->th_sport = htons(1);
115741edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
115841edb306SCy Schubert 		fflush(stdout);
115941edb306SCy Schubert 		PAUSE();
116041edb306SCy Schubert 
116141edb306SCy Schubert 		printf("5.7.3 TCP sport = 32767\n");
116241edb306SCy Schubert 		t->th_sport = htons(32767);
116341edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
116441edb306SCy Schubert 		fflush(stdout);
116541edb306SCy Schubert 		PAUSE();
116641edb306SCy Schubert 
116741edb306SCy Schubert 		printf("5.7.4 TCP sport = 32768\n");
116841edb306SCy Schubert 		t->th_sport = htons(32768);
116941edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
117041edb306SCy Schubert 		fflush(stdout);
117141edb306SCy Schubert 		PAUSE();
117241edb306SCy Schubert 
117341edb306SCy Schubert 		printf("5.7.5 TCP sport = 65535\n");
117441edb306SCy Schubert 		t->th_sport = htons(65535);
117541edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
117641edb306SCy Schubert 		fflush(stdout);
117741edb306SCy Schubert 		PAUSE();
117841edb306SCy Schubert 	}
117941edb306SCy Schubert 
118041edb306SCy Schubert 	if (!ptest || (ptest == 8)) {
118141edb306SCy Schubert 		t->th_sport = htons(1);
118241edb306SCy Schubert 		t->th_flags = TH_SYN;
118341edb306SCy Schubert 		/*
118441edb306SCy Schubert 		 * Test 8: dport = 0, dport = 1, dport = 32767
118541edb306SCy Schubert 		 *         dport = 32768, dport = 65535
118641edb306SCy Schubert 		 */
118741edb306SCy Schubert 		printf("5.8.1 TCP dport = 0\n");
118841edb306SCy Schubert 		t->th_dport = 0;
118941edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
119041edb306SCy Schubert 		fflush(stdout);
119141edb306SCy Schubert 		PAUSE();
119241edb306SCy Schubert 
119341edb306SCy Schubert 		printf("5.8.2 TCP dport = 1\n");
119441edb306SCy Schubert 		t->th_dport = htons(1);
119541edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
119641edb306SCy Schubert 		fflush(stdout);
119741edb306SCy Schubert 		PAUSE();
119841edb306SCy Schubert 
119941edb306SCy Schubert 		printf("5.8.3 TCP dport = 32767\n");
120041edb306SCy Schubert 		t->th_dport = htons(32767);
120141edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
120241edb306SCy Schubert 		fflush(stdout);
120341edb306SCy Schubert 		PAUSE();
120441edb306SCy Schubert 
120541edb306SCy Schubert 		printf("5.8.4 TCP dport = 32768\n");
120641edb306SCy Schubert 		t->th_dport = htons(32768);
120741edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
120841edb306SCy Schubert 		fflush(stdout);
120941edb306SCy Schubert 		PAUSE();
121041edb306SCy Schubert 
121141edb306SCy Schubert 		printf("5.8.5 TCP dport = 65535\n");
121241edb306SCy Schubert 		t->th_dport = htons(65535);
121341edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
121441edb306SCy Schubert 		fflush(stdout);
121541edb306SCy Schubert 		PAUSE();
121641edb306SCy Schubert 	}
121741edb306SCy Schubert 
121841edb306SCy Schubert 	/* LAND attack - self connect, so make src & dst ip/port the same */
121941edb306SCy Schubert 	if (!ptest || (ptest == 9)) {
122041edb306SCy Schubert 		printf("5.9 TCP LAND attack. sport = 25, dport = 25\n");
122141edb306SCy Schubert 		/* chose SMTP port 25 */
122241edb306SCy Schubert 		t->th_sport = htons(25);
122341edb306SCy Schubert 		t->th_dport = htons(25);
122441edb306SCy Schubert 		t->th_flags = TH_SYN;
122541edb306SCy Schubert 		ip->ip_src = ip->ip_dst;
122641edb306SCy Schubert 		(void) send_tcp(nfd, mtu, ip, gwip);
122741edb306SCy Schubert 		fflush(stdout);
122841edb306SCy Schubert 		PAUSE();
122941edb306SCy Schubert 	}
123041edb306SCy Schubert 
123141edb306SCy Schubert 	/* TCP options header checking */
123241edb306SCy Schubert 	/* 0 length options, etc */
123341edb306SCy Schubert }
123441edb306SCy Schubert 
123541edb306SCy Schubert 
123641edb306SCy Schubert /* Perform test 6 (exhaust mbuf test) */
123741edb306SCy Schubert 
1238*efeb8bffSCy Schubert void
ip_test6(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)1239*efeb8bffSCy Schubert ip_test6(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
124041edb306SCy Schubert {
124141edb306SCy Schubert #ifdef USE_NANOSLEEP
124241edb306SCy Schubert 	struct	timespec ts;
124341edb306SCy Schubert #else
124441edb306SCy Schubert 	struct	timeval	tv;
124541edb306SCy Schubert #endif
124641edb306SCy Schubert 	udphdr_t *u;
124741edb306SCy Schubert 	int	nfd, i, j, k;
124841edb306SCy Schubert 
124941edb306SCy Schubert 	IP_V_A(ip, IPVERSION);
125041edb306SCy Schubert 	ip->ip_tos = 0;
125141edb306SCy Schubert 	ip->ip_off = 0;
125241edb306SCy Schubert 	ip->ip_ttl = 60;
125341edb306SCy Schubert 	ip->ip_p = IPPROTO_UDP;
125441edb306SCy Schubert 	ip->ip_sum = 0;
125541edb306SCy Schubert 	u = (udphdr_t *)(ip + 1);
125641edb306SCy Schubert 	u->uh_sport = htons(1);
125741edb306SCy Schubert 	u->uh_dport = htons(9);
125841edb306SCy Schubert 	u->uh_sum = 0;
125941edb306SCy Schubert 
126041edb306SCy Schubert 	nfd = initdevice(dev, 1);
126141edb306SCy Schubert 	if (nfd == -1)
126241edb306SCy Schubert 		return;
126341edb306SCy Schubert 
126441edb306SCy Schubert 	u->uh_ulen = htons(7168);
126541edb306SCy Schubert 
126641edb306SCy Schubert 	printf("6. Exhaustive mbuf test.\n");
126741edb306SCy Schubert 	printf("   Send 7k packet in 768 & 128 byte fragments, 128 times.\n");
126841edb306SCy Schubert 	printf("   Total of around 8,900 packets\n");
126941edb306SCy Schubert 	for (i = 0; i < 128; i++) {
127041edb306SCy Schubert 		/*
127141edb306SCy Schubert 		 * First send the entire packet in 768 byte chunks.
127241edb306SCy Schubert 		 */
127341edb306SCy Schubert 		ip->ip_len = sizeof(*ip) + 768 + sizeof(*u);
127441edb306SCy Schubert 		IP_HL_A(ip, sizeof(*ip) >> 2);
127541edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
127641edb306SCy Schubert 		(void) send_ip(nfd, 1500, ip, gwip, 1);
127741edb306SCy Schubert 		printf("%d %d\r", i, 0);
127841edb306SCy Schubert 		fflush(stdout);
127941edb306SCy Schubert 		PAUSE();
128041edb306SCy Schubert 		/*
128141edb306SCy Schubert 		 * And again using 128 byte chunks.
128241edb306SCy Schubert 		 */
128341edb306SCy Schubert 		ip->ip_len = sizeof(*ip) + 128 + sizeof(*u);
128441edb306SCy Schubert 		ip->ip_off = htons(IP_MF);
128541edb306SCy Schubert 		(void) send_ip(nfd, 1500, ip, gwip, 1);
128641edb306SCy Schubert 		printf("%d %d\r", i, 0);
128741edb306SCy Schubert 		fflush(stdout);
128841edb306SCy Schubert 		PAUSE();
128941edb306SCy Schubert 
129041edb306SCy Schubert 		for (j = 768; j < 3584; j += 768) {
129141edb306SCy Schubert 			ip->ip_len = sizeof(*ip) + 768;
129241edb306SCy Schubert 			ip->ip_off = htons(IP_MF|(j>>3));
129341edb306SCy Schubert 			(void) send_ip(nfd, 1500, ip, gwip, 1);
129441edb306SCy Schubert 			printf("%d %d\r", i, j);
129541edb306SCy Schubert 			fflush(stdout);
129641edb306SCy Schubert 			PAUSE();
129741edb306SCy Schubert 
129841edb306SCy Schubert 			ip->ip_len = sizeof(*ip) + 128;
129941edb306SCy Schubert 			for (k = j - 768; k < j; k += 128) {
130041edb306SCy Schubert 				ip->ip_off = htons(IP_MF|(k>>3));
130141edb306SCy Schubert 				(void) send_ip(nfd, 1500, ip, gwip, 1);
130241edb306SCy Schubert 				printf("%d %d\r", i, k);
130341edb306SCy Schubert 				fflush(stdout);
130441edb306SCy Schubert 				PAUSE();
130541edb306SCy Schubert 			}
130641edb306SCy Schubert 		}
130741edb306SCy Schubert 	}
130841edb306SCy Schubert 	putchar('\n');
130941edb306SCy Schubert }
131041edb306SCy Schubert 
131141edb306SCy Schubert 
131241edb306SCy Schubert /* Perform test 7 (random packets) */
131341edb306SCy Schubert 
131441edb306SCy Schubert static	u_long	tbuf[64];
131541edb306SCy Schubert 
1316*efeb8bffSCy Schubert void
ip_test7(char * dev,int mtu,ip_t * ip,struct in_addr gwip,int ptest)1317*efeb8bffSCy Schubert ip_test7(char *dev, int mtu, ip_t *ip, struct  in_addr gwip, int ptest)
131841edb306SCy Schubert {
131941edb306SCy Schubert 	ip_t	*pip;
132041edb306SCy Schubert #ifdef USE_NANOSLEEP
132141edb306SCy Schubert 	struct	timespec ts;
132241edb306SCy Schubert #else
132341edb306SCy Schubert 	struct	timeval	tv;
132441edb306SCy Schubert #endif
132541edb306SCy Schubert 	int	nfd, i, j;
132641edb306SCy Schubert 	u_char	*s;
132741edb306SCy Schubert 
132841edb306SCy Schubert 	nfd = initdevice(dev, 1);
132941edb306SCy Schubert 	if (nfd == -1)
133041edb306SCy Schubert 		return;
133141edb306SCy Schubert 
133241edb306SCy Schubert 	pip = (ip_t *)tbuf;
133341edb306SCy Schubert 
133441edb306SCy Schubert 	srand(time(NULL) ^ (getpid() * getppid()));
133541edb306SCy Schubert 
133641edb306SCy Schubert 	printf("7. send 1024 random IP packets.\n");
133741edb306SCy Schubert 
133841edb306SCy Schubert 	for (i = 0; i < 512; i++) {
133941edb306SCy Schubert 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
134041edb306SCy Schubert 			*s = (rand() >> 13) & 0xff;
134141edb306SCy Schubert 		IP_V_A(pip, IPVERSION);
134241edb306SCy Schubert 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
134341edb306SCy Schubert 		      sizeof(struct in_addr));
134441edb306SCy Schubert 		pip->ip_sum = 0;
134541edb306SCy Schubert 		pip->ip_len &= 0xff;
134641edb306SCy Schubert 		(void) send_ip(nfd, mtu, pip, gwip, 0);
134741edb306SCy Schubert 		printf("%d\r", i);
134841edb306SCy Schubert 		fflush(stdout);
134941edb306SCy Schubert 		PAUSE();
135041edb306SCy Schubert 	}
135141edb306SCy Schubert 	putchar('\n');
135241edb306SCy Schubert 
135341edb306SCy Schubert 	for (i = 0; i < 512; i++) {
135441edb306SCy Schubert 		for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++)
135541edb306SCy Schubert 			*s = (rand() >> 13) & 0xff;
135641edb306SCy Schubert 		IP_V_A(pip, IPVERSION);
135741edb306SCy Schubert 		pip->ip_off &= htons(0xc000);
135841edb306SCy Schubert 		bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst,
135941edb306SCy Schubert 		      sizeof(struct in_addr));
136041edb306SCy Schubert 		pip->ip_sum = 0;
136141edb306SCy Schubert 		pip->ip_len &= 0xff;
136241edb306SCy Schubert 		(void) send_ip(nfd, mtu, pip, gwip, 0);
136341edb306SCy Schubert 		printf("%d\r", i);
136441edb306SCy Schubert 		fflush(stdout);
136541edb306SCy Schubert 		PAUSE();
136641edb306SCy Schubert 	}
136741edb306SCy Schubert 	putchar('\n');
136841edb306SCy Schubert }
1369