diff options
Diffstat (limited to 'isisd/isis_pfpacket.c')
| -rw-r--r-- | isisd/isis_pfpacket.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/isisd/isis_pfpacket.c b/isisd/isis_pfpacket.c index 2427047b38..6ec7771ec2 100644 --- a/isisd/isis_pfpacket.c +++ b/isisd/isis_pfpacket.c @@ -25,13 +25,14 @@ #include <net/ethernet.h> /* the L2 protocols */ #include <netpacket/packet.h> +#include <linux/filter.h> + #include "log.h" #include "network.h" #include "stream.h" #include "if.h" #include "isisd/dict.h" -#include "isisd/include-netbsd/iso.h" #include "isisd/isis_constants.h" #include "isisd/isis_common.h" #include "isisd/isis_circuit.h" @@ -45,6 +46,25 @@ extern struct zebra_privs_t isisd_privs; +/* tcpdump -i eth0 'isis' -dd */ +static struct sock_filter isisfilter[] = { +/* NB: we're in SOCK_DGRAM, so src/dst mac + length are stripped off! + * (OTOH it's a bit more lower-layer agnostic and might work over GRE?) */ +/* { 0x28, 0, 0, 0x0000000c - 14 }, */ +/* { 0x25, 5, 0, 0x000005dc }, */ + { 0x28, 0, 0, 0x0000000e - 14 }, + { 0x15, 0, 3, 0x0000fefe }, + { 0x30, 0, 0, 0x00000011 - 14 }, + { 0x15, 0, 1, 0x00000083 }, + { 0x6, 0, 0, 0x00040000 }, + { 0x6, 0, 0, 0x00000000 }, +}; + +static struct sock_fprog bpf = { + .len = array_size(isisfilter), + .filter = isisfilter, +}; + /* * Table 9 - Architectural constants for use with ISO 8802 subnetworks * ISO 10589 - 8.4.8 @@ -118,6 +138,12 @@ open_packet_socket (struct isis_circuit *circuit) return ISIS_WARNING; } + if (setsockopt (fd, SOL_SOCKET, SO_ATTACH_FILTER, &bpf, sizeof (bpf))) + { + zlog_warn ("open_packet_socket(): SO_ATTACH_FILTER failed: %s", + safe_strerror (errno)); + } + /* * Bind to the physical interface */ |
