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