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