X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c202a9fa8922a7b5f7677232d6a232150e6686d0..6e12d87355718f309ce9f33183ff8235b9c5eb0d:/print-ospf.c diff --git a/print-ospf.c b/print-ospf.c index ef0e133a..23fb1ce0 100644 --- a/print-ospf.c +++ b/print-ospf.c @@ -21,11 +21,6 @@ * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu) */ -#ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ospf.c,v 1.63 2007-09-23 23:01:33 guy Exp $ (LBL)"; -#endif - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -43,38 +38,28 @@ static const char rcsid[] _U_ = #include "ip.h" -static struct tok ospf_option_values[] = { - { OSPF_OPTION_T, "TOS" }, - { OSPF_OPTION_E, "External" }, - { OSPF_OPTION_MC, "Multicast" }, - { OSPF_OPTION_NP, "NSSA" }, - { OSPF_OPTION_EA, "Advertise External" }, - { OSPF_OPTION_DC, "Demand Circuit" }, - { OSPF_OPTION_O, "Opaque" }, - { OSPF_OPTION_DN, "Up/Down" }, - { 0, NULL } -}; +static const char tstr[] = " [|ospf2]"; -static struct tok ospf_option_values2[] = { - { OSPF_OPTION_T, "TOS" }, +static const struct tok ospf_option_values[] = { + { OSPF_OPTION_T, "MultiTopology" }, /* draft-ietf-ospf-mt-09 */ { OSPF_OPTION_E, "External" }, { OSPF_OPTION_MC, "Multicast" }, { OSPF_OPTION_NP, "NSSA" }, - { OSPF_OPTION_L, "LLS" }, + { OSPF_OPTION_L, "LLS" }, { OSPF_OPTION_DC, "Demand Circuit" }, { OSPF_OPTION_O, "Opaque" }, { OSPF_OPTION_DN, "Up/Down" }, { 0, NULL } }; -static struct tok ospf_authtype_values[] = { +static const struct tok ospf_authtype_values[] = { { OSPF_AUTH_NONE, "none" }, { OSPF_AUTH_SIMPLE, "simple" }, { OSPF_AUTH_MD5, "MD5" }, { 0, NULL } }; -static struct tok ospf_rla_flag_values[] = { +static const struct tok ospf_rla_flag_values[] = { { RLA_FLAG_B, "ABR" }, { RLA_FLAG_E, "ASBR" }, { RLA_FLAG_W1, "Virtual" }, @@ -82,7 +67,7 @@ static struct tok ospf_rla_flag_values[] = { { 0, NULL } }; -static struct tok type2str[] = { +static const struct tok type2str[] = { { OSPF_TYPE_UMD, "UMD" }, { OSPF_TYPE_HELLO, "Hello" }, { OSPF_TYPE_DD, "Database Description" }, @@ -92,7 +77,7 @@ static struct tok type2str[] = { { 0, NULL } }; -static struct tok lsa_values[] = { +static const struct tok lsa_values[] = { { LS_TYPE_ROUTER, "Router" }, { LS_TYPE_NETWORK, "Network" }, { LS_TYPE_SUM_IP, "Summary" }, @@ -106,7 +91,7 @@ static struct tok lsa_values[] = { { 0, NULL } }; -static struct tok ospf_dd_flag_values[] = { +static const struct tok ospf_dd_flag_values[] = { { OSPF_DB_INIT, "Init" }, { OSPF_DB_MORE, "More" }, { OSPF_DB_MASTER, "Master" }, @@ -114,20 +99,20 @@ static struct tok ospf_dd_flag_values[] = { { 0, NULL } }; -static struct tok lsa_opaque_values[] = { +static const struct tok lsa_opaque_values[] = { { LS_OPAQUE_TYPE_TE, "Traffic Engineering" }, { LS_OPAQUE_TYPE_GRACE, "Graceful restart" }, { LS_OPAQUE_TYPE_RI, "Router Information" }, { 0, NULL } }; -static struct tok lsa_opaque_te_tlv_values[] = { +static const struct tok lsa_opaque_te_tlv_values[] = { { LS_OPAQUE_TE_TLV_ROUTER, "Router Address" }, { LS_OPAQUE_TE_TLV_LINK, "Link" }, { 0, NULL } }; -static struct tok lsa_opaque_te_link_tlv_subtlv_values[] = { +static const struct tok lsa_opaque_te_link_tlv_subtlv_values[] = { { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE, "Link Type" }, { LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID, "Link ID" }, { LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP, "Local Interface IP address" }, @@ -145,14 +130,14 @@ static struct tok lsa_opaque_te_link_tlv_subtlv_values[] = { { 0, NULL } }; -static struct tok lsa_opaque_grace_tlv_values[] = { +static const struct tok lsa_opaque_grace_tlv_values[] = { { LS_OPAQUE_GRACE_TLV_PERIOD, "Grace Period" }, { LS_OPAQUE_GRACE_TLV_REASON, "Graceful restart Reason" }, { LS_OPAQUE_GRACE_TLV_INT_ADDRESS, "IPv4 interface address" }, { 0, NULL } }; -static struct tok lsa_opaque_grace_tlv_reason_values[] = { +static const struct tok lsa_opaque_grace_tlv_reason_values[] = { { LS_OPAQUE_GRACE_TLV_REASON_UNKNOWN, "Unknown" }, { LS_OPAQUE_GRACE_TLV_REASON_SW_RESTART, "Software Restart" }, { LS_OPAQUE_GRACE_TLV_REASON_SW_UPGRADE, "Software Reload/Upgrade" }, @@ -160,18 +145,18 @@ static struct tok lsa_opaque_grace_tlv_reason_values[] = { { 0, NULL } }; -static struct tok lsa_opaque_te_tlv_link_type_sub_tlv_values[] = { +static const struct tok lsa_opaque_te_tlv_link_type_sub_tlv_values[] = { { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_PTP, "Point-to-point" }, { LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_MA, "Multi-Access" }, { 0, NULL } }; -static struct tok lsa_opaque_ri_tlv_values[] = { +static const struct tok lsa_opaque_ri_tlv_values[] = { { LS_OPAQUE_RI_TLV_CAP, "Router Capabilities" }, { 0, NULL } }; -static struct tok lsa_opaque_ri_tlv_cap_values[] = { +static const struct tok lsa_opaque_ri_tlv_cap_values[] = { { 1, "Reserved" }, { 2, "Reserved" }, { 4, "Reserved" }, @@ -185,31 +170,25 @@ static struct tok lsa_opaque_ri_tlv_cap_values[] = { { 0, NULL } }; -static struct tok ospf_lls_tlv_values[] = { +static const struct tok ospf_lls_tlv_values[] = { { OSPF_LLS_EO, "Extended Options" }, { OSPF_LLS_MD5, "MD5 Authentication" }, { 0, NULL } }; -static struct tok ospf_lls_eo_options[] = { +static const struct tok ospf_lls_eo_options[] = { { OSPF_LLS_EO_LR, "LSDB resync" }, { OSPF_LLS_EO_RS, "Restart" }, { 0, NULL } }; -static char tstr[] = " [|ospf2]"; - -#ifdef WIN32 -#define inline __inline -#endif /* WIN32 */ - static int ospf_print_lshdr(const struct lsa_hdr *); static const u_char *ospf_print_lsa(const struct lsa *); static int ospf_decode_v2(const struct ospfhdr *, const u_char *); static int ospf_decode_lls(const struct ospfhdr *, register u_int); int -ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) { +ospf_print_grace_lsa (const u_int8_t *tptr, u_int ls_length) { u_int tlv_type, tlv_length; @@ -224,7 +203,7 @@ ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) { tlv_length = EXTRACT_16BITS(tptr+2); tptr+=4; ls_length-=4; - + printf("\n\t %s TLV (%u), length %u, value: ", tok2str(lsa_opaque_grace_tlv_values,"unknown",tlv_type), tlv_type, @@ -272,7 +251,7 @@ ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) { default: if (vflag <= 1) { - if(!print_unknown_data(tptr,"\n\t ",tlv_length)) + if(!print_unknown_data(gndo,tptr,"\n\t ",tlv_length)) return -1; } break; @@ -291,12 +270,12 @@ trunc: } int -ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { +ospf_print_te_lsa (const u_int8_t *tptr, u_int ls_length) { u_int tlv_type, tlv_length, subtlv_type, subtlv_length; u_int priority_level, te_class, count_srlg; union { /* int to float conversion buffer for several subTLVs */ - float f; + float f; u_int32_t i; } bw; @@ -310,7 +289,7 @@ ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { tlv_length = EXTRACT_16BITS(tptr+2); tptr+=4; ls_length-=4; - + printf("\n\t %s TLV (%u), length: %u", tok2str(lsa_opaque_te_tlv_values,"unknown",tlv_type), tlv_type, @@ -340,12 +319,12 @@ ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { subtlv_length = EXTRACT_16BITS(tptr+2); tptr+=4; tlv_length-=4; - + printf("\n\t %s subTLV (%u), length: %u", tok2str(lsa_opaque_te_link_tlv_subtlv_values,"unknown",subtlv_type), subtlv_type, subtlv_length); - + TCHECK2(*tptr, subtlv_length); switch(subtlv_type) { case LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP: @@ -432,7 +411,7 @@ ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { default: if (vflag <= 1) { - if(!print_unknown_data(tptr,"\n\t\t",subtlv_length)) + if(!print_unknown_data(gndo,tptr,"\n\t\t",subtlv_length)) return -1; } break; @@ -440,13 +419,13 @@ ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { /* in OSPF everything has to be 32-bit aligned, including subTLVs */ if (subtlv_length%4 != 0) subtlv_length+=4-(subtlv_length%4); - + tlv_length-=subtlv_length; tptr+=subtlv_length; - + } break; - + case LS_OPAQUE_TE_TLV_ROUTER: if (tlv_length < 4) { printf("\n\t TLV length %u < 4", tlv_length); @@ -455,10 +434,10 @@ ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) { TCHECK2(*tptr, 4); printf(", %s", ipaddr_string(tptr)); break; - + default: if (vflag <= 1) { - if(!print_unknown_data(tptr,"\n\t ",tlv_length)) + if(!print_unknown_data(gndo,tptr,"\n\t ",tlv_length)) return -1; } break; @@ -510,7 +489,7 @@ ospf_print_lshdr(register const struct lsa_hdr *lshp) *(&lshp->un_lsa_id.opaque_field.opaque_type)), *(&lshp->un_lsa_id.opaque_field.opaque_type), EXTRACT_24BITS(&lshp->un_lsa_id.opaque_field.opaque_id) - + ); break; @@ -531,6 +510,41 @@ trunc: return (-1); } +/* draft-ietf-ospf-mt-09 */ +static const struct tok ospf_topology_values[] = { + { 0, "default " }, + { 1, "multicast " }, + { 2, "management " }, + { 0, NULL } +}; + +/* + * Print all the per-topology metrics. + */ +static void +ospf_print_tos_metrics(const union un_tos *tos) +{ + int metric_count; + int toscount; + + toscount = tos->link.link_tos_count+1; + metric_count = 0; + + /* + * All but the first metric contain a valid topology id. + */ + while (toscount) { + printf("\n\t\ttopology %s(%u), metric %u", + tok2str(ospf_topology_values, "", + metric_count ? tos->metrics.tos_type : 0), + metric_count ? tos->metrics.tos_type : 0, + EXTRACT_16BITS(&tos->metrics.tos_metric)); + metric_count++; + tos++; + toscount--; + } +} + /* * Print a single link state advertisement. If truncated or if LSA length * field is less than the length of the LSA header, return NULl, else @@ -541,12 +555,11 @@ ospf_print_lsa(register const struct lsa *lsap) { register const u_int8_t *ls_end; register const struct rlalink *rlp; - register const struct tos_metric *tosp; register const struct in_addr *ap; register const struct aslametric *almp; register const struct mcla *mcp; register const u_int32_t *lp; - register int j, k, tlv_type, tlv_length; + register int j, tlv_type, tlv_length, topology; register int ls_length; const u_int8_t *tptr; @@ -569,12 +582,12 @@ ospf_print_lsa(register const struct lsa *lsap) rlp = lsap->lsa_un.un_rla.rla_link; while (j--) { TCHECK(*rlp); - switch (rlp->link_type) { + switch (rlp->un_tos.link.link_type) { case RLA_TYPE_VIRTUAL: printf("\n\t Virtual Link: Neighbor Router-ID: %s, Interface Address: %s", ipaddr_string(&rlp->link_id), - ipaddr_string(&rlp->link_data)); + ipaddr_string(&rlp->link_data)); break; case RLA_TYPE_ROUTER: @@ -597,20 +610,14 @@ ospf_print_lsa(register const struct lsa *lsap) default: printf("\n\t Unknown Router Link Type (%u)", - rlp->link_type); + rlp->un_tos.link.link_type); return (ls_end); } - printf(", tos 0, metric: %d", EXTRACT_16BITS(&rlp->link_tos0metric)); - tosp = (struct tos_metric *) - ((sizeof rlp->link_tos0metric) + (u_char *) rlp); - for (k = 0; k < (int) rlp->link_toscount; ++k, ++tosp) { - TCHECK(*tosp); - printf(", tos %d, metric: %d", - tosp->tos_type, - EXTRACT_16BITS(&tosp->tos_metric)); - } + + ospf_print_tos_metrics(&rlp->un_tos); + rlp = (struct rlalink *)((u_char *)(rlp + 1) + - ((rlp->link_toscount) * sizeof(*tosp))); + ((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos))); } break; @@ -632,19 +639,16 @@ ospf_print_lsa(register const struct lsa *lsap) ipaddr_string(&lsap->lsa_un.un_sla.sla_mask)); TCHECK(lsap->lsa_un.un_sla.sla_tosmetric); lp = lsap->lsa_un.un_sla.sla_tosmetric; - /* suppress tos if its not supported */ - if(!((lsap->ls_hdr.ls_options)&OSPF_OPTION_T)) { - printf(", metric %u", EXTRACT_32BITS(lp)&SLA_MASK_METRIC); - break; - } while ((u_char *)lp < ls_end) { register u_int32_t ul; TCHECK(*lp); ul = EXTRACT_32BITS(lp); - printf(", tos %d metric %d", - (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS, - ul & SLA_MASK_METRIC); + topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS; + printf("\n\t\ttopology %s(%u) metric %d", + tok2str(ospf_topology_values, "", topology), + topology, + ul & SLA_MASK_METRIC); ++lp; } break; @@ -652,19 +656,16 @@ ospf_print_lsa(register const struct lsa *lsap) case LS_TYPE_SUM_ABR: TCHECK(lsap->lsa_un.un_sla.sla_tosmetric); lp = lsap->lsa_un.un_sla.sla_tosmetric; - /* suppress tos if its not supported */ - if(!((lsap->ls_hdr.ls_options)&OSPF_OPTION_T)) { - printf(", metric: %u", EXTRACT_32BITS(lp)&SLA_MASK_METRIC); - break; - } while ((u_char *)lp < ls_end) { register u_int32_t ul; TCHECK(*lp); ul = EXTRACT_32BITS(lp); - printf(", tos %d metric %d", - (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS, - ul & SLA_MASK_METRIC); + topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS; + printf("\n\t\ttopology %s(%u) metric %d", + tok2str(ospf_topology_values, "", topology), + topology, + ul & SLA_MASK_METRIC); ++lp; } break; @@ -682,9 +683,11 @@ ospf_print_lsa(register const struct lsa *lsap) TCHECK(almp->asla_tosmetric); ul = EXTRACT_32BITS(&almp->asla_tosmetric); - printf(", type %d, tos %d metric:", - (ul & ASLA_FLAG_EXTERNAL) ? 2 : 1, - (ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS); + topology = ((ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS); + printf("\n\t\ttopology %s(%u), type %d, metric", + tok2str(ospf_topology_values, "", topology), + topology, + (ul & ASLA_FLAG_EXTERNAL) ? 2 : 1); if ((ul & ASLA_MASK_METRIC)==0xffffff) printf(" infinite"); else @@ -731,7 +734,7 @@ ospf_print_lsa(register const struct lsa *lsap) break; case LS_TYPE_OPAQUE_LL: /* fall through */ - case LS_TYPE_OPAQUE_AL: + case LS_TYPE_OPAQUE_AL: case LS_TYPE_OPAQUE_DW: switch (*(&lsap->ls_hdr.un_lsa_id.opaque_field.opaque_type)) { @@ -748,7 +751,7 @@ ospf_print_lsa(register const struct lsa *lsap) tlv_length = EXTRACT_16BITS(tptr+2); tptr+=4; ls_length-=4; - + printf("\n\t %s TLV (%u), length: %u, value: ", tok2str(lsa_opaque_ri_tlv_values,"unknown",tlv_type), tlv_type, @@ -772,7 +775,7 @@ ospf_print_lsa(register const struct lsa *lsap) break; default: if (vflag <= 1) { - if(!print_unknown_data(tptr,"\n\t ",tlv_length)) + if(!print_unknown_data(gndo,tptr,"\n\t ",tlv_length)) return(ls_end); } break; @@ -799,21 +802,21 @@ ospf_print_lsa(register const struct lsa *lsap) default: if (vflag <= 1) { - if(!print_unknown_data((u_int8_t *)lsap->lsa_un.un_unknown, + if(!print_unknown_data(gndo,(u_int8_t *)lsap->lsa_un.un_unknown, "\n\t ", ls_length)) return(ls_end); - } + } break; } } /* do we want to see an additionally hexdump ? */ if (vflag> 1) - if(!print_unknown_data((u_int8_t *)lsap->lsa_un.un_unknown, + if(!print_unknown_data(gndo,(u_int8_t *)lsap->lsa_un.un_unknown, "\n\t ", ls_length)) { return(ls_end); } - + return (ls_end); trunc: return (NULL); @@ -821,7 +824,7 @@ trunc: static int ospf_decode_lls(register const struct ospfhdr *op, - register u_int length) + register u_int length) { register const u_char *dptr; register const u_char *dataend; @@ -932,7 +935,7 @@ ospf_decode_v2(register const struct ospfhdr *op, case OSPF_TYPE_HELLO: printf("\n\tOptions [%s]", - bittok2str(ospf_option_values2,"none",op->ospf_hello.hello_options)); + bittok2str(ospf_option_values,"none",op->ospf_hello.hello_options)); TCHECK(op->ospf_hello.hello_deadint); printf("\n\t Hello Timer %us, Dead Timer %us, Mask %s, Priority %u", @@ -964,20 +967,20 @@ ospf_decode_v2(register const struct ospfhdr *op, case OSPF_TYPE_DD: TCHECK(op->ospf_db.db_options); printf("\n\tOptions [%s]", - bittok2str(ospf_option_values2,"none",op->ospf_db.db_options)); + bittok2str(ospf_option_values,"none",op->ospf_db.db_options)); TCHECK(op->ospf_db.db_flags); printf(", DD Flags [%s]", bittok2str(ospf_dd_flag_values,"none",op->ospf_db.db_flags)); TCHECK(op->ospf_db.db_ifmtu); if (op->ospf_db.db_ifmtu) { - printf(", MTU: %u", ntohs(op->ospf_db.db_ifmtu)); + printf(", MTU: %u", EXTRACT_16BITS(&op->ospf_db.db_ifmtu)); } TCHECK(op->ospf_db.db_seq); - printf(", Sequence: 0x%08x", ntohl(op->ospf_db.db_seq)); + printf(", Sequence: 0x%08x", EXTRACT_32BITS(&op->ospf_db.db_seq)); /* Print all the LS adv's */ lshp = op->ospf_db.db_lshdr; - while ((u_char *)lshp < dataend && ospf_print_lshdr(lshp) != -1) { + while (((u_char *)lshp < dataend) && ospf_print_lshdr(lshp) != -1) { ++lshp; } break; @@ -1007,7 +1010,7 @@ ospf_decode_v2(register const struct ospfhdr *op, ipaddr_string(&lsrp->un_ls_stateid.ls_stateid)); break; } - + ++lsrp; } break; @@ -1016,7 +1019,7 @@ ospf_decode_v2(register const struct ospfhdr *op, lsap = op->ospf_lsu.lsu_lsa; TCHECK(op->ospf_lsu.lsu_count); lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count); - printf(", %d LSA%s",lsa_count_max, lsa_count_max > 1 ? "s" : ""); + printf(", %d LSA%s",lsa_count_max, PLURAL_SUFFIX(lsa_count_max)); for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) { printf("\n\t LSA #%u",lsa_count); lsap = (const struct lsa *)ospf_print_lsa(lsap);