X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/e69972a8ef1ddbf73924e42f76f53a1f9d0aab0a..HEAD:/print-rt6.c diff --git a/print-rt6.c b/print-rt6.c index 82359a42..edbcd96d 100644 --- a/print-rt6.c +++ b/print-rt6.c @@ -21,51 +21,56 @@ /* \summary: IPv6 routing header printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "addrtoname.h" #include "extract.h" #include "ip6.h" +static const struct tok srh_tlv_type[] = { + { IPV6_SRH_TLV_PAD1, "Pad1"}, + { IPV6_SRH_TLV_PADN, "PadN"}, + { IPV6_SRH_TLV_HMAC, "HMAC"}, + { 0, NULL } +}; + static int srh_tlv_print(netdissect_options *ndo, const u_char *p, u_int bytes_left) { u_int tlv_type, tlv_len; while (bytes_left != 0) { tlv_type = GET_U_1(p); + ND_PRINT(", TLV-type=%s(%u)", + tok2str(srh_tlv_type, "Unknown", tlv_type), + tlv_type); ND_ICHECKMSG_U("remaining length", bytes_left, <, 1); p += 1; bytes_left -= 1; if (bytes_left == 0) break; - if (tlv_type == IPV6_SRH_TLV_PAD1) { - ND_PRINT(", TLV-type=Pad1(%u)", tlv_type); + if (tlv_type == IPV6_SRH_TLV_PAD1) continue; - } tlv_len = GET_U_1(p); + ND_PRINT(", TLV-len=%u", tlv_len); ND_ICHECKMSG_U("remaining length", bytes_left, <, 1); p += 1; bytes_left -= 1; switch (tlv_type) { case IPV6_SRH_TLV_PADN: - ND_PRINT(", TLV-type=PadN(%u)", tlv_type); - ND_PRINT(", TLV-len=%u", tlv_len); ND_ICHECKMSG_U("PadN length", tlv_len, >, 5); /* RFC 8754 */ ND_ICHECKMSG_U("remaining length", bytes_left, <, tlv_len); + ND_TCHECK_LEN(p, tlv_len); p += tlv_len; bytes_left -= tlv_len; break; case IPV6_SRH_TLV_HMAC: - ND_PRINT(", TLV-type=HMAC(%u)", tlv_type); - ND_PRINT(", TLV-len=%u", tlv_len); ND_ICHECKMSG_U("remaining length", bytes_left, <, 6); uint16_t reserved; uint32_t key_id; @@ -74,6 +79,8 @@ srh_tlv_print(netdissect_options *ndo, const u_char *p, u_int bytes_left) p += 2; if (ndo->ndo_vflag) ND_PRINT(", D=%u", reserved >> 15); + if (ndo->ndo_vflag && (reserved & 0x7fff) != 0) + ND_PRINT(", reserved MBZ %u", reserved & 0x7fff); key_id = GET_BE_U_4(p); p += 4; if (ndo->ndo_vflag) @@ -90,9 +97,7 @@ srh_tlv_print(netdissect_options *ndo, const u_char *p, u_int bytes_left) ND_PRINT("%02x", hmac_byte); } break; - default: /* Unknown type */ - ND_PRINT(" Unknown"); - ND_PRINT(", TLV-len=%u", tlv_len); + default: /* Unknown type */ if (ndo->ndo_vflag) ND_PRINT(", TLV-value=0x"); ND_ICHECKMSG_U("remaining length", bytes_left, <, tlv_len); @@ -148,7 +153,7 @@ rt6_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2 _U_) } if (len % 2 == 1) { - ND_PRINT(" (invalid length %u)", len); + ND_PRINT(" [length %u]", len); goto invalid; } len >>= 1; @@ -160,7 +165,6 @@ rt6_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2 _U_) /*(*/ ND_PRINT(") "); return((GET_U_1(dp0->ip6r0_len) + 1) << 3); - break; case IPV6_RTHDR_TYPE_4: srh = (const struct ip6_srh *)dp; last_entry = GET_U_1(srh->srh_last_ent); @@ -190,7 +194,6 @@ rt6_print(netdissect_options *ndo, const u_char *bp, const u_char *bp2 _U_) /*(*/ ND_PRINT(") "); return((GET_U_1(srh->srh_len) + 1) << 3); - break; default: ND_PRINT(" (unknown type)"); goto invalid;