]> The Tcpdump Group git mirrors - libpcap/blobdiff - gencode.c
Fix a typo; this fixes bug 1854436.
[libpcap] / gencode.c
index 51385af2b5bfd059c34ab4db4d040c2f367b1de5..177ff925c36071a199735acab0cd9d08db796d49 100644 (file)
--- a/gencode.c
+++ b/gencode.c
@@ -21,7 +21,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.51 2007-06-14 20:54:12 gianluca Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.54 2007-10-26 00:47:36 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -73,7 +73,12 @@ static const char rcsid[] _U_ =
 #include "ppp.h"
 #include "sll.h"
 #include "arcnet.h"
-#include "pf.h"
+#ifdef HAVE_NET_PFVAR_H
+#include <sys/socket.h>
+#include <net/if.h>
+#include <net/pfvar.h>
+#include <net/if_pflog.h>
+#endif
 #ifndef offsetof
 #define offsetof(s, e) ((size_t)&((s *)0)->e)
 #endif
@@ -129,6 +134,7 @@ bpf_error(const char *fmt, ...)
 
 static void init_linktype(pcap_t *);
 
+static void init_regs(void);
 static int alloc_reg(void);
 static void free_reg(int);
 
@@ -243,7 +249,7 @@ static struct slist *xfer_to_a(struct arth *);
 static struct block *gen_mac_multicast(int);
 static struct block *gen_len(int, int);
 
-static struct block *gen_ppi_dlt_check();
+static struct block *gen_ppi_dlt_check(void);
 static struct block *gen_msg_abbrev(int type);
 
 static void *
@@ -364,6 +370,7 @@ pcap_compile(pcap_t *p, struct bpf_program *program,
        n_errors = 0;
        root = NULL;
        bpf_pcap = p;
+       init_regs();
        if (setjmp(top_ctx)) {
                lex_cleanup();
                freechunks();
@@ -1175,12 +1182,13 @@ init_linktype(p)
                off_nl_nosnap = 44;     /* XXX - what does it do with 802.3 packets? */
                return;
 
+#ifdef HAVE_NET_PFVAR_H
        case DLT_PFLOG:
                off_linktype = 0;
-               /* XXX read this from pf.h? */
                off_nl = PFLOG_HDRLEN;
                off_nl_nosnap = PFLOG_HDRLEN;   /* no 802.2 LLC */
                return;
+#endif
 
         case DLT_JUNIPER_MFR:
         case DLT_JUNIPER_MLFR:
@@ -1261,6 +1269,17 @@ init_linktype(p)
                off_nl_nosnap = -1;
                return;
 
+       case DLT_MTP2_WITH_PHDR:
+               off_li = 6;
+               off_sio = 7;
+               off_opc = 8;
+               off_dpc = 8;
+               off_sls = 11;
+               off_linktype = -1;
+               off_nl = -1;
+               off_nl_nosnap = -1;
+               return;
+
 #ifdef DLT_PFSYNC
        case DLT_PFSYNC:
                off_linktype = -1;
@@ -1981,7 +2000,7 @@ insert_ppi_load_llprefixlen(b)
 }
        
 static struct block *
-gen_ppi_dlt_check()
+gen_ppi_dlt_check(void)
 {
        struct slist *s_load_dlt;
        struct block *b;
@@ -2415,6 +2434,7 @@ gen_linktype(proto)
                }
                return (gen_cmp(OR_LINK, 0, BPF_W, (bpf_int32)proto));
 
+#ifdef HAVE_NET_PFVAR_H
        case DLT_PFLOG:
                /*
                 * af field is host byte order in contrast to the rest of
@@ -2432,6 +2452,7 @@ gen_linktype(proto)
                        return gen_false();
                /*NOTREACHED*/
                break;
+#endif /* HAVE_NET_PFVAR_H */
 
        case DLT_ARCNET:
        case DLT_ARCNET_LINUX:
@@ -5921,6 +5942,16 @@ gen_arth(code, a0, a1)
 static int regused[BPF_MEMWORDS];
 static int curreg;
 
+/*
+ * Initialize the table of used registers and the current register.
+ */
+static void
+init_regs()
+{
+       curreg = 0;
+       memset(regused, 0, sizeof regused);
+}
+
 /*
  * Return the next free register.
  */
@@ -6363,10 +6394,12 @@ gen_inbound(dir)
                }
                break;
 
+#ifdef HAVE_NET_PFVAR_H
        case DLT_PFLOG:
                b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, dir), BPF_B,
                    (bpf_int32)((dir == 0) ? PF_IN : PF_OUT));
                break;
+#endif
 
        case DLT_PPP_PPPD:
                if (dir) {
@@ -6414,6 +6447,7 @@ gen_inbound(dir)
        return (b0);
 }
 
+#ifdef HAVE_NET_PFVAR_H
 /* PF firewall log matched interface */
 struct block *
 gen_pf_ifname(const char *ifname)
@@ -6523,6 +6557,55 @@ gen_pf_action(int action)
 
        return (b0);
 }
+#else /* !HAVE_NET_PFVAR_H */
+struct block *
+gen_pf_ifname(const char *ifname)
+{
+       bpf_error("libpcap was compiled without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+
+struct block *
+gen_pf_ruleset(char *ruleset)
+{
+       bpf_error("libpcap was compiled on a machine without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+
+struct block *
+gen_pf_rnr(int rnr)
+{
+       bpf_error("libpcap was compiled on a machine without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+
+struct block *
+gen_pf_srnr(int srnr)
+{
+       bpf_error("libpcap was compiled on a machine without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+
+struct block *
+gen_pf_reason(int reason)
+{
+       bpf_error("libpcap was compiled on a machine without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+
+struct block *
+gen_pf_action(int action)
+{
+       bpf_error("libpcap was compiled on a machine without pf support");
+       /* NOTREACHED */
+       return (NULL);
+}
+#endif /* HAVE_NET_PFVAR_H */
 
 struct block *
 gen_acode(eaddr, q)
@@ -6959,14 +7042,16 @@ gen_mtp2type_abbrev(type)
        switch (type) {
 
        case M_FISU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'fisu' supported only on MTP2");
                /* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JEQ, 0, 0);
                break;
 
        case M_LSSU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'lssu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
                b1 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 0);
@@ -6974,7 +7059,8 @@ gen_mtp2type_abbrev(type)
                break;
 
        case M_MSU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'msu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
                break;