xref: /minix3/external/bsd/tcpdump/dist/print-pflog.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
3*b636d99dSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
4*b636d99dSDavid van Moolenbroek  *
5*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that: (1) source code distributions
7*b636d99dSDavid van Moolenbroek  * retain the above copyright notice and this paragraph in its entirety, (2)
8*b636d99dSDavid van Moolenbroek  * distributions including binary code include the above copyright notice and
9*b636d99dSDavid van Moolenbroek  * this paragraph in its entirety in the documentation or other materials
10*b636d99dSDavid van Moolenbroek  * provided with the distribution, and (3) all advertising materials mentioning
11*b636d99dSDavid van Moolenbroek  * features or use of this software display the following acknowledgement:
12*b636d99dSDavid van Moolenbroek  * ``This product includes software developed by the University of California,
13*b636d99dSDavid van Moolenbroek  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*b636d99dSDavid van Moolenbroek  * the University nor the names of its contributors may be used to endorse
15*b636d99dSDavid van Moolenbroek  * or promote products derived from this software without specific prior
16*b636d99dSDavid van Moolenbroek  * written permission.
17*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*b636d99dSDavid van Moolenbroek  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*b636d99dSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*b636d99dSDavid van Moolenbroek  */
21*b636d99dSDavid van Moolenbroek 
22*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
23*b636d99dSDavid van Moolenbroek #ifndef lint
24*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-pflog.c,v 1.6 2015/03/31 21:59:35 christos Exp $");
25*b636d99dSDavid van Moolenbroek #endif
26*b636d99dSDavid van Moolenbroek 
27*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
28*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
29*b636d99dSDavid van Moolenbroek #include "config.h"
30*b636d99dSDavid van Moolenbroek #endif
31*b636d99dSDavid van Moolenbroek 
32*b636d99dSDavid van Moolenbroek #ifndef HAVE_NET_PFVAR_H
33*b636d99dSDavid van Moolenbroek #error "No pf headers available"
34*b636d99dSDavid van Moolenbroek #endif
35*b636d99dSDavid van Moolenbroek #include <sys/types.h>
36*b636d99dSDavid van Moolenbroek #include <sys/socket.h>
37*b636d99dSDavid van Moolenbroek #include <net/if.h>
38*b636d99dSDavid van Moolenbroek #include <net/pfvar.h>
39*b636d99dSDavid van Moolenbroek #include <net/if_pflog.h>
40*b636d99dSDavid van Moolenbroek 
41*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
42*b636d99dSDavid van Moolenbroek 
43*b636d99dSDavid van Moolenbroek #include "interface.h"
44*b636d99dSDavid van Moolenbroek #include "extract.h"
45*b636d99dSDavid van Moolenbroek 
46*b636d99dSDavid van Moolenbroek static const char tstr[] = "[|pflog]";
47*b636d99dSDavid van Moolenbroek 
48*b636d99dSDavid van Moolenbroek static const struct tok pf_reasons[] = {
49*b636d99dSDavid van Moolenbroek 	{ 0,	"0(match)" },
50*b636d99dSDavid van Moolenbroek 	{ 1,	"1(bad-offset)" },
51*b636d99dSDavid van Moolenbroek 	{ 2,	"2(fragment)" },
52*b636d99dSDavid van Moolenbroek 	{ 3,	"3(short)" },
53*b636d99dSDavid van Moolenbroek 	{ 4,	"4(normalize)" },
54*b636d99dSDavid van Moolenbroek 	{ 5,	"5(memory)" },
55*b636d99dSDavid van Moolenbroek 	{ 6,	"6(bad-timestamp)" },
56*b636d99dSDavid van Moolenbroek 	{ 7,	"7(congestion)" },
57*b636d99dSDavid van Moolenbroek 	{ 8,	"8(ip-option)" },
58*b636d99dSDavid van Moolenbroek 	{ 9,	"9(proto-cksum)" },
59*b636d99dSDavid van Moolenbroek 	{ 10,	"10(state-mismatch)" },
60*b636d99dSDavid van Moolenbroek 	{ 11,	"11(state-insert)" },
61*b636d99dSDavid van Moolenbroek 	{ 12,	"12(state-limit)" },
62*b636d99dSDavid van Moolenbroek 	{ 13,	"13(src-limit)" },
63*b636d99dSDavid van Moolenbroek 	{ 14,	"14(synproxy)" },
64*b636d99dSDavid van Moolenbroek 	{ 0,	NULL }
65*b636d99dSDavid van Moolenbroek };
66*b636d99dSDavid van Moolenbroek 
67*b636d99dSDavid van Moolenbroek static const struct tok pf_actions[] = {
68*b636d99dSDavid van Moolenbroek 	{ PF_PASS,		"pass" },
69*b636d99dSDavid van Moolenbroek 	{ PF_DROP,		"block" },
70*b636d99dSDavid van Moolenbroek 	{ PF_SCRUB,		"scrub" },
71*b636d99dSDavid van Moolenbroek 	{ PF_NAT,		"nat" },
72*b636d99dSDavid van Moolenbroek 	{ PF_NONAT,		"nat" },
73*b636d99dSDavid van Moolenbroek 	{ PF_BINAT,		"binat" },
74*b636d99dSDavid van Moolenbroek 	{ PF_NOBINAT,		"binat" },
75*b636d99dSDavid van Moolenbroek 	{ PF_RDR,		"rdr" },
76*b636d99dSDavid van Moolenbroek 	{ PF_NORDR,		"rdr" },
77*b636d99dSDavid van Moolenbroek 	{ PF_SYNPROXY_DROP,	"synproxy-drop" },
78*b636d99dSDavid van Moolenbroek 	{ 0,			NULL }
79*b636d99dSDavid van Moolenbroek };
80*b636d99dSDavid van Moolenbroek 
81*b636d99dSDavid van Moolenbroek static const struct tok pf_directions[] = {
82*b636d99dSDavid van Moolenbroek 	{ PF_INOUT,	"in/out" },
83*b636d99dSDavid van Moolenbroek 	{ PF_IN,	"in" },
84*b636d99dSDavid van Moolenbroek 	{ PF_OUT,	"out" },
85*b636d99dSDavid van Moolenbroek 	{ 0,		NULL }
86*b636d99dSDavid van Moolenbroek };
87*b636d99dSDavid van Moolenbroek 
88*b636d99dSDavid van Moolenbroek /* For reading capture files on other systems */
89*b636d99dSDavid van Moolenbroek #define	OPENBSD_AF_INET		2
90*b636d99dSDavid van Moolenbroek #define	OPENBSD_AF_INET6	24
91*b636d99dSDavid van Moolenbroek 
92*b636d99dSDavid van Moolenbroek static void
pflog_print(netdissect_options * ndo,const struct pfloghdr * hdr)93*b636d99dSDavid van Moolenbroek pflog_print(netdissect_options *ndo, const struct pfloghdr *hdr)
94*b636d99dSDavid van Moolenbroek {
95*b636d99dSDavid van Moolenbroek 	uint32_t rulenr, subrulenr;
96*b636d99dSDavid van Moolenbroek 
97*b636d99dSDavid van Moolenbroek 	rulenr = EXTRACT_32BITS(&hdr->rulenr);
98*b636d99dSDavid van Moolenbroek 	subrulenr = EXTRACT_32BITS(&hdr->subrulenr);
99*b636d99dSDavid van Moolenbroek 	if (subrulenr == (uint32_t)-1)
100*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "rule %u/", rulenr));
101*b636d99dSDavid van Moolenbroek 	else
102*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "rule %u.%s.%u/", rulenr, hdr->ruleset, subrulenr));
103*b636d99dSDavid van Moolenbroek 
104*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "%s: %s %s on %s: ",
105*b636d99dSDavid van Moolenbroek 	    tok2str(pf_reasons, "unkn(%u)", hdr->reason),
106*b636d99dSDavid van Moolenbroek 	    tok2str(pf_actions, "unkn(%u)", hdr->action),
107*b636d99dSDavid van Moolenbroek 	    tok2str(pf_directions, "unkn(%u)", hdr->dir),
108*b636d99dSDavid van Moolenbroek 	    hdr->ifname));
109*b636d99dSDavid van Moolenbroek }
110*b636d99dSDavid van Moolenbroek 
111*b636d99dSDavid van Moolenbroek u_int
pflog_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,register const u_char * p)112*b636d99dSDavid van Moolenbroek pflog_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
113*b636d99dSDavid van Moolenbroek                register const u_char *p)
114*b636d99dSDavid van Moolenbroek {
115*b636d99dSDavid van Moolenbroek 	u_int length = h->len;
116*b636d99dSDavid van Moolenbroek 	u_int hdrlen;
117*b636d99dSDavid van Moolenbroek 	u_int caplen = h->caplen;
118*b636d99dSDavid van Moolenbroek 	const struct pfloghdr *hdr;
119*b636d99dSDavid van Moolenbroek 	uint8_t af;
120*b636d99dSDavid van Moolenbroek 
121*b636d99dSDavid van Moolenbroek 	/* check length */
122*b636d99dSDavid van Moolenbroek 	if (caplen < sizeof(uint8_t)) {
123*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "%s", tstr));
124*b636d99dSDavid van Moolenbroek 		return (caplen);
125*b636d99dSDavid van Moolenbroek 	}
126*b636d99dSDavid van Moolenbroek 
127*b636d99dSDavid van Moolenbroek #define MIN_PFLOG_HDRLEN	45
128*b636d99dSDavid van Moolenbroek 	hdr = (struct pfloghdr *)p;
129*b636d99dSDavid van Moolenbroek 	if (hdr->length < MIN_PFLOG_HDRLEN) {
130*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[pflog: invalid header length!]"));
131*b636d99dSDavid van Moolenbroek 		return (hdr->length);	/* XXX: not really */
132*b636d99dSDavid van Moolenbroek 	}
133*b636d99dSDavid van Moolenbroek 	hdrlen = BPF_WORDALIGN(hdr->length);
134*b636d99dSDavid van Moolenbroek 
135*b636d99dSDavid van Moolenbroek 	if (caplen < hdrlen) {
136*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "%s", tstr));
137*b636d99dSDavid van Moolenbroek 		return (hdrlen);	/* XXX: true? */
138*b636d99dSDavid van Moolenbroek 	}
139*b636d99dSDavid van Moolenbroek 
140*b636d99dSDavid van Moolenbroek 	/* print what we know */
141*b636d99dSDavid van Moolenbroek 	hdr = (struct pfloghdr *)p;
142*b636d99dSDavid van Moolenbroek 	ND_TCHECK(*hdr);
143*b636d99dSDavid van Moolenbroek 	if (ndo->ndo_eflag)
144*b636d99dSDavid van Moolenbroek 		pflog_print(ndo, hdr);
145*b636d99dSDavid van Moolenbroek 
146*b636d99dSDavid van Moolenbroek 	/* skip to the real packet */
147*b636d99dSDavid van Moolenbroek 	af = hdr->af;
148*b636d99dSDavid van Moolenbroek 	length -= hdrlen;
149*b636d99dSDavid van Moolenbroek 	caplen -= hdrlen;
150*b636d99dSDavid van Moolenbroek 	p += hdrlen;
151*b636d99dSDavid van Moolenbroek 	switch (af) {
152*b636d99dSDavid van Moolenbroek 
153*b636d99dSDavid van Moolenbroek 		case AF_INET:
154*b636d99dSDavid van Moolenbroek #if OPENBSD_AF_INET != AF_INET
155*b636d99dSDavid van Moolenbroek 		case OPENBSD_AF_INET:		/* XXX: read pcap files */
156*b636d99dSDavid van Moolenbroek #endif
157*b636d99dSDavid van Moolenbroek 		        ip_print(ndo, p, length);
158*b636d99dSDavid van Moolenbroek 			break;
159*b636d99dSDavid van Moolenbroek 
160*b636d99dSDavid van Moolenbroek #if defined(AF_INET6) || defined(OPENBSD_AF_INET6)
161*b636d99dSDavid van Moolenbroek #ifdef AF_INET6
162*b636d99dSDavid van Moolenbroek 		case AF_INET6:
163*b636d99dSDavid van Moolenbroek #endif /* AF_INET6 */
164*b636d99dSDavid van Moolenbroek #if !defined(AF_INET6) || OPENBSD_AF_INET6 != AF_INET6
165*b636d99dSDavid van Moolenbroek 		case OPENBSD_AF_INET6:		/* XXX: read pcap files */
166*b636d99dSDavid van Moolenbroek #endif /* !defined(AF_INET6) || OPENBSD_AF_INET6 != AF_INET6 */
167*b636d99dSDavid van Moolenbroek 			ip6_print(ndo, p, length);
168*b636d99dSDavid van Moolenbroek 			break;
169*b636d99dSDavid van Moolenbroek #endif /* defined(AF_INET6) || defined(OPENBSD_AF_INET6) */
170*b636d99dSDavid van Moolenbroek 
171*b636d99dSDavid van Moolenbroek 	default:
172*b636d99dSDavid van Moolenbroek 		/* address family not handled, print raw packet */
173*b636d99dSDavid van Moolenbroek 		if (!ndo->ndo_eflag)
174*b636d99dSDavid van Moolenbroek 			pflog_print(ndo, hdr);
175*b636d99dSDavid van Moolenbroek 		if (!ndo->ndo_suppress_default_print)
176*b636d99dSDavid van Moolenbroek 			ND_DEFAULTPRINT(p, caplen);
177*b636d99dSDavid van Moolenbroek 	}
178*b636d99dSDavid van Moolenbroek 
179*b636d99dSDavid van Moolenbroek 	return (hdrlen);
180*b636d99dSDavid van Moolenbroek trunc:
181*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "%s", tstr));
182*b636d99dSDavid van Moolenbroek 	return (hdrlen);
183*b636d99dSDavid van Moolenbroek }
184*b636d99dSDavid van Moolenbroek 
185*b636d99dSDavid van Moolenbroek /*
186*b636d99dSDavid van Moolenbroek  * Local Variables:
187*b636d99dSDavid van Moolenbroek  * c-style: whitesmith
188*b636d99dSDavid van Moolenbroek  * c-basic-offset: 8
189*b636d99dSDavid van Moolenbroek  * End:
190*b636d99dSDavid van Moolenbroek  */
191