Annotation of embedaddon/hping2/ars.h, revision 1.1.1.1
1.1 misho 1: /* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
2: * See the LICENSE file for more information. */
3:
4: /* $Id: ars.h,v 1.3 2003/07/28 09:00:55 njombart Exp $ */
5:
6: #ifndef _ARS_H
7: #define _ARS_H
8:
9: /* define before including sys/socket.h */
10: #if defined(__APPLE__)
11: #define _BSD_SOCKLEN_T_ int
12: #endif
13:
14: #include <sys/types.h>
15: #include <sys/socket.h>
16: #include "systype.h"
17: #include "in.h"
18: #include "bytesex.h"
19:
20: #ifndef TRUE
21: #define TRUE 1
22: #define FALSE 0
23: #endif
24:
25:
26: #ifndef MIN
27: #define MIN(x,y) ((x)<(y)?(x):(y))
28: #endif
29:
30: #ifndef MAX
31: #define MAX(x,y) ((x)>(y)?(x):(y))
32: #endif
33:
34: #ifdef DEBUG
35: #define __D(x) x
36: #else
37: #define __D(x) do { } while (0);
38: #endif
39:
40: #ifndef __u8
41: #define __u8 u_int8_t
42: #define __u16 u_int16_t
43: #define __u32 u_int32_t
44: #endif
45:
46: /* error codes */
47: #define ARS_OK 0
48: #define ARS_ERROR 1
49: #define ARS_NOSPACE 2
50: #define ARS_NOMEM 3
51: #define ARS_INVALID 4
52:
53: /* Headers size */
54: #define ARS_ICMPHDR_SIZE sizeof(struct ars_icmphdr)
55: #define ARS_UDPHDR_SIZE sizeof(struct ars_udphdr)
56: #define ARS_TCPHDR_SIZE sizeof(struct ars_tcphdr)
57: #define ARS_IPHDR_SIZE sizeof(struct ars_iphdr)
58: #define ARS_PSEUDOHDR_SIZE sizeof(struct pseudohdr)
59:
60: /* IP defines */
61: #define ARS_MAX_IP_SIZE 65535
62:
63: #define ARS_IP_MF ((unsigned short)0x2000) /* more fragments */
64: #define ARS_IP_DF ((unsigned short)0x4000) /* dont fragment */
65: #define ARS_IP_RF ((unsigned short)0x8000) /* reserved fragment flag */
66:
67: #define ARS_IPOPT_COPY 0x80
68: #define ARS_IPOPT_CLASS_MASK 0x60
69: #define ARS_IPOPT_NUMBER_MASK 0x1f
70:
71: #define ARS_IPOPT_COPIED(o) ((o)&ARS_IPOPT_COPY)
72: #define ARS_IPOPT_CLASS(o) ((o)&ARS_IPOPT_CLASS_MASK)
73: #define ARS_IPOPT_NUMBER(o) ((o)&ARS_IPOPT_NUMBER_MASK)
74:
75: #define ARS_IPOPT_CONTROL 0x00
76: #define ARS_IPOPT_RESERVED1 0x20
77: #define ARS_IPOPT_MEASUREMENT 0x40
78: #define ARS_IPOPT_RESERVED2 0x60
79:
80: #define ARS_IPOPT_END (0 |ARS_IPOPT_CONTROL)
81: #define ARS_IPOPT_NOOP (1 |ARS_IPOPT_CONTROL)
82: #define ARS_IPOPT_SEC (2 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
83: #define ARS_IPOPT_LSRR (3 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
84: #define ARS_IPOPT_TIMESTAMP (4 |ARS_IPOPT_MEASUREMENT)
85: #define ARS_IPOPT_RR (7 |ARS_IPOPT_CONTROL)
86: #define ARS_IPOPT_SID (8 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
87: #define ARS_IPOPT_SSRR (9 |ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
88: #define ARS_IPOPT_RA (20|ARS_IPOPT_CONTROL|ARS_IPOPT_COPY)
89:
90: #define ARS_IPOPT_OPTVAL 0
91: #define ARS_IPOPT_OLEN 1
92: #define ARS_IPOPT_OFFSET 2
93: #define ARS_IPOPT_MINOFF 4
94: #define ARS_MAX_IPOPTLEN 40
95: #define ARS_IPOPT_NOP ARS_IPOPT_NOOP
96: #define ARS_IPOPT_EOL ARS_IPOPT_END
97: #define ARS_IPOPT_TS ARS_IPOPT_TIMESTAMP
98:
99: #define ARS_IPOPT_TS_TSONLY 0 /* timestamps only */
100: #define ARS_IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
101: #define ARS_IPOPT_TS_PRESPEC 3 /* specified modules only */
102:
103: /* IPV4 and IPV6 string rappresentation len */
104: #define ARS_INET_ADDRSTRLEN 16
105: #define ARS_INET6_ADDRSTRLEN 46
106:
107: /* TCP */
108: #define ARS_TCPOPT_EOL 0
109: #define ARS_TCPOPT_NOP 1
110: #define ARS_TCPOPT_MAXSEG 2
111: #define ARS_TCPOPT_WINDOW 3
112: #define ARS_TCPOPT_SACK_PERM 4
113: #define ARS_TCPOPT_SACK 5
114: #define ARS_TCPOPT_ECHOREQUEST 6
115: #define ARS_TCPOPT_ECHOREPLY 7
116: #define ARS_TCPOPT_TIMESTAMP 8
117:
118: #define ARS_TCP_TH_FIN 0x01
119: #define ARS_TCP_TH_SYN 0x02
120: #define ARS_TCP_TH_RST 0x04
121: #define ARS_TCP_TH_PUSH 0x08
122: #define ARS_TCP_TH_ACK 0x10
123: #define ARS_TCP_TH_URG 0x20
124: #define ARS_TCP_TH_X 0x40 /* X tcp flag */
125: #define ARS_TCP_TH_Y 0x80 /* Y tcp flag */
126:
127: /* ICMP TYPE */
128: #define ARS_ICMP_ECHOREPLY 0 /* Echo Reply */
129: #define ARS_ICMP_DEST_UNREACH 3 /* Destination Unreachable */
130: #define ARS_ICMP_SOURCE_QUENCH 4 /* Source Quench */
131: #define ARS_ICMP_REDIRECT 5 /* Redirect (change route) */
132: #define ARS_ICMP_ECHO 8 /* Echo Request */
133: #define ARS_ICMP_TIME_EXCEEDED 11 /* Time Exceeded */
134: #define ARS_ICMP_PARAMETERPROB 12 /* Parameter Problem */
135: #define ARS_ICMP_TIMESTAMP 13 /* Timestamp Request */
136: #define ARS_ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */
137: #define ARS_ICMP_INFO_REQUEST 15 /* Information Request */
138: #define ARS_ICMP_INFO_REPLY 16 /* Information Reply */
139: #define ARS_ICMP_ADDRESS 17 /* Address Mask Request */
140: #define ARS_ICMP_ADDRESSREPLY 18 /* Address Mask Reply */
141:
142: /* Codes for UNREACHABLE */
143: #define ARS_ICMP_UNR_NET 0 /* Network Unreachable */
144: #define ARS_ICMP_UNR_HOST 1 /* Host Unreachable */
145: #define ARS_ICMP_UNR_PROT 2 /* Protocol Unreachable */
146: #define ARS_ICMP_UNR_PORT 3 /* Port Unreachable */
147: #define ARS_ICMP_UNR_FRAG_NEEDED 4 /* Fragmentation Needed,DF set*/
148: #define ARS_ICMP_UNR_SR_FAILED 5 /* Source Route failed */
149: #define ARS_ICMP_UNR_UNK_NET 6
150: #define ARS_ICMP_UNR_UNK_HOST 7
151: #define ARS_ICMP_UNR_ISOLATED_HOST 8
152: #define ARS_ICMP_UNR_NET_ANO 9
153: #define ARS_ICMP_UNR_HOST_ANO 10
154: #define ARS_ICMP_UNR_NET_UNR_TOS 11
155: #define ARS_ICMP_UNR_HOST_UNR_TOS 12
156: #define ARS_ICMP_UNR_PKT_FILTERED 13 /* Packet filtered */
157: #define ARS_ICMP_UNR_PREC_VIOLATION 14 /* Precedence violation */
158: #define ARS_ICMP_UNR_PREC_CUTOFF 15 /* Precedence cut off */
159: #define ARS_NR_ICMP_UNREACH 15 /* Instead of hardcoded immediate value */
160:
161: /* Codes for REDIRECT */
162: #define ARS_ICMP_REDIR_NET 0 /* Redirect Net */
163: #define ARS_ICMP_REDIR_HOST 1 /* Redirect Host */
164: #define ARS_ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */
165: #define ARS_ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */
166:
167: /* Codes for TIME_EXCEEDED */
168: #define ARS_ICMP_EXC_TTL 0 /* TTL count exceeded */
169: #define ARS_ICMP_EXC_FRAGTIME 1 /* TTL exceeded reassembling */
170:
171: /* The IP header structure */
172: struct ars_iphdr {
173: #if defined(BYTE_ORDER_LITTLE_ENDIAN)
174: __u8 ihl:4,
175: version:4;
176: #elif defined (BYTE_ORDER_BIG_ENDIAN)
177: __u8 version:4,
178: ihl:4;
179: #else
180: #error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
181: #endif
182: __u8 tos;
183: __u16 tot_len;
184: __u16 id;
185: __u16 frag_off;
186: __u8 ttl;
187: __u8 protocol;
188: __u16 check;
189: __u32 saddr;
190: __u32 daddr;
191: };
192:
193: /* The IP options structure */
194: struct ars_ipopt {
195: u_int8_t kind;
196: u_int8_t len;
197: union {
198: struct {
199: u_int16_t s;
200: u_int16_t c;
201: u_int16_t h;
202: u_int8_t tcc[3];
203: } sec; /* security */
204: struct {
205: u_int8_t ptr;
206: u_int8_t data[37];
207: } src; /* loose and strinct source routing */
208: struct {
209: u_int8_t ptr;
210: u_int8_t data[37];
211: } rr; /* record route */
212: struct {
213: u_int16_t id;
214: } sid; /* stream id */
215: struct {
216: u_int8_t ptr;
217: u_int8_t flags;
218: u_int8_t data[36];
219: } tstamp; /* timestamp */
220: } un;
221: };
222:
223: /* The UDP header structure */
224: struct ars_udphdr {
225: __u16 uh_sport; /* source port */
226: __u16 uh_dport; /* destination port */
227: __u16 uh_ulen; /* udp length */
228: __u16 uh_sum; /* udp checksum */
229: };
230:
231: /* The TCP header structure */
232: struct ars_tcphdr {
233: __u16 th_sport; /* source port */
234: __u16 th_dport; /* destination port */
235: __u32 th_seq; /* sequence number */
236: __u32 th_ack; /* acknowledgement number */
237: #if defined (BYTE_ORDER_LITTLE_ENDIAN)
238: __u8 th_x2:4, /* (unused) */
239: th_off:4; /* data offset */
240: #elif defined (BYTE_ORDER_BIG_ENDIAN)
241: __u8 th_off:4, /* data offset */
242: th_x2:4; /* (unused) */
243: #else
244: #error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
245: #endif
246: __u8 th_flags;
247: __u16 th_win; /* window */
248: __u16 th_sum; /* checksum */
249: __u16 th_urp; /* urgent pointer */
250: };
251:
252: /* The TCP options structure */
253: struct ars_tcpopt {
254: u_int8_t kind;
255: u_int8_t len;
256: union {
257: struct {
258: u_int16_t size;
259: } mss;
260: struct {
261: u_int8_t shift;
262: } win;
263: struct {
264: u_int16_t origin;
265: u_int16_t size;
266: } sack[10]; /* 10 SACK blocks in 44 bytes of space */
267: struct {
268: u_int8_t info[4];
269: } echo;
270: struct {
271: u_int8_t tsval[4];
272: u_int8_t tsecr[4];
273: } timestamp;
274: } un;
275: };
276:
277: /* The ICMP header structure */
278: struct ars_icmphdr
279: {
280: __u8 type;
281: __u8 code;
282: __u16 checksum;
283: union
284: {
285: struct
286: {
287: __u16 id;
288: __u16 sequence;
289: } echo; /* called echo since it's the most used */
290: __u32 gateway;
291: } un;
292: };
293:
294: /* TCP/UDP pseudo header used to compute the checksum */
295: struct ars_pseudohdr
296: {
297: __u32 saddr;
298: __u32 daddr;
299: __u8 zero;
300: __u8 protocol;
301: __u16 lenght;
302: };
303:
304: struct ars_packet; /* forward declaration */
305:
306: /* ARS layer */
307: struct ars_layer {
308: int l_type;
309: int l_size;
310: int l_flags;
311: void *l_data;
312: struct ars_packet *l_packet;
313: };
314:
315: #define ARS_MAX_LAYER 16
316:
317: /* Types */
318: #define ARS_TYPE_SIZE 32
319: #define ARS_TYPE_NULL 0
320: #define ARS_TYPE_IP 1
321: #define ARS_TYPE_IPOPT 2
322: #define ARS_TYPE_ICMP 3
323: #define ARS_TYPE_UDP 4
324: #define ARS_TYPE_TCP 5
325: #define ARS_TYPE_TCPOPT 6
326: #define ARS_TYPE_DATA 31
327:
328: /* ARS packet context */
329: struct ars_packet {
330: char *p_error;
331: int p_layer_nr;
332: struct ars_layer p_layer[ARS_MAX_LAYER];
333: void *p_default[ARS_TYPE_SIZE];
334: int aux; /* Auxiliar variable for data exchange between functions */
335: };
336:
337: /* Facility to check for flags */
338: #define ARS_TAKE(f,x) (f & x)
339: #define ARS_DONTTAKE(f, x) (!(f & x))
340: #define ARS_TAKE_NONE 0
341:
342: /* IP layer flags */
343: #define ARS_TAKE_IP_VERSION (1 << 0)
344: #define ARS_TAKE_IP_HDRLEN (1 << 1)
345: #define ARS_TAKE_IP_TOTLEN (1 << 2)
346: #define ARS_TAKE_IP_PROTOCOL (1 << 3)
347: #define ARS_TAKE_IP_CKSUM (1 << 4)
348:
349: /* ICMP layer flags */
350: #define ARS_TAKE_ICMP_CKSUM (1 << 0)
351:
352: /* UDP layer flags */
353: #define ARS_TAKE_UDP_CKSUM (1 << 0)
354: #define ARS_TAKE_UDP_LEN (1 << 1)
355:
356: /* TCP layer flags */
357: #define ARS_TAKE_TCP_HDRLEN (1 << 0)
358: #define ARS_TAKE_TCP_CKSUM (1 << 1)
359:
360: /* Some function that acts on layer switch to the last layer with this */
361: #define ARS_LAST_LAYER -1
362:
363: /* Structure and defines needed to calculate the internet-like checksum
364: * when the data is splitted in more not adjacent buffers */
365: #define ARS_MC_INIT 0
366: #define ARS_MC_UPDATE 1
367: #define ARS_MC_FINAL 2
368:
369: struct mc_context {
370: u_int32_t oddbyte_flag;
371: u_int32_t old;
372: u_int8_t oddbyte;
373: u_int8_t pad;
374: };
375:
376: /* ARS layer info structure */
377: struct ars_layer_info {
378: char *li_name; /* NULL = unused slot */
379: int (*li_compiler) (struct ars_packet *pkt, int layer); /* NULL = NOP */
380: int layer_id;
381: };
382:
383: /* ARS layer info table */
384: struct ars_layer_info ars_linfo[ARS_TYPE_SIZE];
385:
386: /* ARS interface managment structure and defines */
387: #define ARS_IF_UP (1 << 0)
388: #define ARS_IF_LOOP (1 << 1)
389: #define ARS_IF_IPV4 (1 << 2)
390: #define ARS_IF_IPV6 (1 << 3)
391: #define ARS_IF_MISCONF (1 << 4)
392:
393: #define ARS_IF_MAX_IFACE 16
394: #define ARS_IF_NAME_SIZE 32
395:
396: /* iface type are obtained using libpcap to avoid efforts duplication */
397: struct ars_iface {
398: char if_name[ARS_IF_NAME_SIZE];
399: int if_mtu;
400: int if_flags;
401: char if_ipv4addr[ARS_INET_ADDRSTRLEN];
402: char if_ipv6addr[ARS_INET6_ADDRSTRLEN];
403: };
404:
405: /* Flags for packet splitting */
406: #define ARS_SPLIT_FTRUNC (1 << 0)
407: #define ARS_SPLIT_FBADCKSUM (1 << 1)
408:
409: /* More macros */
410: #define ars_atou(x) strtoul(x, (char **) NULL, 0)
411:
412: /* Prototypes */
413: int ars_init(struct ars_packet *pkt);
414: int ars_destroy(struct ars_packet *pkt);
415: int ars_nospace(struct ars_packet *pkt);
416: int ars_add_generic(struct ars_packet *pkt, size_t size, int type);
417: void *ars_add_iphdr(struct ars_packet *pkt, int unused);
418: void *ars_add_ipopt(struct ars_packet *pkt, int option);
419: void *ars_add_udphdr(struct ars_packet *pkt, int unused);
420: void *ars_add_tcphdr(struct ars_packet *pkt, int unused);
421: void *ars_add_tcpopt(struct ars_packet *pkt, int option);
422: void *ars_add_icmphdr(struct ars_packet *pkt, int unused);
423: void *ars_add_data(struct ars_packet *pkt, int size);
424: size_t ars_relative_size(struct ars_packet *pkt, int layer_nr);
425: size_t ars_packet_size(struct ars_packet *pkt);
426: u_int16_t ars_cksum(void *vbuf, size_t nbytes);
427: u_int16_t ars_multi_cksum(struct mc_context *c, int op, void *vbuf, size_t nbytes);
428: int ars_compile(struct ars_packet *pkt);
429: int ars_udptcp_cksum(struct ars_packet *pkt, int layer, u_int16_t *sum);
430: int ars_open_rawsocket(struct ars_packet *pkt);
431: int ars_build_packet(struct ars_packet *pkt, unsigned char **packet, size_t *size);
432: int ars_bsd_fix(struct ars_packet *pkt, unsigned char *packet, size_t size);
433: int ars_set_flags(struct ars_packet *pkt, int layer, int flags);
434: int ars_send(int s, struct ars_packet *pkt, struct sockaddr *sa, socklen_t slen);
435: int ars_resolve(struct ars_packet *pkt, u_int32_t *dest, char *hostname);
436: int ars_set_error(struct ars_packet *pkt, char *error);
437: int ars_d_build(struct ars_packet *pkt, char *t);
438: int ars_valid_layer(int layer);
439: int ars_get_iface_list(struct ars_iface *iface, size_t *isize);
440: int ars_get_iface(char *name, struct ars_iface *i);
441: int ars_valid_layer(int layer);
442: int ars_remove_layer(struct ars_packet *pkt, int layer);
443:
444: /* split.c prototypes */
445: int ars_seems_ip(struct ars_iphdr *ip, size_t size);
446: int ars_guess_ipoff(void *packet, size_t size, int *lhs);
447: int ars_check_ip_cksum(struct ars_iphdr *ip);
448: int ars_check_icmp_cksum(struct ars_icmphdr *icmp, size_t size);
449: int ars_split_packet(void *packet, size_t size, int ipoff, struct ars_packet *pkt);
450: #endif /* _ARS_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>