1 /*
2  * $smu-mark$
3  * $name: hping2.h$
4  * $author: Salvatore Sanfilippo <antirez@invece.org>$
5  * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
6  * $license: This software is under GPL version 2 of license$
7  * $date: Fri Nov  5 11:55:48 MET 1999$
8  * $rev: 9$
9  */
10 
11 /* $Id: hping2.h,v 1.4 2004/06/04 07:22:38 antirez Exp $ */
12 
13 #ifndef _HPING2_H
14 #define _HPING2_H
15 
16 #include <sys/types.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19 #include <limits.h>
20 #include "byteorder.h"
21 #include "systype.h"
22 #include "fixtypes.h"
23 
24 /* types */
25 #ifndef __u8
26 #define __u8		u_int8_t
27 #endif /* __u8 */
28 #ifndef __u16
29 #define __u16		u_int16_t
30 #endif /* __u16 */
31 #ifndef __u32
32 #define __u32		u_int32_t
33 #endif /* __u32 */
34 
35 #ifndef __uint8_t
36 #define __uint8_t	u_int8_t
37 #endif /* __uint8_t */
38 #ifndef __uint16_t
39 #define __uint16_t	u_int16_t
40 #endif /* __uint16_t */
41 #ifndef __uint32_t
42 #define __uint32_t	u_int32_t
43 #endif /* __uint32_t */
44 
45 #include "hcmp.h" /* Hping Control Message Protocol */
46 
47 /* protocols header size */
48 #ifndef ICMPHDR_SIZE
49 #define ICMPHDR_SIZE	sizeof(struct myicmphdr)
50 #endif
51 #ifndef UDPHDR_SIZE
52 #define UDPHDR_SIZE	sizeof(struct myudphdr)
53 #endif
54 #ifndef TCPHDR_SIZE
55 #define TCPHDR_SIZE	sizeof(struct mytcphdr)
56 #endif
57 #ifndef IPHDR_SIZE
58 #define IPHDR_SIZE	sizeof(struct myiphdr)
59 #endif
60 
61 /* wait X seconds after reached to sent packets in oreder to display replies */
62 #define COUNTREACHED_TIMEOUT 1
63 
64 /* requests status table stuffs */
65 /* Warning, TABLESIZE 0 == floating point exception */
66 #define TABLESIZE	400
67 #define S_SENT		0
68 #define S_RECV		1
69 
70 /* usefull defines */
71 #ifndef TRUE
72 #define TRUE	1
73 #define FALSE	0
74 #endif
75 #ifndef IFNAMSIZ
76 #define IFNAMSIZ 16
77 #endif
78 #ifndef PF_PACKET
79 #define PF_PACKET 17		/* kernel 2.[12].* with 2.0.* kernel headers? */
80 #endif
81 #ifndef ETH_P_IP
82 #define ETH_P_IP  0x0800	/* Internet Protocol packet     */
83 #endif
84 #ifndef ABS
85 #define ABS(x) (((x)>0) ? (x) : -(x))
86 #endif
87 
88 /* header size of some physical layer type */
89 #define PPPHDR_SIZE_LINUX	0
90 #define PPPHDR_SIZE_FREEBSD	4
91 #define PPPHDR_SIZE_DRAGONFLY	4
92 #define PPPHDR_SIZE_OPENBSD	4
93 #define PPPHDR_SIZE_NETBSD	4
94 #define PPPHDR_SIZE_BSDI	4
95 #define ETHHDR_SIZE		14
96 #define LOHDR_SIZE		14
97 #define WLANHDR_SIZE		14
98 #define TRHDR_SIZE		20
99 
100 /* packet size (physical header size + ip header + tcp header + 0 data bytes) */
101 #ifndef IP_MAX_SIZE
102 #define IP_MAX_SIZE	65535
103 #endif
104 
105 /* absolute offsets */
106 #define ABS_OFFSETIP	linkhdr_size
107 #define ABS_OFFSETTCP	( linkhdr_size + IPHDR_SIZE )
108 #define ABS_OFFSETICMP	( linkhdr_size + IPHDR_SIZE )
109 #define ABS_OFFSETUDP	( linkhdr_size + IPHDR_SIZE )
110 
111 /* defaults and misc */
112 #define DEFAULT_SENDINGWAIT 1	/* wait 1 sec. between sending each packets */
113 #define DEFAULT_DPORT	    0	/* default dest. port */
114 #define DEFAULT_INITSPORT  -1	/* default initial source port: -1 means random */
115 #define DEFAULT_COUNT      -1	/* default packets count: -1 means forever */
116 #define DEFAULT_TTL	   64	/* default ip->ttl value */
117 #define DEFAULT_SRCWINSIZE 512	/* default tcp windows size */
118 #define DEFAULT_VIRTUAL_MTU 16  /* tiny fragments */
119 #define DEFAULT_ICMP_TYPE   8	/* echo request */
120 #define DEFAULT_ICMP_CODE   0	/* icmp-type relative */
121 #define DEFAULT_ICMP_IP_VERSION		4
122 #define DEFAULT_ICMP_IP_IHL		(IPHDR_SIZE >> 2)
123 #define	DEFAULT_ICMP_IP_TOS		0
124 #define DEFAULT_ICMP_IP_TOT_LEN		0 /* computed by send_icmp_*() */
125 #define DEFAULT_ICMP_IP_ID		0 /* rand */
126 #define DEFAULT_ICMP_CKSUM		-1 /* -1 means compute the cksum */
127 #define DEFAULT_ICMP_IP_PROTOCOL	6 /* TCP */
128 #define DEFAULT_RAW_IP_PROTOCOL		6 /* TCP */
129 #define DEFAULT_TRACEROUTE_TTL		1
130 
131 #define BIND_NONE	0		/* no bind */
132 #define BIND_DPORT	1		/* bind destination port */
133 #define BIND_TTL	2		/* bind ip->ttl */
134 #define DEFAULT_BIND	BIND_DPORT
135 
136 /* fragmentation defines */
137 #define MF ((unsigned short)0x2000)	/* more fragments */
138 #define DF ((unsigned short)0x4000)	/* dont fragment */
139 #define NF ((unsigned short)0x0000)	/* no more fragments */
140 
141 /* ip options defines */
142 #define IPOPT_COPY		0x80
143 #define IPOPT_CLASS_MASK	0x60
144 #define IPOPT_NUMBER_MASK	0x1f
145 
146 #define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
147 #define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
148 #define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
149 
150 #define	IPOPT_CONTROL		0x00
151 #define	IPOPT_RESERVED1		0x20
152 #define	IPOPT_MEASUREMENT	0x40
153 #define	IPOPT_RESERVED2		0x60
154 
155 #define IPOPT_END	(0 |IPOPT_CONTROL)
156 #define IPOPT_NOOP	(1 |IPOPT_CONTROL)
157 #define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
158 #define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
159 #define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
160 #define IPOPT_RR	(7 |IPOPT_CONTROL)
161 #define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
162 #define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
163 #define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
164 
165 #define IPOPT_OPTVAL 0
166 #define IPOPT_OLEN   1
167 #define IPOPT_OFFSET 2
168 #define IPOPT_MINOFF 4
169 #define MAX_IPOPTLEN 40
170 #define IPOPT_NOP IPOPT_NOOP
171 #define IPOPT_EOL IPOPT_END
172 #define IPOPT_TS  IPOPT_TIMESTAMP
173 
174 #define	IPOPT_TS_TSONLY		0		/* timestamps only */
175 #define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
176 #define	IPOPT_TS_PRESPEC	3		/* specified modules only */
177 
178 /* tcp flags */
179 #ifndef	TH_FIN
180 #define TH_FIN  0x01
181 #endif
182 #ifndef TH_SYN
183 #define TH_SYN  0x02
184 #endif
185 #ifndef TH_RST
186 #define TH_RST  0x04
187 #endif
188 #ifndef TH_PUSH
189 #define TH_PUSH 0x08
190 #endif
191 #ifndef TH_ACK
192 #define TH_ACK  0x10
193 #endif
194 #ifndef TH_URG
195 #define TH_URG  0x20
196 #endif
197 #ifndef TH_X
198 #define	TH_X 0x40	/* X tcp flag */
199 #endif
200 #ifndef TH_Y
201 #define TH_Y 0x80	/* Y tcp flag */
202 #endif
203 
204 /* ICMP TYPE */
205 #define ICMP_ECHOREPLY          0       /* Echo Reply                   */
206 #define ICMP_DEST_UNREACH       3       /* Destination Unreachable      */
207 #define ICMP_SOURCE_QUENCH      4       /* Source Quench                */
208 #define ICMP_REDIRECT           5       /* Redirect (change route)      */
209 #define ICMP_ECHO               8       /* Echo Request                 */
210 #define ICMP_TIME_EXCEEDED      11      /* Time Exceeded                */
211 #define ICMP_PARAMETERPROB      12      /* Parameter Problem            */
212 #define ICMP_TIMESTAMP          13      /* Timestamp Request            */
213 #define ICMP_TIMESTAMPREPLY     14      /* Timestamp Reply              */
214 #define ICMP_INFO_REQUEST       15      /* Information Request          */
215 #define ICMP_INFO_REPLY         16      /* Information Reply            */
216 #define ICMP_ADDRESS            17      /* Address Mask Request         */
217 #define ICMP_ADDRESSREPLY       18      /* Address Mask Reply           */
218 
219 /* Codes for UNREACHABLE */
220 #define ICMP_NET_UNREACH        0       /* Network Unreachable          */
221 #define ICMP_HOST_UNREACH       1       /* Host Unreachable             */
222 #define ICMP_PROT_UNREACH       2       /* Protocol Unreachable         */
223 #define ICMP_PORT_UNREACH       3       /* Port Unreachable             */
224 #define ICMP_FRAG_NEEDED        4       /* Fragmentation Needed/DF set  */
225 #define ICMP_SR_FAILED          5       /* Source Route failed          */
226 #define ICMP_NET_UNKNOWN        6
227 #define ICMP_HOST_UNKNOWN       7
228 #define ICMP_HOST_ISOLATED      8
229 #define ICMP_NET_ANO            9
230 #define ICMP_HOST_ANO           10
231 #define ICMP_NET_UNR_TOS        11
232 #define ICMP_HOST_UNR_TOS       12
233 #define ICMP_PKT_FILTERED       13      /* Packet filtered */
234 #define ICMP_PREC_VIOLATION     14      /* Precedence violation */
235 #define ICMP_PREC_CUTOFF        15      /* Precedence cut off */
236 #define NR_ICMP_UNREACH 15        /* instead of hardcoding immediate value */
237 
238 /* Codes for REDIRECT */
239 #define ICMP_REDIR_NET          0       /* Redirect Net                 */
240 #define ICMP_REDIR_HOST         1       /* Redirect Host                */
241 #define ICMP_REDIR_NETTOS       2       /* Redirect Net for TOS         */
242 #define ICMP_REDIR_HOSTTOS      3       /* Redirect Host for TOS        */
243 
244 /* Codes for TIME_EXCEEDED */
245 #define ICMP_EXC_TTL            0       /* TTL count exceeded           */
246 #define ICMP_EXC_FRAGTIME       1       /* Fragment Reass time exceeded */
247 
248 /*
249  * IP header
250  */
251 struct myiphdr {
252 #if defined(__LITTLE_ENDIAN_BITFIELD)
253         __u8    ihl:4,
254                 version:4;
255 #elif defined (__BIG_ENDIAN_BITFIELD)
256         __u8    version:4,
257                 ihl:4;
258 #else
259 #error  "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
260 #endif
261         __u8    tos;
262         __u16   tot_len;
263         __u16   id;
264         __u16   frag_off;
265         __u8    ttl;
266         __u8    protocol;
267         __u16   check;
268         __u32   saddr;
269         __u32   daddr;
270 };
271 
272 /*
273  * UDP header
274  */
275 struct myudphdr {
276 	__u16 uh_sport;     /* source port */
277 	__u16 uh_dport;     /* destination port */
278 	__u16 uh_ulen;      /* udp length */
279 	__u16 uh_sum;       /* udp checksum */
280 };
281 
282 /*
283  * TCP header.
284  * Per RFC 793, September, 1981.
285  */
286 struct mytcphdr {
287 	__u16	th_sport;               /* source port */
288 	__u16	th_dport;               /* destination port */
289 	__u32	th_seq;                 /* sequence number */
290 	__u32	th_ack;                 /* acknowledgement number */
291 #if defined (__LITTLE_ENDIAN_BITFIELD)
292 	__u8    th_x2:4,                /* (unused) */
293 		th_off:4;               /* data offset */
294 #elif defined (__BIG_ENDIAN_BITFIELD)
295 	__u8    th_off:4,               /* data offset */
296 		th_x2:4;                /* (unused) */
297 #else
298 #error  "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
299 #endif
300 	__u8    th_flags;
301 	__u16   th_win;                 /* window */
302 	__u16   th_sum;                 /* checksum */
303 	__u16   th_urp;                 /* urgent pointer */
304 };
305 
306 /*
307  * ICMP header
308  */
309 struct myicmphdr
310 {
311 	__u8          type;
312 	__u8          code;
313 	__u16         checksum;
314 	union
315 	{
316 		struct
317 		{
318 			__u16   id;
319 			__u16   sequence;
320 		} echo;
321 		__u32   gateway;
322 	} un;
323 };
324 
325 struct icmp_tstamp_data {
326 	__u32 orig;
327 	__u32 recv;
328 	__u32 tran;
329 };
330 
331 /*
332  * UDP/TCP pseudo header
333  * for cksum computing
334  */
335 struct pseudohdr
336 {
337 	__u32 saddr;
338 	__u32 daddr;
339 	__u8  zero;
340 	__u8  protocol;
341 	__u16 lenght;
342 };
343 
344 #define PSEUDOHDR_SIZE sizeof(struct pseudohdr)
345 
346 /*
347  * hping replies delay table
348  */
349 struct delaytable_element {
350 	int seq;
351 	int src;
352 	time_t sec;
353 	time_t usec;
354 	int status;
355 };
356 
357 extern volatile struct delaytable_element delaytable[TABLESIZE];
358 
359 /* protos */
360 void	nop(void);				/* nop */
361 int	parse_options(int, char**);		/* option parser */
362 int	get_if_name(void);			/* get interface (see source) */
363 int	get_output_if(struct sockaddr_in *dest, struct sockaddr_in *ifip);
364 int	dltype_to_lhs(int dltype);
365 int	get_linkhdr_size(char*);		/* get link layer hdr size */
366 int	open_sockpacket(void);			/* open SOCK_PACKET socket */
367 int	open_sockpacket_ifindex(int ifindex);
368 int	close_sockpacket(int);			/* close SOCK_PACKET socket */
369 int	open_sockraw(void);			/* open raw socket */
370 void	send_packet (int signal_id);
371 void	send_rawip (void);
372 void	send_tcp(void);
373 void	send_udp(void);
374 void	send_icmp(void);
375 void	send_hcmp(__u8 type, __u32 arg);	/* send hcmp packets */
376 void	send_ip (char*, char*, char*, unsigned int, int, unsigned short,
377 		 char*, char);
378 void	send_ip_handler(char *packet, unsigned int size); /* fragmentation
379                                                              handler */
380 void	wait_packet(void);			/* handle incoming packets */
381 void	print_statistics(int);
382 void	show_usage(void);
383 void	show_version(void);
384 int	resolve_addr(struct sockaddr * addr, char *hostname); /* resolver */
385 void	resolve(struct sockaddr*, char*);	/* resolver, exit on err. */
386 void	log_icmp_unreach(char*, unsigned short);/* ICMP unreachable logger */
387 void	log_icmp_timeexc(char*, unsigned short);/* ICMP time exceeded logger */
388 time_t	get_usec(void);				/* return current usec */
389 time_t	milliseconds(void);			/* ms from UT midnight */
390 #define get_midnight_ut_ms milliseconds		/* backward compatibilty */
391 __u16	cksum(__u16 *buf, int nwords);		/* compute 16bit checksum */
392 void	inc_destparm(int sid);			/* inc dst port or ttl */
393 char	*get_hostname(char*);			/* get host from addr */
394 void	datafiller(char *p, int size);		/* fill data from file */
395 void	data_handler(char *data, int data_size);/* handle data filling */
396 void	socket_broadcast(int sd);		/* set SO_BROADCAST option */
397 void	socket_iphdrincl(int sd);		/* set SO_IPHDRINCL option */
398 void	listenmain(void);			/* main for listen mode */
399 char	*memstr(char *haystack, char *needle, int size); /* memstr */
400 void	tos_help(void);				/* show the TOS help */
401 int	rtt(int *seqp, int recvport, float *ms_delay);	/* compute round trip time */
402 int	relativize_id(int seqnum, int *ip_id);	/* compute relative id */
403 int	if_promisc_on(int s);			/* promisc. mode ON */
404 int	if_promisc_off(int s);			/* promisc. mode OFF */
405 int	open_pcap(void);			/* open libpcap socket */
406 int	close_pcap(void);			/* close libpcap socket */
407 int	pcap_recv(char *, unsigned int);	/* libpcap api wrapper */
408 int	memlock(char *addr, size_t size);	/* disable paging */
409 int	memunlock(char *addr, size_t size);	/* enable paging */
410 int	memlockall(void);			/* disable paging (all pages) */
411 int	memunlockall(void);			/* enable paging (all pages) */
412 unsigned char ip_opt_build(char *ip_opt);		/* build ip options */
413 void	display_ipopt(char* buf);		/* display ip options */
414 void	icmp_help(void);			/* show the ICMP help */
415 void	route_help(void);			/* show the route help */
416 void	(*Signal(int signo, void (*func)(int)))(int);
417 void	delaytable_add(int seq, int src, time_t sec, time_t usec, int status);
418 int	read_packet(void *packet, int size);
419 void	scanmain(void);
420 void	hping_script(int argc, char **argv);
421 u_int32_t hp_rand(void);
422 #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \
423     !defined(__bsdi__) && !defined(__APPLE__) && !defined(__DragonFly__)
424 size_t strlcpy(char *dst, const char *src, size_t siz);
425 #endif
426 
427 /* ARS glue */
428 void hping_ars_send(char *s);
429 
430 #endif /* _HPING2_H */
431