summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1999-09-30 07:23:13 +0000
committerbrian <brian@FreeBSD.org>1999-09-30 07:23:13 +0000
commitf3bceef566234685610dbdd666fe891f89f4501d (patch)
tree122b4ca632e7da2408474ec5e53ecb4c582a3f96 /usr.sbin/ppp
parent1fc218b67628314fd94ac6b188a33a35873298be (diff)
downloadFreeBSD-src-f3bceef566234685610dbdd666fe891f89f4501d.zip
FreeBSD-src-f3bceef566234685610dbdd666fe891f89f4501d.tar.gz
Support GRE packets
Submitted by: Harry Starr <starr@gccs.com.au>
Diffstat (limited to 'usr.sbin/ppp')
-rw-r--r--usr.sbin/ppp/filter.c25
-rw-r--r--usr.sbin/ppp/filter.h3
-rw-r--r--usr.sbin/ppp/ip.c22
3 files changed, 49 insertions, 1 deletions
diff --git a/usr.sbin/ppp/filter.c b/usr.sbin/ppp/filter.c
index 1669466..217c177 100644
--- a/usr.sbin/ppp/filter.c
+++ b/usr.sbin/ppp/filter.c
@@ -277,6 +277,24 @@ ParseIgmp(int argc, char const * const *argv, struct filterent *tgt)
return 1;
}
+#ifdef P_GRE
+static int
+ParseGRE(int argc, char const * const *argv, struct filterent *tgt)
+{
+ /*
+ * Filter currently is a catch-all. Requests are either permitted or
+ * dropped.
+ */
+ if (argc != 0) {
+ log_Printf(LogWARN, "ParseGRE: Too many parameters\n");
+ return 0;
+ } else
+ tgt->f_srcop = OP_NONE;
+
+ return 1;
+}
+#endif
+
#ifdef P_OSPF
static int
ParseOspf(int argc, char const * const *argv, struct filterent *tgt)
@@ -458,6 +476,11 @@ Parse(struct ipcp *ipcp, int argc, char const *const *argv,
val = ParseOspf(argc, argv, &filterdata);
break;
#endif
+#ifdef P_GRE
+ case P_GRE:
+ val = ParseGRE(argc, argv, &filterdata);
+ break;
+#endif
}
log_Printf(LogDEBUG, "Parse: Src: %s\n", inet_ntoa(filterdata.f_src.ipaddr));
@@ -596,7 +619,7 @@ filter_Show(struct cmdargs const *arg)
}
static const char *protoname[] = {
- "none", "tcp", "udp", "icmp", "ospf", "igmp"
+ "none", "tcp", "udp", "icmp", "ospf", "igmp", "gre"
};
const char *
diff --git a/usr.sbin/ppp/filter.h b/usr.sbin/ppp/filter.h
index 9eef696..03922cd 100644
--- a/usr.sbin/ppp/filter.h
+++ b/usr.sbin/ppp/filter.h
@@ -29,6 +29,9 @@
#define P_OSPF 4
#endif
#define P_IGMP 5
+#ifdef IPPROTO_GRE
+#define P_GRE 6
+#endif
/* Operations - f_srcop, f_dstop */
#define OP_NONE 0
diff --git a/usr.sbin/ppp/ip.c b/usr.sbin/ppp/ip.c
index f1219d0..2e5f00c 100644
--- a/usr.sbin/ppp/ip.c
+++ b/usr.sbin/ppp/ip.c
@@ -170,6 +170,15 @@ FilterCheck(const struct ip *pip, const struct filter *filter)
estab = syn = finrst = -1;
sport = ntohs(0);
break;
+#ifdef IPPROTO_GRE
+ case IPPROTO_GRE:
+ cproto = P_GRE;
+ if (datalen < 2) /* GRE uses 2-octet+ messages */
+ return (1);
+ estab = syn = finrst = -1;
+ sport = ntohs(0);
+ break;
+#endif
#ifdef IPPROTO_OSPFIGP
case IPPROTO_OSPFIGP:
cproto = P_OSPF;
@@ -360,6 +369,19 @@ PacketCheck(struct bundle *bundle, char *cp, int nb, struct filter *filter)
}
break;
+#ifdef IPPROTO_GRE
+ case IPPROTO_GRE:
+ if (logit && loglen < sizeof logbuf) {
+ snprintf(logbuf + loglen, sizeof logbuf - loglen,
+ "GRE: %s ---> ", inet_ntoa(pip->ip_src));
+ loglen += strlen(logbuf + loglen);
+ snprintf(logbuf + loglen, sizeof logbuf - loglen,
+ "%s", inet_ntoa(pip->ip_dst));
+ loglen += strlen(logbuf + loglen);
+ }
+ break;
+#endif
+
#ifdef IPPROTO_OSPFIGP
case IPPROTO_OSPFIGP:
if (logit && loglen < sizeof logbuf) {
OpenPOWER on IntegriCloud