X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/513f782ae18791f0c925b9235da749b38159b607..a8abce5c5e2dce2ba6dbccd5d3829da104b80f9c:/print-ospf6.c diff --git a/print-ospf6.c b/print-ospf6.c index 08923015..0511435f 100644 --- a/print-ospf6.c +++ b/print-ospf6.c @@ -24,7 +24,7 @@ /* \summary: IPv6 Open Shortest Path First (OSPFv3) printer */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif #include "netdissect-stdinc.h" @@ -187,14 +187,14 @@ struct lsa6 { #if 0 /* Summary links advertisements */ struct { - struct in_addr sla_mask; + nd_ipv4 sla_mask; nd_uint32_t sla_tosmetric[1]; /* may repeat */ } un_sla; /* Multicast group membership */ struct mcla { nd_uint32_t mcla_vtype; - struct in_addr mcla_vid; + nd_ipv4 mcla_vid; } un_mcla[1]; #endif @@ -208,7 +208,7 @@ struct lsa6 { } llsa_priandopt; #define llsa_priority llsa_priandopt.pri #define llsa_options llsa_priandopt.opt - struct in6_addr llsa_lladdr; + nd_ipv6 llsa_lladdr; nd_uint32_t llsa_nprefix; struct lsa6_prefix llsa_prefix[1]; } un_llsa; @@ -284,7 +284,6 @@ struct lsu6 { struct lsa6 lsu_lsa[1]; /* may repeat */ }; -static const char tstr[] = " [|ospf3]"; static const struct tok ospf6_option_values[] = { { OSPF6_OPTION_V6, "V6" }, @@ -380,7 +379,7 @@ 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 */ - ipaddr_string(ndo, ls_stateid)); + ipaddr_string(ndo, (const u_char *)ls_stateid)); } static int @@ -389,11 +388,11 @@ ospf6_print_lshdr(netdissect_options *ndo, { if ((const u_char *)(lshp + 1) > dataend) goto trunc; - ND_TCHECK(lshp->ls_type); - ND_TCHECK(lshp->ls_seq); + ND_TCHECK_2(lshp->ls_type); + ND_TCHECK_4(lshp->ls_seq); ND_PRINT("\n\t Advertising Router %s, seq 0x%08x, age %us, length %u", - ipaddr_string(ndo, &lshp->ls_router), + ipaddr_string(ndo, lshp->ls_router), EXTRACT_BE_U_4(lshp->ls_seq), EXTRACT_BE_U_2(lshp->ls_age), EXTRACT_BE_U_2(lshp->ls_length)-(u_int)sizeof(struct lsa6_hdr)); @@ -412,14 +411,14 @@ ospf6_print_lsaprefix(netdissect_options *ndo, { const struct lsa6_prefix *lsapp = (const struct lsa6_prefix *)tptr; u_int wordlen; - struct in6_addr prefix; + nd_ipv6 prefix; if (lsa_length < sizeof (*lsapp) - IPV6_ADDR_LEN_BYTES) goto trunc; lsa_length -= sizeof (*lsapp) - IPV6_ADDR_LEN_BYTES; ND_TCHECK_LEN(lsapp, sizeof(*lsapp) - IPV6_ADDR_LEN_BYTES); wordlen = (EXTRACT_U_1(lsapp->lsa_p_len) + 31) / 32; - if (wordlen * 4 > sizeof(struct in6_addr)) { + if (wordlen * 4 > sizeof(nd_ipv6)) { ND_PRINT(" bogus prefixlen /%u", EXTRACT_U_1(lsapp->lsa_p_len)); goto trunc; } @@ -427,10 +426,10 @@ ospf6_print_lsaprefix(netdissect_options *ndo, 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); - ND_PRINT("\n\t\t%s/%u", ip6addr_string(ndo, &prefix), - EXTRACT_U_1(lsapp->lsa_p_len)); + memset(prefix, 0, sizeof(prefix)); + memcpy(prefix, lsapp->lsa_p_prefix, wordlen * 4); + ND_PRINT("\n\t\t%s/%u", ip6addr_string(ndo, prefix), + EXTRACT_U_1(lsapp->lsa_p_len)); if (EXTRACT_U_1(lsapp->lsa_p_opt)) { ND_PRINT(", Options [%s]", bittok2str(ospf6_lsa_prefix_option_values, @@ -473,7 +472,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (ospf6_print_lshdr(ndo, &lsap->ls_hdr, dataend)) return (1); - ND_TCHECK(lsap->ls_hdr.ls_length); + ND_TCHECK_2(lsap->ls_hdr.ls_length); length = EXTRACT_BE_U_2(lsap->ls_hdr.ls_length); /* @@ -492,7 +491,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_rla.rla_options)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_rla.rla_options); - ND_TCHECK(lsap->lsa_un.un_rla.rla_options); + ND_TCHECK_4(lsap->lsa_un.un_rla.rla_options); ND_PRINT("\n\t Options [%s]", bittok2str(ospf6_option_values, "none", EXTRACT_BE_U_4(lsap->lsa_un.un_rla.rla_options))); @@ -511,25 +510,25 @@ ospf6_print_lsa(netdissect_options *ndo, case RLA_TYPE_VIRTUAL: ND_PRINT("\n\t Virtual Link: Neighbor Router-ID %s" "\n\t Neighbor Interface-ID %s, Interface %s", - ipaddr_string(ndo, &rlp->link_nrtid), - ipaddr_string(ndo, &rlp->link_nifid), - ipaddr_string(ndo, &rlp->link_ifid)); + ipaddr_string(ndo, rlp->link_nrtid), + ipaddr_string(ndo, rlp->link_nifid), + ipaddr_string(ndo, rlp->link_ifid)); break; case RLA_TYPE_ROUTER: ND_PRINT("\n\t Neighbor Router-ID %s" "\n\t Neighbor Interface-ID %s, Interface %s", - ipaddr_string(ndo, &rlp->link_nrtid), - ipaddr_string(ndo, &rlp->link_nifid), - ipaddr_string(ndo, &rlp->link_ifid)); + ipaddr_string(ndo, rlp->link_nrtid), + ipaddr_string(ndo, rlp->link_nifid), + ipaddr_string(ndo, rlp->link_ifid)); break; case RLA_TYPE_TRANSIT: ND_PRINT("\n\t Neighbor Network-ID %s" "\n\t Neighbor Interface-ID %s, Interface %s", - ipaddr_string(ndo, &rlp->link_nrtid), - ipaddr_string(ndo, &rlp->link_nifid), - ipaddr_string(ndo, &rlp->link_ifid)); + ipaddr_string(ndo, rlp->link_nrtid), + ipaddr_string(ndo, rlp->link_nifid), + ipaddr_string(ndo, rlp->link_ifid)); break; default: @@ -546,7 +545,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_nla.nla_options)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_nla.nla_options); - ND_TCHECK(lsap->lsa_un.un_nla.nla_options); + ND_TCHECK_4(lsap->lsa_un.un_nla.nla_options); ND_PRINT("\n\t Options [%s]", bittok2str(ospf6_option_values, "none", EXTRACT_BE_U_4(lsap->lsa_un.un_nla.nla_options))); @@ -558,7 +557,7 @@ ospf6_print_lsa(netdissect_options *ndo, return (1); lsa_length -= sizeof (*ap); ND_TCHECK_SIZE(ap); - ND_PRINT("\n\t\t%s", ipaddr_string(ndo, ap)); + ND_PRINT("\n\t\t%s", ipaddr_string(ndo, *ap)); ++ap; } break; @@ -567,7 +566,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_inter_ap.inter_ap_metric); - ND_TCHECK(lsap->lsa_un.un_inter_ap.inter_ap_metric); + ND_TCHECK_4(lsap->lsa_un.un_inter_ap.inter_ap_metric); ND_PRINT(", metric %u", EXTRACT_BE_U_4(lsap->lsa_un.un_inter_ap.inter_ap_metric) & SLA_MASK_METRIC); @@ -585,7 +584,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_asla.asla_metric)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_asla.asla_metric); - ND_TCHECK(lsap->lsa_un.un_asla.asla_metric); + ND_TCHECK_4(lsap->lsa_un.un_asla.asla_metric); flags32 = EXTRACT_BE_U_4(lsap->lsa_un.un_asla.asla_metric); ND_PRINT("\n\t Flags [%s]", bittok2str(ospf6_asla_flag_values, "none", flags32)); @@ -602,25 +601,22 @@ ospf6_print_lsa(netdissect_options *ndo, tptr += bytelen; if ((flags32 & ASLA_FLAG_FWDADDR) != 0) { - const struct in6_addr *fwdaddr6; - - fwdaddr6 = (const struct in6_addr *)tptr; - if (lsa_length < sizeof (*fwdaddr6)) + if (lsa_length < sizeof (nd_ipv6)) return (1); - lsa_length -= sizeof (*fwdaddr6); - ND_TCHECK_SIZE(fwdaddr6); + lsa_length -= sizeof (nd_ipv6); + ND_TCHECK_8(tptr); ND_PRINT(" forward %s", - ip6addr_string(ndo, fwdaddr6)); - tptr += sizeof(*fwdaddr6); + ip6addr_string(ndo, tptr)); + tptr += sizeof(nd_ipv6); } if ((flags32 & ASLA_FLAG_ROUTETAG) != 0) { if (lsa_length < sizeof (uint32_t)) return (1); lsa_length -= sizeof (uint32_t); - ND_TCHECK(*(const uint32_t *)tptr); + ND_TCHECK_4(tptr); ND_PRINT(" tag %s", - ipaddr_string(ndo, (const uint32_t *)tptr)); + ipaddr_string(ndo, tptr)); tptr += sizeof(uint32_t); } @@ -628,9 +624,9 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (uint32_t)) return (1); lsa_length -= sizeof (uint32_t); - ND_TCHECK(*(const uint32_t *)tptr); + ND_TCHECK_4(tptr); ND_PRINT(" RefLSID: %s", - ipaddr_string(ndo, (const uint32_t *)tptr)); + ipaddr_string(ndo, tptr)); tptr += sizeof(uint32_t); } break; @@ -641,7 +637,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (llsap->llsa_priandopt)) return (1); lsa_length -= sizeof (llsap->llsa_priandopt); - ND_TCHECK(llsap->llsa_priandopt); + ND_TCHECK_SIZE(&llsap->llsa_priandopt); ND_PRINT("\n\t Options [%s]", bittok2str(ospf6_option_values, "none", EXTRACT_BE_U_4(llsap->llsa_options))); @@ -649,11 +645,11 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix)) return (1); lsa_length -= sizeof (llsap->llsa_lladdr) + sizeof (llsap->llsa_nprefix); - ND_TCHECK(llsap->llsa_nprefix); + ND_TCHECK_4(llsap->llsa_nprefix); prefixes = EXTRACT_BE_U_4(llsap->llsa_nprefix); ND_PRINT("\n\t Priority %u, Link-local address %s, Prefixes %u:", EXTRACT_U_1(llsap->llsa_priority), - ip6addr_string(ndo, &llsap->llsa_lladdr), + ip6addr_string(ndo, llsap->llsa_lladdr), prefixes); tptr = (const uint8_t *)llsap->llsa_prefix; @@ -672,7 +668,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_rtid); - ND_TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_rtid); + ND_TCHECK_4(lsap->lsa_un.un_intra_ap.intra_ap_rtid); ospf6_print_ls_type(ndo, EXTRACT_BE_U_2(lsap->lsa_un.un_intra_ap.intra_ap_lstype), &lsap->lsa_un.un_intra_ap.intra_ap_lsid); @@ -680,7 +676,7 @@ ospf6_print_lsa(netdissect_options *ndo, if (lsa_length < sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix)) return (1); lsa_length -= sizeof (lsap->lsa_un.un_intra_ap.intra_ap_nprefix); - ND_TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_nprefix); + ND_TCHECK_2(lsap->lsa_un.un_intra_ap.intra_ap_nprefix); prefixes = EXTRACT_BE_U_2(lsap->lsa_un.un_intra_ap.intra_ap_nprefix); ND_PRINT("\n\t Prefixes %u:", prefixes); @@ -696,13 +692,13 @@ ospf6_print_lsa(netdissect_options *ndo, break; case LS_TYPE_GRACE | LS_SCOPE_LINKLOCAL: - if (ospf_print_grace_lsa(ndo, tptr, lsa_length) == -1) { + if (ospf_grace_lsa_print(ndo, tptr, lsa_length) == -1) { return 1; } break; case LS_TYPE_INTRA_ATE | LS_SCOPE_LINKLOCAL: - if (ospf_print_te_lsa(ndo, tptr, lsa_length) == -1) { + if (ospf_te_lsa_print(ndo, tptr, lsa_length) == -1) { return 1; } break; @@ -742,27 +738,27 @@ ospf6_decode_v3(netdissect_options *ndo, bittok2str(ospf6_option_values, "none", EXTRACT_BE_U_4(hellop->hello_options))); - ND_TCHECK(hellop->hello_deadint); + ND_TCHECK_2(hellop->hello_deadint); ND_PRINT("\n\t Hello Timer %us, Dead Timer %us, Interface-ID %s, Priority %u", EXTRACT_BE_U_2(hellop->hello_helloint), EXTRACT_BE_U_2(hellop->hello_deadint), - ipaddr_string(ndo, &hellop->hello_ifid), + ipaddr_string(ndo, hellop->hello_ifid), EXTRACT_U_1(hellop->hello_priority)); - ND_TCHECK(hellop->hello_dr); + ND_TCHECK_4(hellop->hello_dr); if (EXTRACT_BE_U_4(hellop->hello_dr) != 0) ND_PRINT("\n\t Designated Router %s", - ipaddr_string(ndo, &hellop->hello_dr)); - ND_TCHECK(hellop->hello_bdr); + ipaddr_string(ndo, hellop->hello_dr)); + ND_TCHECK_4(hellop->hello_bdr); if (EXTRACT_BE_U_4(hellop->hello_bdr) != 0) ND_PRINT(", Backup Designated Router %s", - ipaddr_string(ndo, &hellop->hello_bdr)); + ipaddr_string(ndo, hellop->hello_bdr)); if (ndo->ndo_vflag > 1) { 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", ipaddr_string(ndo, ap)); + ND_PRINT("\n\t %s", ipaddr_string(ndo, *ap)); ++ap; } } @@ -772,15 +768,15 @@ ospf6_decode_v3(netdissect_options *ndo, case OSPF_TYPE_DD: { const struct dd6 *ddp = (const struct dd6 *)((const uint8_t *)op + OSPF6HDR_LEN); - ND_TCHECK(ddp->db_options); + ND_TCHECK_4(ddp->db_options); ND_PRINT("\n\tOptions [%s]", bittok2str(ospf6_option_values, "none", EXTRACT_BE_U_4(ddp->db_options))); - ND_TCHECK(ddp->db_flags); + ND_TCHECK_1(ddp->db_flags); ND_PRINT(", DD Flags [%s]", bittok2str(ospf6_dd_flag_values,"none",EXTRACT_U_1(ddp->db_flags))); - ND_TCHECK(ddp->db_seq); + ND_TCHECK_4(ddp->db_seq); ND_PRINT(", MTU %u, DD-Sequence 0x%08x", EXTRACT_BE_U_2(ddp->db_mtu), EXTRACT_BE_U_4(ddp->db_seq)); @@ -801,7 +797,7 @@ ospf6_decode_v3(netdissect_options *ndo, while ((const u_char *)lsrp < dataend) { ND_TCHECK_SIZE(lsrp); ND_PRINT("\n\t Advertising Router %s", - ipaddr_string(ndo, &lsrp->ls_router)); + ipaddr_string(ndo, lsrp->ls_router)); ospf6_print_ls_type(ndo, EXTRACT_BE_U_2(lsrp->ls_type), &lsrp->ls_stateid); @@ -814,7 +810,7 @@ ospf6_decode_v3(netdissect_options *ndo, if (ndo->ndo_vflag > 1) { const struct lsu6 *lsup = (const struct lsu6 *)((const uint8_t *)op + OSPF6HDR_LEN); - ND_TCHECK(lsup->lsu_count); + ND_TCHECK_4(lsup->lsu_count); i = EXTRACT_BE_U_4(lsup->lsu_count); lsap = lsup->lsu_lsa; while ((const u_char *)lsap < dataend && i--) { @@ -939,12 +935,12 @@ ospf6_decode_v3_trailer(netdissect_options *ndo, type = EXTRACT_U_1(op->ospf6_type); if (type == OSPF_TYPE_HELLO) { const struct hello6 *hellop = (const struct hello6 *)((const uint8_t *)op + OSPF6HDR_LEN); - ND_TCHECK(hellop->hello_options); + ND_TCHECK_4(hellop->hello_options); if (EXTRACT_BE_U_4(hellop->hello_options) & OSPF6_OPTION_L) lls_hello = 1; } else if (type == OSPF_TYPE_DD) { const struct dd6 *ddp = (const struct dd6 *)((const uint8_t *)op + OSPF6HDR_LEN); - ND_TCHECK(ddp->db_options); + ND_TCHECK_4(ddp->db_options); if (EXTRACT_BE_U_4(ddp->db_options) & OSPF6_OPTION_L) lls_dd = 1; } @@ -965,11 +961,12 @@ ospf6_print(netdissect_options *ndo, const char *cp; uint16_t datalen; + ndo->ndo_protocol = "ospf3"; op = (const struct ospf6hdr *)bp; /* If the type is valid translate it, or just print the type */ /* value. If it's not valid, say so and return */ - ND_TCHECK(op->ospf6_type); + ND_TCHECK_1(op->ospf6_type); cp = tok2str(ospf6_type_values, "unknown packet type (%u)", EXTRACT_U_1(op->ospf6_type)); ND_PRINT("OSPFv%u, %s, length %u", EXTRACT_U_1(op->ospf6_version), cp, length); if (*cp == 'u') { @@ -981,7 +978,7 @@ ospf6_print(netdissect_options *ndo, } /* OSPFv3 data always comes first and optional trailing data may follow. */ - ND_TCHECK(op->ospf6_len); + ND_TCHECK_2(op->ospf6_len); datalen = EXTRACT_BE_U_2(op->ospf6_len); if (datalen > length) { ND_PRINT(" [len %u]", datalen); @@ -989,15 +986,15 @@ ospf6_print(netdissect_options *ndo, } dataend = bp + datalen; - ND_TCHECK(op->ospf6_routerid); - ND_PRINT("\n\tRouter-ID %s", ipaddr_string(ndo, &op->ospf6_routerid)); + ND_TCHECK_4(op->ospf6_routerid); + ND_PRINT("\n\tRouter-ID %s", ipaddr_string(ndo, op->ospf6_routerid)); - ND_TCHECK(op->ospf6_areaid); + ND_TCHECK_4(op->ospf6_areaid); if (EXTRACT_BE_U_4(op->ospf6_areaid) != 0) - ND_PRINT(", Area %s", ipaddr_string(ndo, &op->ospf6_areaid)); + ND_PRINT(", Area %s", ipaddr_string(ndo, op->ospf6_areaid)); else ND_PRINT(", Backbone Area"); - ND_TCHECK(op->ospf6_instanceid); + ND_TCHECK_1(op->ospf6_instanceid); if (EXTRACT_U_1(op->ospf6_instanceid)) ND_PRINT(", Instance %u", EXTRACT_U_1(op->ospf6_instanceid)); @@ -1014,5 +1011,5 @@ ospf6_print(netdissect_options *ndo, return; trunc: - ND_PRINT("%s", tstr); + nd_print_trunc(ndo); }