9 #include <sys/socket.h>
10 #include <sys/types.h>
15 #include "raw_ethernet_packet.h"
21 typedef struct ip_hdr {
22 unsigned char hdr_len:4, version:4;
24 unsigned short total_len;
26 unsigned char flags:3;
27 unsigned short offset:13;
31 unsigned int src_addr;
32 unsigned int dst_addr;
37 unsigned short int th_sport;
38 unsigned short int th_dport;
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;
49 unsigned short int uh_sport;
50 unsigned short int uh_dport;
51 unsigned short int uh_len;
52 unsigned short int uh_check;
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;
65 #define ETH_HDR_LEN 14
66 #define MAC_BCAST {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
68 #define ETH_ARP 0x0608
69 #define ETH_RARP 0x3508
73 #define ETH_DST_OFFSET 0
74 #define ETH_SRC_OFFSET 6
75 #define ETH_TYPE_OFFSET 12
76 #define ETH_DATA_OFFSET 14
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)
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)
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
99 #define ARP_REQUEST 0x0001
100 #define ARP_REPLY 0x0002
101 #define RARP_REQUEST 0x0003
102 #define RARP_REPLY 0x0004
104 #define ARP_HDR(pkt) (pkt + ETH_HDR_LEN)
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))
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)
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))
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))
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))
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))
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
165 // These can be fleshed out:
166 // http://www.iana.org/assignments/protocol-numbers
172 #define IP_HDR(pkt) (pkt + ETH_HDR_LEN)
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))
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))
205 void inline SET_IP_VERSION(char * pkt, char version) {
206 *(char *)IP_HDR(pkt) &= 0x0f;
207 *(char *)IP_HDR(pkt) |= ((version & 0x0f) << 4);
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);
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))
220 void inline SET_IP_FLAGS(char * pkt, char flags) {
221 *(char *)IP_FLAGS(pkt) &= 0x1f;
222 *(char *)IP_FLAGS(pkt) |= (flags & 0xe0);
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);
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))
236 unsigned short compute_ip_checksum(RawEthernetPacket * pkt);
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
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))
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))
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)
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))
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);
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);
298 void inline SET_TCP_FLAGS(char * pkt, char flags) {
299 *(char *)TCP_FLAGS(pkt) &= 0xc0;
300 *(char *)TCP_FLAGS(pkt) |= (flags & 0x3f);
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))
308 #define TCP_OPTS_MSS 0x0001
309 #define TCP_OPTS_TS 0x0002
310 #define TCP_OPTS_SACK_OK 0x0004
312 typedef struct tcp_opts {
316 unsigned long * sack_entries;
317 unsigned long local_ts;
318 unsigned long remote_ts;
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)
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)
350 int is_syn_pkt(RawEthernetPacket * pkt);
351 int is_ack_pkt(RawEthernetPacket * pkt);
352 int is_fin_pkt(RawEthernetPacket * pkt);
355 unsigned long compute_next_tcp_seq_num(RawEthernetPacket * pkt);
356 unsigned short compute_tcp_checksum(RawEthernetPacket * pkt);
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
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)
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))
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)
383 unsigned short compute_udp_checksum(RawEthernetPacket * pkt);
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);
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);
402 /* UDP Packet queries */
403 int is_dns_pkt(RawEthernetPacket * pkt);
405 /* TCP Packet queries */
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);
410 int compute_pkt_size(RawEthernetPacket * pkt);
412 /* ARP Packet queries */
413 int is_arp_bcast_pkt(RawEthernetPacket * pkt);
421 void swap_eth_addrs(RawEthernetPacket * pkt);
422 void swap_ip_addrs(RawEthernetPacket * pkt);
423 void swap_ports(RawEthernetPacket * pkt);
425 int pkt_has_timestamp(RawEthernetPacket * pkt);
427 char * get_eth_protocol(unsigned short protocol);
428 char * get_ip_protocol(unsigned char protocol);
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);
436 int get_mss(RawEthernetPacket * pkt);
439 void set_tcp_timestamp(char * ts_opt, unsigned long local_ts, unsigned long remote_ts);