From 851f5f90b2acebef085113d04c1edf7f22065421 Mon Sep 17 00:00:00 2001 From: etxrab Date: Mon, 28 Nov 2011 17:13:45 +0000 Subject: [PATCH] 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 git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@40027 f5534014-38df-0310-8fa8-9805f1628bb7 --- epan/dissectors/packet-bfd.c | 200 ++++++++++++++++++++++++++++++++++- 1 file 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 } } }; -- 2.34.1