*/
+/* \summary: Open Shortest Path First (OSPF) printer */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
-#include "interface.h"
+#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
#include "gmpls.h"
};
static const struct tok type2str[] = {
- { OSPF_TYPE_UMD, "UMD" },
{ OSPF_TYPE_HELLO, "Hello" },
{ OSPF_TYPE_DD, "Database Description" },
{ OSPF_TYPE_LS_REQ, "LS-Request" },
while (ls_length > 0) {
- ND_TCHECK2(*tptr, 4);
+ ND_TCHECK_4(tptr);
if (ls_length < 4) {
ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
return -1;
}
- tlv_type = EXTRACT_16BITS(tptr);
- tlv_length = EXTRACT_16BITS(tptr+2);
+ tlv_type = EXTRACT_BE_U_2(tptr);
+ tlv_length = EXTRACT_BE_U_2(tptr + 2);
tptr+=4;
ls_length-=4;
ND_PRINT((ndo, "\n\t Bogus length %u != 4", tlv_length));
return -1;
}
- ND_PRINT((ndo, "%us", EXTRACT_32BITS(tptr)));
+ ND_PRINT((ndo, "%us", EXTRACT_BE_U_4(tptr)));
break;
case LS_OPAQUE_GRACE_TLV_REASON:
return -1;
}
ND_PRINT((ndo, "%s (%u)",
- tok2str(lsa_opaque_grace_tlv_reason_values, "Unknown", *tptr),
- *tptr));
+ tok2str(lsa_opaque_grace_tlv_reason_values, "Unknown", EXTRACT_U_1(tptr)),
+ EXTRACT_U_1(tptr)));
break;
case LS_OPAQUE_GRACE_TLV_INT_ADDRESS:
} bw;
while (ls_length != 0) {
- ND_TCHECK2(*tptr, 4);
+ ND_TCHECK_4(tptr);
if (ls_length < 4) {
ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
return -1;
}
- tlv_type = EXTRACT_16BITS(tptr);
- tlv_length = EXTRACT_16BITS(tptr+2);
+ tlv_type = EXTRACT_BE_U_2(tptr);
+ tlv_length = EXTRACT_BE_U_2(tptr + 2);
tptr+=4;
ls_length-=4;
tlv_length));
return -1;
}
- ND_TCHECK2(*tptr, 4);
- subtlv_type = EXTRACT_16BITS(tptr);
- subtlv_length = EXTRACT_16BITS(tptr+2);
+ ND_TCHECK_4(tptr);
+ subtlv_type = EXTRACT_BE_U_2(tptr);
+ subtlv_length = EXTRACT_BE_U_2(tptr + 2);
tptr+=4;
tlv_length-=4;
+ /* Infinite loop protection */
+ if (subtlv_type == 0 || subtlv_length == 0)
+ goto invalid;
+
ND_PRINT((ndo, "\n\t %s subTLV (%u), length: %u",
tok2str(lsa_opaque_te_link_tlv_subtlv_values,"unknown",subtlv_type),
subtlv_type,
ND_TCHECK2(*tptr, subtlv_length);
switch(subtlv_type) {
case LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP:
- ND_PRINT((ndo, ", 0x%08x", EXTRACT_32BITS(tptr)));
+ if (subtlv_length != 4) {
+ ND_PRINT((ndo, " != 4"));
+ goto invalid;
+ }
+ ND_PRINT((ndo, ", 0x%08x", EXTRACT_BE_U_4(tptr)));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID:
case LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID:
+ if (subtlv_length != 4 && subtlv_length != 8) {
+ ND_PRINT((ndo, " != 4 && != 8"));
+ goto invalid;
+ }
ND_PRINT((ndo, ", %s (0x%08x)",
ipaddr_string(ndo, tptr),
- EXTRACT_32BITS(tptr)));
+ EXTRACT_BE_U_4(tptr)));
if (subtlv_length == 8) /* rfc4203 */
ND_PRINT((ndo, ", %s (0x%08x)",
ipaddr_string(ndo, tptr+4),
- EXTRACT_32BITS(tptr + 4)));
+ EXTRACT_BE_U_4(tptr + 4)));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP:
case LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP:
+ if (subtlv_length != 4) {
+ ND_PRINT((ndo, " != 4"));
+ goto invalid;
+ }
ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr)));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW:
case LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW:
- bw.i = EXTRACT_32BITS(tptr);
+ if (subtlv_length != 4) {
+ ND_PRINT((ndo, " != 4"));
+ goto invalid;
+ }
+ bw.i = EXTRACT_BE_U_4(tptr);
ND_PRINT((ndo, ", %.3f Mbps", bw.f * 8 / 1000000));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW:
+ if (subtlv_length != 32) {
+ ND_PRINT((ndo, " != 32"));
+ goto invalid;
+ }
for (te_class = 0; te_class < 8; te_class++) {
- bw.i = EXTRACT_32BITS(tptr+te_class*4);
+ bw.i = EXTRACT_BE_U_4(tptr + te_class * 4);
ND_PRINT((ndo, "\n\t\tTE-Class %u: %.3f Mbps",
te_class,
bw.f * 8 / 1000000));
}
break;
case LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS:
+ if (subtlv_length < 4) {
+ ND_PRINT((ndo, " < 4"));
+ goto invalid;
+ }
+ /* BC Model Id (1 octet) + Reserved (3 octets) */
ND_PRINT((ndo, "\n\t\tBandwidth Constraints Model ID: %s (%u)",
- tok2str(diffserv_te_bc_values, "unknown", *tptr),
- *tptr));
+ tok2str(diffserv_te_bc_values, "unknown", EXTRACT_U_1(tptr)),
+ EXTRACT_U_1(tptr)));
+ if (subtlv_length % 4 != 0) {
+ ND_PRINT((ndo, "\n\t\tlength %u != N x 4", subtlv_length));
+ goto invalid;
+ }
+ if (subtlv_length > 36) {
+ ND_PRINT((ndo, "\n\t\tlength %u > 36", subtlv_length));
+ goto invalid;
+ }
/* decode BCs until the subTLV ends */
for (te_class = 0; te_class < (subtlv_length-4)/4; te_class++) {
- bw.i = EXTRACT_32BITS(tptr+4+te_class*4);
+ bw.i = EXTRACT_BE_U_4(tptr + 4 + te_class * 4);
ND_PRINT((ndo, "\n\t\t Bandwidth constraint CT%u: %.3f Mbps",
te_class,
bw.f * 8 / 1000000));
}
break;
case LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC:
- ND_PRINT((ndo, ", Metric %u", EXTRACT_32BITS(tptr)));
+ if (subtlv_length != 4) {
+ ND_PRINT((ndo, " != 4"));
+ goto invalid;
+ }
+ ND_PRINT((ndo, ", Metric %u", EXTRACT_BE_U_4(tptr)));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE:
- ND_PRINT((ndo, ", %s, Priority %u",
- bittok2str(gmpls_link_prot_values, "none", *tptr),
- *(tptr + 1)));
+ /* Protection Cap (1 octet) + Reserved ((3 octets) */
+ if (subtlv_length != 4) {
+ ND_PRINT((ndo, " != 4"));
+ goto invalid;
+ }
+ ND_PRINT((ndo, ", %s",
+ bittok2str(gmpls_link_prot_values, "none", EXTRACT_U_1(tptr))));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR:
+ if (subtlv_length < 36) {
+ ND_PRINT((ndo, " < 36"));
+ goto invalid;
+ }
+ /* Switching Cap (1 octet) + Encoding (1) + Reserved (2) */
ND_PRINT((ndo, "\n\t\tInterface Switching Capability: %s",
- tok2str(gmpls_switch_cap_values, "Unknown", *(tptr))));
+ tok2str(gmpls_switch_cap_values, "Unknown", EXTRACT_U_1((tptr)))));
ND_PRINT((ndo, "\n\t\tLSP Encoding: %s\n\t\tMax LSP Bandwidth:",
- tok2str(gmpls_encoding_values, "Unknown", *(tptr + 1))));
+ tok2str(gmpls_encoding_values, "Unknown", EXTRACT_U_1((tptr + 1)))));
for (priority_level = 0; priority_level < 8; priority_level++) {
- bw.i = EXTRACT_32BITS(tptr+4+(priority_level*4));
+ bw.i = EXTRACT_BE_U_4(tptr + 4 + (priority_level * 4));
ND_PRINT((ndo, "\n\t\t priority level %d: %.3f Mbps",
priority_level,
bw.f * 8 / 1000000));
}
break;
case LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE:
+ if (subtlv_length != 1) {
+ ND_PRINT((ndo, " != 1"));
+ goto invalid;
+ }
ND_PRINT((ndo, ", %s (%u)",
- tok2str(lsa_opaque_te_tlv_link_type_sub_tlv_values,"unknown",*tptr),
- *tptr));
+ tok2str(lsa_opaque_te_tlv_link_type_sub_tlv_values,"unknown",EXTRACT_U_1(tptr)),
+ EXTRACT_U_1(tptr)));
break;
case LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP:
+ if (subtlv_length % 4 != 0) {
+ ND_PRINT((ndo, " != N x 4"));
+ goto invalid;
+ }
count_srlg = subtlv_length / 4;
if (count_srlg != 0)
ND_PRINT((ndo, "\n\t\t Shared risk group: "));
while (count_srlg > 0) {
- bw.i = EXTRACT_32BITS(tptr);
+ bw.i = EXTRACT_BE_U_4(tptr);
ND_PRINT((ndo, "%d", bw.i));
tptr+=4;
count_srlg--;
ND_PRINT((ndo, "\n\t TLV length %u < 4", tlv_length));
return -1;
}
- ND_TCHECK2(*tptr, 4);
+ ND_TCHECK_4(tptr);
ND_PRINT((ndo, ", %s", ipaddr_string(ndo, tptr)));
break;
return 0;
trunc:
return -1;
+invalid:
+ ND_PRINT((ndo, "%s", istr));
+ return -1;
}
static int
u_int ls_length;
ND_TCHECK(lshp->ls_length);
- ls_length = EXTRACT_16BITS(&lshp->ls_length);
+ ls_length = EXTRACT_BE_U_2(&lshp->ls_length);
if (ls_length < sizeof(struct lsa_hdr)) {
ND_PRINT((ndo, "\n\t Bogus length %u < header (%lu)", ls_length,
(unsigned long)sizeof(struct lsa_hdr)));
ND_TCHECK(lshp->ls_seq); /* XXX - ls_length check checked this */
ND_PRINT((ndo, "\n\t Advertising Router %s, seq 0x%08x, age %us, length %u",
ipaddr_string(ndo, &lshp->ls_router),
- EXTRACT_32BITS(&lshp->ls_seq),
- EXTRACT_16BITS(&lshp->ls_age),
+ EXTRACT_BE_U_4(&lshp->ls_seq),
+ EXTRACT_BE_U_2(&lshp->ls_age),
ls_length - (u_int)sizeof(struct lsa_hdr)));
ND_TCHECK(lshp->ls_type); /* XXX - ls_length check checked this */
"unknown",
*(&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)
+ EXTRACT_BE_U_3(&lshp->un_lsa_id.opaque_field.opaque_id)
));
break;
/* draft-ietf-ospf-mt-09 */
static const struct tok ospf_topology_values[] = {
- { 0, "default " },
- { 1, "multicast " },
- { 2, "management " },
+ { 0, "default" },
+ { 1, "multicast" },
+ { 2, "management" },
{ 0, NULL }
};
/*
* Print all the per-topology metrics.
*/
-static void
+static int
ospf_print_tos_metrics(netdissect_options *ndo,
const union un_tos *tos)
{
/*
* All but the first metric contain a valid topology id.
*/
- while (toscount) {
- ND_PRINT((ndo, "\n\t\ttopology %s(%u), metric %u",
- tok2str(ospf_topology_values, "",
+ while (toscount > 0) {
+ ND_TCHECK(*tos);
+ ND_PRINT((ndo, "\n\t\ttopology %s (%u), metric %u",
+ tok2str(ospf_topology_values, "Unknown",
metric_count ? tos->metrics.tos_type : 0),
metric_count ? tos->metrics.tos_type : 0,
- EXTRACT_16BITS(&tos->metrics.tos_metric)));
+ EXTRACT_BE_U_2(&tos->metrics.tos_metric)));
metric_count++;
tos++;
toscount--;
}
+ return 0;
+trunc:
+ return 1;
}
/*
bittok2str(ospf_rla_flag_values, "none", lsap->lsa_un.un_rla.rla_flags)));
ND_TCHECK(lsap->lsa_un.un_rla.rla_count);
- j = EXTRACT_16BITS(&lsap->lsa_un.un_rla.rla_count);
+ j = EXTRACT_BE_U_2(&lsap->lsa_un.un_rla.rla_count);
ND_TCHECK(lsap->lsa_un.un_rla.rla_link);
rlp = lsap->lsa_un.un_rla.rla_link;
while (j--) {
return (ls_end);
}
- ospf_print_tos_metrics(ndo, &rlp->un_tos);
+ if (ospf_print_tos_metrics(ndo, &rlp->un_tos))
+ goto trunc;
rlp = (const struct rlalink *)((const u_char *)(rlp + 1) +
((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos)));
register uint32_t ul;
ND_TCHECK(*lp);
- ul = EXTRACT_32BITS(lp);
+ ul = EXTRACT_BE_U_4(lp);
topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;
- ND_PRINT((ndo, "\n\t\ttopology %s(%u) metric %d",
- tok2str(ospf_topology_values, "", topology),
+ ND_PRINT((ndo, "\n\t\ttopology %s (%u) metric %d",
+ tok2str(ospf_topology_values, "Unknown", topology),
topology,
ul & SLA_MASK_METRIC));
++lp;
register uint32_t ul;
ND_TCHECK(*lp);
- ul = EXTRACT_32BITS(lp);
+ ul = EXTRACT_BE_U_4(lp);
topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;
- ND_PRINT((ndo, "\n\t\ttopology %s(%u) metric %d",
- tok2str(ospf_topology_values, "", topology),
+ ND_PRINT((ndo, "\n\t\ttopology %s (%u) metric %d",
+ tok2str(ospf_topology_values, "Unknown", topology),
topology,
ul & SLA_MASK_METRIC));
++lp;
register uint32_t ul;
ND_TCHECK(almp->asla_tosmetric);
- ul = EXTRACT_32BITS(&almp->asla_tosmetric);
+ ul = EXTRACT_BE_U_4(&almp->asla_tosmetric);
topology = ((ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS);
- ND_PRINT((ndo, "\n\t\ttopology %s(%u), type %d, metric",
- tok2str(ospf_topology_values, "", topology),
+ ND_PRINT((ndo, "\n\t\ttopology %s (%u), type %d, metric",
+ tok2str(ospf_topology_values, "Unknown", topology),
topology,
(ul & ASLA_FLAG_EXTERNAL) ? 2 : 1));
if ((ul & ASLA_MASK_METRIC) == 0xffffff)
mcp = lsap->lsa_un.un_mcla;
while ((const u_char *)mcp < ls_end) {
ND_TCHECK(mcp->mcla_vid);
- switch (EXTRACT_32BITS(&mcp->mcla_vtype)) {
+ switch (EXTRACT_BE_U_4(&mcp->mcla_vtype)) {
case MCLA_VERTEX_ROUTER:
ND_PRINT((ndo, "\n\t Router Router-ID %s",
default:
ND_PRINT((ndo, "\n\t unknown VertexType (%u)",
- EXTRACT_32BITS(&mcp->mcla_vtype)));
+ EXTRACT_BE_U_4(&mcp->mcla_vtype)));
break;
}
++mcp;
tptr = (const uint8_t *)(&lsap->lsa_un.un_ri_tlv.type);
while (ls_length != 0) {
- ND_TCHECK2(*tptr, 4);
+ ND_TCHECK_4(tptr);
if (ls_length < 4) {
ND_PRINT((ndo, "\n\t Remaining LS length %u < 4", ls_length));
return(ls_end);
}
- tlv_type = EXTRACT_16BITS(tptr);
- tlv_length = EXTRACT_16BITS(tptr+2);
+ tlv_type = EXTRACT_BE_U_2(tptr);
+ tlv_length = EXTRACT_BE_U_2(tptr + 2);
tptr+=4;
ls_length-=4;
return(ls_end);
}
ND_PRINT((ndo, "Capabilities: %s",
- bittok2str(lsa_opaque_ri_tlv_cap_values, "Unknown", EXTRACT_32BITS(tptr))));
+ bittok2str(lsa_opaque_ri_tlv_cap_values, "Unknown", EXTRACT_BE_U_4(tptr))));
break;
default:
if (ndo->ndo_vflag <= 1) {
}
/* dig deeper if LLS data is available; see RFC4813 */
- length2 = EXTRACT_16BITS(&op->ospf_len);
+ length2 = EXTRACT_BE_U_2(&op->ospf_len);
dptr = (const u_char *)op + length2;
dataend = (const u_char *)op + length;
- if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) {
+ if (EXTRACT_BE_U_2(&op->ospf_authtype) == OSPF_AUTH_MD5) {
dptr = dptr + op->ospf_authdata[3];
length2 += op->ospf_authdata[3];
}
ND_PRINT((ndo, "\n\t[LLS truncated]"));
return (1);
}
- ND_TCHECK2(*dptr, 2);
- ND_PRINT((ndo, "\n\t LLS: checksum: 0x%04x", (u_int)EXTRACT_16BITS(dptr)));
+ ND_TCHECK_2(dptr);
+ ND_PRINT((ndo, "\n\t LLS: checksum: 0x%04x", (u_int) EXTRACT_BE_U_2(dptr)));
dptr += 2;
- ND_TCHECK2(*dptr, 2);
- length2 = EXTRACT_16BITS(dptr);
+ ND_TCHECK_2(dptr);
+ length2 = EXTRACT_BE_U_2(dptr);
ND_PRINT((ndo, ", length: %u", length2));
dptr += 2;
- ND_TCHECK(*dptr);
+ ND_TCHECK_1(dptr);
while (dptr < dataend) {
- ND_TCHECK2(*dptr, 2);
- lls_type = EXTRACT_16BITS(dptr);
+ ND_TCHECK_2(dptr);
+ lls_type = EXTRACT_BE_U_2(dptr);
ND_PRINT((ndo, "\n\t %s (%u)",
tok2str(ospf_lls_tlv_values,"Unknown TLV",lls_type),
lls_type));
dptr += 2;
- ND_TCHECK2(*dptr, 2);
- lls_len = EXTRACT_16BITS(dptr);
+ ND_TCHECK_2(dptr);
+ lls_len = EXTRACT_BE_U_2(dptr);
ND_PRINT((ndo, ", length: %u", lls_len));
dptr += 2;
switch (lls_type) {
ND_PRINT((ndo, " [should be 4]"));
lls_len = 4;
}
- ND_TCHECK2(*dptr, 4);
- lls_flags = EXTRACT_32BITS(dptr);
+ ND_TCHECK_4(dptr);
+ lls_flags = EXTRACT_BE_U_4(dptr);
ND_PRINT((ndo, "\n\t Options: 0x%08x [%s]", lls_flags,
bittok2str(ospf_lls_eo_options, "?", lls_flags)));
ND_PRINT((ndo, " [should be 20]"));
lls_len = 20;
}
- ND_TCHECK2(*dptr, 4);
- ND_PRINT((ndo, "\n\t Sequence number: 0x%08x", EXTRACT_32BITS(dptr)));
+ ND_TCHECK_4(dptr);
+ ND_PRINT((ndo, "\n\t Sequence number: 0x%08x", EXTRACT_BE_U_4(dptr)));
break;
}
switch (op->ospf_type) {
- case OSPF_TYPE_UMD:
- /*
- * Rob Coltun's special monitoring packets;
- * do nothing
- */
- break;
-
case OSPF_TYPE_HELLO:
+ ND_TCHECK(op->ospf_hello.hello_options);
ND_PRINT((ndo, "\n\tOptions [%s]",
bittok2str(ospf_option_values,"none",op->ospf_hello.hello_options)));
ND_TCHECK(op->ospf_hello.hello_deadint);
ND_PRINT((ndo, "\n\t Hello Timer %us, Dead Timer %us, Mask %s, Priority %u",
- EXTRACT_16BITS(&op->ospf_hello.hello_helloint),
- EXTRACT_32BITS(&op->ospf_hello.hello_deadint),
+ EXTRACT_BE_U_2(&op->ospf_hello.hello_helloint),
+ EXTRACT_BE_U_4(&op->ospf_hello.hello_deadint),
ipaddr_string(ndo, &op->ospf_hello.hello_mask),
op->ospf_hello.hello_priority));
bittok2str(ospf_dd_flag_values, "none", op->ospf_db.db_flags)));
ND_TCHECK(op->ospf_db.db_ifmtu);
if (op->ospf_db.db_ifmtu) {
- ND_PRINT((ndo, ", MTU: %u", EXTRACT_16BITS(&op->ospf_db.db_ifmtu)));
+ ND_PRINT((ndo, ", MTU: %u", EXTRACT_BE_U_2(&op->ospf_db.db_ifmtu)));
}
ND_TCHECK(op->ospf_db.db_seq);
- ND_PRINT((ndo, ", Sequence: 0x%08x", EXTRACT_32BITS(&op->ospf_db.db_seq)));
+ ND_PRINT((ndo, ", Sequence: 0x%08x", EXTRACT_BE_U_4(&op->ospf_db.db_seq)));
/* Print all the LS adv's */
lshp = op->ospf_db.db_lshdr;
ND_PRINT((ndo, "\n\t Advertising Router: %s, %s LSA (%u)",
ipaddr_string(ndo, &lsrp->ls_router),
- tok2str(lsa_values,"unknown",EXTRACT_32BITS(lsrp->ls_type)),
- EXTRACT_32BITS(&lsrp->ls_type)));
+ tok2str(lsa_values,"unknown",EXTRACT_BE_U_4(lsrp->ls_type)),
+ EXTRACT_BE_U_4(&lsrp->ls_type)));
- switch (EXTRACT_32BITS(lsrp->ls_type)) {
+ switch (EXTRACT_BE_U_4(lsrp->ls_type)) {
/* the LSA header for opaque LSAs was slightly changed */
case LS_TYPE_OPAQUE_LL:
case LS_TYPE_OPAQUE_AL:
ND_PRINT((ndo, ", Opaque-Type: %s LSA (%u), Opaque-ID: %u",
tok2str(lsa_opaque_values, "unknown",lsrp->un_ls_stateid.opaque_field.opaque_type),
lsrp->un_ls_stateid.opaque_field.opaque_type,
- EXTRACT_24BITS(&lsrp->un_ls_stateid.opaque_field.opaque_id)));
+ EXTRACT_BE_U_3(&lsrp->un_ls_stateid.opaque_field.opaque_id)));
break;
default:
ND_PRINT((ndo, ", LSA-ID: %s",
case OSPF_TYPE_LS_UPDATE:
lsap = op->ospf_lsu.lsu_lsa;
ND_TCHECK(op->ospf_lsu.lsu_count);
- lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count);
+ lsa_count_max = EXTRACT_BE_U_4(&op->ospf_lsu.lsu_count);
ND_PRINT((ndo, ", %d LSA%s", lsa_count_max, PLURAL_SUFFIX(lsa_count_max)));
for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) {
ND_PRINT((ndo, "\n\t LSA #%u", lsa_count));
/* XXX Before we do anything else, strip off the MD5 trailer */
ND_TCHECK(op->ospf_authtype);
- if (EXTRACT_16BITS(&op->ospf_authtype) == OSPF_AUTH_MD5) {
+ if (EXTRACT_BE_U_2(&op->ospf_authtype) == OSPF_AUTH_MD5) {
length -= OSPF_AUTH_MD5_LEN;
ndo->ndo_snapend -= OSPF_AUTH_MD5_LEN;
}
/* 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->ospf_type);
- cp = tok2str(type2str, "unknown LS-type", op->ospf_type);
+ cp = tok2str(type2str, "unknown LS-type %u", op->ospf_type);
ND_PRINT((ndo, "OSPFv%u, %s, length %u", op->ospf_version, cp, length));
if (*cp == 'u')
return;
}
ND_TCHECK(op->ospf_len);
- if (length != EXTRACT_16BITS(&op->ospf_len)) {
- ND_PRINT((ndo, " [len %d]", EXTRACT_16BITS(&op->ospf_len)));
+ if (length != EXTRACT_BE_U_2(&op->ospf_len)) {
+ ND_PRINT((ndo, " [len %d]", EXTRACT_BE_U_2(&op->ospf_len)));
}
- if (length > EXTRACT_16BITS(&op->ospf_len)) {
- dataend = bp + EXTRACT_16BITS(&op->ospf_len);
+ if (length > EXTRACT_BE_U_2(&op->ospf_len)) {
+ dataend = bp + EXTRACT_BE_U_2(&op->ospf_len);
} else {
dataend = bp + length;
}
ND_TCHECK2(op->ospf_authdata[0], sizeof(op->ospf_authdata));
ND_PRINT((ndo, ", Authentication Type: %s (%u)",
- tok2str(ospf_authtype_values, "unknown", EXTRACT_16BITS(&op->ospf_authtype)),
- EXTRACT_16BITS(&op->ospf_authtype)));
+ tok2str(ospf_authtype_values, "unknown", EXTRACT_BE_U_2(&op->ospf_authtype)),
+ EXTRACT_BE_U_2(&op->ospf_authtype)));
- switch (EXTRACT_16BITS(&op->ospf_authtype)) {
+ switch (EXTRACT_BE_U_2(&op->ospf_authtype)) {
case OSPF_AUTH_NONE:
break;
ND_PRINT((ndo, "\n\tKey-ID: %u, Auth-Length: %u, Crypto Sequence Number: 0x%08x",
*((op->ospf_authdata) + 2),
*((op->ospf_authdata) + 3),
- EXTRACT_32BITS((op->ospf_authdata) + 4)));
+ EXTRACT_BE_U_4((op->ospf_authdata) + 4)));
break;
default:
/* ospf version 2 */
if (ospf_decode_v2(ndo, op, dataend))
goto trunc;
- if (length > EXTRACT_16BITS(&op->ospf_len)) {
+ if (length > EXTRACT_BE_U_2(&op->ospf_len)) {
if (ospf_decode_lls(ndo, op, length))
goto trunc;
}