*/
-#ifndef lint
-static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ospf.c,v 1.65 2007-09-27 10:29:18 hannes Exp $ (LBL)";
-#endif
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "ip.h"
-static struct tok ospf_option_values[] = {
+static const char tstr[] = " [|ospf2]";
+
+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" },
{ 0, NULL }
};
-static struct tok type2str[] = {
+static const struct tok type2str[] = {
{ OSPF_TYPE_UMD, "UMD" },
{ OSPF_TYPE_HELLO, "Hello" },
{ OSPF_TYPE_DD, "Database Description" },
{ 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" },
{ 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" },
{ 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" },
{ 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" },
{ 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" },
{ 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;
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,
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;
}
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;
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,
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:
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;
/* 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);
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;
*(&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;
}
/* draft-ietf-ospf-mt-09 */
-static struct tok ospf_topology_values[] = {
+static const struct tok ospf_topology_values[] = {
{ 0, "default " },
{ 1, "multicast " },
{ 2, "management " },
* Print all the per-topology metrics.
*/
static void
-ospf_print_tos_metrics(const struct tos_metric *metrics)
+ospf_print_tos_metrics(const union un_tos *tos)
{
int metric_count;
int toscount;
- toscount = metrics->tos_count+1;
+ toscount = tos->link.link_tos_count+1;
metric_count = 0;
/*
* All but the first metric contain a valid topology id.
*/
- while (toscount) {
+ while (toscount) {
printf("\n\t\ttopology %s(%u), metric %u",
tok2str(ospf_topology_values, "",
- metric_count ? metrics->tos_type : 0),
- metric_count ? metrics->tos_type : 0,
- EXTRACT_16BITS(&metrics->tos_metric));
+ metric_count ? tos->metrics.tos_type : 0),
+ metric_count ? tos->metrics.tos_type : 0,
+ EXTRACT_16BITS(&tos->metrics.tos_metric));
metric_count++;
- metrics++;
+ tos++;
toscount--;
}
}
rlp = lsap->lsa_un.un_rla.rla_link;
while (j--) {
TCHECK(*rlp);
- switch (rlp->metrics.tos_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:
default:
printf("\n\t Unknown Router Link Type (%u)",
- rlp->metrics.tos_type);
+ rlp->un_tos.link.link_type);
return (ls_end);
}
- ospf_print_tos_metrics(&rlp->metrics);
+ ospf_print_tos_metrics(&rlp->un_tos);
rlp = (struct rlalink *)((u_char *)(rlp + 1) +
- ((rlp->metrics.tos_count) * sizeof(struct tos_metric)));
+ ((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos)));
}
break;
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)) {
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,
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;
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);
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;
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", 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;
ipaddr_string(&lsrp->un_ls_stateid.ls_stateid));
break;
}
-
+
++lsrp;
}
break;
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);