Upgrade to tcpdump 4.7.4.

Bug: http://b/24902618
Change-Id: I7c3605015d90453b0a8c339b1774e285796f8775
diff --git a/print-openflow.c b/print-openflow.c
index 5dbefac..8825ae3 100644
--- a/print-openflow.c
+++ b/print-openflow.c
@@ -30,6 +30,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -39,19 +40,44 @@
 #include "interface.h"
 #include "extract.h"
 #include "openflow.h"
+#include "oui.h"
+
+static const char tstr[] = " [|openflow]";
+static const char cstr[] = " (corrupt)";
 
 #define OF_VER_1_0    0x01
 
+const struct tok onf_exp_str[] = {
+	{ ONF_EXP_ONF,               "ONF Extensions"                                  },
+	{ ONF_EXP_BUTE,              "Budapest University of Technology and Economics" },
+	{ ONF_EXP_NOVIFLOW,          "NoviFlow"                                        },
+	{ ONF_EXP_L3,                "L3+ Extensions, Vendor Neutral"                  },
+	{ ONF_EXP_L4L7,              "L4-L7 Extensions"                                },
+	{ ONF_EXP_WMOB,              "Wireless and Mobility Extensions"                },
+	{ ONF_EXP_FABS,              "Forwarding Abstractions Extensions"              },
+	{ ONF_EXP_OTRANS,            "Optical Transport Extensions"                    },
+	{ 0, NULL }
+};
+
+const char *
+of_vendor_name(const uint32_t vendor)
+{
+	const struct tok *table = (vendor & 0xff000000) == 0 ? oui_values : onf_exp_str;
+	return tok2str(table, "unknown", vendor);
+}
+
 static void
-of_header_print(const uint8_t version, const uint8_t type,
-                      const uint16_t length, const uint32_t xid) {
-	printf("\n\tversion unknown (0x%02x), type 0x%02x, length %u, xid 0x%08x",
-	       version, type, length, xid);
+of_header_print(netdissect_options *ndo, const uint8_t version, const uint8_t type,
+                      const uint16_t length, const uint32_t xid)
+{
+	ND_PRINT((ndo, "\n\tversion unknown (0x%02x), type 0x%02x, length %u, xid 0x%08x",
+	       version, type, length, xid));
 }
 
 /* Print a single OpenFlow message. */
 static const u_char *
-of_header_body_print(const u_char *cp, const u_char *ep) {
+of_header_body_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
+{
 	uint8_t version, type;
 	uint16_t length;
 	uint32_t xid;
@@ -59,19 +85,19 @@
 	if (ep < cp + OF_HEADER_LEN)
 		goto corrupt;
 	/* version */
-	TCHECK2(*cp, 1);
+	ND_TCHECK2(*cp, 1);
 	version = *cp;
 	cp += 1;
 	/* type */
-	TCHECK2(*cp, 1);
+	ND_TCHECK2(*cp, 1);
 	type = *cp;
 	cp += 1;
 	/* length */
-	TCHECK2(*cp, 2);
+	ND_TCHECK2(*cp, 2);
 	length = EXTRACT_16BITS(cp);
 	cp += 2;
 	/* xid */
-	TCHECK2(*cp, 4);
+	ND_TCHECK2(*cp, 4);
 	xid = EXTRACT_32BITS(cp);
 	cp += 4;
 	/* Message length includes the header length and a message always includes
@@ -80,36 +106,37 @@
 	 * message as possible even when it does not end within the current TCP
 	 * segment. */
 	if (length < OF_HEADER_LEN) {
-		of_header_print(version, type, length, xid);
+		of_header_print(ndo, version, type, length, xid);
 		goto corrupt;
 	}
 	/* Decode known protocol versions further without printing the header (the
 	 * type decoding is version-specific. */
 	switch (version) {
 	case OF_VER_1_0:
-		return of10_header_body_print(cp, ep, type, length, xid);
+		return of10_header_body_print(ndo, cp, ep, type, length, xid);
 	default:
-		of_header_print(version, type, length, xid);
-		TCHECK2(*cp, length - OF_HEADER_LEN);
+		of_header_print(ndo, version, type, length, xid);
+		ND_TCHECK2(*cp, length - OF_HEADER_LEN);
 		return cp + length - OF_HEADER_LEN; /* done with current message */
 	}
 
 corrupt: /* fail current packet */
-	printf(" (corrupt)");
-	TCHECK2(*cp, ep - cp);
+	ND_PRINT((ndo, "%s", cstr));
+	ND_TCHECK2(*cp, ep - cp);
 	return ep;
 trunc:
-	printf(" [|openflow]");
+	ND_PRINT((ndo, "%s", tstr));
 	return ep;
 }
 
 /* Print a TCP segment worth of OpenFlow messages presuming the segment begins
  * on a message boundary. */
 void
-openflow_print(const u_char *cp, const u_int len) {
+openflow_print(netdissect_options *ndo, const u_char *cp, const u_int len)
+{
 	const u_char *ep = cp + len;
 
-	printf(": OpenFlow");
+	ND_PRINT((ndo, ": OpenFlow"));
 	while (cp < ep)
-		cp = of_header_body_print(cp, ep);
+		cp = of_header_body_print(ndo, cp, ep);
 }