summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-mpls-echo.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-mpls-echo.c')
-rw-r--r--epan/dissectors/packet-mpls-echo.c82
1 files changed, 49 insertions, 33 deletions
diff --git a/epan/dissectors/packet-mpls-echo.c b/epan/dissectors/packet-mpls-echo.c
index f25049c4db..6dc5c8db31 100644
--- a/epan/dissectors/packet-mpls-echo.c
+++ b/epan/dissectors/packet-mpls-echo.c
@@ -229,6 +229,13 @@ static gint ett_mpls_echo_tlv_ilso = -1;
static gint ett_mpls_echo_tlv_dd_map = -1;
static gint ett_mpls_echo_tlv_ddstlv_map = -1;
+static expert_field ei_mpls_echo_tlv_fec_len = EI_INIT;
+static expert_field ei_mpls_echo_tlv_dd_map_subtlv_len = EI_INIT;
+static expert_field ei_mpls_echo_tlv_len = EI_INIT;
+static expert_field ei_mpls_echo_tlv_ds_map_muti_len = EI_INIT;
+static expert_field ei_mpls_echo_unknown_address_type = EI_INIT;
+static expert_field ei_mpls_echo_incorrect_address_type = EI_INIT;
+
static guint global_mpls_echo_udp_port = UDP_PORT_MPLS_ECHO;
static const value_string mpls_echo_msgtype[] = {
@@ -542,7 +549,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
}
if (length + 4 > rem) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length (claimed %u, found %u)",
length, rem - 4);
return;
@@ -568,7 +575,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
break;
case TLV_FEC_STACK_RSVP_IPv4:
if (length != 20) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be %u)",
length, 20);
@@ -593,7 +600,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
break;
case TLV_FEC_STACK_RSVP_IPv6:
if (length != 56) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be %u)",
length, 56);
@@ -662,7 +669,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
break;
case TLV_FEC_STACK_L2_CID_NEW:
if (length < 14) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be %u)",
length, 14);
@@ -683,7 +690,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
break;
case TLV_FEC_VENDOR_PRIVATE_START:
if (length < 4) { /* SMI Enterprise code */
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be >= %u)",
length, 4);
@@ -747,7 +754,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
break;
case TLV_FEC_STACK_P2MP_IPv4:
if (length != 20) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be %u)",
length, 20);
@@ -777,7 +784,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
case TLV_FEC_STACK_P2MP_IPv6:
if (length != 56) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Length "
"(claimed %u, should be %u)",
length, 56);
@@ -857,7 +864,7 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto
if (length % 4) {
pad = 4 - (length % 4);
if (length + 4 + pad > rem) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_fec_len,
"Invalid FEC Sub-TLV Padded Length (claimed %u, found %u)",
length + pad, rem - 4);
return;
@@ -932,7 +939,7 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
(offset + 8), 4, ENC_BIG_ENDIAN);
break;
default:
- expert_add_info_format(pinfo, addr_ti, PI_UNDECODED, PI_WARN,
+ expert_add_info_format_text(pinfo, addr_ti, &ei_mpls_echo_unknown_address_type,
"Unknown Address Type (%u)", addr_type);
break;
}
@@ -950,7 +957,7 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
rem -= 16;
offset += 16;
if (rem < mplen) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
"Invalid FEC Multipath (claimed %u, found %u)",
mplen, rem);
return;
@@ -960,7 +967,7 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
switch (hash_type) {
case TLV_DS_MAP_HASH_IP:
if (mplen != 4) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
"Invalid FEC Multipath (claimed %u, should be 4)",
mplen);
break;
@@ -973,7 +980,7 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
break;
case TLV_DS_MAP_HASH_IP_RANGE:
if (mplen != 8) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
"Invalid FEC Multipath (claimed %u, should be 8)",
mplen);
break;
@@ -995,7 +1002,7 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
break;
case TLV_DS_MAP_HASH_BITMASK_IP:
if (mplen < 4) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_ds_map_muti_len,
"Invalid FEC Multipath (claimed %u, should be 4)",
mplen);
break;
@@ -1101,7 +1108,7 @@ dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
(offset + 8), 4, ENC_BIG_ENDIAN);
break;
default:
- expert_add_info_format(pinfo, ddti, PI_UNDECODED, PI_WARN,
+ expert_add_info_format_text(pinfo, ddti, &ei_mpls_echo_unknown_address_type,
"Unknown Address Type (%u)", addr_type);
break;
}
@@ -1126,7 +1133,7 @@ dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
offset += 4;
if (rem<subtlv_length){
- expert_add_info_format(pinfo, ddti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
"Invalid Sub-tlv Length (claimed %u, found %u)",
subtlv_length, rem);
return;
@@ -1159,7 +1166,7 @@ dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
case TLV_MULTIPATH_IP_ADDRESS:
if (multipath_length != 4) {
- expert_add_info_format(pinfo, ddsti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
"Invalid Sub-tlv Length (claimed %u, should be 4)",
multipath_length);
break;
@@ -1183,7 +1190,7 @@ dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
case TLV_MULTIPATH_IP_ADDRESS_RANGE:
if (multipath_length != 8) {
- expert_add_info_format(pinfo, ddsti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
"Invalid Sub-tlv Length (claimed %u, should be 8)",
multipath_length);
break;
@@ -1209,7 +1216,7 @@ dissect_mpls_echo_tlv_dd_map(tvbuff_t *tvb, packet_info *pinfo, guint offset, pr
case TLV_MULTIPATH_BIT_MASKED_IP:
if (multipath_length < 4) {
- expert_add_info_format(pinfo, ddsti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ddsti, &ei_mpls_echo_tlv_dd_map_subtlv_len,
"Invalid Sub-tlv Length (claimed %u, should be >= 4)",
multipath_length);
break;
@@ -1348,8 +1355,7 @@ dissect_mpls_echo_tlv_ilso(tvbuff_t *tvb, packet_info *pinfo, guint offset, prot
if ((type == TLV_ADDR_IPv4) || (type == TLV_ADDR_UNNUM_IPv4)) {
if (is_ipv6) {
- expert_add_info_format(pinfo, ti, PI_PROTOCOL, PI_WARN,
- "Incorrect address type for TLV?");
+ expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
}
proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_addr, tvb,
offset, 4, ENC_BIG_ENDIAN);
@@ -1364,8 +1370,7 @@ dissect_mpls_echo_tlv_ilso(tvbuff_t *tvb, packet_info *pinfo, guint offset, prot
rem -= 8;
} else if ((type == TLV_ADDR_IPv6) || (type == TLV_ADDR_UNNUM_IPv6)) {
if (!is_ipv6) {
- expert_add_info_format(pinfo, ti, PI_PROTOCOL, PI_WARN,
- "Incorrect address type for TLV?");
+ expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
}
proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_addr, tvb,
@@ -1382,8 +1387,7 @@ dissect_mpls_echo_tlv_ilso(tvbuff_t *tvb, packet_info *pinfo, guint offset, prot
rem -= 20;
}
} else {
- expert_add_info_format(pinfo, ti, PI_UNDECODED, PI_WARN,
- "Incorrect address type for TLV?");
+ expert_add_info(pinfo, ti, &ei_mpls_echo_incorrect_address_type);
return;
}
@@ -1511,7 +1515,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
break;
case TLV_ILSO_IPv4:
if (length < 12) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be >= 12)",
length);
break;
@@ -1520,7 +1524,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
break;
case TLV_ILSO_IPv6:
if (length < 24) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be >= 24)",
length);
break;
@@ -1551,7 +1555,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
#endif
case TLV_P2MP_ECHO_JITTER:
if (length != 4) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be 4)",
length);
break;
@@ -1570,7 +1574,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
case TLV_P2MP_RESPONDER_IDENT_IPV4_EGRESS_ADDR:
case TLV_P2MP_RESPONDER_IDENT_IPV4_NODE_ADDR:
if (resp_ident_len != 4) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be 4)",
length);
break;
@@ -1587,7 +1591,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
case TLV_P2MP_RESPONDER_IDENT_IPV6_EGRESS_ADDR:
case TLV_P2MP_RESPONDER_IDENT_IPV6_NODE_ADDR:
if (resp_ident_len != 16) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be 16)",
length);
break;
@@ -1605,7 +1609,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
}
case TLV_VENDOR_PRIVATE_START:
if (length < 4) { /* SMI Enterprise code */
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be >= 4)",
length);
} else {
@@ -1617,7 +1621,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
break;
case TLV_DOWNSTREAM_MAPPING:
if (length < 16) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be >= 16)",
length);
break;
@@ -1626,7 +1630,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
break;
case TLV_DETAILED_DOWNSTREAM: /* [RFC 6424] */
if (length < 16) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be >= 16)",
length);
break;
@@ -1642,7 +1646,7 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, packet_info *pinfo, guint offset, proto_tre
break;
case TLV_REPLY_TOS:
if (length != 4) {
- expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR,
+ expert_add_info_format_text(pinfo, ti, &ei_mpls_echo_tlv_len,
"Invalid TLV Length (claimed %u, should be 4)",
length);
break;
@@ -2523,13 +2527,25 @@ proto_register_mpls_echo(void)
&ett_mpls_echo_tlv_ddstlv_map
};
+ static ei_register_info ei[] = {
+ { &ei_mpls_echo_tlv_fec_len, { "mpls_echo.tlv.fec.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid FEC TLV length", EXPFILL }},
+ { &ei_mpls_echo_tlv_dd_map_subtlv_len, { "mpls_echo.tlv.dd_map.subtlv_len.invalid", PI_MALFORMED, PI_ERROR, "Invalid Sub-TLV length", EXPFILL }},
+ { &ei_mpls_echo_tlv_len, { "mpls_echo.tlv.len.invalid", PI_MALFORMED, PI_ERROR, "Invalid TLV length", EXPFILL }},
+ { &ei_mpls_echo_tlv_ds_map_muti_len, { "mpls_echo.tlv.ds_map.multi_len.invalid", PI_MALFORMED, PI_ERROR, "Invalid Multipath TLV length", EXPFILL }},
+ { &ei_mpls_echo_unknown_address_type, { "mpls_echo.address_type.unknown", PI_UNDECODED, PI_WARN, "Unknown Address Type", EXPFILL }},
+ { &ei_mpls_echo_incorrect_address_type, { "mpls_echo.address_type.incorrect", PI_PROTOCOL, PI_WARN, "Incorrect address type for TLV?", EXPFILL }},
+ };
+
module_t *mpls_echo_module;
+ expert_module_t* expert_mpls_echo;
proto_mpls_echo = proto_register_protocol("Multiprotocol Label Switching Echo",
"MPLS Echo", "mpls-echo");
proto_register_field_array(proto_mpls_echo, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+ expert_mpls_echo = expert_register_protocol(proto_mpls_echo);
+ expert_register_field_array(expert_mpls_echo, ei, array_length(ei));
mpls_echo_module = prefs_register_protocol(proto_mpls_echo, proto_reg_handoff_mpls_echo);
prefs_register_uint_preference(mpls_echo_module, "udp.port", "MPLS Echo UDP Port",