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