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