aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bfd.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2011-11-28 17:13:45 +0000
committerAnders Broman <anders.broman@ericsson.com>2011-11-28 17:13:45 +0000
commit2cd8cf96f9fcf57223fc8e1a5cfdfb2b9854fd84 (patch)
tree67f66cd8ec5ffb2f5ade7e8e0360a0ad56011f36 /epan/dissectors/packet-bfd.c
parent947399180fe6fbfc0bf1cd507e04ed62de1ffde7 (diff)
From Krishnamurthy Mayya:
BFD extension has been added as per RFC 6428, to decode the BFD packet with ACH encapsulation(without IP/UDP header encapsulation). The channel type in ACH header identifies the BFD payload as BFD CC or CV packet. Also decoding for MPLS-TP source MEP-ID TLV in BFD CV packet has been added. https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6610#add_comment svn path=/trunk/; revision=40027
Diffstat (limited to 'epan/dissectors/packet-bfd.c')
-rw-r--r--epan/dissectors/packet-bfd.c200
1 files changed, 197 insertions, 3 deletions
diff --git a/epan/dissectors/packet-bfd.c b/epan/dissectors/packet-bfd.c
index 7b217de900..08db74e778 100644
--- a/epan/dissectors/packet-bfd.c
+++ b/epan/dissectors/packet-bfd.c
@@ -40,6 +40,18 @@
#define UDP_PORT_BFD_1HOP_CONTROL 3784 /* draft-katz-ward-bfd-v4v6-1hop-00.txt */
#define UDP_PORT_BFD_MULTIHOP_CONTROL 4784 /* draft-ietf-bfd-multihop-05.txt */
+/* As per RFC 6428 : http://tools.ietf.org/html/rfc6428
+ Section: 3.5 */
+#define TLV_TYPE_MPLSTP_SECTION_MEP 0
+#define TLV_TYPE_MPLSTP_LSP_MEP 1
+#define TLV_TYPE_MPLSTP_PW_MEP 2
+
+static const value_string mplstp_mep_tlv_type_values [] = {
+ { TLV_TYPE_MPLSTP_SECTION_MEP, "Section MEP-ID" },
+ { TLV_TYPE_MPLSTP_LSP_MEP, "LSP MEP-ID" },
+ { TLV_TYPE_MPLSTP_PW_MEP, "PW MEP-ID" },
+ { 0, NULL}
+};
static const value_string bfd_control_v0_diag_values[] = {
{ 0, "No Diagnostic" },
{ 1, "Control Detection Time Expired" },
@@ -62,6 +74,7 @@ static const value_string bfd_control_v1_diag_values[] = {
{ 6, "Concatenated Path Down" },
{ 7, "Administratively Down" },
{ 8, "Reverse Concatenated Path Down" },
+ { 9, "Mis-Connectivity Defect" },
{ 0, NULL }
};
@@ -142,6 +155,18 @@ static gint ett_bfd = -1;
static gint ett_bfd_flags = -1;
static gint ett_bfd_auth = -1;
+static gint hf_mep_type = -1;
+static gint hf_mep_len = -1;
+static gint hf_mep_global_id = -1;
+static gint hf_mep_node_id = -1;
+static gint hf_mep_interface_no = -1;
+static gint hf_mep_tunnel_no = -1;
+static gint hf_mep_lsp_no = -1;
+static gint hf_mep_ac_id = -1;
+static gint hf_mep_agi_type = -1;
+static gint hf_mep_agi_len = -1;
+static gint hf_mep_agi_val = -1;
+static gint hf_section_interface_no = -1;
/*
* Control packet version 0, draft-katz-ward-bfd-01.txt
*
@@ -332,7 +357,7 @@ static void dissect_bfd_authentication(tvbuff_t *tvb, packet_info *pinfo, proto_
}
-static void dissect_bfd_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+void dissect_bfd_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
gint bfd_version = -1;
gint bfd_diag = -1;
@@ -389,7 +414,6 @@ static void dissect_bfd_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
}
bfd_detect_time_multiplier = tvb_get_guint8(tvb, 2);
bfd_length = tvb_get_guint8(tvb, 3);
-
bfd_my_discriminator = tvb_get_ntohl(tvb, 4);
bfd_your_discriminator = tvb_get_ntohl(tvb, 8);
bfd_desired_min_tx_interval = tvb_get_ntohl(tvb, 12);
@@ -412,7 +436,7 @@ static void dissect_bfd_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
}
if (tree) {
- ti = proto_tree_add_protocol_format(tree, proto_bfd, tvb, 0, -1,
+ ti = proto_tree_add_protocol_format(tree, proto_bfd, tvb, 0, bfd_length,
"BFD Control message");
bfd_tree = proto_item_add_subtree(ti, ett_bfd);
@@ -526,6 +550,116 @@ static void dissect_bfd_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
}
return;
}
+/* BFD CV Source MEP-ID TLV Decoder,
+ As per RFC 6428 : http://tools.ietf.org/html/rfc6428
+ sections - 3.5.1, 3.5.2, 3.5.3 */
+void dissect_bfd_mep (tvbuff_t *tvb, proto_tree *tree)
+{
+ gint offset = 0, mep_offset = 0;
+ gint mep_type = -1;
+ gint mep_len = -1;
+ gint mep_global_id = -1;
+ gint mep_node_id = -1;
+ gint mep_tunnel_no = -1;
+ gint mep_lsp_no = -1;
+ gint mep_ac_id = -1;
+ gint mep_agi_type = -1;
+ gint mep_agi_len = -1;
+ gint section_global_id = -1;
+ gint section_node_id = -1;
+ gint section_interface_num = -1;
+ proto_item *ti;
+ proto_tree *bfd_tree;
+
+ /* Fetch the BFD control message length and move the offset
+ to point to the data portion after the control message */
+ mep_offset = tvb_get_guint8 ( tvb, (offset + 3));
+ offset = mep_offset;
+ mep_type = tvb_get_ntohs (tvb, offset);
+ mep_len = tvb_get_ntohs (tvb, (offset + 2));
+ ti = proto_tree_add_protocol_format (tree, proto_bfd, tvb, offset, (mep_len + 4),
+ "MPLS-TP SOURCE MEP-ID TLV");
+
+ switch (mep_type) {
+ case TLV_TYPE_MPLSTP_SECTION_MEP:
+
+ section_global_id = tvb_get_ntohl (tvb, (offset + 4));
+ section_node_id = tvb_get_ipv4 (tvb, (offset + 8));
+ section_interface_num = tvb_get_ntohl (tvb, (offset + 12));
+ if (tree) {
+ bfd_tree = proto_item_add_subtree (ti, ett_bfd);
+ proto_tree_add_uint (bfd_tree, hf_mep_type , tvb, offset,
+ 2, mep_type);
+ proto_tree_add_uint (bfd_tree, hf_mep_len, tvb, (offset + 2),
+ 2, mep_len);
+ proto_tree_add_uint (bfd_tree, hf_mep_global_id, tvb, (offset + 4),
+ 4, section_global_id);
+ proto_tree_add_ipv4 (bfd_tree, hf_mep_node_id, tvb, (offset + 8),
+ 4, section_node_id);
+ proto_tree_add_uint (bfd_tree, hf_section_interface_no, tvb, (offset + 12),
+ 4, section_interface_num);
+ }
+
+ break;
+
+ case TLV_TYPE_MPLSTP_LSP_MEP:
+
+ mep_global_id = tvb_get_ntohl (tvb, (offset + 4));
+ mep_node_id = tvb_get_ipv4 (tvb, (offset + 8));
+ mep_tunnel_no = tvb_get_ntohs (tvb, (offset + 12));
+ mep_lsp_no = tvb_get_ntohs (tvb, (offset + 14));
+ if (tree) {
+ bfd_tree = proto_item_add_subtree (ti, ett_bfd);
+ proto_tree_add_uint (bfd_tree, hf_mep_type , tvb, offset,
+ 2, mep_type);
+ proto_tree_add_uint (bfd_tree, hf_mep_len, tvb, (offset + 2),
+ 2, mep_len);
+ proto_tree_add_uint (bfd_tree, hf_mep_global_id, tvb, (offset + 4),
+ 4, mep_global_id);
+ proto_tree_add_ipv4 (bfd_tree, hf_mep_node_id, tvb, (offset + 8),
+ 4, mep_node_id);
+ proto_tree_add_uint (bfd_tree, hf_mep_tunnel_no, tvb, (offset + 12),
+ 2, mep_tunnel_no);
+ proto_tree_add_uint (bfd_tree, hf_mep_lsp_no, tvb, (offset + 14),
+ 2, mep_lsp_no);
+ }
+
+ break;
+
+ case TLV_TYPE_MPLSTP_PW_MEP:
+
+ mep_global_id = tvb_get_ntohl (tvb, (offset + 4));
+ mep_node_id = tvb_get_ipv4 (tvb, (offset + 8));
+ mep_ac_id = tvb_get_ntohl (tvb, (offset + 12));
+ mep_agi_type = tvb_get_guint8 (tvb, (offset + 16));
+ mep_agi_len = tvb_get_guint8 (tvb, (offset + 17));
+ if (tree) {
+ bfd_tree = proto_item_add_subtree (ti, ett_bfd);
+ proto_tree_add_uint (bfd_tree, hf_mep_type, tvb, offset,
+ 2, (mep_type));
+ proto_tree_add_uint (bfd_tree, hf_mep_len, tvb, (offset + 2),
+ 2, mep_len);
+ proto_tree_add_uint (bfd_tree, hf_mep_global_id, tvb, (offset + 4),
+ 4, mep_global_id);
+ proto_tree_add_ipv4 (bfd_tree, hf_mep_node_id, tvb, (offset + 8),
+ 4, mep_node_id);
+ proto_tree_add_uint (bfd_tree, hf_mep_ac_id, tvb, (offset + 12),
+ 4, mep_ac_id);
+ proto_tree_add_uint (bfd_tree, hf_mep_agi_type, tvb, (offset + 16),
+ 1, mep_agi_type);
+ proto_tree_add_uint (bfd_tree, hf_mep_agi_len, tvb, (offset + 17),
+ 1, mep_agi_len);
+ proto_tree_add_item (bfd_tree, hf_mep_agi_val, tvb, (offset + 18),
+ mep_agi_len, ENC_BIG_ENDIAN);
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ return;
+}
/* Register the protocol with Wireshark */
void proto_register_bfd(void)
@@ -664,6 +798,66 @@ void proto_register_bfd(void)
{ "Sequence Number", "bfd.auth.seq_num",
FT_UINT32, BASE_HEX, NULL, 0x0,
"The Sequence Number is periodically incremented to prevent replay attacks", HFILL }
+ },
+ { &hf_mep_type,
+ { "Type", "mep.type",
+ FT_UINT16, BASE_DEC, VALS(mplstp_mep_tlv_type_values), 0x0,
+ "The type of the MEP Id", HFILL }
+ },
+ { &hf_mep_len,
+ { "Length", "mep.len",
+ FT_UINT16, BASE_DEC, NULL , 0x0,
+ "The length of the MEP Id", HFILL }
+ },
+ { &hf_mep_global_id,
+ { "Global Id", "mep.global.id",
+ FT_UINT32, BASE_DEC, NULL , 0x0,
+ "MPLS-TP Global MEP Id", HFILL }
+ },
+ { &hf_mep_node_id,
+ { "Node Id", "mep.node.id",
+ FT_IPv4, BASE_NONE, NULL , 0x0,
+ "MPLS-TP Node Identifier", HFILL }
+ },
+ { &hf_mep_interface_no,
+ { "Interface Number", "mep.interface.no",
+ FT_UINT32, BASE_DEC, NULL , 0x0,
+ "MPLS-TP Interface Number", HFILL }
+ },
+ { &hf_mep_tunnel_no,
+ { "Tunnel Number", "mep.tunnel.no",
+ FT_UINT16, BASE_DEC, NULL , 0x0,
+ "Tunnel Number", HFILL }
+ },
+ { &hf_mep_lsp_no,
+ { "LSP Number", "mep.lsp.no",
+ FT_UINT16, BASE_DEC, NULL , 0x0,
+ "LSP Number", HFILL }
+ },
+ { &hf_mep_ac_id,
+ { "AC Id", "mep.ac.id",
+ FT_UINT32, BASE_DEC, NULL , 0x0,
+ "AC Identifier", HFILL }
+ },
+ { &hf_mep_agi_type,
+ { "AGI TYPE", "mep.agi.type",
+ FT_UINT8, BASE_DEC, NULL , 0x0,
+ "AGI TYPE", HFILL }
+ },
+ { &hf_mep_agi_len,
+ { "AGI Length", "mep.agi.len",
+ FT_UINT8, BASE_DEC, NULL , 0x0,
+ "AGI Length", HFILL }
+ },
+ { &hf_mep_agi_val,
+ { "AGI value", "mep.agi.val",
+ FT_STRING, BASE_NONE, NULL , 0x0,
+ "AGI String", HFILL }
+ },
+ { &hf_section_interface_no,
+ { "Interface Number", "mep.interface.no",
+ FT_UINT32, BASE_DEC, NULL , 0x0,
+ "MPLS-TP Interface Number", HFILL }
}
};