summaryrefslogtreecommitdiffstats
path: root/contrib/libpcap/gencode.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2013-05-30 08:02:00 +0000
committerdelphij <delphij@FreeBSD.org>2013-05-30 08:02:00 +0000
commit8be1d9016e057c1f30a906165802d48b52b73938 (patch)
tree5ab08c0c24a5cec0f64a701f8ba689a47b1d5fec /contrib/libpcap/gencode.c
parent351801626880685262a58abdd5f5db9dca6da379 (diff)
downloadFreeBSD-src-8be1d9016e057c1f30a906165802d48b52b73938.zip
FreeBSD-src-8be1d9016e057c1f30a906165802d48b52b73938.tar.gz
MFV: libpcap 1.4.0.
MFC after: 4 weeks
Diffstat (limited to 'contrib/libpcap/gencode.c')
-rw-r--r--contrib/libpcap/gencode.c106
1 files changed, 28 insertions, 78 deletions
diff --git a/contrib/libpcap/gencode.c b/contrib/libpcap/gencode.c
index fa4bb27..12879f2 100644
--- a/contrib/libpcap/gencode.c
+++ b/contrib/libpcap/gencode.c
@@ -109,6 +109,18 @@ static const char rcsid[] _U_ =
#define ETHERMTU 1500
+#ifndef IPPROTO_HOPOPTS
+#define IPPROTO_HOPOPTS 0
+#endif
+#ifndef IPPROTO_ROUTING
+#define IPPROTO_ROUTING 43
+#endif
+#ifndef IPPROTO_FRAGMENT
+#define IPPROTO_FRAGMENT 44
+#endif
+#ifndef IPPROTO_DSTOPTS
+#define IPPROTO_DSTOPTS 60
+#endif
#ifndef IPPROTO_SCTP
#define IPPROTO_SCTP 132
#endif
@@ -263,20 +275,16 @@ static struct block *gen_gateway(const u_char *, bpf_u_int32 **, int, int);
static struct block *gen_ipfrag(void);
static struct block *gen_portatom(int, bpf_int32);
static struct block *gen_portrangeatom(int, bpf_int32, bpf_int32);
-#ifdef INET6
static struct block *gen_portatom6(int, bpf_int32);
static struct block *gen_portrangeatom6(int, bpf_int32, bpf_int32);
-#endif
struct block *gen_portop(int, int, int);
static struct block *gen_port(int, int, int);
struct block *gen_portrangeop(int, int, int, int);
static struct block *gen_portrange(int, int, int, int);
-#ifdef INET6
struct block *gen_portop6(int, int, int);
static struct block *gen_port6(int, int, int);
struct block *gen_portrangeop6(int, int, int, int);
static struct block *gen_portrange6(int, int, int, int);
-#endif
static int lookup_proto(const char *, int);
static struct block *gen_protochain(int, int, int);
static struct block *gen_proto(int, int, int);
@@ -427,6 +435,15 @@ pcap_compile(pcap_t *p, struct bpf_program *program,
const char * volatile xbuf = buf;
u_int len;
+ /*
+ * If this pcap_t hasn't been activated, it doesn't have a
+ * link-layer type, so we can't use it.
+ */
+ if (!p->activated) {
+ snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+ "not-yet-activated pcap_t passed to pcap_compile");
+ return (-1);
+ }
no_optimize = 0;
n_errors = 0;
root = NULL;
@@ -2834,11 +2851,9 @@ ethertype_to_ppptype(proto)
proto = PPP_IP;
break;
-#ifdef INET6
case ETHERTYPE_IPV6:
proto = PPP_IPV6;
break;
-#endif
case ETHERTYPE_DN:
proto = PPP_DECNET;
@@ -3046,11 +3061,10 @@ gen_linktype(proto)
case ETHERTYPE_IP:
/* Check for a version number of 4. */
return gen_mcmp(OR_LINK, 0, BPF_B, 0x40, 0xF0);
-#ifdef INET6
+
case ETHERTYPE_IPV6:
/* Check for a version number of 6. */
return gen_mcmp(OR_LINK, 0, BPF_B, 0x60, 0xF0);
-#endif
default:
return gen_false(); /* always false */
@@ -3074,10 +3088,8 @@ gen_linktype(proto)
/*
* Raw IPv6, so no type field.
*/
-#ifdef INET6
if (proto == ETHERTYPE_IPV6)
return gen_true(); /* always true */
-#endif
/* Checking for something other than IPv6; always false */
return gen_false();
@@ -3199,11 +3211,9 @@ gen_linktype(proto)
if (proto == ETHERTYPE_IP)
return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
BPF_B, (bpf_int32)AF_INET));
-#ifdef INET6
else if (proto == ETHERTYPE_IPV6)
return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
BPF_B, (bpf_int32)AF_INET6));
-#endif /* INET6 */
else
return gen_false();
/*NOTREACHED*/
@@ -3221,11 +3231,9 @@ gen_linktype(proto)
default:
return gen_false();
-#ifdef INET6
case ETHERTYPE_IPV6:
return (gen_cmp(OR_LINK, off_linktype, BPF_B,
(bpf_int32)ARCTYPE_INET6));
-#endif /* INET6 */
case ETHERTYPE_IP:
b0 = gen_cmp(OR_LINK, off_linktype, BPF_B,
@@ -3277,13 +3285,11 @@ gen_linktype(proto)
*/
return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0xcc);
-#ifdef INET6
case ETHERTYPE_IPV6:
/*
* Check for the special NLPID for IPv6.
*/
return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0x8e);
-#endif
case LLCSAP_ISONS:
/*
@@ -3630,7 +3636,7 @@ gen_hostop6(addr, mask, dir, proto, src_off, dst_off)
gen_and(b0, b1);
return b1;
}
-#endif /*INET6*/
+#endif
static struct block *
gen_ehostop(eaddr, dir)
@@ -4508,13 +4514,11 @@ gen_host(addr, mask, proto, dir, type)
case Q_MOPRC:
bpf_error("MOPRC host filtering not implemented");
-#ifdef INET6
case Q_IPV6:
bpf_error("'ip6' modifier applied to ip host");
case Q_ICMPV6:
bpf_error("'icmp6' modifier applied to %s", typestr);
-#endif /* INET6 */
case Q_AH:
bpf_error("'ah' modifier applied to %s", typestr);
@@ -4671,7 +4675,7 @@ gen_host6(addr, mask, proto, dir, type)
}
/* NOTREACHED */
}
-#endif /*INET6*/
+#endif
#ifndef INET6
static struct block *
@@ -4763,26 +4767,20 @@ gen_proto_abbrev(proto)
case Q_SCTP:
b1 = gen_proto(IPPROTO_SCTP, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_SCTP, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
case Q_TCP:
b1 = gen_proto(IPPROTO_TCP, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_TCP, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
case Q_UDP:
b1 = gen_proto(IPPROTO_UDP, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_UDP, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
case Q_ICMP:
@@ -4810,10 +4808,8 @@ gen_proto_abbrev(proto)
case Q_PIM:
b1 = gen_proto(IPPROTO_PIM, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_PIM, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
#ifndef IPPROTO_VRRP
@@ -4875,7 +4871,6 @@ gen_proto_abbrev(proto)
b1 = gen_linktype(ETHERTYPE_MOPRC);
break;
-#ifdef INET6
case Q_IPV6:
b1 = gen_linktype(ETHERTYPE_IPV6);
break;
@@ -4886,17 +4881,14 @@ gen_proto_abbrev(proto)
case Q_ICMPV6:
b1 = gen_proto(IPPROTO_ICMPV6, Q_IPV6, Q_DEFAULT);
break;
-#endif /* INET6 */
#ifndef IPPROTO_AH
#define IPPROTO_AH 51
#endif
case Q_AH:
b1 = gen_proto(IPPROTO_AH, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_AH, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
#ifndef IPPROTO_ESP
@@ -4904,10 +4896,8 @@ gen_proto_abbrev(proto)
#endif
case Q_ESP:
b1 = gen_proto(IPPROTO_ESP, Q_IP, Q_DEFAULT);
-#ifdef INET6
b0 = gen_proto(IPPROTO_ESP, Q_IPV6, Q_DEFAULT);
gen_or(b0, b1);
-#endif
break;
case Q_ISO:
@@ -5040,7 +5030,6 @@ gen_portatom(off, v)
return gen_cmp(OR_TRAN_IPV4, off, BPF_H, v);
}
-#ifdef INET6
static struct block *
gen_portatom6(off, v)
int off;
@@ -5048,7 +5037,6 @@ gen_portatom6(off, v)
{
return gen_cmp(OR_TRAN_IPV6, off, BPF_H, v);
}
-#endif/*INET6*/
struct block *
gen_portop(port, proto, dir)
@@ -5140,7 +5128,6 @@ gen_port(port, ip_proto, dir)
return b1;
}
-#ifdef INET6
struct block *
gen_portop6(port, proto, dir)
int port, proto, dir;
@@ -5213,7 +5200,6 @@ gen_port6(port, ip_proto, dir)
gen_and(b0, b1);
return b1;
}
-#endif /* INET6 */
/* gen_portrange code */
static struct block *
@@ -5318,7 +5304,6 @@ gen_portrange(port1, port2, ip_proto, dir)
return b1;
}
-#ifdef INET6
static struct block *
gen_portrangeatom6(off, v1, v2)
int off;
@@ -5419,7 +5404,6 @@ gen_portrange6(port1, port2, ip_proto, dir)
gen_and(b0, b1);
return b1;
}
-#endif /* INET6 */
static int
lookup_proto(name, proto)
@@ -5554,7 +5538,7 @@ gen_protochain(v, proto, dir)
s[i]->s.k = off_macpl + off_nl;
i++;
break;
-#ifdef INET6
+
case Q_IPV6:
b0 = gen_linktype(ETHERTYPE_IPV6);
@@ -5567,7 +5551,7 @@ gen_protochain(v, proto, dir)
s[i]->s.k = 40;
i++;
break;
-#endif
+
default:
bpf_error("unsupported proto to gen_protochain");
/*NOTREACHED*/
@@ -5594,7 +5578,6 @@ gen_protochain(v, proto, dir)
fix2 = i;
i++;
-#ifdef INET6
if (proto == Q_IPV6) {
int v6start, v6end, v6advance, j;
@@ -5676,9 +5659,7 @@ gen_protochain(v, proto, dir)
/* fixup */
for (j = v6start; j <= v6end; j++)
s[j]->s.jt = s[v6advance];
- } else
-#endif
- {
+ } else {
/* nop */
s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
s[i]->s.k = 0;
@@ -5822,25 +5803,20 @@ gen_proto(v, proto, dir)
int dir;
{
struct block *b0, *b1;
-#ifdef INET6
#ifndef CHASE_CHAIN
struct block *b2;
#endif
-#endif
if (dir != Q_DEFAULT)
bpf_error("direction applied to 'proto'");
switch (proto) {
case Q_DEFAULT:
-#ifdef INET6
b0 = gen_proto(v, Q_IP, dir);
b1 = gen_proto(v, Q_IPV6, dir);
gen_or(b0, b1);
return b1;
-#else
- /*FALLTHROUGH*/
-#endif
+
case Q_IP:
/*
* For FDDI, RFC 1188 says that SNAP encapsulation is used,
@@ -5991,7 +5967,6 @@ gen_proto(v, proto, dir)
bpf_error("'carp proto' is bogus");
/* NOTREACHED */
-#ifdef INET6
case Q_IPV6:
b0 = gen_linktype(ETHERTYPE_IPV6);
#ifndef CHASE_CHAIN
@@ -6012,7 +5987,6 @@ gen_proto(v, proto, dir)
case Q_ICMPV6:
bpf_error("'icmp6 proto' is bogus");
-#endif /* INET6 */
case Q_AH:
bpf_error("'ah proto' is bogus");
@@ -6269,13 +6243,9 @@ gen_scode(name, q)
bpf_error("illegal port number %d < 0", port);
if (port > 65535)
bpf_error("illegal port number %d > 65535", port);
-#ifndef INET6
- return gen_port(port, real_proto, dir);
-#else
b = gen_port(port, real_proto, dir);
gen_or(gen_port6(port, real_proto, dir), b);
return b;
-#endif /* INET6 */
case Q_PORTRANGE:
if (proto != Q_DEFAULT &&
@@ -6319,13 +6289,9 @@ gen_scode(name, q)
if (port2 > 65535)
bpf_error("illegal port number %d > 65535", port2);
-#ifndef INET6
- return gen_portrange(port1, port2, real_proto, dir);
-#else
b = gen_portrange(port1, port2, real_proto, dir);
gen_or(gen_portrange6(port1, port2, real_proto, dir), b);
return b;
-#endif /* INET6 */
case Q_GATEWAY:
#ifndef INET6
@@ -6473,16 +6439,12 @@ gen_ncode(s, v, q)
if (v > 65535)
bpf_error("illegal port number %u > 65535", v);
-#ifndef INET6
- return gen_port((int)v, proto, dir);
-#else
{
struct block *b;
b = gen_port((int)v, proto, dir);
gen_or(gen_port6((int)v, proto, dir), b);
return b;
}
-#endif /* INET6 */
case Q_PORTRANGE:
if (proto == Q_UDP)
@@ -6499,16 +6461,12 @@ gen_ncode(s, v, q)
if (v > 65535)
bpf_error("illegal port number %u > 65535", v);
-#ifndef INET6
- return gen_portrange((int)v, (int)v, proto, dir);
-#else
{
struct block *b;
b = gen_portrange((int)v, (int)v, proto, dir);
gen_or(gen_portrange6((int)v, (int)v, proto, dir), b);
return b;
}
-#endif /* INET6 */
case Q_GATEWAY:
bpf_error("'gateway' requires a name");
@@ -6798,9 +6756,7 @@ gen_load(proto, inst, size)
case Q_LAT:
case Q_MOPRC:
case Q_MOPDL:
-#ifdef INET6
case Q_IPV6:
-#endif
/*
* The offset is relative to the beginning of
* the network-layer header.
@@ -6909,16 +6865,12 @@ gen_load(proto, inst, size)
gen_and(gen_proto_abbrev(proto), b = gen_ipfrag());
if (inst->b)
gen_and(inst->b, b);
-#ifdef INET6
gen_and(gen_proto_abbrev(Q_IP), b);
-#endif
inst->b = b;
break;
-#ifdef INET6
case Q_ICMPV6:
bpf_error("IPv6 upper-layer protocol is not supported by proto[x]");
/*NOTREACHED*/
-#endif
}
inst->regno = regno;
s = new_stmt(BPF_ST);
@@ -7470,13 +7422,11 @@ gen_multicast(proto)
gen_and(b0, b1);
return b1;
-#ifdef INET6
case Q_IPV6:
b0 = gen_linktype(ETHERTYPE_IPV6);
b1 = gen_cmp(OR_NET, 24, BPF_B, (bpf_int32)255);
gen_and(b0, b1);
return b1;
-#endif /* INET6 */
}
bpf_error("link-layer multicast filters supported only on ethernet/FDDI/token ring/ARCNET/802.11/ATM LANE/Fibre Channel");
/* NOTREACHED */
OpenPOWER on IntegriCloud