X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/51e180c4fb05a88ad6687a23cc983955cd9ea431..HEAD:/print-ospf6.c diff --git a/print-ospf6.c b/print-ospf6.c index 01a35d56..c6f5f67d 100644 --- a/print-ospf6.c +++ b/print-ospf6.c @@ -23,9 +23,7 @@ /* \summary: IPv6 Open Shortest Path First (OSPFv3) printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -95,7 +93,7 @@ #define RLA_FLAG_E 0x02 #define RLA_FLAG_V 0x04 #define RLA_FLAG_W 0x08 -#define RLA_FLAG_N 0x10 +#define RLA_FLAG_Nt 0x10 /* lsa_prefix options */ #define LSA_PREFIX_OPT_NU 0x01 @@ -103,6 +101,7 @@ #define LSA_PREFIX_OPT_MC 0x04 #define LSA_PREFIX_OPT_P 0x08 #define LSA_PREFIX_OPT_DN 0x10 +#define LSA_PREFIX_OPT_N 0x20 /* sla_tosmetric breakdown */ #define SLA_MASK_TOS 0x7f000000 @@ -302,8 +301,8 @@ static const struct tok ospf6_rla_flag_values[] = { { RLA_FLAG_B, "ABR" }, { RLA_FLAG_E, "External" }, { RLA_FLAG_V, "Virtual-Link Endpoint" }, - { RLA_FLAG_W, "Wildcard Receiver" }, - { RLA_FLAG_N, "NSSA Translator" }, + { RLA_FLAG_W, "Deprecated" }, + { RLA_FLAG_Nt, "NSSA Translator" }, { 0, NULL } }; @@ -362,6 +361,7 @@ static const struct tok ospf6_lsa_prefix_option_values[] = { { LSA_PREFIX_OPT_MC, "Deprecated" }, { LSA_PREFIX_OPT_P, "Propagate" }, { LSA_PREFIX_OPT_DN, "Down" }, + { LSA_PREFIX_OPT_N, "N-bit" }, { 0, NULL } }; @@ -379,22 +379,30 @@ ospf6_print_ls_type(netdissect_options *ndo, ls_type & LS_TYPE_MASK, tok2str(ospf6_ls_scope_values, "Unknown", ls_type & LS_SCOPE_MASK), ls_type &0x8000 ? ", transitive" : "", /* U-bit */ - GET_IPADDR_STRING((const u_char *)ls_stateid)); + GET_IPADDR_STRING(ls_stateid)); } static int ospf6_print_lshdr(netdissect_options *ndo, const struct lsa6_hdr *lshp, const u_char *dataend) { + u_int ls_length; + if ((const u_char *)(lshp + 1) > dataend) goto trunc; - ND_TCHECK_4(lshp->ls_router); - ND_PRINT("\n\t Advertising Router %s, seq 0x%08x, age %us, length %u", - GET_IPADDR_STRING(lshp->ls_router), - GET_BE_U_4(lshp->ls_seq), - GET_BE_U_2(lshp->ls_age), - GET_BE_U_2(lshp->ls_length)-(u_int)sizeof(struct lsa6_hdr)); + ls_length = GET_BE_U_2(lshp->ls_length); + if (ls_length < sizeof(struct lsa_hdr)) { + ND_PRINT("\n\t Bogus length %u < header (%zu)", ls_length, + sizeof(struct lsa_hdr)); + goto trunc; + } + + ND_PRINT("\n\t Advertising Router %s, seq 0x%08x, age %us, length %zu", + GET_IPADDR_STRING(lshp->ls_router), + GET_BE_U_4(lshp->ls_seq), + GET_BE_U_2(lshp->ls_age), + ls_length-sizeof(struct lsa6_hdr)); ospf6_print_ls_type(ndo, GET_BE_U_2(lshp->ls_type), &lshp->ls_stateid); @@ -424,9 +432,8 @@ ospf6_print_lsaprefix(netdissect_options *ndo, if (lsa_length < wordlen * 4) goto trunc; lsa_length -= wordlen * 4; - ND_TCHECK_LEN(lsapp->lsa_p_prefix, wordlen * 4); memset(prefix, 0, sizeof(prefix)); - memcpy(prefix, lsapp->lsa_p_prefix, wordlen * 4); + GET_CPY_BYTES(prefix, lsapp->lsa_p_prefix, wordlen * 4); ND_PRINT("\n\t\t%s/%u", ip6addr_string(ndo, prefix), /* local buffer, not packet data; don't use GET_IP6ADDR_STRING() */ GET_U_1(lsapp->lsa_p_len)); if (GET_U_1(lsapp->lsa_p_opt)) { @@ -552,8 +559,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (*ap)) return (1); lsa_length -= sizeof (*ap); - ND_TCHECK_SIZE(ap); - ND_PRINT("\n\t\t%s", GET_IPADDR_STRING(*ap)); + ND_PRINT("\n\t\t%s", GET_IPADDR_STRING(ap)); ++ap; } break; @@ -617,7 +623,6 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (uint32_t)) return (1); lsa_length -= sizeof (uint32_t); - ND_TCHECK_4(tptr); ND_PRINT(" tag %s", GET_IPADDR_STRING(tptr)); tptr += sizeof(uint32_t); @@ -627,7 +632,6 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (uint32_t)) return (1); lsa_length -= sizeof (uint32_t); - ND_TCHECK_4(tptr); ND_PRINT(" RefLSID: %s", GET_IPADDR_STRING(tptr)); tptr += sizeof(uint32_t); @@ -655,7 +659,7 @@ ospf6_print_lsa(netdissect_options *ndo, prefixes); tptr = (const uint8_t *)llsap->llsa_prefix; - while (prefixes > 0) { + while (prefixes != 0) { bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length); if (bytelen < 0) goto trunc; @@ -687,7 +691,7 @@ ospf6_print_lsa(netdissect_options *ndo, ND_PRINT("\n\t Prefixes %u:", prefixes); tptr = (const uint8_t *)lsap->lsa_un.un_intra_ap.intra_ap_prefix; - while (prefixes > 0) { + while (prefixes != 0) { bytelen = ospf6_print_lsaprefix(ndo, tptr, lsa_length); if (bytelen < 0) goto trunc; @@ -737,7 +741,7 @@ ospf6_decode_v3(netdissect_options *ndo, const struct lsr6 *lsrp; const struct lsa6_hdr *lshp; const struct lsa6 *lsap; - int i; + uint32_t i; switch (GET_U_1(op->ospf6_type)) { @@ -764,8 +768,7 @@ ospf6_decode_v3(netdissect_options *ndo, ND_PRINT("\n\t Neighbor List:"); ap = hellop->hello_neighbor; while ((const u_char *)ap < dataend) { - ND_TCHECK_SIZE(ap); - ND_PRINT("\n\t %s", GET_IPADDR_STRING(*ap)); + ND_PRINT("\n\t %s", GET_IPADDR_STRING(ap)); ++ap; } } @@ -980,7 +983,6 @@ ospf6_print(netdissect_options *ndo, } dataend = bp + datalen; - ND_TCHECK_4(op->ospf6_routerid); ND_PRINT("\n\tRouter-ID %s", GET_IPADDR_STRING(op->ospf6_routerid)); if (GET_BE_U_4(op->ospf6_areaid) != 0)