]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ipfilter/ipsend/iptests.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ipfilter / ipsend / iptests.c
1 /*      $FreeBSD$       */
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
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
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  */
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
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
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
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
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 }