+ flags = GET_U_1(bp);
+ bp += 1;
+ len -= 1;
+ ver = (flags & VXLAN_GPE_VER) >> VXLAN_GPE_SHIFT;
+ if (ver != VXLAN_GPE_VER_0) {
+ ND_PRINT("unknown version %u", ver);
+ goto invalid;
+ }
+ ND_PRINT("flags [%s], ",
+ bittok2str_nosep(vxlan_gpe_flags, "none", flags));
+
+ /* Reserved */
+ bp += 2;
+ len -= 2;
+
+ /*
+ * If the VXLAN_GPE_P flag bit isn't set, that means this is a VXLAN
+ * packet, not a VXLAN-GPE packet, and thus has no "next protocol"
+ * field; the payload is Ethernet.
+ */
+ if (flags & VXLAN_GPE_P)
+ next_protocol = GET_U_1(bp);
+ else
+ next_protocol = VXLAN_GPE_PROTO_ETHERNET;
+ bp += 1;
+ len -= 1;
+
+ /*
+ * Both RFC 7348 and draft-ietf-nvo3-vxlan-gpe-12 say that the I flag
+ * MUST be set.
+ */
+ if (flags & VXLAN_GPE_I)
+ ND_PRINT("vni %u", GET_BE_U_3(bp));
+ else
+ ND_PRINT("ERROR: I flag not set");