Make the filtering stuff work with recent versions of libpcap.
authorPaul Mackerras <paulus@samba.org>
Thu, 28 Oct 2004 00:15:08 +0000 (00:15 +0000)
committerPaul Mackerras <paulus@samba.org>
Thu, 28 Oct 2004 00:15:08 +0000 (00:15 +0000)
pppd/Makefile.linux
pppd/demand.c
pppd/options.c
pppd/sys-linux.c

index b52a1292e179298c98ea8f8725b237bce0842abe..e1d95b3c4612c767c39035819194f3f7eb80bfeb 100644 (file)
@@ -1,6 +1,6 @@
 #
 # pppd makefile for Linux
-# $Id: Makefile.linux,v 1.60 2003/11/27 21:55:19 paulus Exp $
+# $Id: Makefile.linux,v 1.61 2004/10/28 00:15:08 paulus Exp $
 #
 
 # Default installation locations
@@ -171,7 +171,7 @@ endif
 
 ifdef FILTER
 LIBS    += -lpcap
-CFLAGS  += -DPPP_FILTER -I/usr/include/pcap
+CFLAGS  += -DPPP_FILTER
 endif
 
 ifdef HAVE_INET6
index 395a598a9ea56b8c95d256d47eeacafc6081d920..83b1d3729a2e661da3888918ace5383a11836434 100644 (file)
@@ -33,7 +33,7 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: demand.c,v 1.17 2003/03/03 05:11:45 paulus Exp $"
+#define RCSID  "$Id: demand.c,v 1.18 2004/10/28 00:15:08 paulus Exp $"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -49,9 +49,7 @@
 #include <sys/stat.h>
 #include <sys/socket.h>
 #ifdef PPP_FILTER
-#include <net/if.h>
-#include <net/bpf.h>
-#include <pcap.h>
+#include <pcap-bpf.h>
 #endif
 
 #include "pppd.h"
index 735f08ecb5d83d809e0109f7a86078364d71a7f4..f9f10b74ca4859a1d9181f1629ace04d69691eb1 100644 (file)
@@ -40,7 +40,7 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#define RCSID  "$Id: options.c,v 1.92 2004/01/13 04:02:07 paulus Exp $"
+#define RCSID  "$Id: options.c,v 1.93 2004/10/28 00:15:08 paulus Exp $"
 
 #include <ctype.h>
 #include <stdio.h>
 #ifdef PLUGIN
 #include <dlfcn.h>
 #endif
+
 #ifdef PPP_FILTER
 #include <pcap.h>
-#include <pcap-int.h>  /* XXX: To get struct pcap */
+/*
+ * DLT_PPP_WITH_DIRECTION is in current libpcap cvs, and should be in
+ * libpcap-0.8.4.  Until that is released, use DLT_PPP - but that means
+ * we lose the inbound and outbound qualifiers.
+ */
+#ifndef DLT_PPP_WITH_DIRECTION
+#define DLT_PPP_WITH_DIRECTION DLT_PPP
+#endif
 #endif
 
 #include "pppd.h"
@@ -77,9 +85,6 @@ struct option_value {
 /*
  * Option variables and default values.
  */
-#ifdef PPP_FILTER
-int    dflag = 0;              /* Tell libpcap we want debugging */
-#endif
 int    debug = 0;              /* Debug flag */
 int    kdebugflag = 0;         /* Tell kernel to print debug messages */
 int    default_device = 1;     /* Using /dev/tty or equivalent */
@@ -122,7 +127,6 @@ extern struct stat devstat;
 #ifdef PPP_FILTER
 struct bpf_program pass_filter;/* Filter program for packets to pass */
 struct bpf_program active_filter; /* Filter program for link-active pkts */
-pcap_t  pc;                    /* Fake struct pcap so we can compile expr */
 #endif
 
 char *current_option;          /* the name of the option being parsed */
@@ -286,9 +290,6 @@ option_t general_options[] = {
 #endif
 
 #ifdef PPP_FILTER
-    { "pdebug", o_int, &dflag,
-      "libpcap debugging", OPT_PRIO },
-
     { "pass-filter", 1, setpassfilter,
       "set filter for packets to pass", OPT_PRIO },
 
@@ -1439,13 +1440,18 @@ static int
 setpassfilter(argv)
     char **argv;
 {
-    pc.linktype = DLT_PPP;
-    pc.snapshot = PPP_HDRLEN;
-    if (pcap_compile(&pc, &pass_filter, *argv, 1, netmask) == 0)
-       return 1;
-    option_error("error in pass-filter expression: %s\n", pcap_geterr(&pc));
-    return 0;
+    pcap_t *pc;
+    int ret = 0;
+
+    pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+    if (pcap_compile(pc, &pass_filter, *argv, 1, netmask) == -1) {
+       option_error("error in pass-filter expression: %s\n",
+                    pcap_geterr(pc));
+       ret = 1;
+    }
+    pcap_close(pc);
+
+    return ret;
 }
 
 /*
@@ -1455,13 +1461,18 @@ static int
 setactivefilter(argv)
     char **argv;
 {
-    pc.linktype = DLT_PPP;
-    pc.snapshot = PPP_HDRLEN;
-    if (pcap_compile(&pc, &active_filter, *argv, 1, netmask) == 0)
-       return 1;
-    option_error("error in active-filter expression: %s\n", pcap_geterr(&pc));
-    return 0;
+    pcap_t *pc;
+    int ret = 0;
+
+    pc = pcap_open_dead(DLT_PPP_WITH_DIRECTION, 65535);
+    if (pcap_compile(pc, &active_filter, *argv, 1, netmask) == -1) {
+       option_error("error in active-filter expression: %s\n",
+                    pcap_geterr(pc));
+       ret = 1;
+    }
+    pcap_close(pc);
+
+    return ret;
 }
 #endif
 
index d7135c3da8738d1528e973694b30364af1faa266..5a5268b7d9162fa239fe10d4a7102fc5ce78ed5b 100644 (file)
 #endif /* IPX_CHANGE */
 
 #ifdef PPP_FILTER
-#include <net/bpf.h>
+#include <pcap-bpf.h>
 #include <linux/filter.h>
 #endif /* PPP_FILTER */