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