Upgrade tcpdump to tcpdump-4.99.1

Test: make
Change-Id: I052ed8f5279c806e4d2ff925f581b71db3ac03c0
diff --git a/print-lisp.c b/print-lisp.c
index 47afe50..0012e06 100644
--- a/print-lisp.c
+++ b/print-lisp.c
@@ -95,13 +95,11 @@
  */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
-#include <netdissect-stdinc.h>
-#include <netdissect.h>
-#include <string.h>
-#include <stdlib.h>
+#include "netdissect-stdinc.h"
+#include "netdissect.h"
 
 #include "ip.h"
 #include "ip6.h"
@@ -109,7 +107,6 @@
 #include "extract.h"
 #include "addrtoname.h"
 
-static const char tstr[] = " [|LISP]";
 
 #define IPv4_AFI			1
 #define IPv6_AFI			2
@@ -205,8 +202,7 @@
 	nd_uint8_t eid_prefix_mask_length;
 	nd_uint8_t act_auth_inc_res;
 	nd_uint8_t reserved;
-	nd_uint8_t reserved_version_hi;
-	nd_uint8_t version_low;
+	nd_uint16_t reserved_and_version;
 	nd_uint16_t eid_prefix_afi;
 } lisp_map_register_eid;
 
@@ -223,14 +219,16 @@
 
 #define MAP_REGISTER_LOC_LEN sizeof(lisp_map_register_loc)
 
-static inline uint8_t extract_lisp_type(uint8_t);
-static inline uint8_t is_xtr_data_present(uint8_t , uint8_t);
+static uint8_t extract_lisp_type(uint8_t);
+static uint8_t is_xtr_data_present(uint8_t, uint8_t);
 static void lisp_hdr_flag(netdissect_options *, const lisp_map_register_hdr *);
 static void action_flag(netdissect_options *, uint8_t);
 static void loc_hdr_flag(netdissect_options *, uint16_t);
 
-void lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
+void
+lisp_print(netdissect_options *ndo, const u_char *bp, u_int length)
 {
+	uint8_t type_and_flag;
 	uint8_t type;
 	uint8_t mask_len;
 	uint8_t loc_count;
@@ -249,33 +247,35 @@
 	const lisp_map_register_eid *lisp_eid;
 	const lisp_map_register_loc *lisp_loc;
 
+	ndo->ndo_protocol = "lisp";
 	/* Check if enough bytes for header are available */
-	ND_TCHECK2(*bp, MAP_REGISTER_HDR_LEN);
+	ND_TCHECK_LEN(bp, MAP_REGISTER_HDR_LEN);
 	lisp_hdr = (const lisp_map_register_hdr *) bp;
 	lisp_hdr_flag(ndo, lisp_hdr);
 	/* Supporting only MAP NOTIFY and MAP REGISTER LISP packets */
-	type = extract_lisp_type(lisp_hdr->type_and_flag);
+	type_and_flag = GET_U_1(lisp_hdr->type_and_flag);
+	type = extract_lisp_type(type_and_flag);
 	if ((type != LISP_MAP_REGISTER) && (type != LISP_MAP_NOTIFY))
 		return;
 
 	/* Find if the packet contains xTR and Site-ID data */
-	xtr_present = is_xtr_data_present(type, lisp_hdr->type_and_flag);
+	xtr_present = is_xtr_data_present(type, type_and_flag);
 
 	/* Extract the number of EID records present */
-	auth_data_len = EXTRACT_16BITS(&lisp_hdr->auth_data_len);
+	auth_data_len = GET_BE_U_2(lisp_hdr->auth_data_len);
 	packet_iterator = (const u_char *)(lisp_hdr);
 	packet_offset = MAP_REGISTER_HDR_LEN;
-	record_count = lisp_hdr->record_count;
+	record_count = GET_U_1(lisp_hdr->record_count);
 
 	if (ndo->ndo_vflag) {
-		key_id = EXTRACT_16BITS(&lisp_hdr->key_id);
-		ND_PRINT((ndo, "\n    %u record(s), ", record_count));
-		ND_PRINT((ndo, "Authentication %s,",
-			tok2str(auth_type, "unknown-type", key_id)));
+		key_id = GET_BE_U_2(lisp_hdr->key_id);
+		ND_PRINT("\n    %u record(s), ", record_count);
+		ND_PRINT("Authentication %s,",
+			tok2str(auth_type, "unknown-type", key_id));
 		hex_print(ndo, "\n    Authentication-Data: ", packet_iterator +
 						packet_offset, auth_data_len);
 	} else {
-		ND_PRINT((ndo, " %u record(s),", record_count));
+		ND_PRINT(" %u record(s),", record_count);
 	}
 	packet_offset += auth_data_len;
 
@@ -285,35 +285,35 @@
 	/* Print all the EID records */
 	while ((length > packet_offset) && (record_count--)) {
 
-		ND_TCHECK2(*(packet_iterator + packet_offset), MAP_REGISTER_EID_LEN);
-		ND_PRINT((ndo, "\n"));
+		ND_TCHECK_LEN(packet_iterator + packet_offset,
+			      MAP_REGISTER_EID_LEN);
+		ND_PRINT("\n");
 		lisp_eid = (const lisp_map_register_eid *)
 				((const u_char *)lisp_hdr + packet_offset);
 		packet_offset += MAP_REGISTER_EID_LEN;
-		mask_len = lisp_eid->eid_prefix_mask_length;
-		eid_afi = EXTRACT_16BITS(&lisp_eid->eid_prefix_afi);
-		loc_count = lisp_eid->locator_count;
+		mask_len = GET_U_1(lisp_eid->eid_prefix_mask_length);
+		eid_afi = GET_BE_U_2(lisp_eid->eid_prefix_afi);
+		loc_count = GET_U_1(lisp_eid->locator_count);
 
 		if (ndo->ndo_vflag) {
-			ttl = EXTRACT_32BITS(&lisp_eid->ttl);
-			ND_PRINT((ndo, "      Record TTL %u,", ttl));
-			action_flag(ndo, lisp_eid->act_auth_inc_res);
-			map_version = (((lisp_eid->reserved_version_hi) & 15 ) * 255) +
-					lisp_eid->version_low;
-			ND_PRINT((ndo, " Map Version: %u,", map_version));
+			ttl = GET_BE_U_4(lisp_eid->ttl);
+			ND_PRINT("      Record TTL %u,", ttl);
+			action_flag(ndo, GET_U_1(lisp_eid->act_auth_inc_res));
+			map_version = GET_BE_U_2(lisp_eid->reserved_and_version) & 0x0FFF;
+			ND_PRINT(" Map Version: %u,", map_version);
 		}
 
 		switch (eid_afi) {
 		case IPv4_AFI:
-			ND_TCHECK2(*(packet_iterator + packet_offset), 4);
-			ND_PRINT((ndo, " EID %s/%u,", ipaddr_string(ndo,
-				packet_iterator + packet_offset), mask_len));
+			ND_PRINT(" EID %s/%u,",
+				GET_IPADDR_STRING(packet_iterator + packet_offset),
+				mask_len);
 			packet_offset += 4;
 			break;
 		case IPv6_AFI:
-			ND_TCHECK2(*(packet_iterator + packet_offset), 16);
-			ND_PRINT((ndo, " EID %s/%u,", ip6addr_string(ndo,
-				packet_iterator + packet_offset), mask_len));
+			ND_PRINT(" EID %s/%u,",
+				GET_IP6ADDR_STRING(packet_iterator + packet_offset),
+				mask_len);
 			packet_offset += 16;
 			break;
 		default:
@@ -324,38 +324,42 @@
 			break;
 		}
 
-		ND_PRINT((ndo, " %u locator(s)", loc_count));
+		ND_PRINT(" %u locator(s)", loc_count);
 
 		while (loc_count--) {
-			ND_TCHECK2(*(packet_iterator + packet_offset), MAP_REGISTER_LOC_LEN);
+			ND_TCHECK_LEN(packet_iterator + packet_offset,
+				      MAP_REGISTER_LOC_LEN);
 			lisp_loc = (const lisp_map_register_loc *) (packet_iterator + packet_offset);
 			loc_ip_pointer = (const u_char *) (lisp_loc + 1);
 			packet_offset += MAP_REGISTER_LOC_LEN;
-			loc_afi = EXTRACT_16BITS(&lisp_loc->locator_afi);
+			loc_afi = GET_BE_U_2(lisp_loc->locator_afi);
 
 			if (ndo->ndo_vflag)
-				ND_PRINT((ndo, "\n       "));
+				ND_PRINT("\n       ");
 
 			switch (loc_afi) {
 			case IPv4_AFI:
-				ND_TCHECK2(*(packet_iterator + packet_offset), 4);
-				ND_PRINT((ndo, " LOC %s", ipaddr_string(ndo, loc_ip_pointer)));
+				ND_TCHECK_4(packet_iterator + packet_offset);
+				ND_PRINT(" LOC %s", GET_IPADDR_STRING(loc_ip_pointer));
 				packet_offset += 4;
 				break;
 			case IPv6_AFI:
-				ND_TCHECK2(*(packet_iterator + packet_offset), 16);
-				ND_PRINT((ndo, " LOC %s", ip6addr_string(ndo, loc_ip_pointer)));
+				ND_TCHECK_16(packet_iterator + packet_offset);
+				ND_PRINT(" LOC %s", GET_IP6ADDR_STRING(loc_ip_pointer));
 				packet_offset += 16;
 				break;
 			default:
 				break;
 			}
 			if (ndo->ndo_vflag) {
-				ND_PRINT((ndo, "\n          Priority/Weight %u/%u,"
+				ND_PRINT("\n          Priority/Weight %u/%u,"
 						" Multicast Priority/Weight %u/%u,",
-						lisp_loc->priority, lisp_loc->weight,
-						lisp_loc->m_priority, lisp_loc->m_weight));
-				loc_hdr_flag(ndo, EXTRACT_16BITS(&lisp_loc->unused_and_flag));
+						GET_U_1(lisp_loc->priority),
+						GET_U_1(lisp_loc->weight),
+						GET_U_1(lisp_loc->m_priority),
+						GET_U_1(lisp_loc->m_weight));
+				loc_hdr_flag(ndo,
+					     GET_BE_U_2(lisp_loc->unused_and_flag));
 			}
 		}
 	}
@@ -366,33 +370,34 @@
 	 * show it as hex data.
 	 */
 	if (xtr_present) {
-		if (!ND_TTEST2(*(packet_iterator + packet_offset), 24))
+		if (!ND_TTEST_LEN(packet_iterator + packet_offset, 24))
 			goto invalid;
-		hex_print_with_offset(ndo, "\n    xTR-ID: ", packet_iterator + packet_offset, 16, 0);
-		ND_PRINT((ndo, "\n    SITE-ID: %" PRIu64,
-			EXTRACT_64BITS(packet_iterator + packet_offset + 16)));
+		hex_print(ndo, "\n    xTR-ID: ", packet_iterator + packet_offset, 16);
+		ND_PRINT("\n    SITE-ID: %" PRIu64,
+			GET_BE_U_8(packet_iterator + packet_offset + 16));
 	} else {
 		/* Check if packet isn't over yet */
 		if (packet_iterator + packet_offset < ndo->ndo_snapend) {
-			hex_print_with_offset(ndo, "\n    Data: ", packet_iterator + packet_offset,
-				(ndo->ndo_snapend - (packet_iterator + packet_offset)), 0);
+			hex_print(ndo, "\n    Data: ", packet_iterator + packet_offset,
+				ND_BYTES_AVAILABLE_AFTER(packet_iterator + packet_offset));
 		}
 	}
 	return;
 trunc:
-	ND_PRINT((ndo, "\n   %s", tstr));
+	nd_print_trunc(ndo);
 	return;
 invalid:
-	ND_PRINT((ndo, "\n   %s", istr));
-	return;
+	nd_print_invalid(ndo);
 }
 
-static inline uint8_t extract_lisp_type(uint8_t lisp_hdr_flags)
+static uint8_t
+extract_lisp_type(uint8_t lisp_hdr_flags)
 {
 	return (lisp_hdr_flags) >> TYPE_INDEX;
 }
 
-static inline uint8_t is_xtr_data_present(uint8_t type, uint8_t lisp_hdr_flags)
+static uint8_t
+is_xtr_data_present(uint8_t type, uint8_t lisp_hdr_flags)
 {
 	uint8_t xtr_present = 0;
 
@@ -406,24 +411,22 @@
 
 static void lisp_hdr_flag(netdissect_options *ndo, const lisp_map_register_hdr *lisp_hdr)
 {
-	uint8_t type = extract_lisp_type(lisp_hdr->type_and_flag);
+	uint8_t type = extract_lisp_type(GET_U_1(lisp_hdr->type_and_flag));
 
 	if (!ndo->ndo_vflag) {
-		ND_PRINT((ndo, "%s,", tok2str(lisp_type, "unknown-type-%u", type)));
+		ND_PRINT("%s,", tok2str(lisp_type, "unknown-type-%u", type));
 		return;
 	} else {
-		ND_PRINT((ndo, "%s,", tok2str(lisp_type, "unknown-type-%u", type)));
+		ND_PRINT("%s,", tok2str(lisp_type, "unknown-type-%u", type));
 	}
 
 	if (type == LISP_MAP_REGISTER) {
-		ND_PRINT((ndo, " flags [%s],", bittok2str(map_register_hdr_flag,
-			 "none", EXTRACT_32BITS(lisp_hdr))));
+		ND_PRINT(" flags [%s],", bittok2str(map_register_hdr_flag,
+			 "none", GET_BE_U_4(lisp_hdr)));
 	} else if (type == LISP_MAP_NOTIFY) {
-		ND_PRINT((ndo, " flags [%s],", bittok2str(map_notify_hdr_flag,
-			 "none", EXTRACT_32BITS(lisp_hdr))));
+		ND_PRINT(" flags [%s],", bittok2str(map_notify_hdr_flag,
+			 "none", GET_BE_U_4(lisp_hdr)));
 	}
-
-	return;
 }
 
 static void action_flag(netdissect_options *ndo, uint8_t act_auth_inc_res)
@@ -434,16 +437,16 @@
 	authoritative  = ((act_auth_inc_res >> 4) & 1);
 
 	if (authoritative)
-		ND_PRINT((ndo, " Authoritative,"));
+		ND_PRINT(" Authoritative,");
 	else
-		ND_PRINT((ndo, " Non-Authoritative,"));
+		ND_PRINT(" Non-Authoritative,");
 
 	action = act_auth_inc_res >> 5;
-	ND_PRINT((ndo, " %s,", tok2str(lisp_eid_action, "unknown", action)));
+	ND_PRINT(" %s,", tok2str(lisp_eid_action, "unknown", action));
 }
 
 static void loc_hdr_flag(netdissect_options *ndo, uint16_t flag)
 {
-	ND_PRINT((ndo, " flags [%s],", bittok2str(lisp_loc_flag, "none", flag)));
+	ND_PRINT(" flags [%s],", bittok2str(lisp_loc_flag, "none", flag));
 }