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