1 /*
2 * Copyright (C) 1993-2001 by Darren Reed.
3 *
4 * See the IPFILTER.LICENCE file for details on licencing.
5 *
6 * $Id: printpacket.c,v 1.12.4.1 2005/02/21 05:09:24 darrenr Exp $
7 */
8
9 #include "ipf.h"
10
11 #ifndef IP_OFFMASK
12 # define IP_OFFMASK 0x3fff
13 #endif
14
15
printpacket(ip)16 void printpacket(ip)
17 struct ip *ip;
18 {
19 struct tcphdr *tcp;
20 u_short len;
21 u_short off;
22
23 if (IP_V(ip) == 6) {
24 off = 0;
25 len = ntohs(((u_short *)ip)[2]) + 40;
26 } else {
27 off = ntohs(ip->ip_off);
28 len = ntohs(ip->ip_len);
29 }
30
31 if ((opts & OPT_HEX) == OPT_HEX) {
32 u_char *s;
33 int i;
34
35 for (s = (u_char *)ip, i = 0; i < len; i++) {
36 printf("%02x", *s++ & 0xff);
37 if (len - i > 1) {
38 i++;
39 printf("%02x", *s++ & 0xff);
40 }
41 putchar(' ');
42 }
43 putchar('\n');
44 return;
45 }
46
47 if (IP_V(ip) == 6) {
48 printpacket6(ip);
49 return;
50 }
51
52 tcp = (struct tcphdr *)((char *)ip + (IP_HL(ip) << 2));
53 printf("ip %d(%d) %d", ntohs(ip->ip_len), IP_HL(ip) << 2, ip->ip_p);
54 if (off & IP_OFFMASK)
55 printf(" @%d", off << 3);
56 printf(" %s", inet_ntoa(ip->ip_src));
57 if (!(off & IP_OFFMASK))
58 if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
59 printf(",%d", ntohs(tcp->th_sport));
60 printf(" > ");
61 printf("%s", inet_ntoa(ip->ip_dst));
62 if (!(off & IP_OFFMASK)) {
63 if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
64 printf(",%d", ntohs(tcp->th_dport));
65 if ((ip->ip_p == IPPROTO_TCP) && (tcp->th_flags != 0)) {
66 putchar(' ');
67 if (tcp->th_flags & TH_FIN)
68 putchar('F');
69 if (tcp->th_flags & TH_SYN)
70 putchar('S');
71 if (tcp->th_flags & TH_RST)
72 putchar('R');
73 if (tcp->th_flags & TH_PUSH)
74 putchar('P');
75 if (tcp->th_flags & TH_ACK)
76 putchar('A');
77 if (tcp->th_flags & TH_URG)
78 putchar('U');
79 if (tcp->th_flags & TH_ECN)
80 putchar('E');
81 if (tcp->th_flags & TH_CWR)
82 putchar('C');
83 }
84 }
85
86 putchar('\n');
87 }
88