1/* $FreeBSD$ */ 2 3/* 4 * ipsend.c (C) 1995-1998 Darren Reed 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 * 8 */ 9#if !defined(lint) 10static const char sccsid[] = "%W% %G% (C)1995 Darren Reed"; 11static const char rcsid[] = "@(#)$Id: iptest.c,v 2.6 2004/01/08 13:34:31 darrenr Exp $"; 12#endif 13#include <sys/param.h> 14#include <sys/types.h> 15#include <sys/time.h> 16#include <sys/socket.h> 17#include <netinet/in.h> 18#include <arpa/inet.h> 19#include <netinet/in_systm.h> 20#include <netinet/ip.h> 21#ifndef linux 22#include <netinet/ip_var.h> 23#endif 24#ifdef linux 25#include <linux/sockios.h> 26#endif 27#include <stdio.h> 28#include <netdb.h> 29#include <unistd.h> 30#include <stdlib.h> 31#include <string.h> 32#include "ipsend.h" 33 34 35extern char *optarg; 36extern int optind; 37 38char options[68]; 39#ifdef linux 40char default_device[] = "eth0"; 41#else 42# ifdef sun 43char default_device[] = "le0"; 44# else 45# ifdef ultrix 46char default_device[] = "ln0"; 47# else 48# ifdef __bsdi__ 49char default_device[] = "ef0"; 50# else 51# ifdef __sgi 52char default_device[] = "ec0"; 53# else 54char default_device[] = "lan0"; 55# endif 56# endif 57# endif 58# endif 59#endif 60 61static void usage __P((char *)); 62int main __P((int, char **)); 63 64 65static void usage(prog) 66char *prog; 67{ 68 fprintf(stderr, "Usage: %s [options] dest\n\ 69\toptions:\n\ 70\t\t-d device\tSend out on this device\n\ 71\t\t-g gateway\tIP gateway to use if non-local dest.\n\ 72\t\t-m mtu\t\tfake MTU to use when sending out\n\ 73\t\t-p pointtest\t\n\ 74\t\t-s src\t\tsource address for IP packet\n\ 75\t\t-1 \t\tPerform test 1 (IP header)\n\ 76\t\t-2 \t\tPerform test 2 (IP options)\n\ 77\t\t-3 \t\tPerform test 3 (ICMP)\n\ 78\t\t-4 \t\tPerform test 4 (UDP)\n\ 79\t\t-5 \t\tPerform test 5 (TCP)\n\ 80\t\t-6 \t\tPerform test 6 (overlapping fragments)\n\ 81\t\t-7 \t\tPerform test 7 (random packets)\n\ 82", prog); 83 exit(1); 84} 85 86 87int main(argc, argv) 88int argc; 89char **argv; 90{ 91 struct tcpiphdr *ti; 92 struct in_addr gwip; 93 ip_t *ip; 94 char *name = argv[0], host[MAXHOSTNAMELEN + 1]; 95 char *gateway = NULL, *dev = NULL; 96 char *src = NULL, *dst; 97 int mtu = 1500, tests = 0, pointtest = 0, c; 98 99 /* 100 * 65535 is maximum packet size...you never know... 101 */ 102 ip = (ip_t *)calloc(1, 65536); 103 ti = (struct tcpiphdr *)ip; 104 ip->ip_len = sizeof(*ip); 105 IP_HL_A(ip, sizeof(*ip) >> 2); 106 107 while ((c = getopt(argc, argv, "1234567d:g:m:p:s:")) != -1) 108 switch (c) 109 { 110 case '1' : 111 case '2' : 112 case '3' : 113 case '4' : 114 case '5' : 115 case '6' : 116 case '7' : 117 tests = c - '0'; 118 break; 119 case 'd' : 120 dev = optarg; 121 break; 122 case 'g' : 123 gateway = optarg; 124 break; 125 case 'm' : 126 mtu = atoi(optarg); 127 if (mtu < 28) 128 { 129 fprintf(stderr, "mtu must be > 28\n"); 130 exit(1); 131 } 132 break; 133 case 'p' : 134 pointtest = atoi(optarg); 135 break; 136 case 's' : 137 src = optarg; 138 break; 139 default : 140 fprintf(stderr, "Unknown option \"%c\"\n", c); 141 usage(name); 142 } 143 144 if ((argc <= optind) || !argv[optind]) 145 usage(name); 146 dst = argv[optind++]; 147 148 if (!src) 149 { 150 gethostname(host, sizeof(host)); 151 host[sizeof(host) - 1] = '\0'; 152 src = host; 153 } 154 155 if (resolve(dst, (char *)&ip->ip_dst) == -1) 156 { 157 fprintf(stderr,"Cant resolve %s\n", dst); 158 exit(2); 159 } 160 161 if (resolve(src, (char *)&ip->ip_src) == -1) 162 { 163 fprintf(stderr,"Cant resolve %s\n", src); 164 exit(2); 165 } 166 167 if (!gateway) 168 gwip = ip->ip_dst; 169 else if (resolve(gateway, (char *)&gwip) == -1) 170 { 171 fprintf(stderr,"Cant resolve %s\n", gateway); 172 exit(2); 173 } 174 175 176 if (!dev) 177 dev = default_device; 178 printf("Device: %s\n", dev); 179 printf("Source: %s\n", inet_ntoa(ip->ip_src)); 180 printf("Dest: %s\n", inet_ntoa(ip->ip_dst)); 181 printf("Gateway: %s\n", inet_ntoa(gwip)); 182 printf("mtu: %d\n", mtu); 183 184 switch (tests) 185 { 186 case 1 : 187 ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); 188 break; 189 case 2 : 190 ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); 191 break; 192 case 3 : 193 ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); 194 break; 195 case 4 : 196 ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); 197 break; 198 case 5 : 199 ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); 200 break; 201 case 6 : 202 ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); 203 break; 204 case 7 : 205 ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); 206 break; 207 default : 208 ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); 209 ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); 210 ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); 211 ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); 212 ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); 213 ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); 214 ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); 215 break; 216 } 217 return 0; 218} 219