iptests.c revision 26119
122514Sdarrenr/* 222514Sdarrenr * (C)opyright 1993, 1994, 1995 by Darren Reed. 322514Sdarrenr * 422514Sdarrenr * This code may be freely distributed as long as it retains this notice 522514Sdarrenr * and is not changed in any way. The author accepts no responsibility 622514Sdarrenr * for the use of this software. I hate legaleese, don't you ? 722514Sdarrenr */ 822514Sdarrenr#if !defined(lint) && defined(LIBC_SCCS) 922514Sdarrenrstatic char sccsid[] = "%W% %G% (C)1995 Darren Reed"; 1022514Sdarrenr#endif 1122514Sdarrenr#include <stdio.h> 1222514Sdarrenr#include <unistd.h> 1322514Sdarrenr#include <stdlib.h> 1422514Sdarrenr#include <string.h> 1522514Sdarrenr#include <sys/types.h> 1622514Sdarrenr#include <sys/time.h> 1722514Sdarrenr#include <sys/param.h> 1822514Sdarrenr#if !defined(solaris) 1922514Sdarrenr# define _KERNEL 2022514Sdarrenr# define KERNEL 2122514Sdarrenr# include <sys/file.h> 2222514Sdarrenr# undef _KERNEL 2322514Sdarrenr# undef KERNEL 2422514Sdarrenr# include <nlist.h> 2522514Sdarrenr# include <sys/user.h> 2622514Sdarrenr# include <sys/proc.h> 2722514Sdarrenr#endif 2822514Sdarrenr#include <kvm.h> 2922514Sdarrenr#include <sys/socket.h> 3026119Sdarrenr#if defined(solaris) 3126119Sdarrenr# include <sys/stream.h> 3226119Sdarrenr#endif 3322514Sdarrenr#include <sys/socketvar.h> 3422514Sdarrenr#ifdef sun 3522514Sdarrenr#include <sys/systm.h> 3622514Sdarrenr#include <sys/session.h> 3722514Sdarrenr#endif 3822514Sdarrenr#if BSD >= 199103 3922514Sdarrenr#include <sys/sysctl.h> 4022514Sdarrenr#include <sys/filedesc.h> 4122514Sdarrenr#include <paths.h> 4222514Sdarrenr#endif 4322514Sdarrenr#include <netinet/in_systm.h> 4422514Sdarrenr#include <sys/socket.h> 4522514Sdarrenr#include <net/if.h> 4622514Sdarrenr#include <net/route.h> 4722514Sdarrenr#include <netinet/in.h> 4822514Sdarrenr#include <arpa/inet.h> 4922514Sdarrenr#include <netinet/ip.h> 5022514Sdarrenr#include <netinet/tcp.h> 5122514Sdarrenr#include <netinet/udp.h> 5222514Sdarrenr#include <netinet/ip_icmp.h> 5322514Sdarrenr#include <netinet/if_ether.h> 5422514Sdarrenr#include <netinet/ip_var.h> 5522514Sdarrenr#include <netinet/in_pcb.h> 5622514Sdarrenr#include <netinet/tcp_timer.h> 5722514Sdarrenr#include <netinet/tcp_var.h> 5822514Sdarrenr# if defined(__SVR4) || defined(__svr4__) 5922514Sdarrenr#include <sys/sysmacros.h> 6022514Sdarrenr# endif 6124583Sdarrenr#include "ipsend.h" 6222514Sdarrenr 6324583Sdarrenr 6422514Sdarrenr#define PAUSE() tv.tv_sec = 0; tv.tv_usec = 10000; \ 6522514Sdarrenr (void) select(0, NULL, NULL, NULL, &tv) 6622514Sdarrenr 6722514Sdarrenr 6822514Sdarrenrvoid ip_test1(dev, mtu, ip, gwip, ptest) 6922514Sdarrenrchar *dev; 7022514Sdarrenrint mtu; 7122514Sdarrenrip_t *ip; 7222514Sdarrenrstruct in_addr gwip; 7322514Sdarrenrint ptest; 7422514Sdarrenr{ 7522514Sdarrenr struct timeval tv; 7622514Sdarrenr udphdr_t *u; 7722514Sdarrenr int nfd, i, len, id = getpid(); 7822514Sdarrenr 7922514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 8022514Sdarrenr ip->ip_v = IPVERSION; 8122514Sdarrenr ip->ip_tos = 0; 8222514Sdarrenr ip->ip_off = 0; 8322514Sdarrenr ip->ip_ttl = 60; 8422514Sdarrenr ip->ip_p = IPPROTO_UDP; 8522514Sdarrenr ip->ip_sum = 0; 8622514Sdarrenr u = (udphdr_t *)(ip + 1); 8722514Sdarrenr u->uh_sport = 1; 8822514Sdarrenr u->uh_dport = 9; 8922514Sdarrenr u->uh_sum = 0; 9022514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 9122514Sdarrenr ip->ip_len = sizeof(*ip) + u->uh_ulen; 9222514Sdarrenr len = ip->ip_len; 9322514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 9422514Sdarrenr 9522514Sdarrenr u->uh_sport = htons(u->uh_sport); 9622514Sdarrenr u->uh_dport = htons(u->uh_dport); 9722514Sdarrenr u->uh_ulen = htons(u->uh_ulen); 9822514Sdarrenr if (!ptest || (ptest == 1)) { 9922514Sdarrenr /* 10022514Sdarrenr * Part1: hl < len 10122514Sdarrenr */ 10222514Sdarrenr ip->ip_id = 0; 10322514Sdarrenr printf("1.1. sending packets with ip_hl < ip_len\n"); 10422514Sdarrenr for (i = 0; i < ((sizeof(*ip) + u->uh_ulen) >> 2); i++) { 10522514Sdarrenr ip->ip_hl = i >> 2; 10622514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 10722514Sdarrenr printf("%d\r", i); 10822514Sdarrenr fflush(stdout); 10922514Sdarrenr PAUSE(); 11022514Sdarrenr } 11122514Sdarrenr putchar('\n'); 11222514Sdarrenr } 11322514Sdarrenr 11422514Sdarrenr if (!ptest || (ptest == 2)) { 11522514Sdarrenr /* 11622514Sdarrenr * Part2: hl > len 11722514Sdarrenr */ 11822514Sdarrenr ip->ip_id = 0; 11922514Sdarrenr printf("1.2. sending packets with ip_hl > ip_len\n"); 12022514Sdarrenr for (; i < ((sizeof(*ip) * 2 + u->uh_ulen) >> 2); i++) { 12122514Sdarrenr ip->ip_hl = i >> 2; 12222514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 12322514Sdarrenr printf("%d\r", i); 12422514Sdarrenr fflush(stdout); 12522514Sdarrenr PAUSE(); 12622514Sdarrenr } 12722514Sdarrenr putchar('\n'); 12822514Sdarrenr } 12922514Sdarrenr 13022514Sdarrenr if (!ptest || (ptest == 3)) { 13122514Sdarrenr /* 13222514Sdarrenr * Part3: v < 4 13322514Sdarrenr */ 13422514Sdarrenr ip->ip_id = 0; 13522514Sdarrenr printf("1.3. ip_v < 4\n"); 13622514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 13722514Sdarrenr for (i = 0; i < 4; i++) { 13822514Sdarrenr ip->ip_v = i; 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 == 4)) { 14822514Sdarrenr /* 14922514Sdarrenr * Part4: v > 4 15022514Sdarrenr */ 15122514Sdarrenr ip->ip_id = 0; 15222514Sdarrenr printf("1.4. ip_v > 4\n"); 15322514Sdarrenr for (i = 5; i < 16; i++) { 15422514Sdarrenr ip->ip_v = i; 15522514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 15622514Sdarrenr printf("%d\r", i); 15722514Sdarrenr fflush(stdout); 15822514Sdarrenr PAUSE(); 15922514Sdarrenr } 16022514Sdarrenr putchar('\n'); 16122514Sdarrenr } 16222514Sdarrenr 16322514Sdarrenr if (!ptest || (ptest == 5)) { 16422514Sdarrenr /* 16522514Sdarrenr * Part5: len < packet 16622514Sdarrenr */ 16722514Sdarrenr ip->ip_id = 0; 16822514Sdarrenr ip->ip_v = IPVERSION; 16922514Sdarrenr i = ip->ip_len + 1; 17022514Sdarrenr ip->ip_len = htons(ip->ip_len); 17122514Sdarrenr ip->ip_off = htons(ip->ip_off); 17222514Sdarrenr printf("1.5.0 ip_len < packet size (size++, long packets)\n"); 17322514Sdarrenr for (; i < (ntohs(ip->ip_len) * 2); i++) { 17422514Sdarrenr ip->ip_id = htons(id++); 17522514Sdarrenr ip->ip_sum = 0; 17624583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 17724583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 17822514Sdarrenr printf("%d\r", i); 17922514Sdarrenr fflush(stdout); 18022514Sdarrenr PAUSE(); 18122514Sdarrenr } 18222514Sdarrenr putchar('\n'); 18322514Sdarrenr printf("1.5.1 ip_len < packet size (ip_len-, short packets)\n"); 18422514Sdarrenr for (i = len; i > 0; i--) { 18522514Sdarrenr ip->ip_id = htons(id++); 18622514Sdarrenr ip->ip_len = htons(i); 18722514Sdarrenr ip->ip_sum = 0; 18824583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 18924583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 19022514Sdarrenr printf("%d\r", i); 19122514Sdarrenr fflush(stdout); 19222514Sdarrenr PAUSE(); 19322514Sdarrenr } 19422514Sdarrenr putchar('\n'); 19522514Sdarrenr } 19622514Sdarrenr 19722514Sdarrenr if (!ptest || (ptest == 6)) { 19822514Sdarrenr /* 19922514Sdarrenr * Part6: len > packet 20022514Sdarrenr */ 20122514Sdarrenr ip->ip_id = 0; 20222514Sdarrenr printf("1.6.0 ip_len > packet size (increase ip_len)\n"); 20322514Sdarrenr for (i = len + 1; i < (len * 2); i++) { 20422514Sdarrenr ip->ip_id = htons(id++); 20522514Sdarrenr ip->ip_len = htons(i); 20622514Sdarrenr ip->ip_sum = 0; 20724583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 20824583Sdarrenr (void) send_ether(nfd, (char *)ip, len, gwip); 20922514Sdarrenr printf("%d\r", i); 21022514Sdarrenr fflush(stdout); 21122514Sdarrenr PAUSE(); 21222514Sdarrenr } 21322514Sdarrenr putchar('\n'); 21422514Sdarrenr ip->ip_len = htons(len); 21522514Sdarrenr printf("1.6.1 ip_len > packet size (size--, short packets)\n"); 21622514Sdarrenr for (i = len; i > 0; i--) { 21722514Sdarrenr ip->ip_id = htons(id++); 21822514Sdarrenr ip->ip_sum = 0; 21924583Sdarrenr ip->ip_sum = chksum((u_short *)ip, ip->ip_hl << 2); 22024583Sdarrenr (void) send_ether(nfd, (char *)ip, i, gwip); 22122514Sdarrenr printf("%d\r", i); 22222514Sdarrenr fflush(stdout); 22322514Sdarrenr PAUSE(); 22422514Sdarrenr } 22522514Sdarrenr putchar('\n'); 22622514Sdarrenr } 22722514Sdarrenr 22822514Sdarrenr if (!ptest || (ptest == 7)) { 22922514Sdarrenr /* 23022514Sdarrenr * Part7: 0 length fragment 23122514Sdarrenr */ 23222514Sdarrenr printf("1.7.0 Zero length fragments (ip_off = 0x2000)\n"); 23322514Sdarrenr ip->ip_id = 0; 23422514Sdarrenr ip->ip_len = sizeof(*ip); 23522514Sdarrenr ip->ip_off = htons(IP_MF); 23622514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 23722514Sdarrenr fflush(stdout); 23822514Sdarrenr PAUSE(); 23922514Sdarrenr 24022514Sdarrenr printf("1.7.1 Zero length fragments (ip_off = 0x3000)\n"); 24122514Sdarrenr ip->ip_id = 0; 24222514Sdarrenr ip->ip_len = sizeof(*ip); 24322514Sdarrenr ip->ip_off = htons(IP_MF); 24422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 24522514Sdarrenr fflush(stdout); 24622514Sdarrenr PAUSE(); 24722514Sdarrenr 24822514Sdarrenr printf("1.7.2 Zero length fragments (ip_off = 0xa000)\n"); 24922514Sdarrenr ip->ip_id = 0; 25022514Sdarrenr ip->ip_len = sizeof(*ip); 25122514Sdarrenr ip->ip_off = htons(0xa000); 25222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 25322514Sdarrenr fflush(stdout); 25422514Sdarrenr PAUSE(); 25522514Sdarrenr 25622514Sdarrenr printf("1.7.3 Zero length fragments (ip_off = 0x0100)\n"); 25722514Sdarrenr ip->ip_id = 0; 25822514Sdarrenr ip->ip_len = sizeof(*ip); 25922514Sdarrenr ip->ip_off = htons(0x0100); 26022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 26122514Sdarrenr fflush(stdout); 26222514Sdarrenr PAUSE(); 26322514Sdarrenr } 26422514Sdarrenr 26522514Sdarrenr if (!ptest || (ptest == 8)) { 26622514Sdarrenr struct timeval tv; 26722514Sdarrenr 26822514Sdarrenr gettimeofday(&tv, NULL); 26922514Sdarrenr srand(tv.tv_sec ^ getpid() ^ tv.tv_usec); 27022514Sdarrenr /* 27122514Sdarrenr * Part8.1: 63k packet + 1k fragment at offset 0x1ffe 27222514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 27322514Sdarrenr * don't bother about the ICMP header, we're not worrying 27422514Sdarrenr * about that here. 27522514Sdarrenr */ 27622514Sdarrenr ip->ip_p = IPPROTO_ICMP; 27722514Sdarrenr ip->ip_off = IP_MF; 27822514Sdarrenr u->uh_dport = htons(9); 27922514Sdarrenr ip->ip_id = htons(id++); 28022514Sdarrenr printf("1.8.1 63k packet + 1k fragment at offset 0x1ffe\n"); 28122514Sdarrenr ip->ip_len = 768 + 20 + 8; 28222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 28322514Sdarrenr printf("%d\r", i); 28422514Sdarrenr 28522514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 28622514Sdarrenr i = 512; 28722514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 28822514Sdarrenr ip->ip_off = IP_MF | (i >> 3); 28922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 29022514Sdarrenr printf("%d\r", i); 29122514Sdarrenr fflush(stdout); 29222514Sdarrenr PAUSE(); 29322514Sdarrenr } 29422514Sdarrenr ip->ip_len = 896 + 20; 29522514Sdarrenr ip->ip_off = (i >> 3); 29622514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 29722514Sdarrenr printf("%d\r", i); 29822514Sdarrenr putchar('\n'); 29922514Sdarrenr fflush(stdout); 30022514Sdarrenr 30122514Sdarrenr /* 30222514Sdarrenr * Part8.2: 63k packet + 1k fragment at offset 0x1ffe 30322514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 30422514Sdarrenr * don't bother about the ICMP header, we're not worrying 30522514Sdarrenr * about that here. (Lossage here) 30622514Sdarrenr */ 30722514Sdarrenr ip->ip_p = IPPROTO_ICMP; 30822514Sdarrenr ip->ip_off = IP_MF; 30922514Sdarrenr u->uh_dport = htons(9); 31022514Sdarrenr ip->ip_id = htons(id++); 31122514Sdarrenr printf("1.8.2 63k packet + 1k fragment at offset 0x1ffe\n"); 31222514Sdarrenr ip->ip_len = 768 + 20 + 8; 31322514Sdarrenr if ((rand() & 0x1f) != 0) { 31422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 31522514Sdarrenr printf("%d\r", i); 31622514Sdarrenr } else 31722514Sdarrenr printf("skip 0\n"); 31822514Sdarrenr 31922514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 32022514Sdarrenr i = 512; 32122514Sdarrenr for (; i < (63 * 1024 + 768); i += 768) { 32222514Sdarrenr ip->ip_off = IP_MF | (i >> 3); 32322514Sdarrenr if ((rand() & 0x1f) != 0) { 32422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 32522514Sdarrenr printf("%d\r", i); 32622514Sdarrenr } else 32722514Sdarrenr printf("skip %d\n", i); 32822514Sdarrenr fflush(stdout); 32922514Sdarrenr PAUSE(); 33022514Sdarrenr } 33122514Sdarrenr ip->ip_len = 896 + 20; 33222514Sdarrenr ip->ip_off = (i >> 3); 33322514Sdarrenr if ((rand() & 0x1f) != 0) { 33422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 33522514Sdarrenr printf("%d\r", i); 33622514Sdarrenr } else 33722514Sdarrenr printf("skip\n"); 33822514Sdarrenr putchar('\n'); 33922514Sdarrenr fflush(stdout); 34022514Sdarrenr 34122514Sdarrenr /* 34222514Sdarrenr * Part8.3: 33k packet - test for not dealing with -ve length 34322514Sdarrenr * Mark it as being ICMP (so it doesn't get junked), but 34422514Sdarrenr * don't bother about the ICMP header, we're not worrying 34522514Sdarrenr * about that here. 34622514Sdarrenr */ 34722514Sdarrenr ip->ip_p = IPPROTO_ICMP; 34822514Sdarrenr ip->ip_off = IP_MF; 34922514Sdarrenr u->uh_dport = htons(9); 35022514Sdarrenr ip->ip_id = htons(id++); 35122514Sdarrenr printf("1.8.3 33k packet\n"); 35222514Sdarrenr ip->ip_len = 768 + 20 + 8; 35322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 35422514Sdarrenr printf("%d\r", i); 35522514Sdarrenr 35622514Sdarrenr ip->ip_len = MIN(768 + 20, mtu - 68); 35722514Sdarrenr i = 512; 35822514Sdarrenr for (; i < (32 * 1024 + 768); i += 768) { 35922514Sdarrenr ip->ip_off = IP_MF | (i >> 3); 36022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 36122514Sdarrenr printf("%d\r", i); 36222514Sdarrenr fflush(stdout); 36322514Sdarrenr PAUSE(); 36422514Sdarrenr } 36522514Sdarrenr ip->ip_len = 896 + 20; 36622514Sdarrenr ip->ip_off = (i >> 3); 36722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 36822514Sdarrenr printf("%d\r", i); 36922514Sdarrenr putchar('\n'); 37022514Sdarrenr fflush(stdout); 37122514Sdarrenr } 37222514Sdarrenr 37322514Sdarrenr ip->ip_len = len; 37422514Sdarrenr ip->ip_off = 0; 37522514Sdarrenr if (!ptest || (ptest == 9)) { 37622514Sdarrenr /* 37722514Sdarrenr * Part9: off & 0x8000 == 0x8000 37822514Sdarrenr */ 37922514Sdarrenr ip->ip_id = 0; 38022514Sdarrenr ip->ip_off = 0x8000; 38122514Sdarrenr printf("1.9. ip_off & 0x8000 == 0x8000\n"); 38222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 38322514Sdarrenr fflush(stdout); 38422514Sdarrenr PAUSE(); 38522514Sdarrenr } 38622514Sdarrenr 38722514Sdarrenr ip->ip_off = 0; 38822514Sdarrenr 38922514Sdarrenr if (!ptest || (ptest == 10)) { 39022514Sdarrenr /* 39122514Sdarrenr * Part10: ttl = 255 39222514Sdarrenr */ 39322514Sdarrenr ip->ip_id = 0; 39422514Sdarrenr ip->ip_ttl = 255; 39522514Sdarrenr printf("1.10.0 ip_ttl = 255\n"); 39622514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 39722514Sdarrenr fflush(stdout); 39822514Sdarrenr PAUSE(); 39922514Sdarrenr 40022514Sdarrenr ip->ip_ttl = 128; 40122514Sdarrenr printf("1.10.1 ip_ttl = 128\n"); 40222514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 40322514Sdarrenr fflush(stdout); 40422514Sdarrenr PAUSE(); 40522514Sdarrenr 40622514Sdarrenr ip->ip_ttl = 0; 40722514Sdarrenr printf("1.10.2 ip_ttl = 0\n"); 40822514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 40922514Sdarrenr fflush(stdout); 41022514Sdarrenr PAUSE(); 41122514Sdarrenr } 41222514Sdarrenr 41322514Sdarrenr (void) close(nfd); 41422514Sdarrenr} 41522514Sdarrenr 41622514Sdarrenr 41722514Sdarrenrvoid ip_test2(dev, mtu, ip, gwip, ptest) 41822514Sdarrenrchar *dev; 41922514Sdarrenrint mtu; 42022514Sdarrenrip_t *ip; 42122514Sdarrenrstruct in_addr gwip; 42222514Sdarrenrint ptest; 42322514Sdarrenr{ 42422514Sdarrenr struct timeval tv; 42522514Sdarrenr int nfd; 42622514Sdarrenr u_char *s; 42722514Sdarrenr 42822514Sdarrenr s = (u_char *)(ip + 1); 42922514Sdarrenr nfd = initdevice(dev, 1, 1); 43022514Sdarrenr 43122514Sdarrenr ip->ip_hl = 6; 43222514Sdarrenr ip->ip_len = ip->ip_hl << 2; 43322514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_NOP; 43422514Sdarrenr s++; 43522514Sdarrenr if (!ptest || (ptest == 1)) { 43622514Sdarrenr /* 43722514Sdarrenr * Test 1: option length > packet length, 43822514Sdarrenr * header length == packet length 43922514Sdarrenr */ 44022514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 44122514Sdarrenr s[IPOPT_OLEN] = 4; 44222514Sdarrenr s[IPOPT_OFFSET] = IPOPT_MINOFF; 44322514Sdarrenr ip->ip_p = IPPROTO_IP; 44422514Sdarrenr printf("2.1 option length > packet length\n"); 44522514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 44622514Sdarrenr fflush(stdout); 44722514Sdarrenr PAUSE(); 44822514Sdarrenr } 44922514Sdarrenr 45022514Sdarrenr ip->ip_hl = 7; 45122514Sdarrenr ip->ip_len = ip->ip_hl << 2; 45222514Sdarrenr if (!ptest || (ptest == 1)) { 45322514Sdarrenr /* 45422514Sdarrenr * Test 2: options have length = 0 45522514Sdarrenr */ 45622514Sdarrenr printf("2.2.1 option length = 0, RR\n"); 45722514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_RR; 45822514Sdarrenr s[IPOPT_OLEN] = 0; 45922514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 46022514Sdarrenr fflush(stdout); 46122514Sdarrenr PAUSE(); 46222514Sdarrenr 46322514Sdarrenr printf("2.2.2 option length = 0, TS\n"); 46422514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_TS; 46522514Sdarrenr s[IPOPT_OLEN] = 0; 46622514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 46722514Sdarrenr fflush(stdout); 46822514Sdarrenr PAUSE(); 46922514Sdarrenr 47022514Sdarrenr printf("2.2.3 option length = 0, SECURITY\n"); 47122514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SECURITY; 47222514Sdarrenr s[IPOPT_OLEN] = 0; 47322514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 47422514Sdarrenr fflush(stdout); 47522514Sdarrenr PAUSE(); 47622514Sdarrenr 47722514Sdarrenr printf("2.2.4 option length = 0, LSRR\n"); 47822514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_LSRR; 47922514Sdarrenr s[IPOPT_OLEN] = 0; 48022514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48122514Sdarrenr fflush(stdout); 48222514Sdarrenr PAUSE(); 48322514Sdarrenr 48422514Sdarrenr printf("2.2.5 option length = 0, SATID\n"); 48522514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SATID; 48622514Sdarrenr s[IPOPT_OLEN] = 0; 48722514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 48822514Sdarrenr fflush(stdout); 48922514Sdarrenr PAUSE(); 49022514Sdarrenr 49122514Sdarrenr printf("2.2.6 option length = 0, SSRR\n"); 49222514Sdarrenr s[IPOPT_OPTVAL] = IPOPT_SSRR; 49322514Sdarrenr s[IPOPT_OLEN] = 0; 49422514Sdarrenr (void) send_ip(nfd, mtu, ip, gwip, 1); 49522514Sdarrenr fflush(stdout); 49622514Sdarrenr PAUSE(); 49722514Sdarrenr } 49822514Sdarrenr 49922514Sdarrenr (void) close(nfd); 50022514Sdarrenr} 50122514Sdarrenr 50222514Sdarrenr 50322514Sdarrenr/* 50422514Sdarrenr * test 3 (ICMP) 50522514Sdarrenr */ 50622514Sdarrenrvoid ip_test3(dev, mtu, ip, gwip, ptest) 50722514Sdarrenrchar *dev; 50822514Sdarrenrint mtu; 50922514Sdarrenrip_t *ip; 51022514Sdarrenrstruct in_addr gwip; 51122514Sdarrenrint ptest; 51222514Sdarrenr{ 51322514Sdarrenr static int ict1[10] = { 8, 9, 10, 13, 14, 15, 16, 17, 18, 0 }; 51422514Sdarrenr static int ict2[8] = { 3, 9, 10, 13, 14, 17, 18, 0 }; 51522514Sdarrenr struct timeval tv; 51622514Sdarrenr struct icmp *icp; 51722514Sdarrenr int nfd, i; 51822514Sdarrenr 51922514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 52022514Sdarrenr ip->ip_v = IPVERSION; 52122514Sdarrenr ip->ip_tos = 0; 52222514Sdarrenr ip->ip_off = 0; 52322514Sdarrenr ip->ip_ttl = 60; 52422514Sdarrenr ip->ip_p = IPPROTO_ICMP; 52522514Sdarrenr ip->ip_sum = 0; 52622514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp); 52722514Sdarrenr icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2)); 52822514Sdarrenr nfd = initdevice(dev, 1, 1); 52922514Sdarrenr 53022514Sdarrenr if (!ptest || (ptest == 1)) { 53122514Sdarrenr /* 53222514Sdarrenr * Type 0 - 31, 255, code = 0 53322514Sdarrenr */ 53422514Sdarrenr bzero((char *)icp, sizeof(*icp)); 53522514Sdarrenr for (i = 0; i < 32; i++) { 53622514Sdarrenr icp->icmp_type = i; 53722514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 53822514Sdarrenr PAUSE(); 53922514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, i); 54022514Sdarrenr } 54122514Sdarrenr icp->icmp_type = 255; 54222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 54322514Sdarrenr PAUSE(); 54422514Sdarrenr printf("3.1.%d ICMP type %d code 0 (all 0's)\r", i, 255); 54522514Sdarrenr putchar('\n'); 54622514Sdarrenr } 54722514Sdarrenr 54822514Sdarrenr if (!ptest || (ptest == 2)) { 54922514Sdarrenr /* 55022514Sdarrenr * Type 3, code = 0 - 31 55122514Sdarrenr */ 55222514Sdarrenr icp->icmp_type = 3; 55322514Sdarrenr for (i = 0; i < 32; i++) { 55422514Sdarrenr icp->icmp_code = i; 55522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 55622514Sdarrenr PAUSE(); 55722514Sdarrenr printf("3.2.%d ICMP type 3 code %d (all 0's)\r", i, i); 55822514Sdarrenr } 55922514Sdarrenr } 56022514Sdarrenr 56122514Sdarrenr if (!ptest || (ptest == 3)) { 56222514Sdarrenr /* 56322514Sdarrenr * Type 4, code = 0,127,128,255 56422514Sdarrenr */ 56522514Sdarrenr icp->icmp_type = 4; 56622514Sdarrenr icp->icmp_code = 0; 56722514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 56822514Sdarrenr PAUSE(); 56922514Sdarrenr printf("3.3.1 ICMP type 4 code 0 (all 0's)\r"); 57022514Sdarrenr icp->icmp_code = 127; 57122514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 57222514Sdarrenr PAUSE(); 57322514Sdarrenr printf("3.3.2 ICMP type 4 code 127 (all 0's)\r"); 57422514Sdarrenr icp->icmp_code = 128; 57522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 57622514Sdarrenr PAUSE(); 57722514Sdarrenr printf("3.3.3 ICMP type 4 code 128 (all 0's)\r"); 57822514Sdarrenr icp->icmp_code = 255; 57922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 58022514Sdarrenr PAUSE(); 58122514Sdarrenr printf("3.3.4 ICMP type 4 code 255 (all 0's)\r"); 58222514Sdarrenr } 58322514Sdarrenr 58422514Sdarrenr if (!ptest || (ptest == 4)) { 58522514Sdarrenr /* 58622514Sdarrenr * Type 5, code = 0,127,128,255 58722514Sdarrenr */ 58822514Sdarrenr icp->icmp_type = 5; 58922514Sdarrenr icp->icmp_code = 0; 59022514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59122514Sdarrenr PAUSE(); 59222514Sdarrenr printf("3.4.1 ICMP type 5 code 0 (all 0's)\r"); 59322514Sdarrenr icp->icmp_code = 127; 59422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59522514Sdarrenr PAUSE(); 59622514Sdarrenr printf("3.4.2 ICMP type 5 code 127 (all 0's)\r"); 59722514Sdarrenr icp->icmp_code = 128; 59822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 59922514Sdarrenr PAUSE(); 60022514Sdarrenr printf("3.4.3 ICMP type 5 code 128 (all 0's)\r"); 60122514Sdarrenr icp->icmp_code = 255; 60222514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 60322514Sdarrenr PAUSE(); 60422514Sdarrenr printf("3.4.4 ICMP type 5 code 255 (all 0's)\r"); 60522514Sdarrenr } 60622514Sdarrenr 60722514Sdarrenr if (!ptest || (ptest == 5)) { 60822514Sdarrenr /* 60922514Sdarrenr * Type 8-10;13-18, code - 0,127,128,255 61022514Sdarrenr */ 61122514Sdarrenr for (i = 0; ict1[i]; i++) { 61222514Sdarrenr icp->icmp_type = ict1[i]; 61322514Sdarrenr icp->icmp_code = 0; 61422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 61522514Sdarrenr PAUSE(); 61622514Sdarrenr printf("3.5.%d ICMP type 5 code 0 (all 0's)\r", 61722514Sdarrenr i * 4); 61822514Sdarrenr icp->icmp_code = 127; 61922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 62022514Sdarrenr PAUSE(); 62122514Sdarrenr printf("3.5.%d ICMP type 5 code 127 (all 0's)\r", 62222514Sdarrenr i * 4 + 1); 62322514Sdarrenr icp->icmp_code = 128; 62422514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 62522514Sdarrenr PAUSE(); 62622514Sdarrenr printf("3.5.%d ICMP type 5 code 128 (all 0's)\r", 62722514Sdarrenr i * 4 + 2); 62822514Sdarrenr icp->icmp_code = 255; 62922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 63022514Sdarrenr PAUSE(); 63122514Sdarrenr printf("3.5.%d ICMP type 5 code 255 (all 0's)\r", 63222514Sdarrenr i * 4 + 3); 63322514Sdarrenr } 63422514Sdarrenr putchar('\n'); 63522514Sdarrenr } 63622514Sdarrenr 63722514Sdarrenr if (!ptest || (ptest == 6)) { 63822514Sdarrenr /* 63922514Sdarrenr * Type 12, code - 0,127,128,129,255 64022514Sdarrenr */ 64122514Sdarrenr icp->icmp_type = 12; 64222514Sdarrenr icp->icmp_code = 0; 64322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64422514Sdarrenr PAUSE(); 64522514Sdarrenr printf("3.6.1 ICMP type 12 code 0 (all 0's)\r"); 64622514Sdarrenr icp->icmp_code = 127; 64722514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 64822514Sdarrenr PAUSE(); 64922514Sdarrenr printf("3.6.2 ICMP type 12 code 127 (all 0's)\r"); 65022514Sdarrenr icp->icmp_code = 128; 65122514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 65222514Sdarrenr PAUSE(); 65322514Sdarrenr printf("3.6.3 ICMP type 12 code 128 (all 0's)\r"); 65422514Sdarrenr icp->icmp_code = 129; 65522514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 65622514Sdarrenr PAUSE(); 65722514Sdarrenr printf("3.6.4 ICMP type 12 code 129 (all 0's)\r"); 65822514Sdarrenr icp->icmp_code = 255; 65922514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 66022514Sdarrenr PAUSE(); 66122514Sdarrenr printf("3.6.5 ICMP type 12 code 255 (all 0's)\r"); 66222514Sdarrenr putchar('\n'); 66322514Sdarrenr } 66422514Sdarrenr 66522514Sdarrenr if (!ptest || (ptest == 7)) { 66622514Sdarrenr /* 66722514Sdarrenr * Type 3;9-10;13-14;17-18 - shorter packets 66822514Sdarrenr */ 66922514Sdarrenr ip->ip_len = sizeof(*ip) + sizeof(*icp) / 2; 67022514Sdarrenr for (i = 0; ict2[i]; i++) { 67122514Sdarrenr icp->icmp_type = ict1[i]; 67222514Sdarrenr icp->icmp_code = 0; 67322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67422514Sdarrenr PAUSE(); 67522514Sdarrenr printf("3.5.%d ICMP type %d code 0 (all 0's)\r", 67622514Sdarrenr i * 4, icp->icmp_type); 67722514Sdarrenr icp->icmp_code = 127; 67822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 67922514Sdarrenr PAUSE(); 68022514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 68122514Sdarrenr i * 4 + 1, icp->icmp_type); 68222514Sdarrenr icp->icmp_code = 128; 68322514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 68422514Sdarrenr PAUSE(); 68522514Sdarrenr printf("3.5.%d ICMP type %d code 128 (all 0's)\r", 68622514Sdarrenr i * 4 + 2, icp->icmp_type); 68722514Sdarrenr icp->icmp_code = 255; 68822514Sdarrenr (void) send_icmp(nfd, mtu, ip, gwip); 68922514Sdarrenr PAUSE(); 69022514Sdarrenr printf("3.5.%d ICMP type %d code 127 (all 0's)\r", 69122514Sdarrenr i * 4 + 3, icp->icmp_type); 69222514Sdarrenr } 69322514Sdarrenr putchar('\n'); 69422514Sdarrenr } 69522514Sdarrenr} 69622514Sdarrenr 69722514Sdarrenr 69822514Sdarrenr/* Perform test 4 (UDP) */ 69922514Sdarrenr 70022514Sdarrenrvoid ip_test4(dev, mtu, ip, gwip, ptest) 70122514Sdarrenrchar *dev; 70222514Sdarrenrint mtu; 70322514Sdarrenrip_t *ip; 70422514Sdarrenrstruct in_addr gwip; 70522514Sdarrenrint ptest; 70622514Sdarrenr{ 70722514Sdarrenr struct timeval tv; 70822514Sdarrenr struct udphdr *u; 70922514Sdarrenr int nfd, i; 71022514Sdarrenr 71122514Sdarrenr 71222514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 71322514Sdarrenr ip->ip_v = IPVERSION; 71422514Sdarrenr ip->ip_tos = 0; 71522514Sdarrenr ip->ip_off = 0; 71622514Sdarrenr ip->ip_ttl = 60; 71722514Sdarrenr ip->ip_p = IPPROTO_UDP; 71822514Sdarrenr ip->ip_sum = 0; 71922514Sdarrenr u = (udphdr_t *)((char *)ip + (ip->ip_hl << 2)); 72022514Sdarrenr u->uh_sport = 1; 72122514Sdarrenr u->uh_dport = 1; 72222514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 72322514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 72422514Sdarrenr 72522514Sdarrenr if (!ptest || (ptest == 1)) { 72622514Sdarrenr /* 72722514Sdarrenr * Test 1. ulen > packet 72822514Sdarrenr */ 72922514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 73022514Sdarrenr ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen; 73122514Sdarrenr printf("4.1 UDP uh_ulen > packet size - short packets\n"); 73222514Sdarrenr for (i = u->uh_ulen * 2; i > sizeof(*u) + 4; i--) { 73322514Sdarrenr u->uh_ulen = i; 73422514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 73522514Sdarrenr printf("%d\r", i); 73622514Sdarrenr fflush(stdout); 73722514Sdarrenr PAUSE(); 73822514Sdarrenr } 73922514Sdarrenr putchar('\n'); 74022514Sdarrenr } 74122514Sdarrenr 74222514Sdarrenr if (!ptest || (ptest == 2)) { 74322514Sdarrenr /* 74422514Sdarrenr * Test 2. ulen < packet 74522514Sdarrenr */ 74622514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 74722514Sdarrenr ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen; 74822514Sdarrenr printf("4.2 UDP uh_ulen < packet size - short packets\n"); 74922514Sdarrenr for (i = u->uh_ulen * 2; i > sizeof(*u) + 4; i--) { 75022514Sdarrenr ip->ip_len = i; 75122514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 75222514Sdarrenr printf("%d\r", i); 75322514Sdarrenr fflush(stdout); 75422514Sdarrenr PAUSE(); 75522514Sdarrenr } 75622514Sdarrenr putchar('\n'); 75722514Sdarrenr } 75822514Sdarrenr 75922514Sdarrenr if (!ptest || (ptest == 3)) { 76022514Sdarrenr /* 76122514Sdarrenr * Test 3: sport = 0, sport = 1, sport = 32767 76222514Sdarrenr * sport = 32768, sport = 65535 76322514Sdarrenr */ 76422514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 76522514Sdarrenr ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen; 76622514Sdarrenr printf("4.3.1 UDP sport = 0\n"); 76722514Sdarrenr u->uh_sport = 0; 76822514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 76922514Sdarrenr printf("0\n"); 77022514Sdarrenr fflush(stdout); 77122514Sdarrenr PAUSE(); 77222514Sdarrenr printf("4.3.2 UDP sport = 1\n"); 77322514Sdarrenr u->uh_sport = 1; 77422514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 77522514Sdarrenr printf("1\n"); 77622514Sdarrenr fflush(stdout); 77722514Sdarrenr PAUSE(); 77822514Sdarrenr printf("4.3.3 UDP sport = 32767\n"); 77922514Sdarrenr u->uh_sport = 32767; 78022514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 78122514Sdarrenr printf("32767\n"); 78222514Sdarrenr fflush(stdout); 78322514Sdarrenr PAUSE(); 78422514Sdarrenr printf("4.3.4 UDP sport = 32768\n"); 78522514Sdarrenr u->uh_sport = 32768; 78622514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 78722514Sdarrenr printf("32768\n"); 78822514Sdarrenr putchar('\n'); 78922514Sdarrenr fflush(stdout); 79022514Sdarrenr PAUSE(); 79122514Sdarrenr printf("4.3.5 UDP sport = 65535\n"); 79222514Sdarrenr u->uh_sport = 65535; 79322514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 79422514Sdarrenr printf("65535\n"); 79522514Sdarrenr fflush(stdout); 79622514Sdarrenr PAUSE(); 79722514Sdarrenr } 79822514Sdarrenr 79922514Sdarrenr if (!ptest || (ptest == 4)) { 80022514Sdarrenr /* 80122514Sdarrenr * Test 4: dport = 0, dport = 1, dport = 32767 80222514Sdarrenr * dport = 32768, dport = 65535 80322514Sdarrenr */ 80422514Sdarrenr u->uh_ulen = sizeof(*u) + 4; 80522514Sdarrenr u->uh_sport = 1; 80622514Sdarrenr ip->ip_len = (ip->ip_hl << 2) + u->uh_ulen; 80722514Sdarrenr printf("4.4.1 UDP dport = 0\n"); 80822514Sdarrenr u->uh_dport = 0; 80922514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 81022514Sdarrenr printf("0\n"); 81122514Sdarrenr fflush(stdout); 81222514Sdarrenr PAUSE(); 81322514Sdarrenr printf("4.4.2 UDP dport = 1\n"); 81422514Sdarrenr u->uh_dport = 1; 81522514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 81622514Sdarrenr printf("1\n"); 81722514Sdarrenr fflush(stdout); 81822514Sdarrenr PAUSE(); 81922514Sdarrenr printf("4.4.3 UDP dport = 32767\n"); 82022514Sdarrenr u->uh_dport = 32767; 82122514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 82222514Sdarrenr printf("32767\n"); 82322514Sdarrenr fflush(stdout); 82422514Sdarrenr PAUSE(); 82522514Sdarrenr printf("4.4.4 UDP dport = 32768\n"); 82622514Sdarrenr u->uh_dport = 32768; 82722514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 82822514Sdarrenr printf("32768\n"); 82922514Sdarrenr fflush(stdout); 83022514Sdarrenr PAUSE(); 83122514Sdarrenr printf("4.4.5 UDP dport = 65535\n"); 83222514Sdarrenr u->uh_dport = 65535; 83322514Sdarrenr (void) send_udp(nfd, 1500, ip, gwip); 83422514Sdarrenr printf("65535\n"); 83522514Sdarrenr fflush(stdout); 83622514Sdarrenr PAUSE(); 83722514Sdarrenr } 83822514Sdarrenr 83922514Sdarrenr if (!ptest || (ptest == 4)) { 84022514Sdarrenr /* 84122514Sdarrenr * Test 5: sizeof(struct ip) <= MTU <= sizeof(struct udphdr) + 84222514Sdarrenr * sizeof(struct ip) 84322514Sdarrenr */ 84422514Sdarrenr printf("4.5 UDP 20 <= MTU <= 32\n"); 84522514Sdarrenr for (i = sizeof(*ip); i <= u->uh_ulen; i++) { 84622514Sdarrenr (void) send_udp(nfd, i, ip, gwip); 84722514Sdarrenr printf("%d\r", i); 84822514Sdarrenr fflush(stdout); 84922514Sdarrenr PAUSE(); 85022514Sdarrenr } 85122514Sdarrenr putchar('\n'); 85222514Sdarrenr } 85322514Sdarrenr} 85422514Sdarrenr 85522514Sdarrenr 85622514Sdarrenr/* Perform test 5 (TCP) */ 85722514Sdarrenr 85822514Sdarrenrvoid ip_test5(dev, mtu, ip, gwip, ptest) 85922514Sdarrenrchar *dev; 86022514Sdarrenrint mtu; 86122514Sdarrenrip_t *ip; 86222514Sdarrenrstruct in_addr gwip; 86322514Sdarrenrint ptest; 86422514Sdarrenr{ 86522514Sdarrenr struct timeval tv; 86622514Sdarrenr tcphdr_t *t; 86722514Sdarrenr int nfd, i; 86822514Sdarrenr 86922514Sdarrenr t = (tcphdr_t *)((char *)ip + (ip->ip_hl << 2)); 87022514Sdarrenr t->th_x2 = 0; 87122514Sdarrenr t->th_off = 0; 87222514Sdarrenr t->th_sport = 1; 87322514Sdarrenr t->th_dport = 1; 87422514Sdarrenr t->th_win = 4096; 87522514Sdarrenr t->th_urp = 0; 87622514Sdarrenr t->th_sum = 0; 87722514Sdarrenr t->th_seq = 1; 87822514Sdarrenr t->th_ack = 0; 87922514Sdarrenr nfd = initdevice(dev, t->th_sport, 1); 88022514Sdarrenr 88122514Sdarrenr if (!ptest || (ptest == 1)) { 88222514Sdarrenr /* 88322514Sdarrenr * Test 1: flags variations, 0 - 3f 88422514Sdarrenr */ 88522514Sdarrenr t->th_off = sizeof(*t) >> 2; 88622514Sdarrenr printf("5.1 Test TCP flag combinations\n"); 88722514Sdarrenr for (i = 0; i <= (TH_URG|TH_ACK|TH_PUSH|TH_RST|TH_SYN|TH_FIN); 88822514Sdarrenr i++) { 88922514Sdarrenr t->th_flags = i; 89022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 89122514Sdarrenr printf("%d\r", i); 89222514Sdarrenr fflush(stdout); 89322514Sdarrenr PAUSE(); 89422514Sdarrenr } 89522514Sdarrenr putchar('\n'); 89622514Sdarrenr } 89722514Sdarrenr 89822514Sdarrenr if (!ptest || (ptest == 2)) { 89922514Sdarrenr t->th_flags = TH_SYN; 90022514Sdarrenr /* 90122514Sdarrenr * Test 2: seq = 0, seq = 1, seq = 0x7fffffff, seq=0x80000000, 90222514Sdarrenr * seq = 0xa000000, seq = 0xffffffff 90322514Sdarrenr */ 90422514Sdarrenr printf("5.2.1 TCP seq = 0\n"); 90522514Sdarrenr t->th_seq = 0; 90622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 90722514Sdarrenr fflush(stdout); 90822514Sdarrenr PAUSE(); 90922514Sdarrenr 91022514Sdarrenr printf("5.2.2 TCP seq = 1\n"); 91122514Sdarrenr t->th_seq = 1; 91222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 91322514Sdarrenr fflush(stdout); 91422514Sdarrenr PAUSE(); 91522514Sdarrenr 91622514Sdarrenr printf("5.2.3 TCP seq = 0x7fffffff\n"); 91722514Sdarrenr t->th_seq = 0x7fffffff; 91822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 91922514Sdarrenr fflush(stdout); 92022514Sdarrenr PAUSE(); 92122514Sdarrenr 92222514Sdarrenr printf("5.2.4 TCP seq = 0x80000000\n"); 92322514Sdarrenr t->th_seq = 0x80000000; 92422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 92522514Sdarrenr fflush(stdout); 92622514Sdarrenr PAUSE(); 92722514Sdarrenr 92822514Sdarrenr printf("5.2.5 TCP seq = 0xc0000000\n"); 92922514Sdarrenr t->th_seq = 0xc0000000; 93022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93122514Sdarrenr fflush(stdout); 93222514Sdarrenr PAUSE(); 93322514Sdarrenr 93422514Sdarrenr printf("5.2.6 TCP seq = 0xffffffff\n"); 93522514Sdarrenr t->th_seq = 0xffffffff; 93622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 93722514Sdarrenr fflush(stdout); 93822514Sdarrenr PAUSE(); 93922514Sdarrenr } 94022514Sdarrenr 94122514Sdarrenr if (!ptest || (ptest == 3)) { 94222514Sdarrenr t->th_flags = TH_ACK; 94322514Sdarrenr /* 94422514Sdarrenr * Test 3: ack = 0, ack = 1, ack = 0x7fffffff, ack = 0x8000000 94522514Sdarrenr * ack = 0xa000000, ack = 0xffffffff 94622514Sdarrenr */ 94722514Sdarrenr printf("5.3.1 TCP ack = 0\n"); 94822514Sdarrenr t->th_ack = 0; 94922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 95022514Sdarrenr fflush(stdout); 95122514Sdarrenr PAUSE(); 95222514Sdarrenr 95322514Sdarrenr printf("5.3.2 TCP ack = 1\n"); 95422514Sdarrenr t->th_ack = 1; 95522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 95622514Sdarrenr fflush(stdout); 95722514Sdarrenr PAUSE(); 95822514Sdarrenr 95922514Sdarrenr printf("5.3.3 TCP ack = 0x7fffffff\n"); 96022514Sdarrenr t->th_ack = 0x7fffffff; 96122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 96222514Sdarrenr fflush(stdout); 96322514Sdarrenr PAUSE(); 96422514Sdarrenr 96522514Sdarrenr printf("5.3.4 TCP ack = 0x80000000\n"); 96622514Sdarrenr t->th_ack = 0x80000000; 96722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 96822514Sdarrenr fflush(stdout); 96922514Sdarrenr PAUSE(); 97022514Sdarrenr 97122514Sdarrenr printf("5.3.5 TCP ack = 0xc0000000\n"); 97222514Sdarrenr t->th_ack = 0xc0000000; 97322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 97422514Sdarrenr fflush(stdout); 97522514Sdarrenr PAUSE(); 97622514Sdarrenr 97722514Sdarrenr printf("5.3.6 TCP ack = 0xffffffff\n"); 97822514Sdarrenr t->th_ack = 0xffffffff; 97922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 98022514Sdarrenr fflush(stdout); 98122514Sdarrenr PAUSE(); 98222514Sdarrenr } 98322514Sdarrenr 98422514Sdarrenr if (!ptest || (ptest == 4)) { 98522514Sdarrenr t->th_flags = TH_SYN; 98622514Sdarrenr /* 98722514Sdarrenr * Test 4: win = 0, win = 32768, win = 65535 98822514Sdarrenr */ 98922514Sdarrenr printf("5.4.1 TCP win = 0\n"); 99022514Sdarrenr t->th_seq = 0; 99122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99222514Sdarrenr fflush(stdout); 99322514Sdarrenr PAUSE(); 99422514Sdarrenr 99522514Sdarrenr printf("5.4.2 TCP win = 32768\n"); 99622514Sdarrenr t->th_seq = 0x7fff; 99722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 99822514Sdarrenr fflush(stdout); 99922514Sdarrenr PAUSE(); 100022514Sdarrenr 100122514Sdarrenr printf("5.4.3 TCP win = 65535\n"); 100222514Sdarrenr t->th_win = 0xffff; 100322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 100422514Sdarrenr fflush(stdout); 100522514Sdarrenr PAUSE(); 100622514Sdarrenr } 100722514Sdarrenr 100822514Sdarrenr#if !defined(linux) && !defined(__SVR4) && !defined(__svr4__) 100922514Sdarrenr { 101022514Sdarrenr struct tcpcb *t, tcb; 101122514Sdarrenr struct tcpiphdr ti; 101222514Sdarrenr struct sockaddr_in sin; 101322514Sdarrenr int fd, slen; 101422514Sdarrenr 101522514Sdarrenr bzero((char *)&sin, sizeof(sin)); 101622514Sdarrenr 101722514Sdarrenr for (i = 1; i < 63; i++) { 101822514Sdarrenr fd = socket(AF_INET, SOCK_STREAM, 0); 101922514Sdarrenr sin.sin_addr.s_addr = ip->ip_dst.s_addr; 102022514Sdarrenr sin.sin_port = htons(i); 102122514Sdarrenr if (!connect(fd, (struct sockaddr *)&sin, sizeof(sin))) 102222514Sdarrenr break; 102322514Sdarrenr } 102422514Sdarrenr 102522514Sdarrenr if (i == 63) { 102622514Sdarrenr printf("Couldn't open a TCP socket between ports 1 and 63\n"); 102722514Sdarrenr printf("to host %s for test 5 and 6 - skipping.\n", 102822514Sdarrenr inet_ntoa(ip->ip_dst)); 102922514Sdarrenr goto skip_five_and_six; 103022514Sdarrenr } 103122514Sdarrenr 103222514Sdarrenr bcopy((char *)ip, (char *)&ti, sizeof(*ip)); 103322514Sdarrenr ti.ti_dport = i; 103422514Sdarrenr slen = sizeof(sin); 103522514Sdarrenr if (!getsockname(fd, (struct sockaddr *)&sin, &slen)) 103622514Sdarrenr ti.ti_sport = sin.sin_port; 103722514Sdarrenr if (!(t = find_tcp(fd, &ti))) { 103822514Sdarrenr printf("Can't find PCB\n"); 103922514Sdarrenr goto skip_five_and_six; 104022514Sdarrenr } 104124583Sdarrenr KMCPY(&tcb, t, sizeof(tcb)); 104222514Sdarrenr ti.ti_win = tcb.rcv_adv; 104322514Sdarrenr ti.ti_seq = tcb.snd_nxt - 1; 104422514Sdarrenr ti.ti_ack = tcb.rcv_nxt; 104522514Sdarrenr 104622514Sdarrenr if (!ptest || (ptest == 5)) { 104722514Sdarrenr /* 104822514Sdarrenr * Test 5: urp 104922514Sdarrenr */ 105022514Sdarrenr printf("5.1 TCP Urgent pointer\n"); 105122514Sdarrenr ti.ti_urp = 1; 105222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 105322514Sdarrenr PAUSE(); 105422514Sdarrenr ti.ti_urp = 0x7fff; 105522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 105622514Sdarrenr PAUSE(); 105722514Sdarrenr ti.ti_urp = 0x8000; 105822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 105922514Sdarrenr PAUSE(); 106022514Sdarrenr ti.ti_urp = 0xffff; 106122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 106222514Sdarrenr PAUSE(); 106322514Sdarrenr } 106422514Sdarrenr 106522514Sdarrenr if (!ptest || (ptest == 6)) { 106622514Sdarrenr /* 106722514Sdarrenr * Test 6: data offset, off = 0, off is inside, off is outside 106822514Sdarrenr */ 106922514Sdarrenr printf("6.1 TCP off = 0-15, len = 40\n"); 107022514Sdarrenr for (i = 0; i < 16; i++) { 107122514Sdarrenr ti.ti_off = ntohs(i); 107222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 107322514Sdarrenr printf("%d\r", i); 107422514Sdarrenr fflush(stdout); 107522514Sdarrenr PAUSE(); 107622514Sdarrenr } 107722514Sdarrenr putchar('\n'); 107822514Sdarrenr } 107922514Sdarrenr 108022514Sdarrenr (void) close(fd); 108122514Sdarrenr } 108222514Sdarrenrskip_five_and_six: 108322514Sdarrenr#endif 108422514Sdarrenr t->th_seq = 1; 108522514Sdarrenr t->th_ack = 1; 108622514Sdarrenr 108722514Sdarrenr if (!ptest || (ptest == 7)) { 108822514Sdarrenr t->th_off = 0; 108922514Sdarrenr t->th_flags = TH_SYN; 109022514Sdarrenr /* 109122514Sdarrenr * Test 7: sport = 0, sport = 1, sport = 32767 109222514Sdarrenr * sport = 32768, sport = 65535 109322514Sdarrenr */ 109422514Sdarrenr printf("5.7.1 TCP sport = 0\n"); 109522514Sdarrenr t->th_sport = 0; 109622514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 109722514Sdarrenr fflush(stdout); 109822514Sdarrenr PAUSE(); 109922514Sdarrenr 110022514Sdarrenr printf("5.7.2 TCP sport = 1\n"); 110122514Sdarrenr t->th_sport = 1; 110222514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 110322514Sdarrenr fflush(stdout); 110422514Sdarrenr PAUSE(); 110522514Sdarrenr 110622514Sdarrenr printf("5.7.3 TCP sport = 32767\n"); 110722514Sdarrenr t->th_sport = 32767; 110822514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 110922514Sdarrenr fflush(stdout); 111022514Sdarrenr PAUSE(); 111122514Sdarrenr 111222514Sdarrenr printf("5.7.4 TCP sport = 32768\n"); 111322514Sdarrenr t->th_sport = 32768; 111422514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 111522514Sdarrenr fflush(stdout); 111622514Sdarrenr PAUSE(); 111722514Sdarrenr 111822514Sdarrenr printf("5.7.5 TCP sport = 65535\n"); 111922514Sdarrenr t->th_sport = 65535; 112022514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 112122514Sdarrenr fflush(stdout); 112222514Sdarrenr PAUSE(); 112322514Sdarrenr } 112422514Sdarrenr 112522514Sdarrenr if (!ptest || (ptest == 8)) { 112622514Sdarrenr t->th_sport = 1; 112722514Sdarrenr /* 112822514Sdarrenr * Test 8: dport = 0, dport = 1, dport = 32767 112922514Sdarrenr * dport = 32768, dport = 65535 113022514Sdarrenr */ 113122514Sdarrenr printf("5.8.1 TCP dport = 0\n"); 113222514Sdarrenr t->th_dport = 0; 113322514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 113422514Sdarrenr fflush(stdout); 113522514Sdarrenr PAUSE(); 113622514Sdarrenr 113722514Sdarrenr printf("5.8.2 TCP dport = 1\n"); 113822514Sdarrenr t->th_dport = 1; 113922514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114022514Sdarrenr fflush(stdout); 114122514Sdarrenr PAUSE(); 114222514Sdarrenr 114322514Sdarrenr printf("5.8.3 TCP dport = 32767\n"); 114422514Sdarrenr t->th_dport = 32767; 114522514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 114622514Sdarrenr fflush(stdout); 114722514Sdarrenr PAUSE(); 114822514Sdarrenr 114922514Sdarrenr printf("5.8.4 TCP dport = 32768\n"); 115022514Sdarrenr t->th_dport = 32768; 115122514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 115222514Sdarrenr fflush(stdout); 115322514Sdarrenr PAUSE(); 115422514Sdarrenr 115522514Sdarrenr printf("5.8.5 TCP dport = 65535\n"); 115622514Sdarrenr t->th_dport = 65535; 115722514Sdarrenr (void) send_tcp(nfd, mtu, ip, gwip); 115822514Sdarrenr fflush(stdout); 115922514Sdarrenr PAUSE(); 116022514Sdarrenr } 116122514Sdarrenr /* TCP options header checking */ 116222514Sdarrenr /* 0 length options, etc */ 116322514Sdarrenr} 116422514Sdarrenr 116522514Sdarrenr 116622514Sdarrenr/* Perform test 6 (exhaust mbuf test) */ 116722514Sdarrenr 116822514Sdarrenrvoid ip_test6(dev, mtu, ip, gwip, ptest) 116922514Sdarrenrchar *dev; 117022514Sdarrenrint mtu; 117122514Sdarrenrip_t *ip; 117222514Sdarrenrstruct in_addr gwip; 117322514Sdarrenrint ptest; 117422514Sdarrenr{ 117522514Sdarrenr struct timeval tv; 117622514Sdarrenr udphdr_t *u; 117722514Sdarrenr int nfd, i, j, k; 117822514Sdarrenr 117922514Sdarrenr ip->ip_v = IPVERSION; 118022514Sdarrenr ip->ip_tos = 0; 118122514Sdarrenr ip->ip_off = 0; 118222514Sdarrenr ip->ip_ttl = 60; 118322514Sdarrenr ip->ip_p = IPPROTO_UDP; 118422514Sdarrenr ip->ip_sum = 0; 118522514Sdarrenr u = (udphdr_t *)(ip + 1); 118622514Sdarrenr u->uh_sport = 1; 118722514Sdarrenr u->uh_dport = 9; 118822514Sdarrenr u->uh_sum = 0; 118922514Sdarrenr 119022514Sdarrenr nfd = initdevice(dev, u->uh_sport, 1); 119122514Sdarrenr u->uh_sport = htons(u->uh_sport); 119222514Sdarrenr u->uh_dport = htons(u->uh_dport); 119322514Sdarrenr u->uh_ulen = 7168; 119422514Sdarrenr 119522514Sdarrenr for (i = 0; i < 128; i++) { 119622514Sdarrenr /* 119722514Sdarrenr * First send the entire packet in 768 byte chunks. 119822514Sdarrenr */ 119922514Sdarrenr ip->ip_len = sizeof(*ip) + 768 + sizeof(*u); 120022514Sdarrenr ip->ip_hl = sizeof(*ip) >> 2; 120122514Sdarrenr ip->ip_off = IP_MF; 120222514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 120322514Sdarrenr printf("%d %d\r", i, 0); 120422514Sdarrenr fflush(stdout); 120522514Sdarrenr PAUSE(); 120622514Sdarrenr /* 120722514Sdarrenr * And again using 128 byte chunks. 120822514Sdarrenr */ 120922514Sdarrenr ip->ip_len = sizeof(*ip) + 128 + sizeof(*u); 121022514Sdarrenr ip->ip_off = IP_MF; 121122514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 121222514Sdarrenr printf("%d %d\r", i, 0); 121322514Sdarrenr fflush(stdout); 121422514Sdarrenr PAUSE(); 121522514Sdarrenr 121622514Sdarrenr for (j = 768; j < 3584; j += 768) { 121722514Sdarrenr ip->ip_len = sizeof(*ip) + 768; 121822514Sdarrenr ip->ip_off = IP_MF|(j>>3); 121922514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 122022514Sdarrenr printf("%d %d\r", i, j); 122122514Sdarrenr fflush(stdout); 122222514Sdarrenr PAUSE(); 122322514Sdarrenr 122422514Sdarrenr ip->ip_len = sizeof(*ip) + 128; 122522514Sdarrenr for (k = j - 768; k < j; k += 128) { 122622514Sdarrenr ip->ip_off = IP_MF|(k>>3); 122722514Sdarrenr (void) send_ip(nfd, 1500, ip, gwip, 1); 122822514Sdarrenr printf("%d %d\r", i, k); 122922514Sdarrenr fflush(stdout); 123022514Sdarrenr PAUSE(); 123122514Sdarrenr } 123222514Sdarrenr } 123322514Sdarrenr } 123422514Sdarrenr putchar('\n'); 123522514Sdarrenr} 123622514Sdarrenr 123722514Sdarrenr 123822514Sdarrenr/* Perform test 7 (random packets) */ 123922514Sdarrenr 124022514Sdarrenrstatic u_long tbuf[64]; 124122514Sdarrenr 124222514Sdarrenrvoid ip_test7(dev, mtu, ip, gwip, ptest) 124322514Sdarrenrchar *dev; 124422514Sdarrenrint mtu; 124522514Sdarrenrip_t *ip; 124622514Sdarrenrstruct in_addr gwip; 124722514Sdarrenrint ptest; 124822514Sdarrenr{ 124922514Sdarrenr ip_t *pip; 125022514Sdarrenr struct timeval tv; 125122514Sdarrenr int nfd, i, j; 125222514Sdarrenr u_char *s; 125322514Sdarrenr 125422514Sdarrenr nfd = initdevice(dev, 0, 1); 125522514Sdarrenr pip = (ip_t *)tbuf; 125622514Sdarrenr 125722514Sdarrenr srand(time(NULL) ^ (getpid() * getppid())); 125822514Sdarrenr 125922514Sdarrenr printf("7. send 1024 random IP packets.\n"); 126022514Sdarrenr 126122514Sdarrenr for (i = 0; i < 512; i++) { 126222514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 126322514Sdarrenr *s = (rand() >> 13) & 0xff; 126422514Sdarrenr pip->ip_v = IPVERSION; 126522514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 126622514Sdarrenr sizeof(struct in_addr)); 126722514Sdarrenr pip->ip_sum = 0; 126822514Sdarrenr pip->ip_len &= 0xff; 126922514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 127022514Sdarrenr printf("%d\r", i); 127122514Sdarrenr fflush(stdout); 127222514Sdarrenr PAUSE(); 127322514Sdarrenr } 127422514Sdarrenr putchar('\n'); 127522514Sdarrenr 127622514Sdarrenr for (i = 0; i < 512; i++) { 127722514Sdarrenr for (s = (u_char *)pip, j = 0; j < sizeof(tbuf); j++, s++) 127822514Sdarrenr *s = (rand() >> 13) & 0xff; 127922514Sdarrenr pip->ip_v = IPVERSION; 128022514Sdarrenr pip->ip_off &= 0xc000; 128122514Sdarrenr bcopy((char *)&ip->ip_dst, (char *)&pip->ip_dst, 128222514Sdarrenr sizeof(struct in_addr)); 128322514Sdarrenr pip->ip_sum = 0; 128422514Sdarrenr pip->ip_len &= 0xff; 128522514Sdarrenr (void) send_ip(nfd, mtu, pip, gwip, 0); 128622514Sdarrenr printf("%d\r", i); 128722514Sdarrenr fflush(stdout); 128822514Sdarrenr PAUSE(); 128922514Sdarrenr } 129022514Sdarrenr putchar('\n'); 129122514Sdarrenr} 1292