1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 04:31:29 +00:00

Upgrade our included libpcap to 1.1.1.

This commit is contained in:
david
2010-04-21 04:39:45 +00:00
parent e34bd54d68
commit 4ac98563ab
160 changed files with 11540 additions and 8247 deletions

View File

@@ -21,7 +21,7 @@
*/
#ifndef lint
static const char rcsid[] _U_ =
"@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.290.2.16 2008-09-22 20:16:01 guy Exp $ (LBL)";
"@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.309 2008-12-23 20:13:29 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -31,6 +31,14 @@ static const char rcsid[] _U_ =
#ifdef WIN32
#include <pcap-stdinc.h>
#else /* WIN32 */
#if HAVE_INTTYPES_H
#include <inttypes.h>
#elif HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef HAVE_SYS_BITYPES_H
#include <sys/bitypes.h>
#endif
#include <sys/types.h>
#include <sys/socket.h>
#endif /* WIN32 */
@@ -49,6 +57,7 @@ static const char rcsid[] _U_ =
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#endif /* WIN32 */
@@ -73,6 +82,7 @@ static const char rcsid[] _U_ =
#include "sunatmpos.h"
#include "ppp.h"
#include "pcap/sll.h"
#include "pcap/ipnet.h"
#include "arcnet.h"
#ifdef HAVE_NET_PFVAR_H
#include <sys/socket.h>
@@ -155,6 +165,17 @@ enum e_offrel {
OR_TRAN_IPV6 /* relative to the transport-layer header, with IPv6 network layer */
};
#ifdef INET6
/*
* As errors are handled by a longjmp, anything allocated must be freed
* in the longjmp handler, so it must be reachable from that handler.
* One thing that's allocated is the result of pcap_nametoaddrinfo();
* it must be freed with freeaddrinfo(). This variable points to any
* addrinfo structure that would need to be freed.
*/
static struct addrinfo *ai;
#endif
/*
* We divy out chunks of memory rather than call malloc each time so
* we don't have to worry about leaking memory. It's probably
@@ -200,6 +221,7 @@ static struct block *gen_uncond(int);
static inline struct block *gen_true(void);
static inline struct block *gen_false(void);
static struct block *gen_ether_linktype(int);
static struct block *gen_ipnet_linktype(int);
static struct block *gen_linux_sll_linktype(int);
static struct slist *gen_load_prism_llprefixlen(void);
static struct slist *gen_load_avs_llprefixlen(void);
@@ -365,10 +387,34 @@ syntax()
static bpf_u_int32 netmask;
static int snaplen;
int no_optimize;
#ifdef WIN32
static int
pcap_compile_unsafe(pcap_t *p, struct bpf_program *program,
const char *buf, int optimize, bpf_u_int32 mask);
int
pcap_compile(pcap_t *p, struct bpf_program *program,
const char *buf, int optimize, bpf_u_int32 mask)
{
int result;
EnterCriticalSection(&g_PcapCompileCriticalSection);
result = pcap_compile_unsafe(p, program, buf, optimize, mask);
LeaveCriticalSection(&g_PcapCompileCriticalSection);
return result;
}
static int
pcap_compile_unsafe(pcap_t *p, struct bpf_program *program,
const char *buf, int optimize, bpf_u_int32 mask)
#else /* WIN32 */
int
pcap_compile(pcap_t *p, struct bpf_program *program,
const char *buf, int optimize, bpf_u_int32 mask)
#endif /* WIN32 */
{
extern int n_errors;
const char * volatile xbuf = buf;
@@ -380,6 +426,12 @@ pcap_compile(pcap_t *p, struct bpf_program *program,
bpf_pcap = p;
init_regs();
if (setjmp(top_ctx)) {
#ifdef INET6
if (ai != NULL) {
freeaddrinfo(ai);
ai = NULL;
}
#endif
lex_cleanup();
freechunks();
return (-1);
@@ -1112,6 +1164,8 @@ init_linktype(p)
return;
case DLT_RAW:
case DLT_IPV4:
case DLT_IPV6:
off_linktype = -1;
off_macpl = 0;
off_nl = 0;
@@ -1497,6 +1551,43 @@ init_linktype(p)
off_nl = -1;
off_nl_nosnap = -1;
return;
case DLT_MPLS:
/*
* Currently, only raw "link[N:M]" filtering is supported.
*/
off_linktype = -1;
off_macpl = -1;
off_nl = -1;
off_nl_nosnap = -1;
return;
case DLT_USB_LINUX_MMAPPED:
/*
* Currently, only raw "link[N:M]" filtering is supported.
*/
off_linktype = -1;
off_macpl = -1;
off_nl = -1;
off_nl_nosnap = -1;
return;
case DLT_CAN_SOCKETCAN:
/*
* Currently, only raw "link[N:M]" filtering is supported.
*/
off_linktype = -1;
off_macpl = -1;
off_nl = -1;
off_nl_nosnap = -1;
return;
case DLT_IPNET:
off_linktype = 1;
off_macpl = 24; /* ipnet header length */
off_nl = 0;
off_nl_nosnap = -1;
return;
}
bpf_error("unknown data link type %d", linktype);
/* NOTREACHED */
@@ -1930,6 +2021,33 @@ gen_ether_linktype(proto)
}
}
/*
* "proto" is an Ethernet type value and for IPNET, if it is not IPv4
* or IPv6 then we have an error.
*/
static struct block *
gen_ipnet_linktype(proto)
register int proto;
{
switch (proto) {
case ETHERTYPE_IP:
return gen_cmp(OR_LINK, off_linktype, BPF_B,
(bpf_int32)IPH_AF_INET);
/* NOTREACHED */
case ETHERTYPE_IPV6:
return gen_cmp(OR_LINK, off_linktype, BPF_B,
(bpf_int32)IPH_AF_INET6);
/* NOTREACHED */
default:
break;
}
return gen_false();
}
/*
* Generate code to match a particular packet type.
*
@@ -3071,6 +3189,32 @@ gen_linktype(proto)
/*NOTREACHED*/
break;
case DLT_IPV4:
/*
* Raw IPv4, so no type field.
*/
if (proto == ETHERTYPE_IP)
return gen_true(); /* always true */
/* Checking for something other than IPv4; always false */
return gen_false();
/*NOTREACHED*/
break;
case DLT_IPV6:
/*
* 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();
/*NOTREACHED*/
break;
case DLT_PPP:
case DLT_PPP_PPPD:
case DLT_PPP_SERIAL:
@@ -3327,6 +3471,9 @@ gen_linktype(proto)
*/
return gen_mcmp(OR_LINK, 0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
case DLT_IPNET:
return gen_ipnet_linktype(proto);
case DLT_LINUX_IRDA:
bpf_error("IrDA link-layer type filtering not implemented");
@@ -3350,6 +3497,7 @@ gen_linktype(proto)
case DLT_USB:
case DLT_USB_LINUX:
case DLT_USB_LINUX_MMAPPED:
bpf_error("USB link-layer type filtering not implemented");
case DLT_BLUETOOTH_HCI_H4:
@@ -3357,7 +3505,8 @@ gen_linktype(proto)
bpf_error("Bluetooth link-layer type filtering not implemented");
case DLT_CAN20B:
bpf_error("CAN20B link-layer type filtering not implemented");
case DLT_CAN_SOCKETCAN:
bpf_error("CAN link-layer type filtering not implemented");
case DLT_IEEE802_15_4:
case DLT_IEEE802_15_4_LINUX:
@@ -4514,29 +4663,30 @@ gen_gateway(eaddr, alist, proto, dir)
b0 = gen_wlanhostop(eaddr, Q_OR);
break;
case DLT_SUNATM:
if (is_lane) {
/*
* Check that the packet doesn't begin with an
* LE Control marker. (We've already generated
* a test for LANE.)
*/
b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
BPF_H, 0xFF00);
gen_not(b1);
if (!is_lane)
bpf_error(
"'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
/*
* Check that the packet doesn't begin with an
* LE Control marker. (We've already generated
* a test for LANE.)
*/
b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
BPF_H, 0xFF00);
gen_not(b1);
/*
* Now check the MAC address.
*/
b0 = gen_ehostop(eaddr, Q_OR);
gen_and(b1, b0);
}
/*
* Now check the MAC address.
*/
b0 = gen_ehostop(eaddr, Q_OR);
gen_and(b1, b0);
break;
case DLT_IP_OVER_FC:
b0 = gen_ipfchostop(eaddr, Q_OR);
break;
default:
bpf_error(
"'gateway' supported only on ethernet/FDDI/token ring/802.11/Fibre Channel");
"'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
}
b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR, Q_HOST);
while (*alist) {
@@ -5966,6 +6116,7 @@ gen_scode(name, q)
res0 = res = pcap_nametoaddrinfo(name);
if (res == NULL)
bpf_error("unknown host '%s'", name);
ai = res;
b = tmp = NULL;
tproto = tproto6 = proto;
if (off_linktype == -1 && tproto == Q_DEFAULT) {
@@ -5999,6 +6150,7 @@ gen_scode(name, q)
gen_or(b, tmp);
b = tmp;
}
ai = NULL;
freeaddrinfo(res0);
if (b == NULL) {
bpf_error("unknown host '%s'%s", name,
@@ -6311,6 +6463,7 @@ gen_mcode6(s1, s2, masklen, q)
res = pcap_nametoaddrinfo(s1);
if (!res)
bpf_error("invalid ip6 address %s", s1);
ai = res;
if (res->ai_next)
bpf_error("%s resolved to multiple address", s1);
addr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
@@ -6341,6 +6494,7 @@ gen_mcode6(s1, s2, masklen, q)
case Q_NET:
b = gen_host6(addr, &mask, q.proto, q.dir, q.addr);
ai = NULL;
freeaddrinfo(res);
return b;
@@ -7003,6 +7157,13 @@ gen_broadcast(proto)
break;
case Q_IP:
/*
* We treat a netmask of PCAP_NETMASK_UNKNOWN (0xffffffff)
* as an indication that we don't know the netmask, and fail
* in that case.
*/
if (netmask == PCAP_NETMASK_UNKNOWN)
bpf_error("netmask not known, so 'ip broadcast' not supported");
b0 = gen_linktype(ETHERTYPE_IP);
hostmask = ~netmask;
b1 = gen_mcmp(OR_NET, 16, BPF_W, (bpf_int32)0, hostmask);
@@ -7250,6 +7411,16 @@ gen_inbound(dir)
dir);
break;
case DLT_IPNET:
if (dir) {
/* match outgoing packets */
b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_OUTBOUND);
} else {
/* match incoming packets */
b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_INBOUND);
}
break;
case DLT_LINUX_SLL:
if (dir) {
/*