| /* |
| * ipsend.c (C) 1995-1998 Darren Reed |
| * |
| * See the IPFILTER.LICENCE file for details on licencing. |
| * |
| */ |
| #if !defined(lint) |
| static const char sccsid[] = "%W% %G% (C)1995 Darren Reed"; |
| static const char rcsid[] = "@(#)$Id$"; |
| #endif |
| #include <sys/param.h> |
| #include <sys/types.h> |
| #include <sys/time.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| #include <netinet/in_systm.h> |
| #include <netinet/ip.h> |
| #ifndef linux |
| #include <netinet/ip_var.h> |
| #endif |
| #ifdef linux |
| #include <linux/sockios.h> |
| #endif |
| #include <stdio.h> |
| #include <netdb.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include "ipsend.h" |
| |
| |
| extern char *optarg; |
| extern int optind; |
| |
| char options[68]; |
| #ifdef linux |
| char default_device[] = "eth0"; |
| #else |
| # ifdef sun |
| char default_device[] = "le0"; |
| # else |
| # ifdef ultrix |
| char default_device[] = "ln0"; |
| # else |
| # ifdef __bsdi__ |
| char default_device[] = "ef0"; |
| # else |
| # ifdef __sgi |
| char default_device[] = "ec0"; |
| # else |
| char default_device[] = "lan0"; |
| # endif |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| static void usage __P((char *)); |
| int main __P((int, char **)); |
| |
| |
| static void usage(prog) |
| char *prog; |
| { |
| fprintf(stderr, "Usage: %s [options] dest\n\ |
| \toptions:\n\ |
| \t\t-d device\tSend out on this device\n\ |
| \t\t-g gateway\tIP gateway to use if non-local dest.\n\ |
| \t\t-m mtu\t\tfake MTU to use when sending out\n\ |
| \t\t-p pointtest\t\n\ |
| \t\t-s src\t\tsource address for IP packet\n\ |
| \t\t-1 \t\tPerform test 1 (IP header)\n\ |
| \t\t-2 \t\tPerform test 2 (IP options)\n\ |
| \t\t-3 \t\tPerform test 3 (ICMP)\n\ |
| \t\t-4 \t\tPerform test 4 (UDP)\n\ |
| \t\t-5 \t\tPerform test 5 (TCP)\n\ |
| \t\t-6 \t\tPerform test 6 (overlapping fragments)\n\ |
| \t\t-7 \t\tPerform test 7 (random packets)\n\ |
| ", prog); |
| exit(1); |
| } |
| |
| |
| int main(argc, argv) |
| int argc; |
| char **argv; |
| { |
| struct tcpiphdr *ti; |
| struct in_addr gwip; |
| ip_t *ip; |
| char *name = argv[0], host[MAXHOSTNAMELEN + 1]; |
| char *gateway = NULL, *dev = NULL; |
| char *src = NULL, *dst; |
| int mtu = 1500, tests = 0, pointtest = 0, c; |
| |
| /* |
| * 65535 is maximum packet size...you never know... |
| */ |
| ip = (ip_t *)calloc(1, 65536); |
| ti = (struct tcpiphdr *)ip; |
| ip->ip_len = sizeof(*ip); |
| IP_HL_A(ip, sizeof(*ip) >> 2); |
| |
| while ((c = getopt(argc, argv, "1234567d:g:m:p:s:")) != -1) |
| switch (c) |
| { |
| case '1' : |
| case '2' : |
| case '3' : |
| case '4' : |
| case '5' : |
| case '6' : |
| case '7' : |
| tests = c - '0'; |
| break; |
| case 'd' : |
| dev = optarg; |
| break; |
| case 'g' : |
| gateway = optarg; |
| break; |
| case 'm' : |
| mtu = atoi(optarg); |
| if (mtu < 28) |
| { |
| fprintf(stderr, "mtu must be > 28\n"); |
| exit(1); |
| } |
| break; |
| case 'p' : |
| pointtest = atoi(optarg); |
| break; |
| case 's' : |
| src = optarg; |
| break; |
| default : |
| fprintf(stderr, "Unknown option \"%c\"\n", c); |
| usage(name); |
| } |
| |
| if ((argc <= optind) || !argv[optind]) |
| usage(name); |
| dst = argv[optind++]; |
| |
| if (!src) |
| { |
| gethostname(host, sizeof(host)); |
| host[sizeof(host) - 1] = '\0'; |
| src = host; |
| } |
| |
| if (resolve(dst, (char *)&ip->ip_dst) == -1) |
| { |
| fprintf(stderr,"Cant resolve %s\n", dst); |
| exit(2); |
| } |
| |
| if (resolve(src, (char *)&ip->ip_src) == -1) |
| { |
| fprintf(stderr,"Cant resolve %s\n", src); |
| exit(2); |
| } |
| |
| if (!gateway) |
| gwip = ip->ip_dst; |
| else if (resolve(gateway, (char *)&gwip) == -1) |
| { |
| fprintf(stderr,"Cant resolve %s\n", gateway); |
| exit(2); |
| } |
| |
| |
| if (!dev) |
| dev = default_device; |
| printf("Device: %s\n", dev); |
| printf("Source: %s\n", inet_ntoa(ip->ip_src)); |
| printf("Dest: %s\n", inet_ntoa(ip->ip_dst)); |
| printf("Gateway: %s\n", inet_ntoa(gwip)); |
| printf("mtu: %d\n", mtu); |
| |
| switch (tests) |
| { |
| case 1 : |
| ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 2 : |
| ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 3 : |
| ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 4 : |
| ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 5 : |
| ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 6 : |
| ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| case 7 : |
| ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| default : |
| ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); |
| break; |
| } |
| return 0; |
| } |