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