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