tcpdump mailing list archives
[RFC LIBPCAP PATCH 1/1] Implement DLT_LINUX_SLL2
From: Petr Vorel <pvorel () suse cz>
Date: Thu, 12 Jul 2018 20:02:19 +0200
From: Petr Vorel <petr.vorel () gmail com>
Implements: GH the-tcpdump-group/libpcap#127
Signed-off-by: Petr Vorel <petr.vorel () gmail com>
Signed-off-by: Petr Vorel <pvorel () suse cz>
---
INSTALL.md | 2 +-
cmakeconfig.h.in | 3 +++
config.h.in | 4 ++++
configure | 20 ++++++++++++++++++++
configure.ac | 10 ++++++++++
gencode.c | 3 +++
pcap-common.c | 1 +
pcap-linux.c | 12 ++++++++++++
pcap.c | 4 ++++
pcap/sll.h | 21 +++++++++++++++++++--
10 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/INSTALL.md b/INSTALL.md
index 96c87a2c..47daa52d 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -308,7 +308,7 @@ pcap/bluetooth.h - public definition of DLT_BLUETOOTH_HCI_H4_WITH_PHDR header
pcap/bpf.h - BPF definitions
pcap/namedb.h - public libpcap name database definitions
pcap/pcap.h - public libpcap definitions
-pcap/sll.h - public definition of DLT_LINUX_SLL header
+pcap/sll.h - public definition of DLT_LINUX_SLL and DLT_LINUX_SLL2 headers
pcap/usb.h - public definition of DLT_USB header
pcap-bpf.c - BSD Packet Filter support
pcap-bpf.h - header for backwards compatibility
diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in
index 6760cec7..216ea92d 100644
--- a/cmakeconfig.h.in
+++ b/cmakeconfig.h.in
@@ -360,6 +360,9 @@
/* define on AIX to get certain functions */
#cmakedefine _SUN 1
+/* enable new LINKTYPE_LINUX_SLL2 capture support on Linux instead of legacy LINKTYPE_LINUX_SLL */
+#cmakedefine PCAP_SUPPORT_SLL_V2 1
+
#if 0
/* on sinix */
#cmakedefine sinix 1
diff --git a/config.h.in b/config.h.in
index b1a20a44..19dd284f 100644
--- a/config.h.in
+++ b/config.h.in
@@ -325,6 +325,10 @@
/* target host supports RDMA sniffing */
#undef PCAP_SUPPORT_RDMASNIFF
+/* enable new LINKTYPE_LINUX_SLL2 capture support on Linux instead of legacy
+ LINKTYPE_LINUX_SLL */
+#undef PCAP_SUPPORT_SLL_V2
+
/* target host supports USB sniffing */
#undef PCAP_SUPPORT_USB
diff --git a/configure b/configure
index 95e7f480..1fa60cde 100755
--- a/configure
+++ b/configure
@@ -623,6 +623,7 @@ ac_subst_vars='LTLIBOBJS
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
+PCAP_SUPPORT_SLL_V2
RDMA_SRC
PCAP_SUPPORT_RDMASNIFF
DBUS_SRC
@@ -764,6 +765,7 @@ enable_netmap
enable_bluetooth
enable_dbus
enable_rdma
+enable_sll_v2
'
ac_precious_vars='build_alias
host_alias
@@ -1411,6 +1413,9 @@ Optional Features:
support available]
--enable-rdma enable RDMA capture support [default=yes, if support
available]
+ --enable-sll-v2 enable new LINKTYPE_LINUX_SLL2 capture support on
+ Linux instead of legacy LINKTYPE_LINUX_SLL
+ [default=yes]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -10647,6 +10652,21 @@ fi
+fi
+
+# Check whether --enable-sll-v2 was given.
+if test "${enable_sll_v2+set}" = set; then :
+ enableval=$enable_sll_v2;
+else
+ enable_sll_v2=yes
+fi
+
+
+if test "x$enable_sll_v2" != "xno" ; then
+
+$as_echo "#define PCAP_SUPPORT_SLL_V2 1" >>confdefs.h
+
+
fi
# Find a good install program. We prefer a C program (faster),
diff --git a/configure.ac b/configure.ac
index eff6eb89..4f311a7b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2260,6 +2260,16 @@ if test "x$enable_rdmasniff" != "xno"; then
AC_SUBST(RDMA_SRC)
fi
+AC_ARG_ENABLE([sll-v2],
+[AC_HELP_STRING([--enable-sll-v2],[enable new LINKTYPE_LINUX_SLL2 capture support on Linux instead of legacy
LINKTYPE_LINUX_SLL @<:@default=yes@:>@])],
+ [],
+ [enable_sll_v2=yes])
+
+if test "x$enable_sll_v2" != "xno" ; then
+ AC_DEFINE(PCAP_SUPPORT_SLL_V2, 1, [enable new LINKTYPE_LINUX_SLL2 capture support on Linux instead of legacy
LINKTYPE_LINUX_SLL])
+ AC_SUBST(PCAP_SUPPORT_SLL_V2)
+fi
+
AC_PROG_INSTALL
AC_CONFIG_HEADER(config.h)
diff --git a/gencode.c b/gencode.c
index 959a56e6..cc4a64cf 100644
--- a/gencode.c
+++ b/gencode.c
@@ -1331,6 +1331,7 @@ init_linktype(compiler_state_t *cstate, pcap_t *p)
break;
case DLT_LINUX_SLL: /* fake header for Linux cooked socket */
+ case DLT_LINUX_SLL2:
cstate->off_linktype.constant_part = 14;
cstate->off_linkpl.constant_part = 16;
cstate->off_nl = 0;
@@ -3136,6 +3137,7 @@ gen_linktype(compiler_state_t *cstate, int proto)
break;
case DLT_LINUX_SLL:
+ case DLT_LINUX_SLL2:
return gen_linux_sll_linktype(cstate, proto);
/*NOTREACHED*/
break;
@@ -7725,6 +7727,7 @@ gen_inbound(compiler_state_t *cstate, int dir)
break;
case DLT_LINUX_SLL:
+ case DLT_LINUX_SLL2:
/* match outgoing packets */
b0 = gen_cmp(cstate, OR_LINKHDR, 0, BPF_H, LINUX_SLL_OUTGOING);
if (!dir) {
diff --git a/pcap-common.c b/pcap-common.c
index ca809996..c2149eb4 100644
--- a/pcap-common.c
+++ b/pcap-common.c
@@ -1525,6 +1525,7 @@ swap_pseudo_headers(int linktype, struct pcap_pkthdr *hdr, u_char *data)
switch (linktype) {
case DLT_LINUX_SLL:
+ case DLT_LINUX_SLL2:
swap_linux_sll_header(hdr, data);
break;
diff --git a/pcap-linux.c b/pcap-linux.c
index 49144b64..4123c72b 100644
--- a/pcap-linux.c
+++ b/pcap-linux.c
@@ -1910,6 +1910,9 @@ pcap_read_packet(pcap_t *handle, pcap_handler callback, u_char *userdata)
hdrp = (struct sll_header *)bp;
hdrp->sll_pkttype = map_packet_type_to_sll_type(from.sll_pkttype);
+#ifdef PCAP_SUPPORT_SLL_V2
+ hdrp->sll_ifindex = htons(from.sll_ifindex);
+#endif
hdrp->sll_hatype = htons(from.sll_hatype);
hdrp->sll_halen = htons(from.sll_halen);
memcpy(hdrp->sll_addr, from.sll_addr,
@@ -3689,6 +3692,7 @@ activate_new(pcap_t *handle)
map_arphrd_to_dlt(handle, sock_fd, arptype, device, 1);
if (handle->linktype == -1 ||
handle->linktype == DLT_LINUX_SLL ||
+ handle->linktype == DLT_LINUX_SLL2 ||
handle->linktype == DLT_LINUX_IRDA ||
handle->linktype == DLT_LINUX_LAPD ||
handle->linktype == DLT_NETLINK ||
@@ -3796,7 +3800,11 @@ activate_new(pcap_t *handle)
* It uses cooked mode.
*/
handlep->cooked = 1;
+#ifdef PCAP_SUPPORT_SLL_V2
+ handle->linktype = DLT_LINUX_SLL2;
+#else
handle->linktype = DLT_LINUX_SLL;
+#endif
/*
* We're not bound to a device.
@@ -3892,6 +3900,7 @@ activate_new(pcap_t *handle)
break;
case DLT_LINUX_SLL:
+ case DLT_LINUX_SLL2:
/*
* The type field is in the last 2 bytes of the
* DLT_LINUX_SLL header.
@@ -4964,6 +4973,9 @@ static int pcap_handle_packet_mmap(
hdrp = (struct sll_header *)bp;
hdrp->sll_pkttype = map_packet_type_to_sll_type(
sll->sll_pkttype);
+#ifdef PCAP_SUPPORT_SLL_V2
+ hdrp->sll_ifindex = sll->sll_ifindex;
+#endif
hdrp->sll_hatype = htons(sll->sll_hatype);
hdrp->sll_halen = htons(sll->sll_halen);
memcpy(hdrp->sll_addr, sll->sll_addr, SLL_ADDRLEN);
diff --git a/pcap.c b/pcap.c
index 3337bcb3..ecdd5aab 100644
--- a/pcap.c
+++ b/pcap.c
@@ -2841,7 +2841,11 @@ static struct dlt_choice dlt_choices[] = {
DLT_CHOICE(FRELAY, "Frame Relay"),
DLT_CHOICE(LOOP, "OpenBSD loopback"),
DLT_CHOICE(ENC, "OpenBSD encapsulated IP"),
+#ifdef PCAP_SUPPORT_SLL_V2
+ DLT_CHOICE(LINUX_SLL2, "Linux cooked v2"),
+#else
DLT_CHOICE(LINUX_SLL, "Linux cooked"),
+#endif
DLT_CHOICE(LTALK, "Localtalk"),
DLT_CHOICE(PFLOG, "OpenBSD pflog file"),
DLT_CHOICE(PFSYNC, "Packet filter state syncing"),
diff --git a/pcap/sll.h b/pcap/sll.h
index c4d08862..82f009b2 100644
--- a/pcap/sll.h
+++ b/pcap/sll.h
@@ -75,19 +75,36 @@
#define lib_pcap_sll_h
/*
- * A DLT_LINUX_SLL fake link-layer header.
+ * DLT_LINUX_SLL and DLT_LINUX_SLL2 fake link-layer header.
+ * Uses PCAP_SUPPORT_SLL_V2 from config.h.
*/
-#define SLL_HDR_LEN 16 /* total header length */
+/* total header length */
+#ifdef PCAP_SUPPORT_SLL_V2
+#define SLL_HDR_LEN 24
+#else
+#define SLL_HDR_LEN 16
+#endif
+
#define SLL_ADDRLEN 8 /* length of address field */
#include <pcap/pcap-inttypes.h>
struct sll_header {
+#ifdef PCAP_SUPPORT_SLL_V2
+ uint16_t sll_protocol; /* protocol */
+ uint16_t reserved; /* reserved */
+ int32_t sll_ifindex; /* interface index, DLT_LINUX_SLL2 ONLY! */
+ uint16_t sll_hatype; /* link-layer address type */
+ uint16_t sll_pkttype; /* packet type */
+ uint16_t sll_halen; /* link-layer address length */
+ uint8_t sll_addr[SLL_ADDRLEN]; /* link-layer address */
+#else
uint16_t sll_pkttype; /* packet type */
uint16_t sll_hatype; /* link-layer address type */
uint16_t sll_halen; /* link-layer address length */
uint8_t sll_addr[SLL_ADDRLEN]; /* link-layer address */
uint16_t sll_protocol; /* protocol */
+#endif
};
/*
--
2.18.0
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers () lists tcpdump org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
Current thread:
- [RFC LIBPCAP PATCH 0/1] LINKTYPE_LINUX_SLL2 implementation Petr Vorel (Jul 12)
- [RFC LIBPCAP PATCH 1/1] Implement DLT_LINUX_SLL2 Petr Vorel (Jul 12)
- Re: [RFC LIBPCAP PATCH 0/1] LINKTYPE_LINUX_SLL2 implementation Petr Vorel (Jul 12)
- Re: [RFC LIBPCAP PATCH 0/1] LINKTYPE_LINUX_SLL2 implementation Guy Harris (Jul 12)
- Re: [RFC LIBPCAP PATCH 0/1] LINKTYPE_LINUX_SLL2 implementation Petr Vorel (Jul 12)
- Re: [RFC LIBPCAP PATCH 0/1] LINKTYPE_LINUX_SLL2 implementation Denis Ovsienko (Jul 12)
