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