+ case 0x0000:
+ /*
+ * 0x0000 is reserved, but Cisco, at least, appears to
+ * use it for keep-alives; see, for example,
+ * https://www.cisco.com/c/en/us/support/docs/ip/generic-routing-encapsulation-gre/118370-technote-gre-00.html#anc1
+ */
+ ND_PRINT("keep-alive");
+ break;
+ case GRE_WCCP:
+ /*
+ * This is a bit weird.
+ *
+ * This may either just mean "IPv4" or it may mean
+ * "IPv4 preceded by a WCCP redirect header". We
+ * check to see if the first octet looks like the
+ * beginning of an IPv4 header and, if not, dissect
+ * it "IPv4 preceded by a WCCP redirect header",
+ * otherwise we dissect it as just IPv4.
+ *
+ * See "Packet redirection" in draft-forster-wrec-wccp-v1-00,
+ * section 4.12 "Traffic Forwarding" in
+ * draft-wilson-wrec-wccp-v2-01, and section 3.12.1
+ * "Forwarding using GRE Encapsulation" in
+ * draft-param-wccp-v2rev1-01.
+ */
+ ND_PRINT("wccp ");
+
+ ND_ICHECK_U(len, <, 1);
+ if (GET_U_1(bp) >> 4 != 4) {
+ /*
+ * First octet isn't 0x4*, so it's not IPv4.
+ */
+ const struct wccp_redirect *wccp;
+ uint8_t wccp_flags;
+
+ ND_ICHECK_ZU(len, <, sizeof(*wccp));
+ wccp = (const struct wccp_redirect *)bp;
+ wccp_flags = GET_U_1(wccp->flags);
+
+ ND_PRINT("T:%c A:%c U:%c SId:%u Alt:%u Pri:%u",
+ (wccp_flags & WCCP_T) ? '1' : '0',
+ (wccp_flags & WCCP_A) ? '1' : '0',
+ (wccp_flags & WCCP_U) ? '1' : '0',
+ GET_U_1(wccp->ServiceId),
+ GET_U_1(wccp->AltBucket),
+ GET_U_1(wccp->PriBucket));
+
+ bp += sizeof(*wccp);
+ len -= sizeof(*wccp);
+
+ ND_PRINT(": ");
+ }
+ /* FALLTHROUGH */