iptests.c revision 92691
122514Sdarrenr/* 253024Sguido * Copyright (C) 1993-1998 by Darren Reed. 322514Sdarrenr * 480490Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 522514Sdarrenr */ 692691Sdarrenr#ifdef __sgi 792691Sdarrenr# include <sys/ptimers.h> 892691Sdarrenr#endif 922514Sdarrenr#include <stdio.h> 1022514Sdarrenr#include <unistd.h> 1122514Sdarrenr#include <stdlib.h> 1222514Sdarrenr#include <string.h> 1322514Sdarrenr#include <sys/types.h> 1422514Sdarrenr#include <sys/time.h> 1522514Sdarrenr#include <sys/param.h> 1653024Sguido#define _KERNEL 1753024Sguido#define KERNEL 1831183Speter#if !defined(solaris) && !defined(linux) && !defined(__sgi) 1922514Sdarrenr# include <sys/file.h> 2053024Sguido#else 2153024Sguido# ifdef solaris 2253024Sguido# include <sys/dditypes.h> 2353024Sguido# endif 2453024Sguido#endif 2553024Sguido#undef _KERNEL 2653024Sguido#undef KERNEL 2753024Sguido#if !defined(solaris) && !defined(linux) && !defined(__sgi) 2822514Sdarrenr# include <nlist.h> 2922514Sdarrenr# include <sys/user.h> 3022514Sdarrenr# include <sys/proc.h> 3122514Sdarrenr#endif 3231183Speter#if !defined(ultrix) && !defined(hpux) && !defined(linux) && !defined(__sgi) 3331183Speter# include <kvm.h> 3431183Speter#endif 3531183Speter#ifndef ultrix 3631183Speter# include <sys/socket.h> 3731183Speter#endif 3826119Sdarrenr#if defined(solaris) 3926119Sdarrenr# include <sys/stream.h> 4026119Sdarrenr#endif 4122514Sdarrenr#include <sys/socketvar.h> 4222514Sdarrenr#ifdef sun 4322514Sdarrenr#include <sys/systm.h> 4422514Sdarrenr#include <sys/session.h> 4522514Sdarrenr#endif 4622514Sdarrenr#if BSD >= 199103 4731183Speter# include <sys/sysctl.h> 4831183Speter# include <sys/filedesc.h> 4931183Speter# include <paths.h> 5022514Sdarrenr#endif 5122514Sdarrenr#include <netinet/in_systm.h> 5222514Sdarrenr#include <sys/socket.h> 5322514Sdarrenr#include <net/if.h> 5431183Speter#if defined(linux) && (LINUX >= 0200) 5531183Speter# include <asm/atomic.h> 5631183Speter#endif 5731183Speter#if !defined(linux) 5831183Speter# include <net/route.h> 5931183Speter#else 6031183Speter# define __KERNEL__ /* because there's a macro not wrapped by this */ 6131183Speter# include <net/route.h> /* in this file :-/ */ 6231183Speter#endif 6322514Sdarrenr#include <netinet/in.h> 6422514Sdarrenr#include <arpa/inet.h> 6522514Sdarrenr#include <netinet/ip.h> 6622514Sdarrenr#include <netinet/tcp.h> 6722514Sdarrenr#include <netinet/udp.h> 6822514Sdarrenr#include <netinet/ip_icmp.h> 6931183Speter#ifndef linux 7031183Speter# include <netinet/ip_var.h> 7131183Speter# include <netinet/in_pcb.h> 7231183Speter# include <netinet/tcp_timer.h> 7331183Speter# include <netinet/tcp_var.h> 7431183Speter#endif 7531183Speter#if defined(__SVR4) || defined(__svr4__) || defined(__sgi) 7631183Speter# include <sys/sysmacros.h> 7731183Speter#endif 7824583Sdarrenr#include "ipsend.h" 7922514Sdarrenr 8084843Sbde#if 0 8180490Sdarrenr#if !defined(lint) 8280490Sdarrenrstatic const char sccsid[] = "%W% %G% (C)1995 Darren Reed"; 8392691Sdarrenrstatic const char rcsid[] = "@(#)$Id: iptests.c,v 2.1.4.5 2002/02/22 15:32:58 darrenr Exp $"; 8480490Sdarrenr#endif 8584843Sbde#endif 8624583Sdarrenr 8784843Sbde__FBSDID("$FreeBSD: head/contrib/ipfilter/ipsend/iptests.c 92691 2002-03-19 11:48:16Z darrenr $"); 8880490Sdarrenr 8984843Sbde 9022514Sdarrenr#define PAUSE() tv.tv_sec = 0; tv.tv_usec = 10000; \ 9122514Sdarrenr (void) select(0, NULL, NULL, NULL, &tv) 9222514Sdarrenr 9322514Sdarrenr 9422514Sdarrenrvoid ip_test1(dev, mtu, ip, gwip, ptest) 9522514Sdarrenrchar *dev; 9622514Sdarrenrint mtu; 9722514Sdarrenrip_t *ip; 9822514Sdarrenrstruct in_addr gwip; 9922514Sdarrenrint ptest; 10022514Sdarrenr{ 10122514Sdarrenr struct timeval tv; 10222514Sdarrenr udphdr_t *u; 10331183Speter int nfd, i = 0, len, id = getpid(); 10422514Sdarrenr 10522514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 10622514Sdarrenr ip->ip_v = IPVERSION; 10722514Sdarrenr ip->ip_tos = 0; 10822514Sdarrenr ip->ip_off = 0; 10922514Sdarrenr ip->ip_ttl = 60; 11022514Sdarrenr ip->ip_p = IPPROTO_UDP; 11122514Sdarrenr ip->ip_sum = 0; 11222514Sdarrenr u = (udphdr_t *)(ip + 1); 11337074Speter u->uh_sport = htons(1); 11437074Speter u->uh_dport = htons(9); 11522514Sdarrenr u->uh_sum = 0; 11637074Speter u->uh_ulen = htons(sizeof(*u) + 4); 11737074Speter ip->ip_len = sizeof(*ip) + ntohs(u->uh_ulen); 11822514Sdarrenr len = ip->ip_len; 11922514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 12022514Sdarrenr 12122514Sdarrenr if (!ptest || (ptest == 1)) { 12222514Sdarrenr /* 12322514Sdarrenr * Part1: hl < len 12422514Sdarrenr */ 12522514Sdarrenr ip->ip_id = 0; 12622514Sdarrenr printf("1.1. sending packets with ip_hl < ip_len\n"); 12737074Speter for (i = 0; i < ((sizeof(*ip) + ntohs(u->uh_ulen)) >> 2); i++) { 12822514Sdarrenr ip->ip_hl = i >> 2; 12922514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 13022514Sdarrenr printf("%d\r", i); 13122514Sdarrenr fflush(stdout); 13222514Sdarrenr PAUSE(); 13322514Sdarrenr } 13422514Sdarrenr putchar('\n'); 13522514Sdarrenr } 13622514Sdarrenr 13722514Sdarrenr if (!ptest || (ptest == 2)) { 13822514Sdarrenr /* 13922514Sdarrenr * Part2: hl > len 14022514Sdarrenr */ 14122514Sdarrenr ip->ip_id = 0; 14222514Sdarrenr printf("1.2. sending packets with ip_hl > ip_len\n"); 14337074Speter for (; i < ((sizeof(*ip) * 2 + ntohs(u->uh_ulen)) >> 2); i++) { 14422514Sdarrenr ip->ip_hl = i >> 2; 14522514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 14622514Sdarrenr printf("%d\r", i); 14722514Sdarrenr fflush(stdout); 14822514Sdarrenr PAUSE(); 14922514Sdarrenr } 15022514Sdarrenr putchar('\n'); 15122514Sdarrenr } 15222514Sdarrenr 15322514Sdarrenr if (!ptest || (ptest == 3)) { 15422514Sdarrenr /* 15522514Sdarrenr * Part3: v < 4 15622514Sdarrenr */ 15722514Sdarrenr ip->ip_id = 0; 15822514Sdarrenr printf("1.3. ip_v < 4\n"); 15922514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 16022514Sdarrenr for (i = 0; i < 4; i++) { 16122514Sdarrenr ip->ip_v = i; 16222514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 16322514Sdarrenr printf("%d\r", i); 16422514Sdarrenr fflush(stdout); 16522514Sdarrenr PAUSE(); 16622514Sdarrenr } 16722514Sdarrenr putchar('\n'); 16822514Sdarrenr } 16922514Sdarrenr 17022514Sdarrenr if (!ptest || (ptest == 4)) { 17122514Sdarrenr /* 17222514Sdarrenr * Part4: v > 4 17322514Sdarrenr */ 17422514Sdarrenr ip->ip_id = 0; 17522514Sdarrenr printf("1.4. ip_v > 4\n"); 17622514Sdarrenr for (i = 5; i < 16; i++) { 17722514Sdarrenr ip->ip_v = i; 17822514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 17922514Sdarrenr printf("%d\r", i); 18022514Sdarrenr fflush(stdout); 18122514Sdarrenr PAUSE(); 18222514Sdarrenr } 18322514Sdarrenr putchar('\n'); 18422514Sdarrenr } 18522514Sdarrenr 18622514Sdarrenr if (!ptest || (ptest == 5)) { 18722514Sdarrenr /* 18822514Sdarrenr * Part5: len < packet 18922514Sdarrenr */ 19022514Sdarrenr ip->ip_id = 0; 19122514Sdarrenr ip->ip_v = IPVERSION; 19222514Sdarrenr i = ip->ip_len + 1; 19322514Sdarrenr printf("1.5.0 ip_len < packet size (size++, long packets)\n"); 19437074Speter for (; i < (ip->ip_len * 2); i++) { 19522514Sdarrenr ip->ip_id = htons(id++); 19622514Sdarrenr ip->ip_sum = 0; 19724583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 19824583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 19922514Sdarrenr printf("%d\r", i); 20022514Sdarrenr fflush(stdout); 20122514Sdarrenr PAUSE(); 20222514Sdarrenr } 20322514Sdarrenr putchar('\n'); 20422514Sdarrenr printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n"); 20522514Sdarrenr for (i = len; i > 0; i--) { 20622514Sdarrenr ip->ip_id = htons(id++); 20737074Speter ip->ip_len = i; 20822514Sdarrenr ip->ip_sum = 0; 20924583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 21024583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 21122514Sdarrenr printf("%d\r", i); 21222514Sdarrenr fflush(stdout); 21322514Sdarrenr PAUSE(); 21422514Sdarrenr } 21522514Sdarrenr putchar('\n'); 21622514Sdarrenr } 21722514Sdarrenr 21822514Sdarrenr if (!ptest || (ptest == 6)) { 21922514Sdarrenr /* 22022514Sdarrenr * Part6: len > packet 22122514Sdarrenr */ 22222514Sdarrenr ip->ip_id = 0; 22322514Sdarrenr printf("1.6.0 ip_len > packet size (increase ip_len)\n"); 22422514Sdarrenr for (i = len + 1; i < (len * 2); i++) { 22522514Sdarrenr ip->ip_id = htons(id++); 22637074Speter ip->ip_len = i; 22722514Sdarrenr ip->ip_sum = 0; 22824583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 22924583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 23022514Sdarrenr printf("%d\r", i); 23122514Sdarrenr fflush(stdout); 23222514Sdarrenr PAUSE(); 23322514Sdarrenr } 23422514Sdarrenr putchar('\n'); 23537074Speter ip->ip_len = len; 23622514Sdarrenr printf("1.6.1 ip_len > packet size (size--, short packets)\n"); 23722514Sdarrenr for (i = len; i > 0; i--) { 23822514Sdarrenr ip->ip_id = htons(id++); 23922514Sdarrenr ip->ip_sum = 0; 24024583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 24124583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 24222514Sdarrenr printf("%d\r", i); 24322514Sdarrenr fflush(stdout); 24422514Sdarrenr PAUSE(); 24522514Sdarrenr } 24622514Sdarrenr putchar('\n'); 24722514Sdarrenr } 24822514Sdarrenr 24922514Sdarrenr if (!ptest || (ptest == 7)) { 25022514Sdarrenr /* 25122514Sdarrenr * Part7: 0 length fragment 25222514Sdarrenr */ 25322514Sdarrenr printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n"); 25422514Sdarrenr ip->ip_id = 0; 25522514Sdarrenr ip->ip_len = sizeof(*ip); 25622514Sdarrenr ip->ip_off = htons(IP_MF); 25722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 25822514Sdarrenr fflush(stdout); 25922514Sdarrenr PAUSE(); 26022514Sdarrenr 26122514Sdarrenr printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n"); 26222514Sdarrenr ip->ip_id = 0; 26322514Sdarrenr ip->ip_len = sizeof(*ip); 26422514Sdarrenr ip->ip_off = htons(IP_MF); 26522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 26622514Sdarrenr fflush(stdout); 26722514Sdarrenr PAUSE(); 26822514Sdarrenr 26922514Sdarrenr printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n"); 27022514Sdarrenr ip->ip_id = 0; 27122514Sdarrenr ip->ip_len = sizeof(*ip); 27222514Sdarrenr ip->ip_off = htons(0xa000); 27322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 27422514Sdarrenr fflush(stdout); 27522514Sdarrenr PAUSE(); 27622514Sdarrenr 27722514Sdarrenr printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n"); 27822514Sdarrenr ip->ip_id = 0; 27922514Sdarrenr ip->ip_len = sizeof(*ip); 28022514Sdarrenr ip->ip_off = htons(0x0100); 28122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 28222514Sdarrenr fflush(stdout); 28322514Sdarrenr PAUSE(); 28422514Sdarrenr } 28522514Sdarrenr 28622514Sdarrenr if (!ptest || (ptest == 8)) { 28722514Sdarrenr struct timeval tv; 28822514Sdarrenr 28922514Sdarrenr gettimeofday(&tv, NULL); 29022514Sdarrenr srand(tv.tv_sec ^ getpid() ^ tv.tv_usec); 29122514Sdarrenr /* 29222514Sdarrenr * Part8.1: 63k packet + 1k fragment at offset 0x1ffe 29322514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 29422514Sdarrenr * don't bother about the ICMP header, we're not worrying 29522514Sdarrenr * about that here. 29622514Sdarrenr */ 29722514Sdarrenr ip->ip_p = IPPROTO_ICMP; 29837074Speter ip->ip_off = htons(IP_MF); 29922514Sdarrenr u->uh_dport = htons(9); 30022514Sdarrenr ip->ip_id = htons(id++); 30122514Sdarrenr printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n"); 30222514Sdarrenr ip->ip_len = 768 + 20 + 8; 30322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 30422514Sdarrenr printf("%d\r", i); 30522514Sdarrenr 30622514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 30722514Sdarrenr i = 512; 30822514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 30992691Sdarrenr ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff)); 31022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 31122514Sdarrenr printf("%d\r", i); 31222514Sdarrenr fflush(stdout); 31322514Sdarrenr PAUSE(); 31422514Sdarrenr } 31522514Sdarrenr ip->ip_len = 896 + 20; 31692691Sdarrenr ip->ip_off = htons((i >> 3) & 0x1fff); 31722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 31822514Sdarrenr printf("%d\r", i); 31922514Sdarrenr putchar('\n'); 32022514Sdarrenr fflush(stdout); 32122514Sdarrenr 32222514Sdarrenr /* 32322514Sdarrenr * Part8.2: 63k packet + 1k fragment at offset 0x1ffe 32422514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 32522514Sdarrenr * don't bother about the ICMP header, we're not worrying 32622514Sdarrenr * about that here. (Lossage here) 32722514Sdarrenr */ 32822514Sdarrenr ip->ip_p = IPPROTO_ICMP; 32937074Speter ip->ip_off = htons(IP_MF); 33022514Sdarrenr u->uh_dport = htons(9); 33122514Sdarrenr ip->ip_id = htons(id++); 33222514Sdarrenr printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n"); 33322514Sdarrenr ip->ip_len = 768 + 20 + 8; 33422514Sdarrenr if ((rand() & 0x1f) != 0) { 33522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 33622514Sdarrenr printf("%d\r", i); 33722514Sdarrenr } else 33822514Sdarrenr printf("skip 0\n"); 33922514Sdarrenr 34022514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 34122514Sdarrenr i = 512; 34222514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 34392691Sdarrenr ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff)); 34422514Sdarrenr if ((rand() & 0x1f) != 0) { 34522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 34622514Sdarrenr printf("%d\r", i); 34722514Sdarrenr } else 34822514Sdarrenr printf("skip %d\n", i); 34922514Sdarrenr fflush(stdout); 35022514Sdarrenr PAUSE(); 35122514Sdarrenr } 35222514Sdarrenr ip->ip_len = 896 + 20; 35392691Sdarrenr ip->ip_off = htons((i >> 3) & 0x1fff); 35422514Sdarrenr if ((rand() & 0x1f) != 0) { 35522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 35622514Sdarrenr printf("%d\r", i); 35722514Sdarrenr } else 35822514Sdarrenr printf("skip\n"); 35922514Sdarrenr putchar('\n'); 36022514Sdarrenr fflush(stdout); 36122514Sdarrenr 36222514Sdarrenr /* 36322514Sdarrenr * Part8.3: 33k packet - test for not dealing with -ve length 36422514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 36522514Sdarrenr * don't bother about the ICMP header, we're not worrying 36622514Sdarrenr * about that here. 36722514Sdarrenr */ 36822514Sdarrenr ip->ip_p = IPPROTO_ICMP; 36937074Speter ip->ip_off = htons(IP_MF); 37022514Sdarrenr u->uh_dport = htons(9); 37122514Sdarrenr ip->ip_id = htons(id++); 37222514Sdarrenr printf("1.8.3 33k packet\n"); 37322514Sdarrenr ip->ip_len = 768 + 20 + 8; 37422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 37522514Sdarrenr printf("%d\r", i); 37622514Sdarrenr 37722514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 37822514Sdarrenr i = 512; 37922514Sdarrenr for (; i < (32 * 1024 + 768); i += 768) { 38092691Sdarrenr ip->ip_off = htons(IP_MF | ((i >> 3) & 0x1fff)); 38122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 38222514Sdarrenr printf("%d\r", i); 38322514Sdarrenr fflush(stdout); 38422514Sdarrenr PAUSE(); 38522514Sdarrenr } 38622514Sdarrenr ip->ip_len = 896 + 20; 38792691Sdarrenr ip->ip_off = htons((i >> 3) & 0x1fff); 38822514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 38922514Sdarrenr printf("%d\r", i); 39022514Sdarrenr putchar('\n'); 39122514Sdarrenr fflush(stdout); 39222514Sdarrenr } 39322514Sdarrenr 39422514Sdarrenr ip->ip_len = len; 39522514Sdarrenr ip->ip_off = 0; 39622514Sdarrenr if (!ptest || (ptest == 9)) { 39722514Sdarrenr /* 39822514Sdarrenr * Part9: off & 0x8000 == 0x8000 39922514Sdarrenr */ 40022514Sdarrenr ip->ip_id = 0; 40137074Speter ip->ip_off = htons(0x8000); 40222514Sdarrenr printf("1.9. ip_off & 0x8000 == 0x8000\n"); 40322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 40422514Sdarrenr fflush(stdout); 40522514Sdarrenr PAUSE(); 40622514Sdarrenr } 40722514Sdarrenr 40822514Sdarrenr ip->ip_off = 0; 40922514Sdarrenr 41022514Sdarrenr if (!ptest || (ptest == 10)) { 41122514Sdarrenr /* 41222514Sdarrenr * Part10: ttl = 255 41322514Sdarrenr */ 41422514Sdarrenr ip->ip_id = 0; 41522514Sdarrenr ip->ip_ttl = 255; 41622514Sdarrenr printf("1.10.0 ip_ttl = 255\n"); 41722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 41822514Sdarrenr fflush(stdout); 41922514Sdarrenr PAUSE(); 42022514Sdarrenr 42122514Sdarrenr ip->ip_ttl = 128; 42222514Sdarrenr printf("1.10.1 ip_ttl = 128\n"); 42322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 42422514Sdarrenr fflush(stdout); 42522514Sdarrenr PAUSE(); 42622514Sdarrenr 42722514Sdarrenr ip->ip_ttl = 0; 42822514Sdarrenr printf("1.10.2 ip_ttl = 0\n"); 42922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 43022514Sdarrenr fflush(stdout); 43122514Sdarrenr PAUSE(); 43222514Sdarrenr } 43322514Sdarrenr 43422514Sdarrenr (void) close(nfd); 43522514Sdarrenr} 43622514Sdarrenr 43722514Sdarrenr 43822514Sdarrenrvoid ip_test2(dev, mtu, ip, gwip, ptest) 43922514Sdarrenrchar *dev; 44022514Sdarrenrint mtu; 44122514Sdarrenrip_t *ip; 44222514Sdarrenrstruct in_addr gwip; 44322514Sdarrenrint ptest; 44422514Sdarrenr{ 44522514Sdarrenr struct timeval tv; 44622514Sdarrenr int nfd; 44722514Sdarrenr u_char *s; 44822514Sdarrenr 44922514Sdarrenr s = (u_char *)(ip + 1); 45037074Speter nfd = initdevice(dev, htons(1), 1); 45122514Sdarrenr 45222514Sdarrenr ip->ip_hl = 6; 45322514Sdarrenr ip->ip_len = ip->ip_hl << 2; 45422514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_NOP; 45522514Sdarrenr s++; 45622514Sdarrenr if (!ptest || (ptest == 1)) { 45722514Sdarrenr /* 45822514Sdarrenr * Test 1: option length > packet length, 45922514Sdarrenr * header length == packet length 46022514Sdarrenr */ 46122514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 46222514Sdarrenr s[IPOPT_OLEN] = 4; 46322514Sdarrenr s[IPOPT_OFFSET] = IPOPT_MINOFF; 46422514Sdarrenr ip->ip_p = IPPROTO_IP; 46522514Sdarrenr printf("2.1 option length > packet length\n"); 46622514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 46722514Sdarrenr fflush(stdout); 46822514Sdarrenr PAUSE(); 46922514Sdarrenr } 47022514Sdarrenr 47122514Sdarrenr ip->ip_hl = 7; 47222514Sdarrenr ip->ip_len = ip->ip_hl << 2; 47322514Sdarrenr if (!ptest || (ptest == 1)) { 47422514Sdarrenr /* 47522514Sdarrenr * Test 2: options have length = 0 47622514Sdarrenr */ 47722514Sdarrenr printf("2.2.1 option length = 0, RR\n"); 47822514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_RR; 47922514Sdarrenr s[IPOPT_OLEN] = 0; 48022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48122514Sdarrenr fflush(stdout); 48222514Sdarrenr PAUSE(); 48322514Sdarrenr 48422514Sdarrenr printf("2.2.2 option length = 0, TS\n"); 48522514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 48622514Sdarrenr s[IPOPT_OLEN] = 0; 48722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48822514Sdarrenr fflush(stdout); 48922514Sdarrenr PAUSE(); 49022514Sdarrenr 49122514Sdarrenr printf("2.2.3 option length = 0, SECURITY\n"); 49222514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SECURITY; 49322514Sdarrenr s[IPOPT_OLEN] = 0; 49422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 49522514Sdarrenr fflush(stdout); 49622514Sdarrenr PAUSE(); 49722514Sdarrenr 49822514Sdarrenr printf("2.2.4 option length = 0, LSRR\n"); 49922514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_LSRR; 50022514Sdarrenr s[IPOPT_OLEN] = 0; 50122514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 50222514Sdarrenr fflush(stdout); 50322514Sdarrenr PAUSE(); 50422514Sdarrenr 50522514Sdarrenr printf("2.2.5 option length = 0, SATID\n"); 50622514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SATID; 50722514Sdarrenr s[IPOPT_OLEN] = 0; 50822514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 50922514Sdarrenr fflush(stdout); 51022514Sdarrenr PAUSE(); 51122514Sdarrenr 51222514Sdarrenr printf("2.2.6 option length = 0, SSRR\n"); 51322514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SSRR; 51422514Sdarrenr s[IPOPT_OLEN] = 0; 51522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 51622514Sdarrenr fflush(stdout); 51722514Sdarrenr PAUSE(); 51822514Sdarrenr } 51922514Sdarrenr 52022514Sdarrenr (void) close(nfd); 52122514Sdarrenr} 52222514Sdarrenr 52322514Sdarrenr 52422514Sdarrenr/* 52522514Sdarrenr * test 3 (ICMP) 52622514Sdarrenr */ 52722514Sdarrenrvoid ip_test3(dev, mtu, ip, gwip, ptest) 52822514Sdarrenrchar *dev; 52922514Sdarrenrint mtu; 53022514Sdarrenrip_t *ip; 53122514Sdarrenrstruct in_addr gwip; 53222514Sdarrenrint ptest; 53322514Sdarrenr{ 53422514Sdarrenr static int ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 }; 53522514Sdarrenr static int ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 }; 53622514Sdarrenr struct timeval tv; 53722514Sdarrenr struct icmp *icp; 53822514Sdarrenr int nfd, i; 53922514Sdarrenr 54022514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 54122514Sdarrenr ip->ip_v = IPVERSION; 54222514Sdarrenr ip->ip_tos = 0; 54322514Sdarrenr ip->ip_off = 0; 54422514Sdarrenr ip->ip_ttl = 60; 54522514Sdarrenr ip->ip_p = IPPROTO_ICMP; 54622514Sdarrenr ip->ip_sum = 0; 54722514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp); 54822514Sdarrenr icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2)); 54937074Speter nfd = initdevice(dev, htons(1), 1); 55022514Sdarrenr 55122514Sdarrenr if (!ptest || (ptest == 1)) { 55222514Sdarrenr /* 55322514Sdarrenr * Type 0 - 31, 255, code = 0 55422514Sdarrenr */ 55522514Sdarrenr bzero((char *)icp, sizeof(*icp)); 55622514Sdarrenr for (i = 0; i < 32; i++) { 55722514Sdarrenr icp->icmp_type = i; 55822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 55922514Sdarrenr PAUSE(); 56022514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i); 56122514Sdarrenr } 56222514Sdarrenr icp->icmp_type = 255; 56322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 56422514Sdarrenr PAUSE(); 56522514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255); 56622514Sdarrenr putchar('\n'); 56722514Sdarrenr } 56822514Sdarrenr 56922514Sdarrenr if (!ptest || (ptest == 2)) { 57022514Sdarrenr /* 57122514Sdarrenr * Type 3, code = 0 - 31 57222514Sdarrenr */ 57322514Sdarrenr icp->icmp_type = 3; 57422514Sdarrenr for (i = 0; i < 32; i++) { 57522514Sdarrenr icp->icmp_code = i; 57622514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 57722514Sdarrenr PAUSE(); 57822514Sdarrenr printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i); 57922514Sdarrenr } 58022514Sdarrenr } 58122514Sdarrenr 58222514Sdarrenr if (!ptest || (ptest == 3)) { 58322514Sdarrenr /* 58422514Sdarrenr * Type 4, code = 0,127,128,255 58522514Sdarrenr */ 58622514Sdarrenr icp->icmp_type = 4; 58722514Sdarrenr icp->icmp_code = 0; 58822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 58922514Sdarrenr PAUSE(); 59022514Sdarrenr printf("3.3.1 ICMP type 4 code 0 (all 0's)\r"); 59122514Sdarrenr icp->icmp_code = 127; 59222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59322514Sdarrenr PAUSE(); 59422514Sdarrenr printf("3.3.2 ICMP type 4 code 127 (all 0's)\r"); 59522514Sdarrenr icp->icmp_code = 128; 59622514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59722514Sdarrenr PAUSE(); 59822514Sdarrenr printf("3.3.3 ICMP type 4 code 128 (all 0's)\r"); 59922514Sdarrenr icp->icmp_code = 255; 60022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 60122514Sdarrenr PAUSE(); 60222514Sdarrenr printf("3.3.4 ICMP type 4 code 255 (all 0's)\r"); 60322514Sdarrenr } 60422514Sdarrenr 60522514Sdarrenr if (!ptest || (ptest == 4)) { 60622514Sdarrenr /* 60722514Sdarrenr * Type 5, code = 0,127,128,255 60822514Sdarrenr */ 60922514Sdarrenr icp->icmp_type = 5; 61022514Sdarrenr icp->icmp_code = 0; 61122514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61222514Sdarrenr PAUSE(); 61322514Sdarrenr printf("3.4.1 ICMP type 5 code 0 (all 0's)\r"); 61422514Sdarrenr icp->icmp_code = 127; 61522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61622514Sdarrenr PAUSE(); 61722514Sdarrenr printf("3.4.2 ICMP type 5 code 127 (all 0's)\r"); 61822514Sdarrenr icp->icmp_code = 128; 61922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 62022514Sdarrenr PAUSE(); 62122514Sdarrenr printf("3.4.3 ICMP type 5 code 128 (all 0's)\r"); 62222514Sdarrenr icp->icmp_code = 255; 62322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 62422514Sdarrenr PAUSE(); 62522514Sdarrenr printf("3.4.4 ICMP type 5 code 255 (all 0's)\r"); 62622514Sdarrenr } 62722514Sdarrenr 62822514Sdarrenr if (!ptest || (ptest == 5)) { 62922514Sdarrenr /* 63022514Sdarrenr * Type 8-10;13-18, code - 0,127,128,255 63122514Sdarrenr */ 63222514Sdarrenr for (i = 0; ict1[i]; i++) { 63322514Sdarrenr icp->icmp_type = ict1[i]; 63422514Sdarrenr icp->icmp_code = 0; 63522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 63622514Sdarrenr PAUSE(); 63722514Sdarrenr printf("3.5.%d ICMP type 5 code 0 (all 0's)\r", 63822514Sdarrenr i * 4); 63922514Sdarrenr icp->icmp_code = 127; 64022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64122514Sdarrenr PAUSE(); 64222514Sdarrenr printf("3.5.%d ICMP type 5 code 127 (all 0's)\r", 64322514Sdarrenr i * 4 + 1); 64422514Sdarrenr icp->icmp_code = 128; 64522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64622514Sdarrenr PAUSE(); 64722514Sdarrenr printf("3.5.%d ICMP type 5 code 128 (all 0's)\r", 64822514Sdarrenr i * 4 + 2); 64922514Sdarrenr icp->icmp_code = 255; 65022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 65122514Sdarrenr PAUSE(); 65222514Sdarrenr printf("3.5.%d ICMP type 5 code 255 (all 0's)\r", 65322514Sdarrenr i * 4 + 3); 65422514Sdarrenr } 65522514Sdarrenr putchar('\n'); 65622514Sdarrenr } 65722514Sdarrenr 65822514Sdarrenr if (!ptest || (ptest == 6)) { 65922514Sdarrenr /* 66022514Sdarrenr * Type 12, code - 0,127,128,129,255 66122514Sdarrenr */ 66222514Sdarrenr icp->icmp_type = 12; 66322514Sdarrenr icp->icmp_code = 0; 66422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 66522514Sdarrenr PAUSE(); 66622514Sdarrenr printf("3.6.1 ICMP type 12 code 0 (all 0's)\r"); 66722514Sdarrenr icp->icmp_code = 127; 66822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 66922514Sdarrenr PAUSE(); 67022514Sdarrenr printf("3.6.2 ICMP type 12 code 127 (all 0's)\r"); 67122514Sdarrenr icp->icmp_code = 128; 67222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67322514Sdarrenr PAUSE(); 67422514Sdarrenr printf("3.6.3 ICMP type 12 code 128 (all 0's)\r"); 67522514Sdarrenr icp->icmp_code = 129; 67622514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67722514Sdarrenr PAUSE(); 67822514Sdarrenr printf("3.6.4 ICMP type 12 code 129 (all 0's)\r"); 67922514Sdarrenr icp->icmp_code = 255; 68022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 68122514Sdarrenr PAUSE(); 68222514Sdarrenr printf("3.6.5 ICMP type 12 code 255 (all 0's)\r"); 68322514Sdarrenr putchar('\n'); 68422514Sdarrenr } 68522514Sdarrenr 68622514Sdarrenr if (!ptest || (ptest == 7)) { 68722514Sdarrenr /* 68822514Sdarrenr * Type 3;9-10;13-14;17-18 - shorter packets 68922514Sdarrenr */ 69022514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2; 69122514Sdarrenr for (i = 0; ict2[i]; i++) { 69222514Sdarrenr icp->icmp_type = ict1[i]; 69322514Sdarrenr icp->icmp_code = 0; 69422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 69522514Sdarrenr PAUSE(); 69622514Sdarrenr printf("3.5.%d ICMP type %d code 0 (all 0's)\r", 69722514Sdarrenr i * 4, icp->icmp_type); 69822514Sdarrenr icp->icmp_code = 127; 69922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 70022514Sdarrenr PAUSE(); 70122514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 70222514Sdarrenr i * 4 + 1, icp->icmp_type); 70322514Sdarrenr icp->icmp_code = 128; 70422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 70522514Sdarrenr PAUSE(); 70622514Sdarrenr printf("3.5.%d ICMP type %d code 128 (all 0's)\r", 70722514Sdarrenr i * 4 + 2, icp->icmp_type); 70822514Sdarrenr icp->icmp_code = 255; 70922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 71022514Sdarrenr PAUSE(); 71122514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 71222514Sdarrenr i * 4 + 3, icp->icmp_type); 71322514Sdarrenr } 71422514Sdarrenr putchar('\n'); 71522514Sdarrenr } 71622514Sdarrenr} 71722514Sdarrenr 71822514Sdarrenr 71922514Sdarrenr/* Perform test 4 (UDP) */ 72022514Sdarrenr 72122514Sdarrenrvoid ip_test4(dev, mtu, ip, gwip, ptest) 72222514Sdarrenrchar *dev; 72322514Sdarrenrint mtu; 72422514Sdarrenrip_t *ip; 72522514Sdarrenrstruct in_addr gwip; 72622514Sdarrenrint ptest; 72722514Sdarrenr{ 72822514Sdarrenr struct timeval tv; 72931183Speter udphdr_t *u; 73022514Sdarrenr int nfd, i; 73122514Sdarrenr 73222514Sdarrenr 73322514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 73422514Sdarrenr ip->ip_v = IPVERSION; 73522514Sdarrenr ip->ip_tos = 0; 73622514Sdarrenr ip->ip_off = 0; 73722514Sdarrenr ip->ip_ttl = 60; 73822514Sdarrenr ip->ip_p = IPPROTO_UDP; 73922514Sdarrenr ip->ip_sum = 0; 74022514Sdarrenr u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2)); 74137074Speter u->uh_sport = htons(1); 74237074Speter u->uh_dport = htons(1); 74337074Speter u->uh_ulen = htons(sizeof(*u) + 4); 74422514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 74522514Sdarrenr 74622514Sdarrenr if (!ptest || (ptest == 1)) { 74722514Sdarrenr /* 74822514Sdarrenr * Test 1. ulen > packet 74922514Sdarrenr */ 75037074Speter u->uh_ulen = htons(sizeof(*u) + 4); 75137074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 75222514Sdarrenr printf("4.1 UDP uh_ulen > packet size - short packets\n"); 75337074Speter for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) { 75437074Speter u->uh_ulen = htons(i); 75522514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 75622514Sdarrenr printf("%d\r", i); 75722514Sdarrenr fflush(stdout); 75822514Sdarrenr PAUSE(); 75922514Sdarrenr } 76022514Sdarrenr putchar('\n'); 76122514Sdarrenr } 76222514Sdarrenr 76322514Sdarrenr if (!ptest || (ptest == 2)) { 76422514Sdarrenr /* 76522514Sdarrenr * Test 2. ulen < packet 76622514Sdarrenr */ 76737074Speter u->uh_ulen = htons(sizeof(*u) + 4); 76837074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 76922514Sdarrenr printf("4.2 UDP uh_ulen < packet size - short packets\n"); 77037074Speter for (i = ntohs(u->uh_ulen) * 2; i > sizeof(*u) + 4; i--) { 77122514Sdarrenr ip->ip_len = i; 77222514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 77322514Sdarrenr printf("%d\r", i); 77422514Sdarrenr fflush(stdout); 77522514Sdarrenr PAUSE(); 77622514Sdarrenr } 77722514Sdarrenr putchar('\n'); 77822514Sdarrenr } 77922514Sdarrenr 78022514Sdarrenr if (!ptest || (ptest == 3)) { 78122514Sdarrenr /* 78222514Sdarrenr * Test 3: sport = 0, sport = 1, sport = 32767 78322514Sdarrenr * sport = 32768, sport = 65535 78422514Sdarrenr */ 78522514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 78637074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 78722514Sdarrenr printf("4.3.1 UDP sport = 0\n"); 78822514Sdarrenr u->uh_sport = 0; 78922514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 79022514Sdarrenr printf("0\n"); 79122514Sdarrenr fflush(stdout); 79222514Sdarrenr PAUSE(); 79322514Sdarrenr printf("4.3.2 UDP sport = 1\n"); 79437074Speter u->uh_sport = htons(1); 79522514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 79622514Sdarrenr printf("1\n"); 79722514Sdarrenr fflush(stdout); 79822514Sdarrenr PAUSE(); 79922514Sdarrenr printf("4.3.3 UDP sport = 32767\n"); 80037074Speter u->uh_sport = htons(32767); 80122514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 80222514Sdarrenr printf("32767\n"); 80322514Sdarrenr fflush(stdout); 80422514Sdarrenr PAUSE(); 80522514Sdarrenr printf("4.3.4 UDP sport = 32768\n"); 80637074Speter u->uh_sport = htons(32768); 80722514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 80822514Sdarrenr printf("32768\n"); 80922514Sdarrenr putchar('\n'); 81022514Sdarrenr fflush(stdout); 81122514Sdarrenr PAUSE(); 81222514Sdarrenr printf("4.3.5 UDP sport = 65535\n"); 81337074Speter u->uh_sport = htons(65535); 81422514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 81522514Sdarrenr printf("65535\n"); 81622514Sdarrenr fflush(stdout); 81722514Sdarrenr PAUSE(); 81822514Sdarrenr } 81922514Sdarrenr 82022514Sdarrenr if (!ptest || (ptest == 4)) { 82122514Sdarrenr /* 82222514Sdarrenr * Test 4: dport = 0, dport = 1, dport = 32767 82322514Sdarrenr * dport = 32768, dport = 65535 82422514Sdarrenr */ 82537074Speter u->uh_ulen = ntohs(sizeof(*u) + 4); 82637074Speter u->uh_sport = htons(1); 82737074Speter ip->ip_len = (ip->ip_hl << 2) + ntohs(u->uh_ulen); 82822514Sdarrenr printf("4.4.1 UDP dport = 0\n"); 82922514Sdarrenr u->uh_dport = 0; 83022514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 83122514Sdarrenr printf("0\n"); 83222514Sdarrenr fflush(stdout); 83322514Sdarrenr PAUSE(); 83422514Sdarrenr printf("4.4.2 UDP dport = 1\n"); 83537074Speter u->uh_dport = htons(1); 83622514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 83722514Sdarrenr printf("1\n"); 83822514Sdarrenr fflush(stdout); 83922514Sdarrenr PAUSE(); 84022514Sdarrenr printf("4.4.3 UDP dport = 32767\n"); 84137074Speter u->uh_dport = htons(32767); 84222514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 84322514Sdarrenr printf("32767\n"); 84422514Sdarrenr fflush(stdout); 84522514Sdarrenr PAUSE(); 84622514Sdarrenr printf("4.4.4 UDP dport = 32768\n"); 84737074Speter u->uh_dport = htons(32768); 84822514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 84922514Sdarrenr printf("32768\n"); 85022514Sdarrenr fflush(stdout); 85122514Sdarrenr PAUSE(); 85222514Sdarrenr printf("4.4.5 UDP dport = 65535\n"); 85337074Speter u->uh_dport = htons(65535); 85422514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 85522514Sdarrenr printf("65535\n"); 85622514Sdarrenr fflush(stdout); 85722514Sdarrenr PAUSE(); 85822514Sdarrenr } 85922514Sdarrenr 86031183Speter if (!ptest || (ptest == 5)) { 86122514Sdarrenr /* 86231183Speter * Test 5: sizeof(ip_t) <= MTU <= sizeof(udphdr_t) + 86331183Speter * sizeof(ip_t) 86422514Sdarrenr */ 86522514Sdarrenr printf("4.5 UDP 20 <= MTU <= 32\n"); 86637074Speter for (i = sizeof(*ip); i <= ntohs(u->uh_ulen); i++) { 86722514Sdarrenr (void) send_udp(nfd, i, ip, gwip); 86822514Sdarrenr printf("%d\r", i); 86922514Sdarrenr fflush(stdout); 87022514Sdarrenr PAUSE(); 87122514Sdarrenr } 87222514Sdarrenr putchar('\n'); 87322514Sdarrenr } 87422514Sdarrenr} 87522514Sdarrenr 87622514Sdarrenr 87722514Sdarrenr/* Perform test 5 (TCP) */ 87822514Sdarrenr 87922514Sdarrenrvoid ip_test5(dev, mtu, ip, gwip, ptest) 88022514Sdarrenrchar *dev; 88122514Sdarrenrint mtu; 88222514Sdarrenrip_t *ip; 88322514Sdarrenrstruct in_addr gwip; 88422514Sdarrenrint ptest; 88522514Sdarrenr{ 88622514Sdarrenr struct timeval tv; 88722514Sdarrenr tcphdr_t *t; 88822514Sdarrenr int nfd, i; 88922514Sdarrenr 89022514Sdarrenr t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2)); 89131183Speter#ifndef linux 89222514Sdarrenr t->th_x2 = 0; 89331183Speter#endif 89422514Sdarrenr t->th_off = 0; 89537074Speter t->th_sport = htons(1); 89637074Speter t->th_dport = htons(1); 89737074Speter t->th_win = htons(4096); 89822514Sdarrenr t->th_urp = 0; 89922514Sdarrenr t->th_sum = 0; 90037074Speter t->th_seq = htonl(1); 90122514Sdarrenr t->th_ack = 0; 90234739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 90322514Sdarrenr nfd = initdevice(dev, t->th_sport, 1); 90422514Sdarrenr 90522514Sdarrenr if (!ptest || (ptest == 1)) { 90622514Sdarrenr /* 90722514Sdarrenr * Test 1: flags variations, 0 - 3f 90822514Sdarrenr */ 90922514Sdarrenr t->th_off = sizeof(*t) >> 2; 91022514Sdarrenr printf("5.1 Test TCP flag combinations\n"); 91122514Sdarrenr for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN); 91222514Sdarrenr i++) { 91322514Sdarrenr t->th_flags = i; 91422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 91522514Sdarrenr printf("%d\r", i); 91622514Sdarrenr fflush(stdout); 91722514Sdarrenr PAUSE(); 91822514Sdarrenr } 91922514Sdarrenr putchar('\n'); 92022514Sdarrenr } 92122514Sdarrenr 92222514Sdarrenr if (!ptest || (ptest == 2)) { 92322514Sdarrenr t->th_flags = TH_SYN; 92422514Sdarrenr /* 92522514Sdarrenr * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000, 92622514Sdarrenr * seq = 0xa000000, seq = 0xffffffff 92722514Sdarrenr */ 92822514Sdarrenr printf("5.2.1 TCP seq = 0\n"); 92937074Speter t->th_seq = htonl(0); 93022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93122514Sdarrenr fflush(stdout); 93222514Sdarrenr PAUSE(); 93322514Sdarrenr 93422514Sdarrenr printf("5.2.2 TCP seq = 1\n"); 93537074Speter t->th_seq = htonl(1); 93622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93722514Sdarrenr fflush(stdout); 93822514Sdarrenr PAUSE(); 93922514Sdarrenr 94022514Sdarrenr printf("5.2.3 TCP seq = 0x7fffffff\n"); 94137074Speter t->th_seq = htonl(0x7fffffff); 94222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 94322514Sdarrenr fflush(stdout); 94422514Sdarrenr PAUSE(); 94522514Sdarrenr 94622514Sdarrenr printf("5.2.4 TCP seq = 0x80000000\n"); 94737074Speter t->th_seq = htonl(0x80000000); 94822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 94922514Sdarrenr fflush(stdout); 95022514Sdarrenr PAUSE(); 95122514Sdarrenr 95222514Sdarrenr printf("5.2.5 TCP seq = 0xc0000000\n"); 95337074Speter t->th_seq = htonl(0xc0000000); 95422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 95522514Sdarrenr fflush(stdout); 95622514Sdarrenr PAUSE(); 95722514Sdarrenr 95822514Sdarrenr printf("5.2.6 TCP seq = 0xffffffff\n"); 95937074Speter t->th_seq = htonl(0xffffffff); 96022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 96122514Sdarrenr fflush(stdout); 96222514Sdarrenr PAUSE(); 96322514Sdarrenr } 96422514Sdarrenr 96522514Sdarrenr if (!ptest || (ptest == 3)) { 96622514Sdarrenr t->th_flags = TH_ACK; 96722514Sdarrenr /* 96822514Sdarrenr * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000 96922514Sdarrenr * ack = 0xa000000, ack = 0xffffffff 97022514Sdarrenr */ 97122514Sdarrenr printf("5.3.1 TCP ack = 0\n"); 97222514Sdarrenr t->th_ack = 0; 97322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 97422514Sdarrenr fflush(stdout); 97522514Sdarrenr PAUSE(); 97622514Sdarrenr 97722514Sdarrenr printf("5.3.2 TCP ack = 1\n"); 97837074Speter t->th_ack = htonl(1); 97922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 98022514Sdarrenr fflush(stdout); 98122514Sdarrenr PAUSE(); 98222514Sdarrenr 98322514Sdarrenr printf("5.3.3 TCP ack = 0x7fffffff\n"); 98437074Speter t->th_ack = htonl(0x7fffffff); 98522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 98622514Sdarrenr fflush(stdout); 98722514Sdarrenr PAUSE(); 98822514Sdarrenr 98922514Sdarrenr printf("5.3.4 TCP ack = 0x80000000\n"); 99037074Speter t->th_ack = htonl(0x80000000); 99122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99222514Sdarrenr fflush(stdout); 99322514Sdarrenr PAUSE(); 99422514Sdarrenr 99522514Sdarrenr printf("5.3.5 TCP ack = 0xc0000000\n"); 99637074Speter t->th_ack = htonl(0xc0000000); 99722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99822514Sdarrenr fflush(stdout); 99922514Sdarrenr PAUSE(); 100022514Sdarrenr 100122514Sdarrenr printf("5.3.6 TCP ack = 0xffffffff\n"); 100237074Speter t->th_ack = htonl(0xffffffff); 100322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 100422514Sdarrenr fflush(stdout); 100522514Sdarrenr PAUSE(); 100622514Sdarrenr } 100722514Sdarrenr 100822514Sdarrenr if (!ptest || (ptest == 4)) { 100922514Sdarrenr t->th_flags = TH_SYN; 101022514Sdarrenr /* 101122514Sdarrenr * Test 4: win = 0, win = 32768, win = 65535 101222514Sdarrenr */ 101322514Sdarrenr printf("5.4.1 TCP win = 0\n"); 101437074Speter t->th_seq = htonl(0); 101522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 101622514Sdarrenr fflush(stdout); 101722514Sdarrenr PAUSE(); 101822514Sdarrenr 101922514Sdarrenr printf("5.4.2 TCP win = 32768\n"); 102037074Speter t->th_seq = htonl(0x7fff); 102122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 102222514Sdarrenr fflush(stdout); 102322514Sdarrenr PAUSE(); 102422514Sdarrenr 102522514Sdarrenr printf("5.4.3 TCP win = 65535\n"); 102637074Speter t->th_win = htons(0xffff); 102722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 102822514Sdarrenr fflush(stdout); 102922514Sdarrenr PAUSE(); 103022514Sdarrenr } 103122514Sdarrenr 103234739Speter#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) && \ 103334739Speter !defined(__sgi) 103422514Sdarrenr { 103534739Speter struct tcpcb *tcbp, tcb; 103622514Sdarrenr struct tcpiphdr ti; 103722514Sdarrenr struct sockaddr_in sin; 103822514Sdarrenr int fd, slen; 103922514Sdarrenr 104092691Sdarrenr fd = -1; 104122514Sdarrenr bzero((char *)&sin, sizeof(sin)); 104222514Sdarrenr 104322514Sdarrenr for (i = 1; i < 63; i++) { 104422514Sdarrenr fd = socket(AF_INET, SOCK_STREAM, 0); 104534739Speter bzero((char *)&sin, sizeof(sin)); 104622514Sdarrenr sin.sin_addr.s_addr = ip->ip_dst.s_addr; 104722514Sdarrenr sin.sin_port = htons(i); 104834739Speter sin.sin_family = AF_INET; 104922514Sdarrenr if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin))) 105022514Sdarrenr break; 105134739Speter close(fd); 105222514Sdarrenr } 105322514Sdarrenr 105422514Sdarrenr if (i == 63) { 105522514Sdarrenr printf("Couldn't open a TCP socket between ports 1 and 63\n"); 105622514Sdarrenr printf("to host %s for test 5 and 6 - skipping.\n", 105722514Sdarrenr inet_ntoa(ip->ip_dst)); 105822514Sdarrenr goto skip_five_and_six; 105922514Sdarrenr } 106022514Sdarrenr 106122514Sdarrenr bcopy((char *)ip, (char *)&ti, sizeof(*ip)); 106234739Speter t->th_dport = htons(i); 106322514Sdarrenr slen = sizeof(sin); 106422514Sdarrenr if (!getsockname(fd, (struct sockaddr *)&sin, &slen)) 106534739Speter t->th_sport = sin.sin_port; 106634739Speter if (!(tcbp = find_tcp(fd, &ti))) { 106722514Sdarrenr printf("Can't find PCB\n"); 106822514Sdarrenr goto skip_five_and_six; 106922514Sdarrenr } 107034739Speter KMCPY(&tcb, tcbp, sizeof(tcb)); 107122514Sdarrenr ti.ti_win = tcb.rcv_adv; 107237074Speter ti.ti_seq = htonl(tcb.snd_nxt - 1); 107322514Sdarrenr ti.ti_ack = tcb.rcv_nxt; 107422514Sdarrenr 107522514Sdarrenr if (!ptest || (ptest == 5)) { 107622514Sdarrenr /* 107722514Sdarrenr * Test 5: urp 107822514Sdarrenr */ 107934739Speter t->th_flags = TH_ACK|TH_URG; 108034739Speter printf("5.5.1 TCP Urgent pointer, sport %hu dport %hu\n", 108134739Speter ntohs(t->th_sport), ntohs(t->th_dport)); 108234739Speter t->th_urp = htons(1); 108322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 108422514Sdarrenr PAUSE(); 108534739Speter 108637074Speter t->th_seq = htonl(tcb.snd_nxt); 108734739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t) + 1; 108834739Speter t->th_urp = htons(0x7fff); 108922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 109022514Sdarrenr PAUSE(); 109134739Speter t->th_urp = htons(0x8000); 109222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 109322514Sdarrenr PAUSE(); 109434739Speter t->th_urp = htons(0xffff); 109522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 109622514Sdarrenr PAUSE(); 109737074Speter t->th_urp = 0; 109834739Speter t->th_flags &= ~TH_URG; 109934739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 110022514Sdarrenr } 110122514Sdarrenr 110222514Sdarrenr if (!ptest || (ptest == 6)) { 110322514Sdarrenr /* 110422514Sdarrenr * Test 6: data offset, off = 0, off is inside, off is outside 110522514Sdarrenr */ 110634739Speter t->th_flags = TH_ACK; 110734739Speter printf("5.6.1 TCP off = 1-15, len = 40\n"); 110834739Speter for (i = 1; i < 16; i++) { 110922514Sdarrenr ti.ti_off = ntohs(i); 111022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 111122514Sdarrenr printf("%d\r", i); 111222514Sdarrenr fflush(stdout); 111322514Sdarrenr PAUSE(); 111422514Sdarrenr } 111522514Sdarrenr putchar('\n'); 111634739Speter ip->ip_len = sizeof(ip_t) + sizeof(tcphdr_t); 111722514Sdarrenr } 111822514Sdarrenr 111922514Sdarrenr (void) close(fd); 112022514Sdarrenr } 112122514Sdarrenrskip_five_and_six: 112222514Sdarrenr#endif 112337074Speter t->th_seq = htonl(1); 112437074Speter t->th_ack = htonl(1); 112534739Speter t->th_off = 0; 112622514Sdarrenr 112722514Sdarrenr if (!ptest || (ptest == 7)) { 112822514Sdarrenr t->th_flags = TH_SYN; 112922514Sdarrenr /* 113022514Sdarrenr * Test 7: sport = 0, sport = 1, sport = 32767 113122514Sdarrenr * sport = 32768, sport = 65535 113222514Sdarrenr */ 113322514Sdarrenr printf("5.7.1 TCP sport = 0\n"); 113422514Sdarrenr t->th_sport = 0; 113522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 113622514Sdarrenr fflush(stdout); 113722514Sdarrenr PAUSE(); 113822514Sdarrenr 113922514Sdarrenr printf("5.7.2 TCP sport = 1\n"); 114037074Speter t->th_sport = htons(1); 114122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114222514Sdarrenr fflush(stdout); 114322514Sdarrenr PAUSE(); 114422514Sdarrenr 114522514Sdarrenr printf("5.7.3 TCP sport = 32767\n"); 114637074Speter t->th_sport = htons(32767); 114722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114822514Sdarrenr fflush(stdout); 114922514Sdarrenr PAUSE(); 115022514Sdarrenr 115122514Sdarrenr printf("5.7.4 TCP sport = 32768\n"); 115237074Speter t->th_sport = htons(32768); 115322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 115422514Sdarrenr fflush(stdout); 115522514Sdarrenr PAUSE(); 115622514Sdarrenr 115722514Sdarrenr printf("5.7.5 TCP sport = 65535\n"); 115837074Speter t->th_sport = htons(65535); 115922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 116022514Sdarrenr fflush(stdout); 116122514Sdarrenr PAUSE(); 116222514Sdarrenr } 116322514Sdarrenr 116422514Sdarrenr if (!ptest || (ptest == 8)) { 116537074Speter t->th_sport = htons(1); 116634739Speter t->th_flags = TH_SYN; 116722514Sdarrenr /* 116822514Sdarrenr * Test 8: dport = 0, dport = 1, dport = 32767 116922514Sdarrenr * dport = 32768, dport = 65535 117022514Sdarrenr */ 117122514Sdarrenr printf("5.8.1 TCP dport = 0\n"); 117222514Sdarrenr t->th_dport = 0; 117322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 117422514Sdarrenr fflush(stdout); 117522514Sdarrenr PAUSE(); 117622514Sdarrenr 117722514Sdarrenr printf("5.8.2 TCP dport = 1\n"); 117837074Speter t->th_dport = htons(1); 117922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 118022514Sdarrenr fflush(stdout); 118122514Sdarrenr PAUSE(); 118222514Sdarrenr 118322514Sdarrenr printf("5.8.3 TCP dport = 32767\n"); 118437074Speter t->th_dport = htons(32767); 118522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 118622514Sdarrenr fflush(stdout); 118722514Sdarrenr PAUSE(); 118822514Sdarrenr 118922514Sdarrenr printf("5.8.4 TCP dport = 32768\n"); 119037074Speter t->th_dport = htons(32768); 119122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 119222514Sdarrenr fflush(stdout); 119322514Sdarrenr PAUSE(); 119422514Sdarrenr 119522514Sdarrenr printf("5.8.5 TCP dport = 65535\n"); 119637074Speter t->th_dport = htons(65535); 119722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 119822514Sdarrenr fflush(stdout); 119922514Sdarrenr PAUSE(); 120022514Sdarrenr } 120134739Speter 120234739Speter /* LAND attack - self connect, so make src & dst ip/port the same */ 120334739Speter if (!ptest || (ptest == 9)) { 120434739Speter printf("5.9 TCP LAND attack. sport = 25, dport = 25\n"); 120534739Speter /* chose SMTP port 25 */ 120634739Speter t->th_sport = htons(25); 120734739Speter t->th_dport = htons(25); 120834739Speter t->th_flags = TH_SYN; 120934739Speter ip->ip_src = ip->ip_dst; 121034739Speter (void) send_tcp(nfd, mtu, ip, gwip); 121134739Speter fflush(stdout); 121234739Speter PAUSE(); 121334739Speter } 121434739Speter 121522514Sdarrenr /* TCP options header checking */ 121622514Sdarrenr /* 0 length options, etc */ 121722514Sdarrenr} 121822514Sdarrenr 121922514Sdarrenr 122022514Sdarrenr/* Perform test 6 (exhaust mbuf test) */ 122122514Sdarrenr 122222514Sdarrenrvoid ip_test6(dev, mtu, ip, gwip, ptest) 122322514Sdarrenrchar *dev; 122422514Sdarrenrint mtu; 122522514Sdarrenrip_t *ip; 122622514Sdarrenrstruct in_addr gwip; 122722514Sdarrenrint ptest; 122822514Sdarrenr{ 122922514Sdarrenr struct timeval tv; 123022514Sdarrenr udphdr_t *u; 123122514Sdarrenr int nfd, i, j, k; 123222514Sdarrenr 123322514Sdarrenr ip->ip_v = IPVERSION; 123422514Sdarrenr ip->ip_tos = 0; 123522514Sdarrenr ip->ip_off = 0; 123622514Sdarrenr ip->ip_ttl = 60; 123722514Sdarrenr ip->ip_p = IPPROTO_UDP; 123822514Sdarrenr ip->ip_sum = 0; 123922514Sdarrenr u = (udphdr_t *)(ip + 1); 124037074Speter u->uh_sport = htons(1); 124137074Speter u->uh_dport = htons(9); 124222514Sdarrenr u->uh_sum = 0; 124322514Sdarrenr 124422514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 124537074Speter u->uh_ulen = htons(7168); 124622514Sdarrenr 124734739Speter printf("6. Exhaustive mbuf test.\n"); 124834739Speter printf(" Send 7k packet in 768 & 128 byte fragments, 128 times.\n"); 124934739Speter printf(" Total of around 8,900 packets\n"); 125022514Sdarrenr for (i = 0; i < 128; i++) { 125122514Sdarrenr /* 125222514Sdarrenr * First send the entire packet in 768 byte chunks. 125322514Sdarrenr */ 125422514Sdarrenr ip->ip_len = sizeof(*ip) + 768 + sizeof(*u); 125522514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 125637074Speter ip->ip_off = htons(IP_MF); 125722514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 125822514Sdarrenr printf("%d %d\r", i, 0); 125922514Sdarrenr fflush(stdout); 126022514Sdarrenr PAUSE(); 126122514Sdarrenr /* 126222514Sdarrenr * And again using 128 byte chunks. 126322514Sdarrenr */ 126422514Sdarrenr ip->ip_len = sizeof(*ip) + 128 + sizeof(*u); 126537074Speter ip->ip_off = htons(IP_MF); 126622514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 126722514Sdarrenr printf("%d %d\r", i, 0); 126822514Sdarrenr fflush(stdout); 126922514Sdarrenr PAUSE(); 127022514Sdarrenr 127122514Sdarrenr for (j = 768; j < 3584; j += 768) { 127222514Sdarrenr ip->ip_len = sizeof(*ip) + 768; 127392691Sdarrenr ip->ip_off = htons(IP_MF|((j>>3) & 0x1fff)); 127422514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 127522514Sdarrenr printf("%d %d\r", i, j); 127622514Sdarrenr fflush(stdout); 127722514Sdarrenr PAUSE(); 127822514Sdarrenr 127922514Sdarrenr ip->ip_len = sizeof(*ip) + 128; 128022514Sdarrenr for (k = j - 768; k < j; k += 128) { 128192691Sdarrenr ip->ip_off = htons(IP_MF|((k>>3) & 0x1fff)); 128222514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 128322514Sdarrenr printf("%d %d\r", i, k); 128422514Sdarrenr fflush(stdout); 128522514Sdarrenr PAUSE(); 128622514Sdarrenr } 128722514Sdarrenr } 128822514Sdarrenr } 128922514Sdarrenr putchar('\n'); 129022514Sdarrenr} 129122514Sdarrenr 129222514Sdarrenr 129322514Sdarrenr/* Perform test 7 (random packets) */ 129422514Sdarrenr 129522514Sdarrenrstatic u_long tbuf[64]; 129622514Sdarrenr 129722514Sdarrenrvoid ip_test7(dev, mtu, ip, gwip, ptest) 129822514Sdarrenrchar *dev; 129922514Sdarrenrint mtu; 130022514Sdarrenrip_t *ip; 130122514Sdarrenrstruct in_addr gwip; 130222514Sdarrenrint ptest; 130322514Sdarrenr{ 130422514Sdarrenr ip_t *pip; 130522514Sdarrenr struct timeval tv; 130622514Sdarrenr int nfd, i, j; 130722514Sdarrenr u_char *s; 130822514Sdarrenr 130922514Sdarrenr nfd = initdevice(dev, 0, 1); 131022514Sdarrenr pip = (ip_t *)tbuf; 131122514Sdarrenr 131222514Sdarrenr srand(time(NULL) ^ (getpid() * getppid())); 131322514Sdarrenr 131422514Sdarrenr printf("7. send 1024 random IP packets.\n"); 131522514Sdarrenr 131622514Sdarrenr for (i = 0; i < 512; i++) { 131722514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 131822514Sdarrenr *s = (rand() >> 13) & 0xff; 131922514Sdarrenr pip->ip_v = IPVERSION; 132022514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 132122514Sdarrenr sizeof(struct in_addr)); 132222514Sdarrenr pip->ip_sum = 0; 132322514Sdarrenr pip->ip_len &= 0xff; 132422514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 132522514Sdarrenr printf("%d\r", i); 132622514Sdarrenr fflush(stdout); 132722514Sdarrenr PAUSE(); 132822514Sdarrenr } 132922514Sdarrenr putchar('\n'); 133022514Sdarrenr 133122514Sdarrenr for (i = 0; i < 512; i++) { 133222514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 133322514Sdarrenr *s = (rand() >> 13) & 0xff; 133422514Sdarrenr pip->ip_v = IPVERSION; 133537074Speter pip->ip_off &= htons(0xc000); 133622514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 133722514Sdarrenr sizeof(struct in_addr)); 133822514Sdarrenr pip->ip_sum = 0; 133922514Sdarrenr pip->ip_len &= 0xff; 134022514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 134122514Sdarrenr printf("%d\r", i); 134222514Sdarrenr fflush(stdout); 134322514Sdarrenr PAUSE(); 134422514Sdarrenr } 134522514Sdarrenr putchar('\n'); 134622514Sdarrenr} 1347