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