Upgrade tcpdump to tcpdump-4.99.1

Test: make
Change-Id: I052ed8f5279c806e4d2ff925f581b71db3ac03c0
diff --git a/print-ah.c b/print-ah.c
index bec6f88..a3d0554 100644
--- a/print-ah.c
+++ b/print-ah.c
@@ -24,41 +24,52 @@
 /* \summary: IPSEC Authentication Header printer */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
-#include <netdissect-stdinc.h>
-
-#include "ah.h"
+#include "netdissect-stdinc.h"
 
 #include "netdissect.h"
 #include "extract.h"
 
-int
-ah_print(netdissect_options *ndo, register const u_char *bp)
-{
-	register const struct ah *ah;
-	int sumlen;
+#include "ah.h"
 
+int
+ah_print(netdissect_options *ndo, const u_char *bp)
+{
+	const struct ah *ah;
+	uint8_t ah_len;
+	u_int ah_hdr_len;
+	uint16_t reserved;
+	const u_char *p;
+
+	ndo->ndo_protocol = "ah";
 	ah = (const struct ah *)bp;
 
-	ND_TCHECK(*ah);
+	nd_print_protocol_caps(ndo);
+/*
+ * RFC4302
+ *
+ * 2.2.  Payload Length
+ *
+ *    This 8-bit field specifies the length of AH in 32-bit words (4-byte
+ *    units), minus "2".
+ */
+	ah_len = GET_U_1(ah->ah_len);
+	ah_hdr_len = (ah_len + 2) * 4;
 
-	sumlen = ah->ah_len << 2;
-
-	ND_PRINT((ndo, "AH(spi=0x%08x", EXTRACT_32BITS(&ah->ah_spi)));
+	ND_PRINT("(");
 	if (ndo->ndo_vflag)
-		ND_PRINT((ndo, ",sumlen=%d", sumlen));
-	ND_TCHECK_32BITS(ah + 1);
-	ND_PRINT((ndo, ",seq=0x%x", EXTRACT_32BITS(ah + 1)));
-	if (!ND_TTEST2(*bp, sizeof(struct ah) + sumlen)) {
-		ND_PRINT((ndo, "[truncated]):"));
-		return -1;
-	}
-	ND_PRINT((ndo, "): "));
+		ND_PRINT("length=%u(%u-bytes),", ah_len, ah_hdr_len);
+	reserved = GET_BE_U_2(ah->ah_reserved);
+	if (reserved)
+		ND_PRINT("reserved=0x%x[MustBeZero],", reserved);
+	ND_PRINT("spi=0x%08x,", GET_BE_U_4(ah->ah_spi));
+	ND_PRINT("seq=0x%x,", GET_BE_U_4(ah->ah_seq));
+	ND_PRINT("icv=0x");
+	for (p = (const u_char *)(ah + 1); p < bp + ah_hdr_len; p++)
+		ND_PRINT("%02x", GET_U_1(p));
+	ND_PRINT("): ");
 
-	return sizeof(struct ah) + sumlen;
- trunc:
-	ND_PRINT((ndo, "[|AH]"));
-	return -1;
+	return ah_hdr_len;
 }