Deleted Added
sdiff udiff text old ( 80486 ) new ( 92686 )
full compact
1/*
2 * ipresend.c (C) 1995-1998 Darren Reed
3 *
4 * This was written to test what size TCP fragments would get through
5 * various TCP/IP packet filters, as used in IP firewalls. In certain
6 * conditions, enough of the TCP header is missing for unpredictable
7 * results unless the filter is aware that this can happen.
8 *
9 * See the IPFILTER.LICENCE file for details on licencing.
10 */
11#include <stdio.h>
12#include <stdlib.h>
13#include <unistd.h>
14#include <netdb.h>
15#include <string.h>
16#include <sys/types.h>
17#include <sys/time.h>
18#include <sys/socket.h>
19#include <netinet/in.h>
20#include <arpa/inet.h>
21#include <netinet/in_systm.h>
22#include <netinet/ip.h>
23#include <netinet/tcp.h>
24#include <netinet/udp.h>
25#include <netinet/ip_icmp.h>
26#ifndef linux
27#include <netinet/ip_var.h>
28#endif
29#include "ipsend.h"
30
31#if !defined(lint)
32static const char sccsid[] = "%W% %G% (C)1995 Darren Reed";
33static const char rcsid[] = "@(#)$Id: ipresend.c,v 2.1.4.2 2001/07/15 22:00:13 darrenr Exp $";
34#endif
35
36
37extern char *optarg;
38extern int optind;
39#ifndef NO_IPF
40extern struct ipread snoop, pcap, etherf, iphex, tcpd, iptext;
41#endif
42
43int opts = 0;
44#ifndef DEFAULT_DEVICE
45# ifdef linux
46char default_device[] = "eth0";
47# else
48# ifdef sun
49char default_device[] = "le0";
50# else
51# ifdef ultrix
52char default_device[] = "ln0";
53# else
54# ifdef __bsdi__
55char default_device[] = "ef0";
56# else
57# ifdef __sgi
58char default_device[] = "ec0";
59# else
60char default_device[] = "lan0";
61# endif
62# endif
63# endif
64# endif
65# endif
66#else
67char default_device[] = DEFAULT_DEVICE;
68#endif
69
70
71static void usage __P((char *));
72int main __P((int, char **));
73
74
75static void usage(prog)
76char *prog;
77{
78 fprintf(stderr, "Usage: %s [options] <-r filename|-R filename>\n\
79\t\t-r filename\tsnoop data file to resend\n\
80\t\t-R filename\tlibpcap data file to resend\n\
81\toptions:\n\
82\t\t-d device\tSend out on this device\n\
83\t\t-g gateway\tIP gateway to use if non-local dest.\n\
84\t\t-m mtu\t\tfake MTU to use when sending out\n\
85", prog);
86 exit(1);
87}
88
89
90int main(argc, argv)
91int argc;
92char **argv;
93{
94 struct in_addr gwip;
95 struct ipread *ipr = NULL;
96 char *name = argv[0], *gateway = NULL, *dev = NULL;
97 char *resend = NULL;
98 int mtu = 1500, c;
99
100 while ((c = getopt(argc, argv, "EHPRSTXd:g:m:r:")) != -1)
101 switch (c)
102 {
103 case 'd' :
104 dev = optarg;
105 break;
106 case 'g' :
107 gateway = optarg;
108 break;
109 case 'm' :
110 mtu = atoi(optarg);
111 if (mtu < 28)
112 {
113 fprintf(stderr, "mtu must be > 28\n");
114 exit(1);
115 }
116 case 'r' :
117 resend = optarg;
118 break;
119 case 'R' :
120 opts |= OPT_RAW;
121 break;
122#ifndef NO_IPF
123 case 'E' :
124 ipr = &etherf;
125 break;
126 case 'H' :
127 ipr = &iphex;
128 break;
129 case 'P' :
130 ipr = &pcap;
131 break;
132 case 'S' :
133 ipr = &snoop;
134 break;
135 case 'T' :
136 ipr = &tcpd;
137 break;
138 case 'X' :
139 ipr = &iptext;
140 break;
141#endif
142 default :
143 fprintf(stderr, "Unknown option \"%c\"\n", c);
144 usage(name);
145 }
146
147 if (!ipr || !resend)
148 usage(name);
149
150 gwip.s_addr = 0;
151 if (gateway && resolve(gateway, (char *)&gwip) == -1)
152 {
153 fprintf(stderr,"Cant resolve %s\n", gateway);
154 exit(2);
155 }
156
157 if (!dev)
158 dev = default_device;
159
160 printf("Device: %s\n", dev);
161 printf("Gateway: %s\n", inet_ntoa(gwip));
162 printf("mtu: %d\n", mtu);
163
164 return ip_resend(dev, mtu, ipr, gwip, resend);
165}