Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


added network server files
[palacios.git] / misc / network_servers / vtl / vtl_util.h
1 #ifndef __VTL_UTIL_H
2 #define __VTL_UTIL_H 1
3
4
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 #ifdef linux
9 #include <sys/socket.h>
10 #include <sys/types.h>
11 #elif WIN32
12
13 #endif 
14
15 #include "raw_ethernet_packet.h"
16 #include "debug.h"
17 #include "socks.h"
18
19
20
21 typedef struct ip_hdr {
22   unsigned char hdr_len:4, version:4;
23   unsigned char tos;
24   unsigned short total_len;
25   unsigned short id;
26   unsigned char flags:3;
27   unsigned short offset:13;
28   unsigned char ttl;
29   unsigned char proto;
30   unsigned short cksum;
31   unsigned int src_addr;
32   unsigned int dst_addr;
33 } ip_hdr_t;
34
35
36 struct tcpheader {
37  unsigned short int th_sport;
38  unsigned short int th_dport;
39  unsigned int th_seq;
40  unsigned int th_ack;
41  unsigned char th_x2:4, th_off:4;
42  unsigned char th_flags;
43  unsigned short int th_win;
44  unsigned short int th_sum;
45  unsigned short int th_urp;
46 };
47
48 struct udpheader {
49  unsigned short int uh_sport;
50  unsigned short int uh_dport;
51  unsigned short int uh_len;
52  unsigned short int uh_check;
53 }; 
54
55 struct icmpheader {
56  unsigned char icmp_type;
57  unsigned char icmp_code;
58  unsigned short int icmp_cksum;
59  /* The following data structures are ICMP type specific */
60  unsigned short int icmp_id;
61  unsigned short int icmp_seq;
62 };
63
64 /* ETHERNET MACROS */
65 #define ETH_HDR_LEN 14
66 #define MAC_BCAST {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
67 #define ETH_IP 0x0008
68 #define ETH_ARP 0x0608
69 #define ETH_RARP 0x3508
70
71 #define MAC_LEN 6
72
73 #define ETH_DST_OFFSET 0
74 #define ETH_SRC_OFFSET 6
75 #define ETH_TYPE_OFFSET 12
76 #define ETH_DATA_OFFSET 14
77
78 #define ETH_DST(pkt) (pkt + ETH_DST_OFFSET)
79 #define ETH_SRC(pkt) (pkt + ETH_SRC_OFFSET)
80 #define ETH_TYPE(pkt) (pkt + ETH_TYPE_OFFSET)
81 #define ETH_DATA(pkt) (pkt + ETH_DATA_OFFSET)
82
83 #define SET_ETH_DST(pkt, dst) memcpy(ETH_DST(pkt), dst, 6)
84 #define SET_ETH_SRC(pkt, src) memcpy(ETH_SRC(pkt), src, 6)
85 #define SET_ETH_TYPE(pkt, type) (*(unsigned short *)(ETH_TYPE(pkt)) = type)
86 #define GET_ETH_TYPE(pkt) (*(unsigned short *)ETH_TYPE(pkt))
87 #define GET_ETH_DST(pkt, dst) memcpy(dst, ETH_DST(pkt), 6)
88 #define GET_ETH_SRC(pkt, src) memcpy(src, ETH_SRC(pkt), 6)
89
90 /* ARP MACROS */
91
92 #define ARP_HW_TYPE_OFFSET 0
93 #define ARP_PROTO_TYPE_OFFSET 2
94 #define ARP_HW_LEN_OFFSET 4
95 #define ARP_PROTO_LEN_OFFSET 5
96 #define ARP_OP_OFFSET 6
97 #define ARP_ADDR_OFFSET 8
98
99 #define ARP_REQUEST 0x0001
100 #define ARP_REPLY 0x0002
101 #define RARP_REQUEST 0x0003
102 #define RARP_REPLY 0x0004
103
104 #define ARP_HDR(pkt) (pkt + ETH_HDR_LEN)
105
106 #define ARP_HW_TYPE(pkt) (ARP_HDR(pkt) + ARP_HW_TYPE_OFFSET)
107 #define ARP_PROTO_TYPE(pkt) (ARP_HDR(pkt) + ARP_PROTO_TYPE_OFFSET)
108 #define ARP_HW_LEN(pkt) (ARP_HDR(pkt) + ARP_HW_LEN_OFFSET)
109 #define ARP_PROTO_LEN(pkt) (ARP_HDR(pkt) + ARP_PROTO_LEN_OFFSET)
110 #define ARP_OP(pkt) (ARP_HDR(pkt) + ARP_OP_OFFSET)
111 #define ARP_SRC_HW(pkt) (ARP_HDR(pkt) + ARP_ADDR_OFFSET)
112 #define ARP_SRC_PROTO(pkt) (ARP_HDR(pkt) + ARP_ADDR_OFFSET + GET_ARP_HW_LEN(pkt))
113 #define ARP_DST_HW(pkt) (ARP_HDR(pkt) + ARP_ADDR_OFFSET + GET_ARP_HW_LEN(pkt) + GET_ARP_PROTO_LEN(pkt))
114 #define ARP_DST_PROTO(pkt) (ARP_HDR(pkt) +  ARP_ADDR_OFFSET + (GET_ARP_HW_LEN(pkt) * 2) + GET_ARP_PROTO_LEN(pkt)) 
115
116 #define ARP_DST_MAC(pkt) ARP_DST_HW(pkt)
117 #define ARP_DST_IP(pkt) ARP_DST_PROTO(pkt)
118 #define ARP_SRC_MAC(pkt) ARP_SRC_HW(pkt)
119 #define ARP_SRC_IP(pkt) ARP_SRC_PROTO(pkt)
120
121 #define GET_ARP_HW_TYPE(pkt) ntohs(*(unsigned short *)ARP_HW_TYPE(pkt))
122 #define GET_ARP_PROTO_TYPE(pkt) ntohs(*(unsigned short *)ARP_PROTO_TYPE(pkt))
123 #define GET_ARP_HW_LEN(pkt) (*(char *)ARP_HW_LEN(pkt))
124 #define GET_ARP_PROTO_LEN(pkt) (*(char *)ARP_PROTO_LEN(pkt))
125 #define GET_ARP_OP(pkt) ntohs(*(unsigned short *)ARP_OP(pkt))
126 #define GET_ARP_SRC_HW(pkt, src) memcpy(src, ARP_SRC_HW(pkt), GET_ARP_HW_LEN(pkt))
127 #define GET_ARP_SRC_PROTO(pkt, src) memcpy(src, ARP_SRC_PROTO(pkt), GET_ARP_PROTO_LEN(pkt))
128 #define GET_ARP_DST_HW(pkt, dst) memcpy(dst, ARP_DST_HW(pkt), GET_ARP_HW_LEN(pkt))
129 #define GET_ARP_DST_PROTO(pkt, dst) memcpy(dst, ARP_DST_PROTO(pkt), GET_ARP_PROTO_LEN(pkt))
130
131 #define GET_ARP_SRC_MAC(pkt, src) GET_ARP_SRC_HW(pkt, src)
132 #define GET_ARP_DST_MAC(pkt, dst) GET_ARP_DST_HW(pkt, dst)
133 #define GET_ARP_SRC_IP(pkt) ntohl(*(unsigned long *)ARP_SRC_IP(pkt))
134 #define GET_ARP_DST_IP(pkt) ntohl(*(unsigned long *)ARP_DST_IP(pkt))
135
136 #define SET_ARP_HW_TYPE(pkt, type) (*(unsigned short *)ARP_HW_TYPE(pkt) = htons(type))
137 #define SET_ARP_PROTO_TYPE(pkt, type) (*(unsigned short *)ARP_PROTO_TYPE(pkt) = htons(type))
138 #define SET_ARP_HW_LEN(pkt, len) (*(char *)ARP_HW_LEN(pkt) = len)
139 #define SET_ARP_PROTO_LEN(pkt, len) (*(char *)ARP_PROTO_LEN(pkt) = len)
140 #define SET_ARP_OP(pkt, op)  (*(unsigned short *)ARP_OP(pkt) = htons(op))
141 #define SET_ARP_SRC_HW(pkt, src) memcpy(ARP_SRC_HW(pkt), src, GET_ARP_HW_LEN(pkt))
142 #define SET_ARP_SRC_PROTO(pkt, src) memcpy(ARP_SRC_PROTO(pkt), src, GET_ARP_PROTO_LEN(pkt))
143 #define SET_ARP_DST_HW(pkt, dst) memcpy(ARP_DST_HW(pkt), dst, GET_ARP_HW_LEN(pkt))
144 #define SET_ARP_DST_PROTO(pkt, dst) memcpy(ARP_DST_PROTO(pkt), dst, GET_ARP_PROTO_LEN(pkt))
145
146 #define SET_ARP_SRC_MAC(pkt, src) SET_ARP_SRC_HW(pkt, src)
147 #define SET_ARP_DST_MAC(pkt, dst) SET_ARP_DST_HW(pkt, dst)
148 #define SET_ARP_SRC_IP(pkt, src) (*(unsigned long *)ARP_SRC_IP(pkt) = htonl(src))
149 #define SET_ARP_DST_IP(pkt, dst) (*(unsigned long *)ARP_DST_IP(pkt) = htonl(dst))
150
151
152 /* IP MACROS */
153 #define IP_SVC_TYPE_OFFSET 1
154 #define IP_TOTAL_LEN_OFFSET 2
155 #define IP_ID_OFFSET 4
156 #define IP_FLAGS_OFFSET 6
157 #define IP_FRAG_OFFSET 6
158 #define IP_TTL_OFFSET 8
159 #define IP_PROTO_OFFSET 9
160 #define IP_CKSUM_OFFSET 10
161 #define IP_SRC_OFFSET 12
162 #define IP_DST_OFFSET 16
163
164
165 // These can be fleshed out: 
166 // http://www.iana.org/assignments/protocol-numbers
167 #define IP_ICMP 0x01
168 #define IP_TCP 0x06
169 #define IP_UDP 0x11
170
171
172 #define IP_HDR(pkt) (pkt + ETH_HDR_LEN)
173
174 #define IP_HDR_LEN(pkt) (IP_HDR(pkt));
175 #define IP_SVC_TYPE(pkt) (IP_HDR(pkt) + IP_SVC_TYPE_OFFSET)
176 #define IP_DSCP(pkt) IP_TOS(pkt)
177 #define IP_TOTAL_LEN(pkt) (IP_HDR(pkt) + IP_TOTAL_LEN_OFFSET)
178 #define IP_ID(pkt) (IP_HDR(pkt) + IP_ID_OFFSET)
179 #define IP_FLAGS(pkt) (IP_HDR(pkt) + IP_FLAGS_OFFSET)
180 #define IP_FRAG(pkt) (IP_HDR(pkt) + IP_FRAG_OFFSET)
181 #define IP_TTOL(pkt) (IP_HDR(pkt) + IP_TTL_OFFSET)
182 #define IP_PROTO(pkt) (IP_HDR(pkt) + IP_PROTO_OFFSET)
183 #define IP_CKSUM(pkt) (IP_HDR(pkt) + IP_CKSUM_OFFSET)
184 #define IP_SRC(pkt) (IP_HDR(pkt) + IP_SRC_OFFSET)
185 #define IP_DST(pkt) (IP_HDR(pkt) + IP_DST_OFFSET)
186 #define IP_DATA(pkt) (IP_HDR(pkt) + GET_IP_HDR_LEN(pkt))
187
188
189 #define GET_IP_VERSION(pkt) (((*(char *)IP_HDR(pkt)) & 0xf0) >> 4)
190 #define GET_IP_HDR_LEN(pkt) ((*((char *)IP_HDR(pkt)) & 0x0f) << 2)
191 #define GET_IP_SVC_TYPE(pkt) (*(char *)IP_SVC_TYPE(pkt))
192 #define GET_IP_DSCP(pkt) (*(char *)IP_DSCP(pkt))
193 #define GET_IP_TOTAL_LEN(pkt) ntohs(*(unsigned short *)IP_TOTAL_LEN(pkt))
194 #define GET_IP_ID(pkt) ntohs(*(unsigned short *)IP_ID(pkt))
195 #define GET_IP_FLAGS(pkt) (*(char *)IP_FLAGS(pkt) & 0xe0)
196 #define GET_IP_FRAG(pkt) ntohs(*(unsigned short *)IP_FRAG(pkt) & htons(0x1fff))
197 #define GET_IP_TTL(pkt) (*(char *)IP_TTOL(pkt))
198 #define GET_IP_PROTO(pkt) (*(char *)IP_PROTO(pkt))
199 #define GET_IP_CKSUM(pkt) (*(unsigned short *)IP_CKSUM(pkt))
200 #define GET_IP_SRC(pkt) ntohl(*(unsigned long *)IP_SRC(pkt))
201 #define GET_IP_DST(pkt) ntohl(*(unsigned long *)IP_DST(pkt))
202
203
204
205 void inline SET_IP_VERSION(char * pkt, char version) {
206   *(char *)IP_HDR(pkt) &= 0x0f;
207   *(char *)IP_HDR(pkt) |= ((version & 0x0f) << 4);
208 }
209
210 void inline SET_IP_HDR_LEN(char * pkt, char len) {
211   *(char *)IP_HDR(pkt) &= 0xf0;
212   *(char *)IP_HDR(pkt) |= ((len >> 2) & 0x0f);
213 }
214
215 #define SET_IP_SVC_TYPE(pkt, tos) (*(char *)IP_SVC_TYPE(pkt) = tos)
216 #define SET_IP_DSCP(pkt, dscp) (*(char *)IP_DSCP(pkt) = dscp)
217 #define SET_IP_TOTAL_LEN(pkt, len) (*(unsigned short *)IP_TOTAL_LEN(pkt) = htons(len))
218 #define SET_IP_ID(pkt, id) (*(unsigned short *)IP_ID(pkt) = htons(id))
219
220 void inline SET_IP_FLAGS(char * pkt, char flags) {
221   *(char *)IP_FLAGS(pkt) &= 0x1f;
222   *(char *)IP_FLAGS(pkt) |= (flags & 0xe0);
223 }
224
225 void inline SET_IP_FRAG(char * pkt, unsigned short frag) {
226   *(unsigned short *)IP_FRAG(pkt) &= htons(0xe000);
227   *(unsigned short *)IP_FRAG(pkt) |= htons(frag & 0x1fff);
228 }
229
230 #define SET_IP_TTL(pkt, ttl) (*(char *)IP_TTOL(pkt) = ttl)
231 #define SET_IP_PROTO(pkt, proto) (*(char *)IP_PROTO(pkt) = proto)
232 #define SET_IP_CKSUM(pkt, cksum) (*(unsigned short *)IP_CKSUM(pkt) = cksum)
233 #define SET_IP_SRC(pkt, src) (*(unsigned long *)IP_SRC(pkt) = htonl(src))
234 #define SET_IP_DST(pkt, dst) (*(unsigned long *)IP_DST(pkt) = htonl(dst))
235
236 unsigned short compute_ip_checksum(RawEthernetPacket * pkt);
237
238 /* TCP MACROS */
239 #define TCP_SRC_PORT_OFFSET 0
240 #define TCP_DST_PORT_OFFSET 2
241 #define TCP_SEQ_NUM_OFFSET 4
242 #define TCP_ACK_NUM_OFFSET 8
243 #define TCP_HDR_LEN_OFFSET 12
244 #define TCP_RSVD_OFFSET 12
245 #define TCP_FLAGS_OFFSET 13
246 #define TCP_WIN_OFFSET 14
247 #define TCP_CKSUM_OFFSET 16
248 #define TCP_URG_PTR_OFFSET 18
249 #define TCP_OPTS_OFFSET 20
250
251
252 #define TCP_HDR(pkt) (pkt + ETH_HDR_LEN + GET_IP_HDR_LEN(pkt))
253 #define TCP_SRC_PORT(pkt) (TCP_HDR(pkt) + TCP_SRC_PORT_OFFSET)
254 #define TCP_DST_PORT(pkt) (TCP_HDR(pkt) + TCP_DST_PORT_OFFSET)
255 #define TCP_SEQ_NUM(pkt) (TCP_HDR(pkt) + TCP_SEQ_NUM_OFFSET)
256 #define TCP_ACK_NUM(pkt) (TCP_HDR(pkt) + TCP_ACK_NUM_OFFSET)
257 #define TCP_HDR_LEN(pkt) (TCP_HDR(pkt) + TCP_HDR_LEN_OFFSET)
258 #define TCP_RSVD(pkt) (TCP_HDR(pkt) + TCP_RSVD_OFFSET)
259 #define TCP_FLAGS(pkt) (TCP_HDR(pkt) + TCP_FLAGS_OFFSET)
260 #define TCP_WIN(pkt) (TCP_HDR(pkt) + TCP_WIN_OFFSET)
261 #define TCP_CKSUM(pkt) (TCP_HDR(pkt) + TCP_CKSUM_OFFSET)
262 #define TCP_URG_PTR(pkt) (TCP_HDR(pkt) + TCP_URG_PTR_OFFSET)
263 #define TCP_OPTS(pkt) (TCP_HDR(pkt) + TCP_OPTS_OFFSET)
264 #define TCP_DATA(pkt) (TCP_HDR(pkt) + GET_TCP_HDR_LEN(pkt))
265
266 #define GET_TCP_SRC_PORT(pkt) ntohs(*(unsigned short *)TCP_SRC_PORT(pkt))
267 #define GET_TCP_DST_PORT(pkt) ntohs(*(unsigned short *)TCP_DST_PORT(pkt))
268 #define GET_TCP_SEQ_NUM(pkt) ntohl(*(unsigned long *)TCP_SEQ_NUM(pkt))
269 #define GET_TCP_ACK_NUM(pkt) ntohl(*(unsigned long *)TCP_ACK_NUM(pkt))
270 #define GET_TCP_HDR_LEN(pkt) (((*(char *)TCP_HDR_LEN(pkt)) & 0xf0) >> 2)
271 #define GET_TCP_RSVD(pkt) (((*(unsigned short *)TCP_RSVD(pkt)) & htons(0x0fc0)) >> 6)
272 #define GET_TCP_FLAGS(pkt) ((*(char *)TCP_FLAGS(pkt)) & 0x3f)
273 #define GET_TCP_EFLAGS(pkt) (*(char *)TCP_FLAGS(pkt))
274 #define GET_TCP_WIN(pkt) ntohs(*(unsigned short *)TCP_WIN(pkt))
275 #define GET_TCP_CKSUM(pkt) (*(unsigned short *)TCP_CKSUM(pkt))
276 #define GET_TCP_URG_PTR(pkt) ntohs(*(unsigned short *)TCP_URG_PTR(pkt))
277
278 #define GET_TCP_DATA_LEN(pkt) (GET_IP_TOTAL_LEN(pkt) - (GET_IP_HDR_LEN(pkt) + GET_TCP_HDR_LEN(pkt)))
279 #define GET_TCP_TOTAL_LEN(pkt) (GET_IP_TOTAL_LEN(pkt) - GET_IP_HDR_LEN(pkt))
280 #define GET_TCP_OPTS_LEN(pkt) (GET_TCP_HDR_LEN(pkt) - 20)
281
282 #define SET_TCP_SRC_PORT(pkt, port) ((*(unsigned short *)TCP_SRC_PORT(pkt)) = htons(port))
283 #define SET_TCP_DST_PORT(pkt, port) ((*(unsigned short *)TCP_DST_PORT(pkt)) = htons(port))
284 #define SET_TCP_SEQ_NUM(pkt, num) ((*(unsigned long *)TCP_SEQ_NUM(pkt)) = htonl(num))
285 #define SET_TCP_ACK_NUM(pkt, num) ((*(unsigned long *)TCP_ACK_NUM(pkt)) = htonl(num))
286
287 void inline SET_TCP_HDR_LEN(char * pkt, char len) {
288   *(char *)TCP_HDR_LEN(pkt) &= 0x0f;
289   *(char *)TCP_HDR_LEN(pkt) |= ((len << 2) & 0xf0);
290 }
291
292 void inline SET_TCP_RSVD(char * pkt, char rsvd) {
293   *(unsigned short *)TCP_RSVD(pkt) &= htons(0xf03f);
294   *(char *)TCP_RSVD(pkt) |= ((rsvd >> 2) & 0x0f);
295   *(char *)(TCP_RSVD(pkt) + 1) |= ((rsvd << 6) & 0xc0);
296 }
297
298 void inline SET_TCP_FLAGS(char * pkt, char flags) {
299   *(char *)TCP_FLAGS(pkt) &= 0xc0;
300   *(char *)TCP_FLAGS(pkt) |= (flags & 0x3f);
301 }
302 #define SET_TCP_EFLAGS(pkt, eflags) (*(char *)TCP_FLAGS(pkt) = eflags)
303 #define SET_TCP_WIN(pkt, win) (*(unsigned short *)TCP_WIN(pkt) = htons(win))
304 #define SET_TCP_CKSUM(pkt, cksum) (*(unsigned short *)TCP_CKSUM(pkt) = cksum)
305 #define SET_TCP_URG_PTR(pkt, urg) (*(unsigned short *)TCP_URG_PTR(pkt) = htons(urg))
306
307
308 #define TCP_OPTS_MSS 0x0001
309 #define TCP_OPTS_TS 0x0002
310 #define TCP_OPTS_SACK_OK 0x0004
311
312 typedef struct tcp_opts {
313   unsigned short mss ;
314   char window;
315   char sack_ok;
316   unsigned long * sack_entries;
317   unsigned long local_ts;
318   unsigned long remote_ts;
319 } tcp_opts_t;
320
321 #define TCP_FIN 0x01
322 #define TCP_SYN 0x02
323 #define TCP_RST 0x04
324 #define TCP_PSH 0x08
325 #define TCP_ACK 0x10
326 #define TCP_URG 0x20
327 #define TCP_ECN 0x40
328 #define TCP_CWR 0x80
329
330 #define SET_TCP_FIN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_FIN)
331 #define SET_TCP_SYN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_SYN)
332 #define SET_TCP_RST_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_RST)
333 #define SET_TCP_PSH_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_PSH)
334 #define SET_TCP_ACK_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_ACK)
335 #define SET_TCP_URG_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_URG)
336 #define SET_TCP_ECN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_ECN)
337 #define SET_TCP_CWR_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) |= TCP_CWR)
338
339
340
341 #define UNSET_TCP_FIN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_FIN)
342 #define UNSET_TCP_SYN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_SYN)
343 #define UNSET_TCP_RST_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_RST)
344 #define UNSET_TCP_PSH_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_PSH)
345 #define UNSET_TCP_ACK_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_ACK)
346 #define UNSET_TCP_URG_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_URG)
347 #define UNSET_TCP_ECN_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_ECN)
348 #define UNSET_TCP_CWR_FLAG(pkt) (*(char *)TCP_FLAGS(pkt) &= ~TCP_CWR)
349
350 int is_syn_pkt(RawEthernetPacket * pkt);
351 int is_ack_pkt(RawEthernetPacket * pkt);
352 int is_fin_pkt(RawEthernetPacket * pkt);
353
354
355 unsigned long compute_next_tcp_seq_num(RawEthernetPacket * pkt);
356 unsigned short compute_tcp_checksum(RawEthernetPacket * pkt);
357
358 /* UDP MACROS */
359 #define UDP_SRC_PORT_OFFSET 0
360 #define UDP_DST_PORT_OFFSET 2
361 #define UDP_LEN_OFFSET 4
362 #define UDP_CKSUM_OFFSET 6
363 #define UDP_DATA_OFFSET 8
364
365 #define UDP_HDR(pkt) (pkt + ETH_HDR_LEN + GET_IP_HDR_LEN(pkt))
366 #define UDP_SRC_PORT(pkt) (UDP_HDR(pkt) + UDP_SRC_PORT_OFFSET)
367 #define UDP_DST_PORT(pkt) (UDP_HDR(pkt) + UDP_DST_PORT_OFFSET)
368 #define UDP_LEN(pkt) (UDP_HDR(pkt) + UDP_LEN_OFFSET)
369 #define UDP_CKSUM(pkt) (UDP_HDR(pkt) + UDP_CKSUM_OFFSET)
370 #define UDP_DATA(pkt) (UDP_HDR(pkt) + UDP_DATA_OFFSET)
371
372 #define GET_UDP_SRC_PORT(pkt) ntohs(*(unsigned short *)UDP_SRC_PORT(pkt))
373 #define GET_UDP_DST_PORT(pkt) ntohs(*(unsigned short *)UDP_DST_PORT(pkt))
374 #define GET_UDP_LEN(pkt) ntohs(*(unsigned short *)UDP_LEN(pkt))
375 #define GET_UDP_CKSUM(pkt) ntohs(*(unsigned short *)UDP_CKSUM(pkt))
376
377
378 #define SET_UDP_SRC_PORT(pkt, src) (*(unsigned short *)UDP_SRC_PORT(pkt) = htons(src))
379 #define SET_UDP_DST_PORT(pkt, dst) (*(unsigned short *)UDP_DST_PORT(pkt) = htons(dst))
380 #define SET_UDP_LEN(pkt, len) (*(unsigned short *)UDP_LEN(pkt) = htons(len))
381 #define SET_UDP_CKSUM(pkt, cksum) (*(unsigned short *)UDP_CKSUM(pkt) = cksum)
382
383 unsigned short compute_udp_checksum(RawEthernetPacket * pkt);
384
385 /* DNS MACROS */
386
387 #define DNS_PORT 53
388
389
390 void dbg_print_pkt_info(RawEthernetPacket * pkt);
391 void dbg_print_pkt(RawEthernetPacket * pkt);
392 void dbg_print_buf(unsigned char * buf, unsigned int len);
393
394
395
396 /* Packet Field Utility Functions */
397 int is_tcp_pkt(RawEthernetPacket * pkt);
398 int is_arp_pkt(RawEthernetPacket * pkt);
399 int is_udp_pkt(RawEthernetPacket * pkt);
400 int is_ip_pkt(RawEthernetPacket * pkt);
401
402 /* UDP Packet queries */
403 int is_dns_pkt(RawEthernetPacket * pkt);
404
405 /* TCP Packet queries */
406
407 int parse_tcp_options(tcp_opts_t * options, RawEthernetPacket * pkt);
408 int set_tcp_options(tcp_opts_t * options, unsigned long opt_flags, RawEthernetPacket * pkt);
409
410 int compute_pkt_size(RawEthernetPacket * pkt);
411
412 /* ARP Packet queries */
413 int is_arp_bcast_pkt(RawEthernetPacket * pkt);
414
415 /* ARP functions */
416
417
418
419
420
421 void swap_eth_addrs(RawEthernetPacket * pkt);
422 void swap_ip_addrs(RawEthernetPacket * pkt);
423 void swap_ports(RawEthernetPacket * pkt);
424
425 int pkt_has_timestamp(RawEthernetPacket * pkt);
426
427 char * get_eth_protocol(unsigned short protocol);
428 char * get_ip_protocol(unsigned char protocol);
429
430 unsigned long get_tcp_timestamp(char *opts, int len);
431 unsigned short OnesComplementSum(unsigned short *buf, int len);
432 unsigned short get_tcp_checksum(RawEthernetPacket * pkt, unsigned short tcp_len);
433 unsigned short get_ip_checksum(RawEthernetPacket * pkt);
434 unsigned short get_udp_checksum(RawEthernetPacket * pkt, unsigned short udp_len);
435
436 int get_mss(RawEthernetPacket * pkt);
437
438
439 void set_tcp_timestamp(char * ts_opt, unsigned long local_ts, unsigned long remote_ts);
440
441
442
443
444 #endif