summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2018-02-08 22:56:29 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2018-02-08 22:56:29 +0000
commit5a491ed020e39345055071e2e63ddfa0ff86c319 (patch)
treeee91939e4972c734afef649cac04de98f9a78a04
parent7b422dbe35a4c60e3ff3e73d839c172c7a83516f (diff)
have a go at decoding cisco wccp gre packets, and let them fall into IP.
-rw-r--r--usr.sbin/tcpdump/print-gre.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/usr.sbin/tcpdump/print-gre.c b/usr.sbin/tcpdump/print-gre.c
index 4890cf87517..19be61f5b66 100644
--- a/usr.sbin/tcpdump/print-gre.c
+++ b/usr.sbin/tcpdump/print-gre.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: print-gre.c,v 1.15 2018/02/08 09:01:45 dlg Exp $ */
+/* $OpenBSD: print-gre.c,v 1.16 2018/02/08 22:56:28 dlg Exp $ */
/*
* Copyright (c) 2002 Jason L. Wright (jason@thought.net)
@@ -66,6 +66,17 @@
#define NVGRE_FLOWID_MASK 0x000000ffU
#define NVGRE_FLOWID_SHIFT 0
+#define GRE_WCCP 0x883e
+
+struct wccp_redirect {
+ uint8_t flags;
+#define WCCP_D (1 << 7)
+#define WCCP_A (1 << 6)
+ uint8_t ServiceId;
+ uint8_t AltBucket;
+ uint8_t PriBucket;
+};
+
void gre_print_0(const u_char *, u_int);
void gre_print_1(const u_char *, u_int);
void gre_sre_print(u_int16_t, u_int8_t, u_int8_t, const u_char *, u_int);
@@ -207,6 +218,28 @@ gre_print_0(const u_char *p, u_int length)
case 0:
printf("keep-alive");
break;
+ case GRE_WCCP: {
+ struct wccp_redirect *wccp;
+
+ printf("wccp ");
+ if (l < sizeof(*wccp)) {
+ printf("[|wccp]");
+ return;
+ }
+
+ wccp = (struct wccp_redirect *)p;
+
+ printf("D:%c A:%c SId:%u Alt:%u Pri:%u",
+ (wccp->flags & WCCP_D) ? '1' : '0',
+ (wccp->flags & WCCP_A) ? '1' : '0',
+ wccp->ServiceId, wccp->AltBucket, wccp->PriBucket);
+
+ p += sizeof(*wccp);
+ l -= sizeof(*wccp);
+
+ printf(": ");
+ /* FALLTHROUGH */
+ }
case ETHERTYPE_IP:
ip_print(p, length);
break;