iptests.c revision 53024
122514Sdarrenr/* 253024Sguido * Copyright (C) 1993-1998 by Darren Reed. 322514Sdarrenr * 431183Speter * Redistribution and use in source and binary forms are permitted 531183Speter * provided that this notice is preserved and due credit is given 631183Speter * to the original author and the contributors. 722514Sdarrenr */ 831183Speter#if !defined(lint) 931183Speterstatic const char sccsid[] = "%W% %G% (C)1995 Darren Reed"; 1053024Sguidostatic const char rcsid[] = "@(#)$Id: iptests.c,v 2.1 1999/08/04 17:31:09 darrenr Exp $"; 1122514Sdarrenr#endif 1222514Sdarrenr#include <stdio.h> 1322514Sdarrenr#include <unistd.h> 1422514Sdarrenr#include <stdlib.h> 1522514Sdarrenr#include <string.h> 1622514Sdarrenr#include <sys/types.h> 1722514Sdarrenr#include <sys/time.h> 1822514Sdarrenr#include <sys/param.h> 1953024Sguido#define _KERNEL 2053024Sguido#define KERNEL 2131183Speter#if !defined(solaris) && !defined(linux) && !defined(__sgi) 2222514Sdarrenr# include <sys/file.h> 2353024Sguido#else 2453024Sguido# ifdef solaris 2553024Sguido# include <sys/dditypes.h> 2653024Sguido# endif 2753024Sguido#endif 2853024Sguido#undef _KERNEL 2953024Sguido#undef KERNEL 3053024Sguido#if !defined(solaris) && !defined(linux) && !defined(__sgi) 3122514Sdarrenr# include <nlist.h> 3222514Sdarrenr# include <sys/user.h> 3322514Sdarrenr# include <sys/proc.h> 3422514Sdarrenr#endif 3531183Speter#if !defined(ultrix) && !defined(hpux) && !defined(linux) && !defined(__sgi) 3631183Speter# include <kvm.h> 3731183Speter#endif 3831183Speter#ifndef ultrix 3931183Speter# include <sys/socket.h> 4031183Speter#endif 4126119Sdarrenr#if defined(solaris) 4226119Sdarrenr# include <sys/stream.h> 4326119Sdarrenr#endif 4422514Sdarrenr#include <sys/socketvar.h> 4522514Sdarrenr#ifdef sun 4622514Sdarrenr#include <sys/systm.h> 4722514Sdarrenr#include <sys/session.h> 4822514Sdarrenr#endif 4922514Sdarrenr#if BSD >= 199103 5031183Speter# include <sys/sysctl.h> 5131183Speter# include <sys/filedesc.h> 5231183Speter# include <paths.h> 5322514Sdarrenr#endif 5422514Sdarrenr#include <netinet/in_systm.h> 5522514Sdarrenr#include <sys/socket.h> 5622514Sdarrenr#include <net/if.h> 5731183Speter#if defined(linux) && (LINUX >= 0200) 5831183Speter# include <asm/atomic.h> 5931183Speter#endif 6031183Speter#if !defined(linux) 6131183Speter# include <net/route.h> 6231183Speter#else 6331183Speter# define __KERNEL__ /* because there's a macro not wrapped by this */ 6431183Speter# include <net/route.h> /* in this file :-/ */ 6531183Speter#endif 6622514Sdarrenr#include <netinet/in.h> 6722514Sdarrenr#include <arpa/inet.h> 6822514Sdarrenr#include <netinet/ip.h> 6922514Sdarrenr#include <netinet/tcp.h> 7022514Sdarrenr#include <netinet/udp.h> 7122514Sdarrenr#include <netinet/ip_icmp.h> 7231183Speter#ifndef linux 7331183Speter# include <netinet/ip_var.h> 7431183Speter# include <netinet/in_pcb.h> 7531183Speter# include <netinet/tcp_timer.h> 7631183Speter# include <netinet/tcp_var.h> 7731183Speter#endif 7831183Speter#if defined(__SVR4) || defined(__svr4__) || defined(__sgi) 7931183Speter# include <sys/sysmacros.h> 8031183Speter#endif 8124583Sdarrenr#include "ipsend.h" 8222514Sdarrenr 8324583Sdarrenr 8422514Sdarrenr#define PAUSE() tv.tv_sec = 0; tv.tv_usec = 10000; \ 8522514Sdarrenr (void) select(0, NULL, NULL, NULL, &tv) 8622514Sdarrenr 8722514Sdarrenr 8822514Sdarrenrvoid ip_test1(dev, mtu, ip, gwip, ptest) 8922514Sdarrenrchar *dev; 9022514Sdarrenrint mtu; 9122514Sdarrenrip_t *ip; 9222514Sdarrenrstruct in_addr gwip; 9322514Sdarrenrint ptest; 9422514Sdarrenr{ 9522514Sdarrenr struct timeval tv; 9622514Sdarrenr udphdr_t *u; 9731183Speter int nfd, i = 0, len, id = getpid(); 9822514Sdarrenr 9922514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 10022514Sdarrenr ip->ip_v = IPVERSION; 10122514Sdarrenr ip->ip_tos = 0; 10222514Sdarrenr ip->ip_off = 0; 10322514Sdarrenr ip->ip_ttl = 60; 10422514Sdarrenr ip->ip_p = IPPROTO_UDP; 10522514Sdarrenr ip->ip_sum = 0; 10622514Sdarrenr u = (udphdr_t *)(ip + 1); 10737074Speter u->uh_sport = htons(1); 10837074Speter u->uh_dport = htons(9); 10922514Sdarrenr u->uh_sum = 0; 11037074Speter u->uh_ulen = htons(sizeof(*u) + 4); 11137074Speter ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen); 11222514Sdarrenr len = ip->ip_len; 11322514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 11422514Sdarrenr 11522514Sdarrenr if (!ptest || (ptest == 1)) { 11622514Sdarrenr /* 11722514Sdarrenr * Part1: hl < len 11822514Sdarrenr */ 11922514Sdarrenr ip->ip_id = 0; 12022514Sdarrenr printf("1.1. sending packets with ip_hl < ip_len\n"); 12137074Speter for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) { 12222514Sdarrenr ip->ip_hl = i >> 2; 12322514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 12422514Sdarrenr printf("%d\r", i); 12522514Sdarrenr fflush(stdout); 12622514Sdarrenr PAUSE(); 12722514Sdarrenr } 12822514Sdarrenr putchar('\n'); 12922514Sdarrenr } 13022514Sdarrenr 13122514Sdarrenr if (!ptest || (ptest == 2)) { 13222514Sdarrenr /* 13322514Sdarrenr * Part2: hl > len 13422514Sdarrenr */ 13522514Sdarrenr ip->ip_id = 0; 13622514Sdarrenr printf("1.2. sending packets with ip_hl > ip_len\n"); 13737074Speter for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) { 13822514Sdarrenr ip->ip_hl = i >> 2; 13922514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 14022514Sdarrenr printf("%d\r", i); 14122514Sdarrenr fflush(stdout); 14222514Sdarrenr PAUSE(); 14322514Sdarrenr } 14422514Sdarrenr putchar('\n'); 14522514Sdarrenr } 14622514Sdarrenr 14722514Sdarrenr if (!ptest || (ptest == 3)) { 14822514Sdarrenr /* 14922514Sdarrenr * Part3: v < 4 15022514Sdarrenr */ 15122514Sdarrenr ip->ip_id = 0; 15222514Sdarrenr printf("1.3. ip_v < 4\n"); 15322514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 15422514Sdarrenr for (i = 0; i < 4; i++) { 15522514Sdarrenr ip->ip_v = i; 15622514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 15722514Sdarrenr printf("%d\r", i); 15822514Sdarrenr fflush(stdout); 15922514Sdarrenr PAUSE(); 16022514Sdarrenr } 16122514Sdarrenr putchar('\n'); 16222514Sdarrenr } 16322514Sdarrenr 16422514Sdarrenr if (!ptest || (ptest == 4)) { 16522514Sdarrenr /* 16622514Sdarrenr * Part4: v > 4 16722514Sdarrenr */ 16822514Sdarrenr ip->ip_id = 0; 16922514Sdarrenr printf("1.4. ip_v > 4\n"); 17022514Sdarrenr for (i = 5; i < 16; i++) { 17122514Sdarrenr ip->ip_v = i; 17222514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 17322514Sdarrenr printf("%d\r", i); 17422514Sdarrenr fflush(stdout); 17522514Sdarrenr PAUSE(); 17622514Sdarrenr } 17722514Sdarrenr putchar('\n'); 17822514Sdarrenr } 17922514Sdarrenr 18022514Sdarrenr if (!ptest || (ptest == 5)) { 18122514Sdarrenr /* 18222514Sdarrenr * Part5: len < packet 18322514Sdarrenr */ 18422514Sdarrenr ip->ip_id = 0; 18522514Sdarrenr ip->ip_v = IPVERSION; 18622514Sdarrenr i = ip->ip_len + 1; 18722514Sdarrenr printf("1.5.0 ip_len < packet size (size++, long packets)\n"); 18837074Speter for (; i < (ip->ip_len * 2); i++) { 18922514Sdarrenr ip->ip_id = htons(id++); 19022514Sdarrenr ip->ip_sum = 0; 19124583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 19224583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 19322514Sdarrenr printf("%d\r", i); 19422514Sdarrenr fflush(stdout); 19522514Sdarrenr PAUSE(); 19622514Sdarrenr } 19722514Sdarrenr putchar('\n'); 19822514Sdarrenr printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n"); 19922514Sdarrenr for (i = len; i > 0; i--) { 20022514Sdarrenr ip->ip_id = htons(id++); 20137074Speter ip->ip_len = i; 20222514Sdarrenr ip->ip_sum = 0; 20324583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 20424583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 20522514Sdarrenr printf("%d\r", i); 20622514Sdarrenr fflush(stdout); 20722514Sdarrenr PAUSE(); 20822514Sdarrenr } 20922514Sdarrenr putchar('\n'); 21022514Sdarrenr } 21122514Sdarrenr 21222514Sdarrenr if (!ptest || (ptest == 6)) { 21322514Sdarrenr /* 21422514Sdarrenr * Part6: len > packet 21522514Sdarrenr */ 21622514Sdarrenr ip->ip_id = 0; 21722514Sdarrenr printf("1.6.0 ip_len > packet size (increase ip_len)\n"); 21822514Sdarrenr for (i = len + 1; i < (len * 2); i++) { 21922514Sdarrenr ip->ip_id = htons(id++); 22037074Speter ip->ip_len = i; 22122514Sdarrenr ip->ip_sum = 0; 22224583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 22324583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 22422514Sdarrenr printf("%d\r", i); 22522514Sdarrenr fflush(stdout); 22622514Sdarrenr PAUSE(); 22722514Sdarrenr } 22822514Sdarrenr putchar('\n'); 22937074Speter ip->ip_len = len; 23022514Sdarrenr printf("1.6.1 ip_len > packet size (size--, short packets)\n"); 23122514Sdarrenr for (i = len; i > 0; i--) { 23222514Sdarrenr ip->ip_id = htons(id++); 23322514Sdarrenr ip->ip_sum = 0; 23424583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 23524583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 23622514Sdarrenr printf("%d\r", i); 23722514Sdarrenr fflush(stdout); 23822514Sdarrenr PAUSE(); 23922514Sdarrenr } 24022514Sdarrenr putchar('\n'); 24122514Sdarrenr } 24222514Sdarrenr 24322514Sdarrenr if (!ptest || (ptest == 7)) { 24422514Sdarrenr /* 24522514Sdarrenr * Part7: 0 length fragment 24622514Sdarrenr */ 24722514Sdarrenr printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n"); 24822514Sdarrenr ip->ip_id = 0; 24922514Sdarrenr ip->ip_len = sizeof(*ip); 25022514Sdarrenr ip->ip_off = htons(IP_MF); 25122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 25222514Sdarrenr fflush(stdout); 25322514Sdarrenr PAUSE(); 25422514Sdarrenr 25522514Sdarrenr printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n"); 25622514Sdarrenr ip->ip_id = 0; 25722514Sdarrenr ip->ip_len = sizeof(*ip); 25822514Sdarrenr ip->ip_off = htons(IP_MF); 25922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 26022514Sdarrenr fflush(stdout); 26122514Sdarrenr PAUSE(); 26222514Sdarrenr 26322514Sdarrenr printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n"); 26422514Sdarrenr ip->ip_id = 0; 26522514Sdarrenr ip->ip_len = sizeof(*ip); 26622514Sdarrenr ip->ip_off = htons(0xa000); 26722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 26822514Sdarrenr fflush(stdout); 26922514Sdarrenr PAUSE(); 27022514Sdarrenr 27122514Sdarrenr printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n"); 27222514Sdarrenr ip->ip_id = 0; 27322514Sdarrenr ip->ip_len = sizeof(*ip); 27422514Sdarrenr ip->ip_off = htons(0x0100); 27522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 27622514Sdarrenr fflush(stdout); 27722514Sdarrenr PAUSE(); 27822514Sdarrenr } 27922514Sdarrenr 28022514Sdarrenr if (!ptest || (ptest == 8)) { 28122514Sdarrenr struct timeval tv; 28222514Sdarrenr 28322514Sdarrenr gettimeofday(&tv, NULL); 28422514Sdarrenr srand(tv.tv_sec ^ getpid() ^ tv.tv_usec); 28522514Sdarrenr /* 28622514Sdarrenr * Part8.1: 63k packet + 1k fragment at offset 0x1ffe 28722514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 28822514Sdarrenr * don't bother about the ICMP header, we're not worrying 28922514Sdarrenr * about that here. 29022514Sdarrenr */ 29122514Sdarrenr ip->ip_p = IPPROTO_ICMP; 29237074Speter ip->ip_off = htons(IP_MF); 29322514Sdarrenr u->uh_dport = htons(9); 29422514Sdarrenr ip->ip_id = htons(id++); 29522514Sdarrenr printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n"); 29622514Sdarrenr ip->ip_len = 768 + 20 + 8; 29722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 29822514Sdarrenr printf("%d\r", i); 29922514Sdarrenr 30022514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 30122514Sdarrenr i = 512; 30222514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 30337074Speter ip->ip_off = htons(IP_MF | (i >> 3)); 30422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 30522514Sdarrenr printf("%d\r", i); 30622514Sdarrenr fflush(stdout); 30722514Sdarrenr PAUSE(); 30822514Sdarrenr } 30922514Sdarrenr ip->ip_len = 896 + 20; 31037074Speter ip->ip_off = htons(i >> 3); 31122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 31222514Sdarrenr printf("%d\r", i); 31322514Sdarrenr putchar('\n'); 31422514Sdarrenr fflush(stdout); 31522514Sdarrenr 31622514Sdarrenr /* 31722514Sdarrenr * Part8.2: 63k packet + 1k fragment at offset 0x1ffe 31822514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 31922514Sdarrenr * don't bother about the ICMP header, we're not worrying 32022514Sdarrenr * about that here. (Lossage here) 32122514Sdarrenr */ 32222514Sdarrenr ip->ip_p = IPPROTO_ICMP; 32337074Speter ip->ip_off = htons(IP_MF); 32422514Sdarrenr u->uh_dport = htons(9); 32522514Sdarrenr ip->ip_id = htons(id++); 32622514Sdarrenr printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n"); 32722514Sdarrenr ip->ip_len = 768 + 20 + 8; 32822514Sdarrenr if ((rand() & 0x1f) != 0) { 32922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 33022514Sdarrenr printf("%d\r", i); 33122514Sdarrenr } else 33222514Sdarrenr printf("skip 0\n"); 33322514Sdarrenr 33422514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 33522514Sdarrenr i = 512; 33622514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 33737074Speter ip->ip_off = htons(IP_MF | (i >> 3)); 33822514Sdarrenr if ((rand() & 0x1f) != 0) { 33922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 34022514Sdarrenr printf("%d\r", i); 34122514Sdarrenr } else 34222514Sdarrenr printf("skip %d\n", i); 34322514Sdarrenr fflush(stdout); 34422514Sdarrenr PAUSE(); 34522514Sdarrenr } 34622514Sdarrenr ip->ip_len = 896 + 20; 34737074Speter ip->ip_off = htons(i >> 3); 34822514Sdarrenr if ((rand() & 0x1f) != 0) { 34922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 35022514Sdarrenr printf("%d\r", i); 35122514Sdarrenr } else 35222514Sdarrenr printf("skip\n"); 35322514Sdarrenr putchar('\n'); 35422514Sdarrenr fflush(stdout); 35522514Sdarrenr 35622514Sdarrenr /* 35722514Sdarrenr * Part8.3: 33k packet - test for not dealing with -ve length 35822514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 35922514Sdarrenr * don't bother about the ICMP header, we're not worrying 36022514Sdarrenr * about that here. 36122514Sdarrenr */ 36222514Sdarrenr ip->ip_p = IPPROTO_ICMP; 36337074Speter ip->ip_off = htons(IP_MF); 36422514Sdarrenr u->uh_dport = htons(9); 36522514Sdarrenr ip->ip_id = htons(id++); 36622514Sdarrenr printf("1.8.3 33k packet\n"); 36722514Sdarrenr ip->ip_len = 768 + 20 + 8; 36822514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 36922514Sdarrenr printf("%d\r", i); 37022514Sdarrenr 37122514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 37222514Sdarrenr i = 512; 37322514Sdarrenr for (; i < (32 * 1024 + 768); i += 768) { 37437074Speter ip->ip_off = htons(IP_MF | (i >> 3)); 37522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 37622514Sdarrenr printf("%d\r", i); 37722514Sdarrenr fflush(stdout); 37822514Sdarrenr PAUSE(); 37922514Sdarrenr } 38022514Sdarrenr ip->ip_len = 896 + 20; 38137074Speter ip->ip_off = htons(i >> 3); 38222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 38322514Sdarrenr printf("%d\r", i); 38422514Sdarrenr putchar('\n'); 38522514Sdarrenr fflush(stdout); 38622514Sdarrenr } 38722514Sdarrenr 38822514Sdarrenr ip->ip_len = len; 38922514Sdarrenr ip->ip_off = 0; 39022514Sdarrenr if (!ptest || (ptest == 9)) { 39122514Sdarrenr /* 39222514Sdarrenr * Part9: off & 0x8000 == 0x8000 39322514Sdarrenr */ 39422514Sdarrenr ip->ip_id = 0; 39537074Speter ip->ip_off = htons(0x8000); 39622514Sdarrenr printf("1.9. ip_off & 0x8000 == 0x8000\n"); 39722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 39822514Sdarrenr fflush(stdout); 39922514Sdarrenr PAUSE(); 40022514Sdarrenr } 40122514Sdarrenr 40222514Sdarrenr ip->ip_off = 0; 40322514Sdarrenr 40422514Sdarrenr if (!ptest || (ptest == 10)) { 40522514Sdarrenr /* 40622514Sdarrenr * Part10: ttl = 255 40722514Sdarrenr */ 40822514Sdarrenr ip->ip_id = 0; 40922514Sdarrenr ip->ip_ttl = 255; 41022514Sdarrenr printf("1.10.0 ip_ttl = 255\n"); 41122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 41222514Sdarrenr fflush(stdout); 41322514Sdarrenr PAUSE(); 41422514Sdarrenr 41522514Sdarrenr ip->ip_ttl = 128; 41622514Sdarrenr printf("1.10.1 ip_ttl = 128\n"); 41722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 41822514Sdarrenr fflush(stdout); 41922514Sdarrenr PAUSE(); 42022514Sdarrenr 42122514Sdarrenr ip->ip_ttl = 0; 42222514Sdarrenr printf("1.10.2 ip_ttl = 0\n"); 42322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 42422514Sdarrenr fflush(stdout); 42522514Sdarrenr PAUSE(); 42622514Sdarrenr } 42722514Sdarrenr 42822514Sdarrenr (void) close(nfd); 42922514Sdarrenr} 43022514Sdarrenr 43122514Sdarrenr 43222514Sdarrenrvoid ip_test2(dev, mtu, ip, gwip, ptest) 43322514Sdarrenrchar *dev; 43422514Sdarrenrint mtu; 43522514Sdarrenrip_t *ip; 43622514Sdarrenrstruct in_addr gwip; 43722514Sdarrenrint ptest; 43822514Sdarrenr{ 43922514Sdarrenr struct timeval tv; 44022514Sdarrenr int nfd; 44122514Sdarrenr u_char *s; 44222514Sdarrenr 44322514Sdarrenr s = (u_char *)(ip + 1); 44437074Speter nfd = initdevice(dev, htons(1), 1); 44522514Sdarrenr 44622514Sdarrenr ip->ip_hl = 6; 44722514Sdarrenr ip->ip_len = ip->ip_hl << 2; 44822514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_NOP; 44922514Sdarrenr s++; 45022514Sdarrenr if (!ptest || (ptest == 1)) { 45122514Sdarrenr /* 45222514Sdarrenr * Test 1: option length > packet length, 45322514Sdarrenr * header length == packet length 45422514Sdarrenr */ 45522514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 45622514Sdarrenr s[IPOPT_OLEN] = 4; 45722514Sdarrenr s[IPOPT_OFFSET] = IPOPT_MINOFF; 45822514Sdarrenr ip->ip_p = IPPROTO_IP; 45922514Sdarrenr printf("2.1 option length > packet length\n"); 46022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 46122514Sdarrenr fflush(stdout); 46222514Sdarrenr PAUSE(); 46322514Sdarrenr } 46422514Sdarrenr 46522514Sdarrenr ip->ip_hl = 7; 46622514Sdarrenr ip->ip_len = ip->ip_hl << 2; 46722514Sdarrenr if (!ptest || (ptest == 1)) { 46822514Sdarrenr /* 46922514Sdarrenr * Test 2: options have length = 0 47022514Sdarrenr */ 47122514Sdarrenr printf("2.2.1 option length = 0, RR\n"); 47222514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_RR; 47322514Sdarrenr s[IPOPT_OLEN] = 0; 47422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 47522514Sdarrenr fflush(stdout); 47622514Sdarrenr PAUSE(); 47722514Sdarrenr 47822514Sdarrenr printf("2.2.2 option length = 0, TS\n"); 47922514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 48022514Sdarrenr s[IPOPT_OLEN] = 0; 48122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48222514Sdarrenr fflush(stdout); 48322514Sdarrenr PAUSE(); 48422514Sdarrenr 48522514Sdarrenr printf("2.2.3 option length = 0, SECURITY\n"); 48622514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SECURITY; 48722514Sdarrenr s[IPOPT_OLEN] = 0; 48822514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48922514Sdarrenr fflush(stdout); 49022514Sdarrenr PAUSE(); 49122514Sdarrenr 49222514Sdarrenr printf("2.2.4 option length = 0, LSRR\n"); 49322514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_LSRR; 49422514Sdarrenr s[IPOPT_OLEN] = 0; 49522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 49622514Sdarrenr fflush(stdout); 49722514Sdarrenr PAUSE(); 49822514Sdarrenr 49922514Sdarrenr printf("2.2.5 option length = 0, SATID\n"); 50022514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SATID; 50122514Sdarrenr s[IPOPT_OLEN] = 0; 50222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 50322514Sdarrenr fflush(stdout); 50422514Sdarrenr PAUSE(); 50522514Sdarrenr 50622514Sdarrenr printf("2.2.6 option length = 0, SSRR\n"); 50722514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SSRR; 50822514Sdarrenr s[IPOPT_OLEN] = 0; 50922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 51022514Sdarrenr fflush(stdout); 51122514Sdarrenr PAUSE(); 51222514Sdarrenr } 51322514Sdarrenr 51422514Sdarrenr (void) close(nfd); 51522514Sdarrenr} 51622514Sdarrenr 51722514Sdarrenr 51822514Sdarrenr/* 51922514Sdarrenr * test 3 (ICMP) 52022514Sdarrenr */ 52122514Sdarrenrvoid ip_test3(dev, mtu, ip, gwip, ptest) 52222514Sdarrenrchar *dev; 52322514Sdarrenrint mtu; 52422514Sdarrenrip_t *ip; 52522514Sdarrenrstruct in_addr gwip; 52622514Sdarrenrint ptest; 52722514Sdarrenr{ 52822514Sdarrenr static int ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 }; 52922514Sdarrenr static int ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 }; 53022514Sdarrenr struct timeval tv; 53122514Sdarrenr struct icmp *icp; 53222514Sdarrenr int nfd, i; 53322514Sdarrenr 53422514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 53522514Sdarrenr ip->ip_v = IPVERSION; 53622514Sdarrenr ip->ip_tos = 0; 53722514Sdarrenr ip->ip_off = 0; 53822514Sdarrenr ip->ip_ttl = 60; 53922514Sdarrenr ip->ip_p = IPPROTO_ICMP; 54022514Sdarrenr ip->ip_sum = 0; 54122514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp); 54222514Sdarrenr icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2)); 54337074Speter nfd = initdevice(dev, htons(1), 1); 54422514Sdarrenr 54522514Sdarrenr if (!ptest || (ptest == 1)) { 54622514Sdarrenr /* 54722514Sdarrenr * Type 0 - 31, 255, code = 0 54822514Sdarrenr */ 54922514Sdarrenr bzero((char *)icp, sizeof(*icp)); 55022514Sdarrenr for (i = 0; i < 32; i++) { 55122514Sdarrenr icp->icmp_type = i; 55222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 55322514Sdarrenr PAUSE(); 55422514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i); 55522514Sdarrenr } 55622514Sdarrenr icp->icmp_type = 255; 55722514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 55822514Sdarrenr PAUSE(); 55922514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255); 56022514Sdarrenr putchar('\n'); 56122514Sdarrenr } 56222514Sdarrenr 56322514Sdarrenr if (!ptest || (ptest == 2)) { 56422514Sdarrenr /* 56522514Sdarrenr * Type 3, code = 0 - 31 56622514Sdarrenr */ 56722514Sdarrenr icp->icmp_type = 3; 56822514Sdarrenr for (i = 0; i < 32; i++) { 56922514Sdarrenr icp->icmp_code = i; 57022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 57122514Sdarrenr PAUSE(); 57222514Sdarrenr printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i); 57322514Sdarrenr } 57422514Sdarrenr } 57522514Sdarrenr 57622514Sdarrenr if (!ptest || (ptest == 3)) { 57722514Sdarrenr /* 57822514Sdarrenr * Type 4, code = 0,127,128,255 57922514Sdarrenr */ 58022514Sdarrenr icp->icmp_type = 4; 58122514Sdarrenr icp->icmp_code = 0; 58222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 58322514Sdarrenr PAUSE(); 58422514Sdarrenr printf("3.3.1 ICMP type 4 code 0 (all 0's)\r"); 58522514Sdarrenr icp->icmp_code = 127; 58622514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 58722514Sdarrenr PAUSE(); 58822514Sdarrenr printf("3.3.2 ICMP type 4 code 127 (all 0's)\r"); 58922514Sdarrenr icp->icmp_code = 128; 59022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59122514Sdarrenr PAUSE(); 59222514Sdarrenr printf("3.3.3 ICMP type 4 code 128 (all 0's)\r"); 59322514Sdarrenr icp->icmp_code = 255; 59422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59522514Sdarrenr PAUSE(); 59622514Sdarrenr printf("3.3.4 ICMP type 4 code 255 (all 0's)\r"); 59722514Sdarrenr } 59822514Sdarrenr 59922514Sdarrenr if (!ptest || (ptest == 4)) { 60022514Sdarrenr /* 60122514Sdarrenr * Type 5, code = 0,127,128,255 60222514Sdarrenr */ 60322514Sdarrenr icp->icmp_type = 5; 60422514Sdarrenr icp->icmp_code = 0; 60522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 60622514Sdarrenr PAUSE(); 60722514Sdarrenr printf("3.4.1 ICMP type 5 code 0 (all 0's)\r"); 60822514Sdarrenr icp->icmp_code = 127; 60922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61022514Sdarrenr PAUSE(); 61122514Sdarrenr printf("3.4.2 ICMP type 5 code 127 (all 0's)\r"); 61222514Sdarrenr icp->icmp_code = 128; 61322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61422514Sdarrenr PAUSE(); 61522514Sdarrenr printf("3.4.3 ICMP type 5 code 128 (all 0's)\r"); 61622514Sdarrenr icp->icmp_code = 255; 61722514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61822514Sdarrenr PAUSE(); 61922514Sdarrenr printf("3.4.4 ICMP type 5 code 255 (all 0's)\r"); 62022514Sdarrenr } 62122514Sdarrenr 62222514Sdarrenr if (!ptest || (ptest == 5)) { 62322514Sdarrenr /* 62422514Sdarrenr * Type 8-10;13-18, code - 0,127,128,255 62522514Sdarrenr */ 62622514Sdarrenr for (i = 0; ict1[i]; i++) { 62722514Sdarrenr icp->icmp_type = ict1[i]; 62822514Sdarrenr icp->icmp_code = 0; 62922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 63022514Sdarrenr PAUSE(); 63122514Sdarrenr printf("3.5.%d ICMP type 5 code 0 (all 0's)\r", 63222514Sdarrenr i * 4); 63322514Sdarrenr icp->icmp_code = 127; 63422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 63522514Sdarrenr PAUSE(); 63622514Sdarrenr printf("3.5.%d ICMP type 5 code 127 (all 0's)\r", 63722514Sdarrenr i * 4 + 1); 63822514Sdarrenr icp->icmp_code = 128; 63922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64022514Sdarrenr PAUSE(); 64122514Sdarrenr printf("3.5.%d ICMP type 5 code 128 (all 0's)\r", 64222514Sdarrenr i * 4 + 2); 64322514Sdarrenr icp->icmp_code = 255; 64422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64522514Sdarrenr PAUSE(); 64622514Sdarrenr printf("3.5.%d ICMP type 5 code 255 (all 0's)\r", 64722514Sdarrenr i * 4 + 3); 64822514Sdarrenr } 64922514Sdarrenr putchar('\n'); 65022514Sdarrenr } 65122514Sdarrenr 65222514Sdarrenr if (!ptest || (ptest == 6)) { 65322514Sdarrenr /* 65422514Sdarrenr * Type 12, code - 0,127,128,129,255 65522514Sdarrenr */ 65622514Sdarrenr icp->icmp_type = 12; 65722514Sdarrenr icp->icmp_code = 0; 65822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 65922514Sdarrenr PAUSE(); 66022514Sdarrenr printf("3.6.1 ICMP type 12 code 0 (all 0's)\r"); 66122514Sdarrenr icp->icmp_code = 127; 66222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 66322514Sdarrenr PAUSE(); 66422514Sdarrenr printf("3.6.2 ICMP type 12 code 127 (all 0's)\r"); 66522514Sdarrenr icp->icmp_code = 128; 66622514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 66722514Sdarrenr PAUSE(); 66822514Sdarrenr printf("3.6.3 ICMP type 12 code 128 (all 0's)\r"); 66922514Sdarrenr icp->icmp_code = 129; 67022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67122514Sdarrenr PAUSE(); 67222514Sdarrenr printf("3.6.4 ICMP type 12 code 129 (all 0's)\r"); 67322514Sdarrenr icp->icmp_code = 255; 67422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67522514Sdarrenr PAUSE(); 67622514Sdarrenr printf("3.6.5 ICMP type 12 code 255 (all 0's)\r"); 67722514Sdarrenr putchar('\n'); 67822514Sdarrenr } 67922514Sdarrenr 68022514Sdarrenr if (!ptest || (ptest == 7)) { 68122514Sdarrenr /* 68222514Sdarrenr * Type 3;9-10;13-14;17-18 - shorter packets 68322514Sdarrenr */ 68422514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2; 68522514Sdarrenr for (i = 0; ict2[i]; i++) { 68622514Sdarrenr icp->icmp_type = ict1[i]; 68722514Sdarrenr icp->icmp_code = 0; 68822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 68922514Sdarrenr PAUSE(); 69022514Sdarrenr printf("3.5.%d ICMP type %d code 0 (all 0's)\r", 69122514Sdarrenr i * 4, icp->icmp_type); 69222514Sdarrenr icp->icmp_code = 127; 69322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 69422514Sdarrenr PAUSE(); 69522514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 69622514Sdarrenr i * 4 + 1, icp->icmp_type); 69722514Sdarrenr icp->icmp_code = 128; 69822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 69922514Sdarrenr PAUSE(); 70022514Sdarrenr printf("3.5.%d ICMP type %d code 128 (all 0's)\r", 70122514Sdarrenr i * 4 + 2, icp->icmp_type); 70222514Sdarrenr icp->icmp_code = 255; 70322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 70422514Sdarrenr PAUSE(); 70522514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 70622514Sdarrenr i * 4 + 3, icp->icmp_type); 70722514Sdarrenr } 70822514Sdarrenr putchar('\n'); 70922514Sdarrenr } 71022514Sdarrenr} 71122514Sdarrenr 71222514Sdarrenr 71322514Sdarrenr/* Perform test 4 (UDP) */ 71422514Sdarrenr 71522514Sdarrenrvoid ip_test4(dev, mtu, ip, gwip, ptest) 71622514Sdarrenrchar *dev; 71722514Sdarrenrint mtu; 71822514Sdarrenrip_t *ip; 71922514Sdarrenrstruct in_addr gwip; 72022514Sdarrenrint ptest; 72122514Sdarrenr{ 72222514Sdarrenr struct timeval tv; 72331183Speter udphdr_t *u; 72422514Sdarrenr int nfd, i; 72522514Sdarrenr 72622514Sdarrenr 72722514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 72822514Sdarrenr ip->ip_v = IPVERSION; 72922514Sdarrenr ip->ip_tos = 0; 73022514Sdarrenr ip->ip_off = 0; 73122514Sdarrenr ip->ip_ttl = 60; 73222514Sdarrenr ip->ip_p = IPPROTO_UDP; 73322514Sdarrenr ip->ip_sum = 0; 73422514Sdarrenr u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2)); 73537074Speter u->uh_sport = htons(1); 73637074Speter u->uh_dport = htons(1); 73737074Speter u->uh_ulen = htons(sizeof(*u) + 4); 73822514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 73922514Sdarrenr 74022514Sdarrenr if (!ptest || (ptest == 1)) { 74122514Sdarrenr /* 74222514Sdarrenr * Test 1. ulen > packet 74322514Sdarrenr */ 74437074Speter u->uh_ulen = htons(sizeof(*u) + 4); 74537074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 74622514Sdarrenr printf("4.1 UDP uh_ulen > packet size - short packets\n"); 74737074Speter for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) { 74837074Speter u->uh_ulen = htons(i); 74922514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 75022514Sdarrenr printf("%d\r", i); 75122514Sdarrenr fflush(stdout); 75222514Sdarrenr PAUSE(); 75322514Sdarrenr } 75422514Sdarrenr putchar('\n'); 75522514Sdarrenr } 75622514Sdarrenr 75722514Sdarrenr if (!ptest || (ptest == 2)) { 75822514Sdarrenr /* 75922514Sdarrenr * Test 2. ulen < packet 76022514Sdarrenr */ 76137074Speter u->uh_ulen = htons(sizeof(*u) + 4); 76237074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 76322514Sdarrenr printf("4.2 UDP uh_ulen < packet size - short packets\n"); 76437074Speter for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) { 76522514Sdarrenr ip->ip_len = i; 76622514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 76722514Sdarrenr printf("%d\r", i); 76822514Sdarrenr fflush(stdout); 76922514Sdarrenr PAUSE(); 77022514Sdarrenr } 77122514Sdarrenr putchar('\n'); 77222514Sdarrenr } 77322514Sdarrenr 77422514Sdarrenr if (!ptest || (ptest == 3)) { 77522514Sdarrenr /* 77622514Sdarrenr * Test 3: sport = 0, sport = 1, sport = 32767 77722514Sdarrenr * sport = 32768, sport = 65535 77822514Sdarrenr */ 77922514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 78037074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 78122514Sdarrenr printf("4.3.1 UDP sport = 0\n"); 78222514Sdarrenr u->uh_sport = 0; 78322514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 78422514Sdarrenr printf("0\n"); 78522514Sdarrenr fflush(stdout); 78622514Sdarrenr PAUSE(); 78722514Sdarrenr printf("4.3.2 UDP sport = 1\n"); 78837074Speter u->uh_sport = htons(1); 78922514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 79022514Sdarrenr printf("1\n"); 79122514Sdarrenr fflush(stdout); 79222514Sdarrenr PAUSE(); 79322514Sdarrenr printf("4.3.3 UDP sport = 32767\n"); 79437074Speter u->uh_sport = htons(32767); 79522514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 79622514Sdarrenr printf("32767\n"); 79722514Sdarrenr fflush(stdout); 79822514Sdarrenr PAUSE(); 79922514Sdarrenr printf("4.3.4 UDP sport = 32768\n"); 80037074Speter u->uh_sport = htons(32768); 80122514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 80222514Sdarrenr printf("32768\n"); 80322514Sdarrenr putchar('\n'); 80422514Sdarrenr fflush(stdout); 80522514Sdarrenr PAUSE(); 80622514Sdarrenr printf("4.3.5 UDP sport = 65535\n"); 80737074Speter u->uh_sport = htons(65535); 80822514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 80922514Sdarrenr printf("65535\n"); 81022514Sdarrenr fflush(stdout); 81122514Sdarrenr PAUSE(); 81222514Sdarrenr } 81322514Sdarrenr 81422514Sdarrenr if (!ptest || (ptest == 4)) { 81522514Sdarrenr /* 81622514Sdarrenr * Test 4: dport = 0, dport = 1, dport = 32767 81722514Sdarrenr * dport = 32768, dport = 65535 81822514Sdarrenr */ 81937074Speter u->uh_ulen = ntohs(sizeof(*u) + 4); 82037074Speter u->uh_sport = htons(1); 82137074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 82222514Sdarrenr printf("4.4.1 UDP dport = 0\n"); 82322514Sdarrenr u->uh_dport = 0; 82422514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 82522514Sdarrenr printf("0\n"); 82622514Sdarrenr fflush(stdout); 82722514Sdarrenr PAUSE(); 82822514Sdarrenr printf("4.4.2 UDP dport = 1\n"); 82937074Speter u->uh_dport = htons(1); 83022514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 83122514Sdarrenr printf("1\n"); 83222514Sdarrenr fflush(stdout); 83322514Sdarrenr PAUSE(); 83422514Sdarrenr printf("4.4.3 UDP dport = 32767\n"); 83537074Speter u->uh_dport = htons(32767); 83622514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 83722514Sdarrenr printf("32767\n"); 83822514Sdarrenr fflush(stdout); 83922514Sdarrenr PAUSE(); 84022514Sdarrenr printf("4.4.4 UDP dport = 32768\n"); 84137074Speter u->uh_dport = htons(32768); 84222514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 84322514Sdarrenr printf("32768\n"); 84422514Sdarrenr fflush(stdout); 84522514Sdarrenr PAUSE(); 84622514Sdarrenr printf("4.4.5 UDP dport = 65535\n"); 84737074Speter u->uh_dport = htons(65535); 84822514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 84922514Sdarrenr printf("65535\n"); 85022514Sdarrenr fflush(stdout); 85122514Sdarrenr PAUSE(); 85222514Sdarrenr } 85322514Sdarrenr 85431183Speter if (!ptest || (ptest == 5)) { 85522514Sdarrenr /* 85631183Speter * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) + 85731183Speter * sizeof(ip_t) 85822514Sdarrenr */ 85922514Sdarrenr printf("4.5 UDP 20 <= MTU <= 32\n"); 86037074Speter for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) { 86122514Sdarrenr (void) send_udp(nfd, i, ip, gwip); 86222514Sdarrenr printf("%d\r", i); 86322514Sdarrenr fflush(stdout); 86422514Sdarrenr PAUSE(); 86522514Sdarrenr } 86622514Sdarrenr putchar('\n'); 86722514Sdarrenr } 86822514Sdarrenr} 86922514Sdarrenr 87022514Sdarrenr 87122514Sdarrenr/* Perform test 5 (TCP) */ 87222514Sdarrenr 87322514Sdarrenrvoid ip_test5(dev, mtu, ip, gwip, ptest) 87422514Sdarrenrchar *dev; 87522514Sdarrenrint mtu; 87622514Sdarrenrip_t *ip; 87722514Sdarrenrstruct in_addr gwip; 87822514Sdarrenrint ptest; 87922514Sdarrenr{ 88022514Sdarrenr struct timeval tv; 88122514Sdarrenr tcphdr_t *t; 88222514Sdarrenr int nfd, i; 88322514Sdarrenr 88422514Sdarrenr t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2)); 88531183Speter#ifndef linux 88622514Sdarrenr t->th_x2 = 0; 88731183Speter#endif 88822514Sdarrenr t->th_off = 0; 88937074Speter t->th_sport = htons(1); 89037074Speter t->th_dport = htons(1); 89137074Speter t->th_win = htons(4096); 89222514Sdarrenr t->th_urp = 0; 89322514Sdarrenr t->th_sum = 0; 89437074Speter t->th_seq = htonl(1); 89522514Sdarrenr t->th_ack = 0; 89634739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 89722514Sdarrenr nfd = initdevice(dev, t->th_sport, 1); 89822514Sdarrenr 89922514Sdarrenr if (!ptest || (ptest == 1)) { 90022514Sdarrenr /* 90122514Sdarrenr * Test 1: flags variations, 0 - 3f 90222514Sdarrenr */ 90322514Sdarrenr t->th_off = sizeof(*t) >> 2; 90422514Sdarrenr printf("5.1 Test TCP flag combinations\n"); 90522514Sdarrenr for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN); 90622514Sdarrenr i++) { 90722514Sdarrenr t->th_flags = i; 90822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 90922514Sdarrenr printf("%d\r", i); 91022514Sdarrenr fflush(stdout); 91122514Sdarrenr PAUSE(); 91222514Sdarrenr } 91322514Sdarrenr putchar('\n'); 91422514Sdarrenr } 91522514Sdarrenr 91622514Sdarrenr if (!ptest || (ptest == 2)) { 91722514Sdarrenr t->th_flags = TH_SYN; 91822514Sdarrenr /* 91922514Sdarrenr * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000, 92022514Sdarrenr * seq = 0xa000000, seq = 0xffffffff 92122514Sdarrenr */ 92222514Sdarrenr printf("5.2.1 TCP seq = 0\n"); 92337074Speter t->th_seq = htonl(0); 92422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 92522514Sdarrenr fflush(stdout); 92622514Sdarrenr PAUSE(); 92722514Sdarrenr 92822514Sdarrenr printf("5.2.2 TCP seq = 1\n"); 92937074Speter t->th_seq = htonl(1); 93022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93122514Sdarrenr fflush(stdout); 93222514Sdarrenr PAUSE(); 93322514Sdarrenr 93422514Sdarrenr printf("5.2.3 TCP seq = 0x7fffffff\n"); 93537074Speter t->th_seq = htonl(0x7fffffff); 93622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93722514Sdarrenr fflush(stdout); 93822514Sdarrenr PAUSE(); 93922514Sdarrenr 94022514Sdarrenr printf("5.2.4 TCP seq = 0x80000000\n"); 94137074Speter t->th_seq = htonl(0x80000000); 94222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 94322514Sdarrenr fflush(stdout); 94422514Sdarrenr PAUSE(); 94522514Sdarrenr 94622514Sdarrenr printf("5.2.5 TCP seq = 0xc0000000\n"); 94737074Speter t->th_seq = htonl(0xc0000000); 94822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 94922514Sdarrenr fflush(stdout); 95022514Sdarrenr PAUSE(); 95122514Sdarrenr 95222514Sdarrenr printf("5.2.6 TCP seq = 0xffffffff\n"); 95337074Speter t->th_seq = htonl(0xffffffff); 95422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 95522514Sdarrenr fflush(stdout); 95622514Sdarrenr PAUSE(); 95722514Sdarrenr } 95822514Sdarrenr 95922514Sdarrenr if (!ptest || (ptest == 3)) { 96022514Sdarrenr t->th_flags = TH_ACK; 96122514Sdarrenr /* 96222514Sdarrenr * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000 96322514Sdarrenr * ack = 0xa000000, ack = 0xffffffff 96422514Sdarrenr */ 96522514Sdarrenr printf("5.3.1 TCP ack = 0\n"); 96622514Sdarrenr t->th_ack = 0; 96722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 96822514Sdarrenr fflush(stdout); 96922514Sdarrenr PAUSE(); 97022514Sdarrenr 97122514Sdarrenr printf("5.3.2 TCP ack = 1\n"); 97237074Speter t->th_ack = htonl(1); 97322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 97422514Sdarrenr fflush(stdout); 97522514Sdarrenr PAUSE(); 97622514Sdarrenr 97722514Sdarrenr printf("5.3.3 TCP ack = 0x7fffffff\n"); 97837074Speter t->th_ack = htonl(0x7fffffff); 97922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 98022514Sdarrenr fflush(stdout); 98122514Sdarrenr PAUSE(); 98222514Sdarrenr 98322514Sdarrenr printf("5.3.4 TCP ack = 0x80000000\n"); 98437074Speter t->th_ack = htonl(0x80000000); 98522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 98622514Sdarrenr fflush(stdout); 98722514Sdarrenr PAUSE(); 98822514Sdarrenr 98922514Sdarrenr printf("5.3.5 TCP ack = 0xc0000000\n"); 99037074Speter t->th_ack = htonl(0xc0000000); 99122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99222514Sdarrenr fflush(stdout); 99322514Sdarrenr PAUSE(); 99422514Sdarrenr 99522514Sdarrenr printf("5.3.6 TCP ack = 0xffffffff\n"); 99637074Speter t->th_ack = htonl(0xffffffff); 99722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99822514Sdarrenr fflush(stdout); 99922514Sdarrenr PAUSE(); 100022514Sdarrenr } 100122514Sdarrenr 100222514Sdarrenr if (!ptest || (ptest == 4)) { 100322514Sdarrenr t->th_flags = TH_SYN; 100422514Sdarrenr /* 100522514Sdarrenr * Test 4: win = 0, win = 32768, win = 65535 100622514Sdarrenr */ 100722514Sdarrenr printf("5.4.1 TCP win = 0\n"); 100837074Speter t->th_seq = htonl(0); 100922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 101022514Sdarrenr fflush(stdout); 101122514Sdarrenr PAUSE(); 101222514Sdarrenr 101322514Sdarrenr printf("5.4.2 TCP win = 32768\n"); 101437074Speter t->th_seq = htonl(0x7fff); 101522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 101622514Sdarrenr fflush(stdout); 101722514Sdarrenr PAUSE(); 101822514Sdarrenr 101922514Sdarrenr printf("5.4.3 TCP win = 65535\n"); 102037074Speter t->th_win = htons(0xffff); 102122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 102222514Sdarrenr fflush(stdout); 102322514Sdarrenr PAUSE(); 102422514Sdarrenr } 102522514Sdarrenr 102634739Speter#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \ 102734739Speter !defined(__sgi) 102822514Sdarrenr { 102934739Speter struct tcpcb *tcbp, tcb; 103022514Sdarrenr struct tcpiphdr ti; 103122514Sdarrenr struct sockaddr_in sin; 103222514Sdarrenr int fd, slen; 103322514Sdarrenr 103422514Sdarrenr bzero((char *)&sin, sizeof(sin)); 103522514Sdarrenr 103622514Sdarrenr for (i = 1; i < 63; i++) { 103722514Sdarrenr fd = socket(AF_INET, SOCK_STREAM, 0); 103834739Speter bzero((char *)&sin, sizeof(sin)); 103922514Sdarrenr sin.sin_addr.s_addr = ip->ip_dst.s_addr; 104022514Sdarrenr sin.sin_port = htons(i); 104134739Speter sin.sin_family = AF_INET; 104222514Sdarrenr if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin))) 104322514Sdarrenr break; 104434739Speter close(fd); 104522514Sdarrenr } 104622514Sdarrenr 104722514Sdarrenr if (i == 63) { 104822514Sdarrenr printf("Couldn't open a TCP socket between ports 1 and 63\n"); 104922514Sdarrenr printf("to host %s for test 5 and 6 - skipping.\n", 105022514Sdarrenr inet_ntoa(ip->ip_dst)); 105122514Sdarrenr goto skip_five_and_six; 105222514Sdarrenr } 105322514Sdarrenr 105422514Sdarrenr bcopy((char *)ip, (char *)&ti, sizeof(*ip)); 105534739Speter t->th_dport = htons(i); 105622514Sdarrenr slen = sizeof(sin); 105722514Sdarrenr if (!getsockname(fd, (struct sockaddr *)&sin, &slen)) 105834739Speter t->th_sport = sin.sin_port; 105934739Speter if (!(tcbp = find_tcp(fd, &ti))) { 106022514Sdarrenr printf("Can't find PCB\n"); 106122514Sdarrenr goto skip_five_and_six; 106222514Sdarrenr } 106334739Speter KMCPY(&tcb, tcbp, sizeof(tcb)); 106422514Sdarrenr ti.ti_win = tcb.rcv_adv; 106537074Speter ti.ti_seq = htonl(tcb.snd_nxt - 1); 106622514Sdarrenr ti.ti_ack = tcb.rcv_nxt; 106722514Sdarrenr 106822514Sdarrenr if (!ptest || (ptest == 5)) { 106922514Sdarrenr /* 107022514Sdarrenr * Test 5: urp 107122514Sdarrenr */ 107234739Speter t->th_flags = TH_ACK|TH_URG; 107334739Speter printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n", 107434739Speter ntohs(t->th_sport), ntohs(t->th_dport)); 107534739Speter t->th_urp = htons(1); 107622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 107722514Sdarrenr PAUSE(); 107834739Speter 107937074Speter t->th_seq = htonl(tcb.snd_nxt); 108034739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1; 108134739Speter t->th_urp = htons(0x7fff); 108222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 108322514Sdarrenr PAUSE(); 108434739Speter t->th_urp = htons(0x8000); 108522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 108622514Sdarrenr PAUSE(); 108734739Speter t->th_urp = htons(0xffff); 108822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 108922514Sdarrenr PAUSE(); 109037074Speter t->th_urp = 0; 109134739Speter t->th_flags &= ~TH_URG; 109234739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 109322514Sdarrenr } 109422514Sdarrenr 109522514Sdarrenr if (!ptest || (ptest == 6)) { 109622514Sdarrenr /* 109722514Sdarrenr * Test 6: data offset, off = 0, off is inside, off is outside 109822514Sdarrenr */ 109934739Speter t->th_flags = TH_ACK; 110034739Speter printf("5.6.1 TCP off = 1-15, len = 40\n"); 110134739Speter for (i = 1; i < 16; i++) { 110222514Sdarrenr ti.ti_off = ntohs(i); 110322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 110422514Sdarrenr printf("%d\r", i); 110522514Sdarrenr fflush(stdout); 110622514Sdarrenr PAUSE(); 110722514Sdarrenr } 110822514Sdarrenr putchar('\n'); 110934739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 111022514Sdarrenr } 111122514Sdarrenr 111222514Sdarrenr (void) close(fd); 111322514Sdarrenr } 111422514Sdarrenrskip_five_and_six: 111522514Sdarrenr#endif 111637074Speter t->th_seq = htonl(1); 111737074Speter t->th_ack = htonl(1); 111834739Speter t->th_off = 0; 111922514Sdarrenr 112022514Sdarrenr if (!ptest || (ptest == 7)) { 112122514Sdarrenr t->th_flags = TH_SYN; 112222514Sdarrenr /* 112322514Sdarrenr * Test 7: sport = 0, sport = 1, sport = 32767 112422514Sdarrenr * sport = 32768, sport = 65535 112522514Sdarrenr */ 112622514Sdarrenr printf("5.7.1 TCP sport = 0\n"); 112722514Sdarrenr t->th_sport = 0; 112822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 112922514Sdarrenr fflush(stdout); 113022514Sdarrenr PAUSE(); 113122514Sdarrenr 113222514Sdarrenr printf("5.7.2 TCP sport = 1\n"); 113337074Speter t->th_sport = htons(1); 113422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 113522514Sdarrenr fflush(stdout); 113622514Sdarrenr PAUSE(); 113722514Sdarrenr 113822514Sdarrenr printf("5.7.3 TCP sport = 32767\n"); 113937074Speter t->th_sport = htons(32767); 114022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114122514Sdarrenr fflush(stdout); 114222514Sdarrenr PAUSE(); 114322514Sdarrenr 114422514Sdarrenr printf("5.7.4 TCP sport = 32768\n"); 114537074Speter t->th_sport = htons(32768); 114622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114722514Sdarrenr fflush(stdout); 114822514Sdarrenr PAUSE(); 114922514Sdarrenr 115022514Sdarrenr printf("5.7.5 TCP sport = 65535\n"); 115137074Speter t->th_sport = htons(65535); 115222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 115322514Sdarrenr fflush(stdout); 115422514Sdarrenr PAUSE(); 115522514Sdarrenr } 115622514Sdarrenr 115722514Sdarrenr if (!ptest || (ptest == 8)) { 115837074Speter t->th_sport = htons(1); 115934739Speter t->th_flags = TH_SYN; 116022514Sdarrenr /* 116122514Sdarrenr * Test 8: dport = 0, dport = 1, dport = 32767 116222514Sdarrenr * dport = 32768, dport = 65535 116322514Sdarrenr */ 116422514Sdarrenr printf("5.8.1 TCP dport = 0\n"); 116522514Sdarrenr t->th_dport = 0; 116622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 116722514Sdarrenr fflush(stdout); 116822514Sdarrenr PAUSE(); 116922514Sdarrenr 117022514Sdarrenr printf("5.8.2 TCP dport = 1\n"); 117137074Speter t->th_dport = htons(1); 117222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 117322514Sdarrenr fflush(stdout); 117422514Sdarrenr PAUSE(); 117522514Sdarrenr 117622514Sdarrenr printf("5.8.3 TCP dport = 32767\n"); 117737074Speter t->th_dport = htons(32767); 117822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 117922514Sdarrenr fflush(stdout); 118022514Sdarrenr PAUSE(); 118122514Sdarrenr 118222514Sdarrenr printf("5.8.4 TCP dport = 32768\n"); 118337074Speter t->th_dport = htons(32768); 118422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 118522514Sdarrenr fflush(stdout); 118622514Sdarrenr PAUSE(); 118722514Sdarrenr 118822514Sdarrenr printf("5.8.5 TCP dport = 65535\n"); 118937074Speter t->th_dport = htons(65535); 119022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 119122514Sdarrenr fflush(stdout); 119222514Sdarrenr PAUSE(); 119322514Sdarrenr } 119434739Speter 119534739Speter /* LAND attack - self connect, so make src & dst ip/port the same */ 119634739Speter if (!ptest || (ptest == 9)) { 119734739Speter printf("5.9 TCP LAND attack. sport = 25, dport = 25\n"); 119834739Speter /* chose SMTP port 25 */ 119934739Speter t->th_sport = htons(25); 120034739Speter t->th_dport = htons(25); 120134739Speter t->th_flags = TH_SYN; 120234739Speter ip->ip_src = ip->ip_dst; 120334739Speter (void) send_tcp(nfd, mtu, ip, gwip); 120434739Speter fflush(stdout); 120534739Speter PAUSE(); 120634739Speter } 120734739Speter 120822514Sdarrenr /* TCP options header checking */ 120922514Sdarrenr /* 0 length options, etc */ 121022514Sdarrenr} 121122514Sdarrenr 121222514Sdarrenr 121322514Sdarrenr/* Perform test 6 (exhaust mbuf test) */ 121422514Sdarrenr 121522514Sdarrenrvoid ip_test6(dev, mtu, ip, gwip, ptest) 121622514Sdarrenrchar *dev; 121722514Sdarrenrint mtu; 121822514Sdarrenrip_t *ip; 121922514Sdarrenrstruct in_addr gwip; 122022514Sdarrenrint ptest; 122122514Sdarrenr{ 122222514Sdarrenr struct timeval tv; 122322514Sdarrenr udphdr_t *u; 122422514Sdarrenr int nfd, i, j, k; 122522514Sdarrenr 122622514Sdarrenr ip->ip_v = IPVERSION; 122722514Sdarrenr ip->ip_tos = 0; 122822514Sdarrenr ip->ip_off = 0; 122922514Sdarrenr ip->ip_ttl = 60; 123022514Sdarrenr ip->ip_p = IPPROTO_UDP; 123122514Sdarrenr ip->ip_sum = 0; 123222514Sdarrenr u = (udphdr_t *)(ip + 1); 123337074Speter u->uh_sport = htons(1); 123437074Speter u->uh_dport = htons(9); 123522514Sdarrenr u->uh_sum = 0; 123622514Sdarrenr 123722514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 123837074Speter u->uh_ulen = htons(7168); 123922514Sdarrenr 124034739Speter printf("6. Exhaustive mbuf test.\n"); 124134739Speter printf(" Send 7k packet in 768 & 128 byte fragments, 128 times.\n"); 124234739Speter printf(" Total of around 8,900 packets\n"); 124322514Sdarrenr for (i = 0; i < 128; i++) { 124422514Sdarrenr /* 124522514Sdarrenr * First send the entire packet in 768 byte chunks. 124622514Sdarrenr */ 124722514Sdarrenr ip->ip_len = sizeof(*ip) + 768 + sizeof(*u); 124822514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 124937074Speter ip->ip_off = htons(IP_MF); 125022514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 125122514Sdarrenr printf("%d %d\r", i, 0); 125222514Sdarrenr fflush(stdout); 125322514Sdarrenr PAUSE(); 125422514Sdarrenr /* 125522514Sdarrenr * And again using 128 byte chunks. 125622514Sdarrenr */ 125722514Sdarrenr ip->ip_len = sizeof(*ip) + 128 + sizeof(*u); 125837074Speter ip->ip_off = htons(IP_MF); 125922514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 126022514Sdarrenr printf("%d %d\r", i, 0); 126122514Sdarrenr fflush(stdout); 126222514Sdarrenr PAUSE(); 126322514Sdarrenr 126422514Sdarrenr for (j = 768; j < 3584; j += 768) { 126522514Sdarrenr ip->ip_len = sizeof(*ip) + 768; 126637074Speter ip->ip_off = htons(IP_MF|(j>>3)); 126722514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 126822514Sdarrenr printf("%d %d\r", i, j); 126922514Sdarrenr fflush(stdout); 127022514Sdarrenr PAUSE(); 127122514Sdarrenr 127222514Sdarrenr ip->ip_len = sizeof(*ip) + 128; 127322514Sdarrenr for (k = j - 768; k < j; k += 128) { 127437074Speter ip->ip_off = htons(IP_MF|(k>>3)); 127522514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 127622514Sdarrenr printf("%d %d\r", i, k); 127722514Sdarrenr fflush(stdout); 127822514Sdarrenr PAUSE(); 127922514Sdarrenr } 128022514Sdarrenr } 128122514Sdarrenr } 128222514Sdarrenr putchar('\n'); 128322514Sdarrenr} 128422514Sdarrenr 128522514Sdarrenr 128622514Sdarrenr/* Perform test 7 (random packets) */ 128722514Sdarrenr 128822514Sdarrenrstatic u_long tbuf[64]; 128922514Sdarrenr 129022514Sdarrenrvoid ip_test7(dev, mtu, ip, gwip, ptest) 129122514Sdarrenrchar *dev; 129222514Sdarrenrint mtu; 129322514Sdarrenrip_t *ip; 129422514Sdarrenrstruct in_addr gwip; 129522514Sdarrenrint ptest; 129622514Sdarrenr{ 129722514Sdarrenr ip_t *pip; 129822514Sdarrenr struct timeval tv; 129922514Sdarrenr int nfd, i, j; 130022514Sdarrenr u_char *s; 130122514Sdarrenr 130222514Sdarrenr nfd = initdevice(dev, 0, 1); 130322514Sdarrenr pip = (ip_t *)tbuf; 130422514Sdarrenr 130522514Sdarrenr srand(time(NULL) ^ (getpid() * getppid())); 130622514Sdarrenr 130722514Sdarrenr printf("7. send 1024 random IP packets.\n"); 130822514Sdarrenr 130922514Sdarrenr for (i = 0; i < 512; i++) { 131022514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 131122514Sdarrenr *s = (rand() >> 13) & 0xff; 131222514Sdarrenr pip->ip_v = IPVERSION; 131322514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 131422514Sdarrenr sizeof(struct in_addr)); 131522514Sdarrenr pip->ip_sum = 0; 131622514Sdarrenr pip->ip_len &= 0xff; 131722514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 131822514Sdarrenr printf("%d\r", i); 131922514Sdarrenr fflush(stdout); 132022514Sdarrenr PAUSE(); 132122514Sdarrenr } 132222514Sdarrenr putchar('\n'); 132322514Sdarrenr 132422514Sdarrenr for (i = 0; i < 512; i++) { 132522514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 132622514Sdarrenr *s = (rand() >> 13) & 0xff; 132722514Sdarrenr pip->ip_v = IPVERSION; 132837074Speter pip->ip_off &= htons(0xc000); 132922514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 133022514Sdarrenr sizeof(struct in_addr)); 133122514Sdarrenr pip->ip_sum = 0; 133222514Sdarrenr pip->ip_len &= 0xff; 133322514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 133422514Sdarrenr printf("%d\r", i); 133522514Sdarrenr fflush(stdout); 133622514Sdarrenr PAUSE(); 133722514Sdarrenr } 133822514Sdarrenr putchar('\n'); 133922514Sdarrenr} 1340