1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 322514Sdarrenr/* 453024Sguido * ipsend.c (C) 1995-1998 Darren Reed 522514Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 722514Sdarrenr * 822514Sdarrenr */ 9145510Sdarrenr#if !defined(lint) 10145510Sdarrenrstatic const char sccsid[] = "%W% %G% (C)1995 Darren Reed"; 11255332Scystatic const char rcsid[] = "@(#)$Id$"; 1292686Sdarrenr#endif 1355924Sguido#include <sys/param.h> 1422514Sdarrenr#include <sys/types.h> 1522514Sdarrenr#include <sys/time.h> 1622514Sdarrenr#include <sys/socket.h> 1722514Sdarrenr#include <netinet/in.h> 1822514Sdarrenr#include <arpa/inet.h> 1922514Sdarrenr#include <netinet/in_systm.h> 2022514Sdarrenr#include <netinet/ip.h> 2122514Sdarrenr#ifndef linux 2222514Sdarrenr#include <netinet/ip_var.h> 2322514Sdarrenr#endif 2422514Sdarrenr#ifdef linux 2522514Sdarrenr#include <linux/sockios.h> 2622514Sdarrenr#endif 27145510Sdarrenr#include <stdio.h> 28145510Sdarrenr#include <netdb.h> 29145510Sdarrenr#include <unistd.h> 30145510Sdarrenr#include <stdlib.h> 31145510Sdarrenr#include <string.h> 3224583Sdarrenr#include "ipsend.h" 3322514Sdarrenr 3422514Sdarrenr 3522514Sdarrenrextern char *optarg; 3622514Sdarrenrextern int optind; 3722514Sdarrenr 3822514Sdarrenrchar options[68]; 3922514Sdarrenr#ifdef linux 4022514Sdarrenrchar default_device[] = "eth0"; 4122514Sdarrenr#else 4222514Sdarrenr# ifdef sun 4322514Sdarrenrchar default_device[] = "le0"; 4422514Sdarrenr# else 4522514Sdarrenr# ifdef ultrix 4622514Sdarrenrchar default_device[] = "ln0"; 4722514Sdarrenr# else 4822514Sdarrenr# ifdef __bsdi__ 4922514Sdarrenrchar default_device[] = "ef0"; 5022514Sdarrenr# else 5131183Speter# ifdef __sgi 5231183Speterchar default_device[] = "ec0"; 5331183Speter# else 5422514Sdarrenrchar default_device[] = "lan0"; 5531183Speter# endif 5622514Sdarrenr# endif 5722514Sdarrenr# endif 5822514Sdarrenr# endif 5922514Sdarrenr#endif 6022514Sdarrenr 6124583Sdarrenrstatic void usage __P((char *)); 6224583Sdarrenrint main __P((int, char **)); 6322514Sdarrenr 6424583Sdarrenr 6524583Sdarrenrstatic void usage(prog) 66255332Scy char *prog; 6722514Sdarrenr{ 6822514Sdarrenr fprintf(stderr, "Usage: %s [options] dest\n\ 6922514Sdarrenr\toptions:\n\ 7022514Sdarrenr\t\t-d device\tSend out on this device\n\ 7122514Sdarrenr\t\t-g gateway\tIP gateway to use if non-local dest.\n\ 7222514Sdarrenr\t\t-m mtu\t\tfake MTU to use when sending out\n\ 7322514Sdarrenr\t\t-p pointtest\t\n\ 7422514Sdarrenr\t\t-s src\t\tsource address for IP packet\n\ 7522514Sdarrenr\t\t-1 \t\tPerform test 1 (IP header)\n\ 7622514Sdarrenr\t\t-2 \t\tPerform test 2 (IP options)\n\ 7722514Sdarrenr\t\t-3 \t\tPerform test 3 (ICMP)\n\ 7822514Sdarrenr\t\t-4 \t\tPerform test 4 (UDP)\n\ 7922514Sdarrenr\t\t-5 \t\tPerform test 5 (TCP)\n\ 8022514Sdarrenr\t\t-6 \t\tPerform test 6 (overlapping fragments)\n\ 8122514Sdarrenr\t\t-7 \t\tPerform test 7 (random packets)\n\ 8222514Sdarrenr", prog); 8322514Sdarrenr exit(1); 8422514Sdarrenr} 8522514Sdarrenr 8622514Sdarrenr 8722514Sdarrenrint main(argc, argv) 88255332Scy int argc; 89255332Scy char **argv; 9022514Sdarrenr{ 9122514Sdarrenr struct tcpiphdr *ti; 9222514Sdarrenr struct in_addr gwip; 9322514Sdarrenr ip_t *ip; 9455924Sguido char *name = argv[0], host[MAXHOSTNAMELEN + 1]; 9555924Sguido char *gateway = NULL, *dev = NULL; 9631183Speter char *src = NULL, *dst; 9731183Speter int mtu = 1500, tests = 0, pointtest = 0, c; 9822514Sdarrenr 9922514Sdarrenr /* 10022514Sdarrenr * 65535 is maximum packet size...you never know... 10122514Sdarrenr */ 10222514Sdarrenr ip = (ip_t *)calloc(1, 65536); 10322514Sdarrenr ti = (struct tcpiphdr *)ip; 10422514Sdarrenr ip->ip_len = sizeof(*ip); 105145510Sdarrenr IP_HL_A(ip, sizeof(*ip) >> 2); 10622514Sdarrenr 10731183Speter while ((c = getopt(argc, argv, "1234567d:g:m:p:s:")) != -1) 10822514Sdarrenr switch (c) 10922514Sdarrenr { 11022514Sdarrenr case '1' : 11122514Sdarrenr case '2' : 11222514Sdarrenr case '3' : 11322514Sdarrenr case '4' : 11422514Sdarrenr case '5' : 11522514Sdarrenr case '6' : 11622514Sdarrenr case '7' : 11722514Sdarrenr tests = c - '0'; 11822514Sdarrenr break; 11922514Sdarrenr case 'd' : 12022514Sdarrenr dev = optarg; 12122514Sdarrenr break; 12222514Sdarrenr case 'g' : 12322514Sdarrenr gateway = optarg; 12422514Sdarrenr break; 12522514Sdarrenr case 'm' : 12622514Sdarrenr mtu = atoi(optarg); 12722514Sdarrenr if (mtu < 28) 12822514Sdarrenr { 12922514Sdarrenr fprintf(stderr, "mtu must be > 28\n"); 13022514Sdarrenr exit(1); 13122514Sdarrenr } 13222514Sdarrenr break; 13322514Sdarrenr case 'p' : 13422514Sdarrenr pointtest = atoi(optarg); 13522514Sdarrenr break; 13622514Sdarrenr case 's' : 13722514Sdarrenr src = optarg; 13822514Sdarrenr break; 13922514Sdarrenr default : 14022514Sdarrenr fprintf(stderr, "Unknown option \"%c\"\n", c); 14122514Sdarrenr usage(name); 14222514Sdarrenr } 14322514Sdarrenr 14434739Speter if ((argc <= optind) || !argv[optind]) 14522514Sdarrenr usage(name); 14622514Sdarrenr dst = argv[optind++]; 14722514Sdarrenr 14822514Sdarrenr if (!src) 14922514Sdarrenr { 15022514Sdarrenr gethostname(host, sizeof(host)); 15155924Sguido host[sizeof(host) - 1] = '\0'; 15222514Sdarrenr src = host; 15322514Sdarrenr } 15422514Sdarrenr 15522514Sdarrenr if (resolve(dst, (char *)&ip->ip_dst) == -1) 15622514Sdarrenr { 15722514Sdarrenr fprintf(stderr,"Cant resolve %s\n", dst); 15822514Sdarrenr exit(2); 15922514Sdarrenr } 16022514Sdarrenr 16122514Sdarrenr if (resolve(src, (char *)&ip->ip_src) == -1) 16222514Sdarrenr { 16322514Sdarrenr fprintf(stderr,"Cant resolve %s\n", src); 16422514Sdarrenr exit(2); 16522514Sdarrenr } 16622514Sdarrenr 16722514Sdarrenr if (!gateway) 16822514Sdarrenr gwip = ip->ip_dst; 16922514Sdarrenr else if (resolve(gateway, (char *)&gwip) == -1) 17022514Sdarrenr { 17122514Sdarrenr fprintf(stderr,"Cant resolve %s\n", gateway); 17222514Sdarrenr exit(2); 17322514Sdarrenr } 17422514Sdarrenr 17522514Sdarrenr 17622514Sdarrenr if (!dev) 17722514Sdarrenr dev = default_device; 17822514Sdarrenr printf("Device: %s\n", dev); 17922514Sdarrenr printf("Source: %s\n", inet_ntoa(ip->ip_src)); 18022514Sdarrenr printf("Dest: %s\n", inet_ntoa(ip->ip_dst)); 18122514Sdarrenr printf("Gateway: %s\n", inet_ntoa(gwip)); 18222514Sdarrenr printf("mtu: %d\n", mtu); 18322514Sdarrenr 18422514Sdarrenr switch (tests) 18522514Sdarrenr { 18622514Sdarrenr case 1 : 18724583Sdarrenr ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); 18824583Sdarrenr break; 18922514Sdarrenr case 2 : 19024583Sdarrenr ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); 19124583Sdarrenr break; 19222514Sdarrenr case 3 : 19324583Sdarrenr ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); 19424583Sdarrenr break; 19522514Sdarrenr case 4 : 19624583Sdarrenr ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); 19724583Sdarrenr break; 19822514Sdarrenr case 5 : 19924583Sdarrenr ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); 20024583Sdarrenr break; 20122514Sdarrenr case 6 : 20224583Sdarrenr ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); 20324583Sdarrenr break; 20422514Sdarrenr case 7 : 20524583Sdarrenr ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); 20624583Sdarrenr break; 20722514Sdarrenr default : 20834739Speter ip_test1(dev, mtu, (ip_t *)ti, gwip, pointtest); 20934739Speter ip_test2(dev, mtu, (ip_t *)ti, gwip, pointtest); 21034739Speter ip_test3(dev, mtu, (ip_t *)ti, gwip, pointtest); 21134739Speter ip_test4(dev, mtu, (ip_t *)ti, gwip, pointtest); 21234739Speter ip_test5(dev, mtu, (ip_t *)ti, gwip, pointtest); 21334739Speter ip_test6(dev, mtu, (ip_t *)ti, gwip, pointtest); 21434739Speter ip_test7(dev, mtu, (ip_t *)ti, gwip, pointtest); 21522514Sdarrenr break; 21622514Sdarrenr } 21722514Sdarrenr return 0; 21822514Sdarrenr} 219