1 /*        $NetBSD: printpacket.c,v 1.2 2012/07/22 14:27:37 darrenr Exp $        */
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  *
8  * Id: printpacket.c,v 1.1.1.2 2012/07/22 13:44:42 darrenr Exp $
9  */
10 
11 #include "ipf.h"
12 
13 #ifndef   IP_OFFMASK
14 # define  IP_OFFMASK          0x3fff
15 #endif
16 
17 
18 void
printpacket(dir,m)19 printpacket(dir, m)
20           int dir;
21           mb_t *m;
22 {
23           u_short len, off;
24           tcphdr_t *tcp;
25           ip_t *ip;
26 
27           ip = MTOD(m, ip_t *);
28 
29           if (IP_V(ip) == 6) {
30 #ifdef USE_INET6
31                     len = ntohs(((ip6_t *)ip)->ip6_plen);
32 #else
33                     len = ntohs(((u_short *)ip)[2]);
34 #endif
35                     len += 40;
36           } else {
37                     len = ntohs(ip->ip_len);
38           }
39           ASSERT(len == msgdsize(m));
40 
41           if ((opts & OPT_HEX) == OPT_HEX) {
42                     u_char *s;
43                     int i;
44 
45                     for (; m != NULL; m = m->mb_next) {
46                               len = m->mb_len;
47                               for (s = (u_char *)m->mb_data, i = 0; i < len; i++) {
48                                         PRINTF("%02x", *s++ & 0xff);
49                                         if (len - i > 1) {
50                                                   i++;
51                                                   PRINTF("%02x", *s++ & 0xff);
52                                         }
53                                         putchar(' ');
54                               }
55                     }
56                     putchar('\n');
57                     putchar('\n');
58                     return;
59           }
60 
61           if (IP_V(ip) == 6) {
62                     printpacket6(dir, m);
63                     return;
64           }
65 
66           if (dir)
67                     PRINTF("> ");
68           else
69                     PRINTF("< ");
70 
71           PRINTF("%s ", IFNAME(m->mb_ifp));
72 
73           off = ntohs(ip->ip_off);
74           tcp = (struct tcphdr *)((char *)ip + (IP_HL(ip) << 2));
75           PRINTF("ip #%d %d(%d) %d", ntohs(ip->ip_id), ntohs(ip->ip_len),
76                  IP_HL(ip) << 2, ip->ip_p);
77           if (off & IP_OFFMASK)
78                     PRINTF(" @%d", off << 3);
79           PRINTF(" %s", inet_ntoa(ip->ip_src));
80           if (!(off & IP_OFFMASK))
81                     if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
82                               PRINTF(",%d", ntohs(tcp->th_sport));
83           PRINTF(" > ");
84           PRINTF("%s", inet_ntoa(ip->ip_dst));
85           if (!(off & IP_OFFMASK)) {
86                     if (ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP)
87                               PRINTF(",%d", ntohs(tcp->th_dport));
88                     if ((ip->ip_p == IPPROTO_TCP) && (tcp->th_flags != 0)) {
89                               putchar(' ');
90                               if (tcp->th_flags & TH_FIN)
91                                         putchar('F');
92                               if (tcp->th_flags & TH_SYN)
93                                         putchar('S');
94                               if (tcp->th_flags & TH_RST)
95                                         putchar('R');
96                               if (tcp->th_flags & TH_PUSH)
97                                         putchar('P');
98                               if (tcp->th_flags & TH_ACK)
99                                         putchar('A');
100                               if (tcp->th_flags & TH_URG)
101                                         putchar('U');
102                               if (tcp->th_flags & TH_ECN)
103                                         putchar('E');
104                               if (tcp->th_flags & TH_CWR)
105                                         putchar('C');
106                     }
107           }
108 
109           putchar('\n');
110 }
111