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