diff options
author | Bill Meier <wmeier@newsguy.com> | 2012-05-15 19:23:35 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2012-05-15 19:23:35 +0000 |
commit | d53320919a29ca233356b649919e7a379d872140 (patch) | |
tree | 2eee7510e84a75f25f38247e9e42033c30f106cc /epan/dissectors/packet-mpls-echo.c | |
parent | 3e4b3756fd7262b47c1f303c99c0ddf6324a8ea5 (diff) |
Remove unneeded #includes (stdlib, stdio, ctypes, time);
In a few cases: do some whitespace, indentation cleanup & reformatting.
svn path=/trunk/; revision=42632
Diffstat (limited to 'epan/dissectors/packet-mpls-echo.c')
-rw-r--r-- | epan/dissectors/packet-mpls-echo.c | 2572 |
1 files changed, 1286 insertions, 1286 deletions
diff --git a/epan/dissectors/packet-mpls-echo.c b/epan/dissectors/packet-mpls-echo.c index c2776e82c9..a6881a3d7a 100644 --- a/epan/dissectors/packet-mpls-echo.c +++ b/epan/dissectors/packet-mpls-echo.c @@ -12,7 +12,7 @@ * Krishnamurthy Mayya <krishnamurthy.mayya@ipinfusion.com> * Nikitha Malgi <malgi.nikitha@ipinfusion.com> * - Support for LSP Ping extensions as per RFC 6426 - * + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -32,8 +32,8 @@ # include "config.h" #endif -#include <stdlib.h> #include <glib.h> + #include <epan/packet.h> #include <epan/prefs.h> #include <epan/sminmpec.h> @@ -164,42 +164,42 @@ static gint ett_mpls_echo_tlv_ilso = -1; static guint global_mpls_echo_udp_port = UDP_PORT_MPLS_ECHO; static const value_string mpls_echo_msgtype[] = { - {1, "MPLS Echo Request"}, - {2, "MPLS Echo Reply"}, - {3, "MPLS Data Plane Verification Request"}, - {4, "MPLS Data Plane Verification Reply"}, - {0, NULL} + {1, "MPLS Echo Request"}, + {2, "MPLS Echo Reply"}, + {3, "MPLS Data Plane Verification Request"}, + {4, "MPLS Data Plane Verification Reply"}, + {0, NULL} }; static const value_string mpls_echo_replymode[] = { - {1, "Do not reply"}, - {2, "Reply via an IPv4/IPv6 UDP packet"}, - {3, "Reply via an IPv4/IPv6 UDP packet with Router Alert"}, - {4, "Reply via application level control channel"}, - {0, NULL} + {1, "Do not reply"}, + {2, "Reply via an IPv4/IPv6 UDP packet"}, + {3, "Reply via an IPv4/IPv6 UDP packet with Router Alert"}, + {4, "Reply via application level control channel"}, + {0, NULL} }; /* http://www.iana.org/assignments/mpls-lsp-ping-parameters/mpls-lsp-ping-parameters.xml */ static const value_string mpls_echo_returncode[] = { - {0, "No return code"}, - {1, "Malformed echo request received"}, - {2, "One or more of the TLVs was not understood"}, - {3, "Replying router is an egress for the FEC at stack depth RSC"}, - {4, "Replying router has no mapping for the FEC at stack depth RSC"}, - {5, "Downstream Mapping Mismatch"}, /*[RFC4379] */ - {6, "Upstream Interface Index Unknown"}, /*[RFC4379]*/ - {7, "Reserved"}, - {8, "Label switched at stack-depth RSC"}, - {9, "Label switched but no MPLS forwarding at stack-depth RSC"}, - {10, "Mapping for this FEC is not the given label at stack depth RSC"}, - {11, "No label entry at stack-depth RSC"}, - {12, "Protocol not associated with interface at FEC stack depth RSC"}, - {13, "Premature termination, label stack shrinking to a single label"}, - {14, "See DDM TLV for meaning of Return Code and Return SubCode"}, /*[RFC6424] */ - {15, "Label switched with FEC change"}, /*[RFC6424] */ - /* 16-251 Unassigned */ - /* 252-255 Reserved for Vendor private use [RFC4379 */ - {0, NULL} + {0, "No return code"}, + {1, "Malformed echo request received"}, + {2, "One or more of the TLVs was not understood"}, + {3, "Replying router is an egress for the FEC at stack depth RSC"}, + {4, "Replying router has no mapping for the FEC at stack depth RSC"}, + {5, "Downstream Mapping Mismatch"}, /*[RFC4379] */ + {6, "Upstream Interface Index Unknown"}, /*[RFC4379]*/ + {7, "Reserved"}, + {8, "Label switched at stack-depth RSC"}, + {9, "Label switched but no MPLS forwarding at stack-depth RSC"}, + {10, "Mapping for this FEC is not the given label at stack depth RSC"}, + {11, "No label entry at stack-depth RSC"}, + {12, "Protocol not associated with interface at FEC stack depth RSC"}, + {13, "Premature termination, label stack shrinking to a single label"}, + {14, "See DDM TLV for meaning of Return Code and Return SubCode"}, /*[RFC6424] */ + {15, "Label switched with FEC change"}, /*[RFC6424] */ + /* 16-251 Unassigned */ + /* 252-255 Reserved for Vendor private use [RFC4379 */ + {0, NULL} }; #define TLV_TARGET_FEC_STACK 0x0001 @@ -224,126 +224,126 @@ static const value_string mpls_echo_returncode[] = { /* MPLS Echo TLV Type names */ static const value_string mpls_echo_tlv_type_names[] = { - { TLV_TARGET_FEC_STACK, "Target FEC Stack" }, - { TLV_DOWNSTREAM_MAPPING, "Downstream Mapping" }, - { TLV_PAD, "Pad" }, - { TLV_ERROR_CODE, "Error Code" }, - { TLV_VENDOR_CODE, "Vendor Enterprise Code" }, - { TLV_TBD, "TDB" }, - { TLV_ILSO_IPv4, "IPv4 Interface and Label Stack Object" }, - { TLV_ILSO_IPv6, "IPv6 Interface and Label Stack Object" }, - { TLV_ERRORED_TLV, "Errored TLVs" }, - { TLV_REPLY_TOS, "Reply TOS Byte" }, - { TLV_RTO_IPv4, "IPv4 Reply-to Object" }, - { TLV_RTO_IPv6, "IPv6 Reply-to Object" }, - { TLV_VENDOR_PRIVATE_START, "Vendor Private" }, - { TLV_REVERSE_PATH_FEC_STACK, "Reverse-path Target FEC Stack" }, - { TLV_SRC_IDENTIFIER, "Source Identifier TLV" }, - { TLV_DST_IDENTIFIER, "Destination Identifier TLV" }, - { 0, NULL} + { TLV_TARGET_FEC_STACK, "Target FEC Stack" }, + { TLV_DOWNSTREAM_MAPPING, "Downstream Mapping" }, + { TLV_PAD, "Pad" }, + { TLV_ERROR_CODE, "Error Code" }, + { TLV_VENDOR_CODE, "Vendor Enterprise Code" }, + { TLV_TBD, "TDB" }, + { TLV_ILSO_IPv4, "IPv4 Interface and Label Stack Object" }, + { TLV_ILSO_IPv6, "IPv6 Interface and Label Stack Object" }, + { TLV_ERRORED_TLV, "Errored TLVs" }, + { TLV_REPLY_TOS, "Reply TOS Byte" }, + { TLV_RTO_IPv4, "IPv4 Reply-to Object" }, + { TLV_RTO_IPv6, "IPv6 Reply-to Object" }, + { TLV_VENDOR_PRIVATE_START, "Vendor Private" }, + { TLV_REVERSE_PATH_FEC_STACK, "Reverse-path Target FEC Stack" }, + { TLV_SRC_IDENTIFIER, "Source Identifier TLV" }, + { TLV_DST_IDENTIFIER, "Destination Identifier TLV" }, + { 0, NULL} }; -#define TLV_FEC_STACK_LDP_IPv4 1 -#define TLV_FEC_STACK_LDP_IPv6 2 -#define TLV_FEC_STACK_RSVP_IPv4 3 -#define TLV_FEC_STACK_RSVP_IPv6 4 -#define TLV_FEC_STACK_RES 5 -#define TLV_FEC_STACK_VPN_IPv4 6 -#define TLV_FEC_STACK_VPN_IPv6 7 -#define TLV_FEC_STACK_L2_VPN 8 -#define TLV_FEC_STACK_L2_CID_OLD 9 -#define TLV_FEC_STACK_L2_CID_NEW 10 -#define TLV_FEC_STACK_L2_FEC_129 11 -#define TLV_FEC_STACK_BGP_LAB_v4 12 -#define TLV_FEC_STACK_BGP_LAB_v6 13 -#define TLV_FEC_STACK_GEN_IPv4 14 -#define TLV_FEC_STACK_GEN_IPv6 15 -#define TLV_FEC_STACK_NIL 16 +#define TLV_FEC_STACK_LDP_IPv4 1 +#define TLV_FEC_STACK_LDP_IPv6 2 +#define TLV_FEC_STACK_RSVP_IPv4 3 +#define TLV_FEC_STACK_RSVP_IPv6 4 +#define TLV_FEC_STACK_RES 5 +#define TLV_FEC_STACK_VPN_IPv4 6 +#define TLV_FEC_STACK_VPN_IPv6 7 +#define TLV_FEC_STACK_L2_VPN 8 +#define TLV_FEC_STACK_L2_CID_OLD 9 +#define TLV_FEC_STACK_L2_CID_NEW 10 +#define TLV_FEC_STACK_L2_FEC_129 11 +#define TLV_FEC_STACK_BGP_LAB_v4 12 +#define TLV_FEC_STACK_BGP_LAB_v6 13 +#define TLV_FEC_STACK_GEN_IPv4 14 +#define TLV_FEC_STACK_GEN_IPv6 15 +#define TLV_FEC_STACK_NIL 16 /*As per RFC 6426, http://tools.ietf.org/html/rfc6426 Section: 2.3 */ -#define TLV_FEC_STACK_STATIC_LSP 22 -#define TLV_FEC_STACK_STATIC_PW 23 +#define TLV_FEC_STACK_STATIC_LSP 22 +#define TLV_FEC_STACK_STATIC_PW 23 #define TLV_FEC_VENDOR_PRIVATE_START 0xFC00 #define TLV_FEC_VENDOR_PRIVATE_END 0xFFFF /* FEC sub-TLV Type names */ static const value_string mpls_echo_tlv_fec_names[] = { - { TLV_FEC_STACK_LDP_IPv4, "LDP IPv4 prefix"}, - { TLV_FEC_STACK_LDP_IPv6, "LDP IPv6 prefix"}, - { TLV_FEC_STACK_RSVP_IPv4, "RSVP IPv4 Session Query"}, - { TLV_FEC_STACK_RSVP_IPv6, "RSVP IPv6 Session Query"}, - { TLV_FEC_STACK_RES, "Reserved"}, - { TLV_FEC_STACK_VPN_IPv4, "VPN IPv4 prefix"}, - { TLV_FEC_STACK_VPN_IPv6, "VPN IPv6 prefix"}, - { TLV_FEC_STACK_L2_VPN, "L2 VPN endpoint"}, - { TLV_FEC_STACK_L2_CID_OLD, "FEC 128 Pseudowire (old)"}, - { TLV_FEC_STACK_L2_CID_NEW, "FEC 128 Pseudowire (new)"}, - { TLV_FEC_STACK_L2_FEC_129, "FEC 129 Pseudowire"}, - { TLV_FEC_STACK_BGP_LAB_v4, "BGP labeled IPv4 prefix"}, - { TLV_FEC_STACK_BGP_LAB_v6, "BGP labeled IPv6 prefix"}, - { TLV_FEC_STACK_GEN_IPv4, "Generic IPv4 prefix"}, - { TLV_FEC_STACK_GEN_IPv6, "Generic IPv6 prefix"}, - { TLV_FEC_STACK_NIL, "Nil FEC"}, - { TLV_FEC_STACK_STATIC_LSP, "Static LSP"}, - { TLV_FEC_STACK_STATIC_PW, "Static Pseudowire"}, - { TLV_FEC_VENDOR_PRIVATE_START, "Vendor Private"}, - { 0, NULL} + { TLV_FEC_STACK_LDP_IPv4, "LDP IPv4 prefix"}, + { TLV_FEC_STACK_LDP_IPv6, "LDP IPv6 prefix"}, + { TLV_FEC_STACK_RSVP_IPv4, "RSVP IPv4 Session Query"}, + { TLV_FEC_STACK_RSVP_IPv6, "RSVP IPv6 Session Query"}, + { TLV_FEC_STACK_RES, "Reserved"}, + { TLV_FEC_STACK_VPN_IPv4, "VPN IPv4 prefix"}, + { TLV_FEC_STACK_VPN_IPv6, "VPN IPv6 prefix"}, + { TLV_FEC_STACK_L2_VPN, "L2 VPN endpoint"}, + { TLV_FEC_STACK_L2_CID_OLD, "FEC 128 Pseudowire (old)"}, + { TLV_FEC_STACK_L2_CID_NEW, "FEC 128 Pseudowire (new)"}, + { TLV_FEC_STACK_L2_FEC_129, "FEC 129 Pseudowire"}, + { TLV_FEC_STACK_BGP_LAB_v4, "BGP labeled IPv4 prefix"}, + { TLV_FEC_STACK_BGP_LAB_v6, "BGP labeled IPv6 prefix"}, + { TLV_FEC_STACK_GEN_IPv4, "Generic IPv4 prefix"}, + { TLV_FEC_STACK_GEN_IPv6, "Generic IPv6 prefix"}, + { TLV_FEC_STACK_NIL, "Nil FEC"}, + { TLV_FEC_STACK_STATIC_LSP, "Static LSP"}, + { TLV_FEC_STACK_STATIC_PW, "Static Pseudowire"}, + { TLV_FEC_VENDOR_PRIVATE_START, "Vendor Private"}, + { 0, NULL} }; static const value_string mpls_echo_tlv_pad[] = { - { 1, "Drop Pad TLV from reply" }, - { 2, "Copy Pad TLV to reply" }, - { 0, NULL} + { 1, "Drop Pad TLV from reply" }, + { 2, "Copy Pad TLV to reply" }, + { 0, NULL} }; -#define TLV_ADDR_IPv4 1 -#define TLV_ADDR_UNNUM_IPv4 2 -#define TLV_ADDR_IPv6 3 -#define TLV_ADDR_UNNUM_IPv6 4 +#define TLV_ADDR_IPv4 1 +#define TLV_ADDR_UNNUM_IPv4 2 +#define TLV_ADDR_IPv6 3 +#define TLV_ADDR_UNNUM_IPv6 4 /* As per RFC 6426, http://tools.ietf.org/html/rfc6426 Section: 2.1 */ -#define TLV_ADDR_NONIP 5 +#define TLV_ADDR_NONIP 5 static const value_string mpls_echo_tlv_addr_type[] = { - {TLV_ADDR_IPv4, "IPv4 Numbered"}, - {TLV_ADDR_UNNUM_IPv4, "IPv4 Unnumbered"}, - {TLV_ADDR_IPv6, "IPv6 Numbered"}, - {TLV_ADDR_UNNUM_IPv6, "IPv6 Unnumbered"}, - {TLV_ADDR_NONIP, "Non IP"}, - {0, NULL} + {TLV_ADDR_IPv4, "IPv4 Numbered"}, + {TLV_ADDR_UNNUM_IPv4, "IPv4 Unnumbered"}, + {TLV_ADDR_IPv6, "IPv6 Numbered"}, + {TLV_ADDR_UNNUM_IPv6, "IPv6 Unnumbered"}, + {TLV_ADDR_NONIP, "Non IP"}, + {0, NULL} }; -#define TLV_DS_MAP_HASH_NO_MP 0 -#define TLV_DS_MAP_HASH_LABEL 1 -#define TLV_DS_MAP_HASH_IP 2 -#define TLV_DS_MAP_HASH_LABEL_RANGE 3 -#define TLV_DS_MAP_HASH_IP_RANGE 4 -#define TLV_DS_MAP_HASH_NO_LABEL 5 -#define TLV_DS_MAP_HASH_ALL_IP 6 -#define TLV_DS_MAP_HASH_NO_MATCH 7 -#define TLV_DS_MAP_HASH_BITMASK_IP 8 -#define TLV_DS_MAP_HASH_BITMASK_LABEL 9 +#define TLV_DS_MAP_HASH_NO_MP 0 +#define TLV_DS_MAP_HASH_LABEL 1 +#define TLV_DS_MAP_HASH_IP 2 +#define TLV_DS_MAP_HASH_LABEL_RANGE 3 +#define TLV_DS_MAP_HASH_IP_RANGE 4 +#define TLV_DS_MAP_HASH_NO_LABEL 5 +#define TLV_DS_MAP_HASH_ALL_IP 6 +#define TLV_DS_MAP_HASH_NO_MATCH 7 +#define TLV_DS_MAP_HASH_BITMASK_IP 8 +#define TLV_DS_MAP_HASH_BITMASK_LABEL 9 static const value_string mpls_echo_tlv_ds_map_hash_type[] = { - {TLV_DS_MAP_HASH_NO_MP, "no multipath"}, - {TLV_DS_MAP_HASH_LABEL, "label"}, - {TLV_DS_MAP_HASH_IP, "IP address"}, - {TLV_DS_MAP_HASH_LABEL_RANGE, "label range"}, - {TLV_DS_MAP_HASH_IP_RANGE, "IP address range"}, - {TLV_DS_MAP_HASH_NO_LABEL, "no more labels"}, - {TLV_DS_MAP_HASH_ALL_IP, "All IP addresses"}, - {TLV_DS_MAP_HASH_NO_MATCH, "no match"}, - {TLV_DS_MAP_HASH_BITMASK_IP, "Bit-masked IPv4 address set"}, - {TLV_DS_MAP_HASH_BITMASK_LABEL, "Bit-masked label set"}, - {0, NULL} + {TLV_DS_MAP_HASH_NO_MP, "no multipath"}, + {TLV_DS_MAP_HASH_LABEL, "label"}, + {TLV_DS_MAP_HASH_IP, "IP address"}, + {TLV_DS_MAP_HASH_LABEL_RANGE, "label range"}, + {TLV_DS_MAP_HASH_IP_RANGE, "IP address range"}, + {TLV_DS_MAP_HASH_NO_LABEL, "no more labels"}, + {TLV_DS_MAP_HASH_ALL_IP, "All IP addresses"}, + {TLV_DS_MAP_HASH_NO_MATCH, "no match"}, + {TLV_DS_MAP_HASH_BITMASK_IP, "Bit-masked IPv4 address set"}, + {TLV_DS_MAP_HASH_BITMASK_LABEL, "Bit-masked label set"}, + {0, NULL} }; static const value_string mpls_echo_tlv_ds_map_mp_proto[] = { - {0, "Unknown"}, - {1, "Static"}, - {2, "BGP"}, - {3, "LDP"}, - {4, "RSVP-TE"}, - {5, "Reserved"}, - {0, NULL} + {0, "Unknown"}, + {1, "Static"}, + {2, "BGP"}, + {3, "LDP"}, + {4, "RSVP-TE"}, + {5, "Reserved"}, + {0, NULL} }; /* @@ -352,261 +352,261 @@ static const value_string mpls_echo_tlv_ds_map_mp_proto[] = { static void dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem) { - proto_tree *ti = NULL, *tlv_fec_tree = NULL; - proto_item *hidden_item; - guint16 idx = 1, nil_idx = 1, type, saved_type; - int length, nil_length, pad; - guint32 label; - guint8 exp, bos, ttl; - - if (tree){ - while (rem >= 4){ /* Type, Length */ + proto_tree *ti = NULL, *tlv_fec_tree = NULL; + proto_item *hidden_item; + guint16 idx = 1, nil_idx = 1, type, saved_type; + int length, nil_length, pad; + guint32 label; + guint8 exp, bos, ttl; + + if (tree) { + while (rem >= 4) { /* Type, Length */ type = tvb_get_ntohs(tvb, offset); - saved_type = type; - /* Check for Vendor Private sub-TLVs */ - if(type >= TLV_FEC_VENDOR_PRIVATE_START) /* && <= TLV_FEC_VENDOR_PRIVATE_END always true */ - type = TLV_FEC_VENDOR_PRIVATE_START; + saved_type = type; + /* Check for Vendor Private sub-TLVs */ + if (type >= TLV_FEC_VENDOR_PRIVATE_START) /* && <= TLV_FEC_VENDOR_PRIVATE_END always true */ + type = TLV_FEC_VENDOR_PRIVATE_START; length = tvb_get_ntohs(tvb, offset + 2); ti = proto_tree_add_text(tree, tvb, offset, length + 4, "FEC Element %u: %s", - idx, val_to_str(type, mpls_echo_tlv_fec_names, - "Unknown FEC type (0x%04X)")); + idx, val_to_str(type, mpls_echo_tlv_fec_names, + "Unknown FEC type (0x%04X)")); tlv_fec_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_fec); - if(tlv_fec_tree == NULL) return; + if (tlv_fec_tree == NULL) return; /* FEC sub-TLV Type and Length */ - proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_type, tvb, - offset, 2, saved_type, "Type: %s (%u)", - val_to_str(type, mpls_echo_tlv_fec_names, "Unknown sub-TLV type"), saved_type); + proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_type, tvb, + offset, 2, saved_type, "Type: %s (%u)", + val_to_str(type, mpls_echo_tlv_fec_names, "Unknown sub-TLV type"), saved_type); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_len, tvb, offset + 2, - 2, ENC_BIG_ENDIAN); + 2, ENC_BIG_ENDIAN); - if (length + 4 > rem){ - proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, - "Error processing FEC sub-TLV: length is %u and reminder is %u", - length, rem - 4); - return; - } + if (length + 4 > rem) { + proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, + "Error processing FEC sub-TLV: length is %u and reminder is %u", + length, rem - 4); + return; + } /* FEC sub-TLV Value */ switch (type) { case TLV_FEC_STACK_LDP_IPv4: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); + tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv4_mask, - tvb, offset + 8, 1, ENC_BIG_ENDIAN); + tvb, offset + 8, 1, ENC_BIG_ENDIAN); if (length == 8) proto_tree_add_text(tlv_fec_tree, tvb, offset + 9, 3, "Padding"); break; - case TLV_FEC_STACK_LDP_IPv6: + case TLV_FEC_STACK_LDP_IPv6: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv6, - tvb, offset + 4, 16, ENC_NA); + tvb, offset + 4, 16, ENC_NA); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_ldp_ipv6_mask, - tvb, offset + 20, 1, ENC_BIG_ENDIAN); + tvb, offset + 20, 1, ENC_BIG_ENDIAN); if (length == 20) proto_tree_add_text(tlv_fec_tree, tvb, offset + 21, 3, "Padding"); break; - case TLV_FEC_STACK_RSVP_IPv4: - if (length != 20){ - proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, - "Error processing sub-TLV: length is %d, should be 20", length); - return; - } - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz1, - tvb, offset + 8, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id, - tvb, offset + 10, 2, ENC_BIG_ENDIAN); - proto_tree_add_text(tlv_fec_tree, tvb, offset + 12, 4, - "Extended Tunnel ID: 0x%08X (%s)", tvb_get_ntohl(tvb, offset + 12), - tvb_ip_to_str(tvb, offset + 12)); - hidden_item = proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id, - tvb, offset + 12, 4, ENC_BIG_ENDIAN); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender, - tvb, offset + 16, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2, - tvb, offset + 20, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id, - tvb, offset + 22, 2, ENC_BIG_ENDIAN); - break; + case TLV_FEC_STACK_RSVP_IPv4: + if (length != 20) { + proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, + "Error processing sub-TLV: length is %d, should be 20", length); + return; + } + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint, + tvb, offset + 4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz1, + tvb, offset + 8, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id, + tvb, offset + 10, 2, ENC_BIG_ENDIAN); + proto_tree_add_text(tlv_fec_tree, tvb, offset + 12, 4, + "Extended Tunnel ID: 0x%08X (%s)", tvb_get_ntohl(tvb, offset + 12), + tvb_ip_to_str(tvb, offset + 12)); + hidden_item = proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id, + tvb, offset + 12, 4, ENC_BIG_ENDIAN); + PROTO_ITEM_SET_HIDDEN(hidden_item); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender, + tvb, offset + 16, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2, + tvb, offset + 20, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id, + tvb, offset + 22, 2, ENC_BIG_ENDIAN); + break; case TLV_FEC_STACK_RSVP_IPv6: - if (length != 56){ + if (length != 56) { proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, - "Error processing sub-TLV: length is %d, should be 56", length); + "Error processing sub-TLV: length is %d, should be 56", length); return; } proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint, - tvb, offset + 4, 16, ENC_NA); + tvb, offset + 4, 16, ENC_NA); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz1, - tvb, offset + 20, 2, ENC_BIG_ENDIAN); + tvb, offset + 20, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id, - tvb, offset + 22, 2, ENC_BIG_ENDIAN); + tvb, offset + 22, 2, ENC_BIG_ENDIAN); proto_tree_add_text(tlv_fec_tree, tvb, offset + 24, 16, - "Extended Tunnel ID: 0x%s (%s)", - tvb_bytes_to_str(tvb, offset + 24, 16), - tvb_ip6_to_str(tvb, offset + 24)); + "Extended Tunnel ID: 0x%s (%s)", + tvb_bytes_to_str(tvb, offset + 24, 16), + tvb_ip6_to_str(tvb, offset + 24)); hidden_item = proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id, - tvb, offset + 24, 16, ENC_NA); - PROTO_ITEM_SET_HIDDEN(hidden_item); + tvb, offset + 24, 16, ENC_NA); + PROTO_ITEM_SET_HIDDEN(hidden_item); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender, - tvb, offset + 40, 16, ENC_NA); + tvb, offset + 40, 16, ENC_NA); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_mbz2, - tvb, offset + 56, 2, ENC_BIG_ENDIAN); + tvb, offset + 56, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id, - tvb, offset + 58, 2, ENC_BIG_ENDIAN); + tvb, offset + 58, 2, ENC_BIG_ENDIAN); break; case TLV_FEC_STACK_L2_CID_OLD: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_remote, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); + tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_vcid, - tvb, offset + 8, 4, ENC_BIG_ENDIAN); + tvb, offset + 8, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_encap, - tvb, offset + 12, 2, ENC_BIG_ENDIAN); + tvb, offset + 12, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_mbz, - tvb, offset + 14, 2, ENC_BIG_ENDIAN); + tvb, offset + 14, 2, ENC_BIG_ENDIAN); break; - case TLV_FEC_STACK_L2_CID_NEW: - if (length < 14){ + case TLV_FEC_STACK_L2_CID_NEW: + if (length < 14) { proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, - "Error processing sub-TLV: length is %d, should be 14", length); + "Error processing sub-TLV: length is %d, should be 14", length); return; } proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_sender, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); + tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_remote, - tvb, offset + 8, 4, ENC_BIG_ENDIAN); + tvb, offset + 8, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_vcid, - tvb, offset + 12, 4, ENC_BIG_ENDIAN); + tvb, offset + 12, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_encap, - tvb, offset + 16, 2, ENC_BIG_ENDIAN); + tvb, offset + 16, 2, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_l2cid_mbz, - tvb, offset + 18, 2, ENC_BIG_ENDIAN); + tvb, offset + 18, 2, ENC_BIG_ENDIAN); break; - case TLV_FEC_VENDOR_PRIVATE_START: - if (length < 4) { /* SMI Enterprise code */ - proto_tree_add_text(tlv_fec_tree, tvb, offset + 4, length, - "Error processing Vendor Private sub-TLV: length is %d, should be >= 4", - length); - } else { - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_vendor, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_value, tvb, - offset + 8, length - 4, ENC_NA); - } - break; - case TLV_FEC_STACK_BGP_LAB_v4: + case TLV_FEC_VENDOR_PRIVATE_START: + if (length < 4) { /* SMI Enterprise code */ + proto_tree_add_text(tlv_fec_tree, tvb, offset + 4, length, + "Error processing Vendor Private sub-TLV: length is %d, should be >= 4", + length); + } else { + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_vendor, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_value, tvb, + offset + 8, length - 4, ENC_NA); + } + break; + case TLV_FEC_STACK_BGP_LAB_v4: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_nh, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); + tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_ipv4, - tvb, offset + 8, 4, ENC_BIG_ENDIAN); + tvb, offset + 8, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_bgp_len, - tvb, offset + 12, 1, ENC_BIG_ENDIAN); + tvb, offset + 12, 1, ENC_BIG_ENDIAN); if (length == 12) proto_tree_add_text(tlv_fec_tree, tvb, offset + 13, 3, "Padding"); - break; - case TLV_FEC_STACK_GEN_IPv4: + break; + case TLV_FEC_STACK_GEN_IPv4: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv4, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); + tvb, offset + 4, 4, ENC_BIG_ENDIAN); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv4_mask, - tvb, offset + 8, 1, ENC_BIG_ENDIAN); + tvb, offset + 8, 1, ENC_BIG_ENDIAN); if (length == 8) proto_tree_add_text(tlv_fec_tree, tvb, offset + 9, 3, "Padding"); - break; - case TLV_FEC_STACK_GEN_IPv6: + break; + case TLV_FEC_STACK_GEN_IPv6: proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv6, - tvb, offset + 4, 16, ENC_NA); + tvb, offset + 4, 16, ENC_NA); proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_gen_ipv6_mask, - tvb, offset + 20, 1, ENC_BIG_ENDIAN); + tvb, offset + 20, 1, ENC_BIG_ENDIAN); if (length == 20) proto_tree_add_text(tlv_fec_tree, tvb, offset + 21, 3, "Padding"); - break; - case TLV_FEC_STACK_NIL: + break; + case TLV_FEC_STACK_NIL: nil_length = length; - while (nil_length >= 4){ - decode_mpls_label(tvb, offset + 4, &label, &exp, &bos, &ttl); - if (label <= LABEL_MAX_RESERVED){ - proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label, - tvb, offset + 4, 3, label, "Label %u: %u (%s)", nil_idx, label, - val_to_str(label, special_labels, "Reserved - Unknown")); - } else { - proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label, - tvb, offset + 4, 3, label, "Label %u: %u", nil_idx, label); - } - nil_length -= 4; - offset += 4; - nil_idx++; - } - break; - case TLV_FEC_STACK_STATIC_LSP: - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid, - tvb, (offset + 4), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid, + while (nil_length >= 4) { + decode_mpls_label(tvb, offset + 4, &label, &exp, &bos, &ttl); + if (label <= LABEL_MAX_RESERVED) { + proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label, + tvb, offset + 4, 3, label, "Label %u: %u (%s)", nil_idx, label, + val_to_str(label, special_labels, "Reserved - Unknown")); + } else { + proto_tree_add_uint_format(tlv_fec_tree, hf_mpls_echo_tlv_fec_nil_label, + tvb, offset + 4, 3, label, "Label %u: %u", nil_idx, label); + } + nil_length -= 4; + offset += 4; + nil_idx++; + } + break; + case TLV_FEC_STACK_STATIC_LSP: + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid, + tvb, (offset + 4), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid, tvb, (offset + 8), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_tunnel_no, + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_tunnel_no, tvb, (offset + 12), 2, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_lsp_no, - tvb, (offset + 14), 2, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid, - tvb, (offset + 16), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid, - tvb, (offset + 20), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_tunnel_no, - tvb, (offset + 24), 2, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_resv, - tvb, (offset + 26), 2, ENC_BIG_ENDIAN); - break; - case TLV_FEC_STACK_STATIC_PW: - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_serv_identifier, + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_lsp_no, + tvb, (offset + 14), 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid, + tvb, (offset + 16), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid, + tvb, (offset + 20), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_tunnel_no, + tvb, (offset + 24), 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_resv, + tvb, (offset + 26), 2, ENC_BIG_ENDIAN); + break; + case TLV_FEC_STACK_STATIC_PW: + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_serv_identifier, tvb, (offset + 4), 8, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid, - tvb, (offset + 12), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid, - tvb, (offset + 16), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_src_ac_id, - tvb, (offset + 20), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid, - tvb, (offset + 24), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid, - tvb, (offset + 28), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_dst_ac_id, - tvb, (offset + 32), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_gid, + tvb, (offset + 12), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_src_nid, + tvb, (offset + 16), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_src_ac_id, + tvb, (offset + 20), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_gid, + tvb, (offset + 24), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_dst_nid, + tvb, (offset + 28), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_lspping_tlv_pw_dst_ac_id, + tvb, (offset + 32), 4, ENC_BIG_ENDIAN); break; case TLV_FEC_STACK_RES: case TLV_FEC_STACK_VPN_IPv4: case TLV_FEC_STACK_VPN_IPv6: case TLV_FEC_STACK_L2_VPN: default: - if(length) - proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_value, - tvb, offset + 4, length, ENC_NA); + if (length) + proto_tree_add_item(tlv_fec_tree, hf_mpls_echo_tlv_fec_value, + tvb, offset + 4, length, ENC_NA); break; } - /* - * Check for padding based on sub-TLV length alignment; - * FEC sub-TLVs is zero-padded to align to four-octet boundary. - */ - if (length % 4){ - pad = 4 - (length % 4); - if (length + 4 + pad > rem){ - proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, - "Error processing FEC sub-TLV: padded length is %u and reminder is %u", - length + pad, rem - 4); - return; - } else { - proto_tree_add_text(tlv_fec_tree, tvb, offset + 4 + length, pad, "Padding"); - } - length += pad; - } + /* + * Check for padding based on sub-TLV length alignment; + * FEC sub-TLVs is zero-padded to align to four-octet boundary. + */ + if (length % 4) { + pad = 4 - (length % 4); + if (length + 4 + pad > rem) { + proto_tree_add_text(tlv_fec_tree, tvb, offset, rem, + "Error processing FEC sub-TLV: padded length is %u and reminder is %u", + length + pad, rem - 4); + return; + } else { + proto_tree_add_text(tlv_fec_tree, tvb, offset + 4 + length, pad, "Padding"); + } + length += pad; + } rem -= 4 + length; offset += 4 + length; idx++; - } } + } } /* @@ -615,170 +615,170 @@ dissect_mpls_echo_tlv_fec(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem static void dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem) { - proto_tree *ti = NULL, *tlv_ds_map_tree = NULL; - guint16 mplen, idx = 1; - guint32 label; - guint8 exp, bos, proto; - guint8 hash_type, addr_type; - - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mtu, tvb, - offset, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_addr_type, tvb, - offset + 2, 1, ENC_BIG_ENDIAN); - ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_res, tvb, - offset + 3, 1, ENC_BIG_ENDIAN); - tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); - - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_res, tvb, - offset + 3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_i, tvb, - offset + 3, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_n, tvb, - offset + 3, 1, ENC_BIG_ENDIAN); - - addr_type = tvb_get_guint8(tvb, offset + 2); - switch(addr_type){ - case TLV_ADDR_IPv4: - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ip, tvb, - offset + 8, 4, ENC_BIG_ENDIAN); - break; - case TLV_ADDR_UNNUM_IPv4: - case TLV_ADDR_UNNUM_IPv6: - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_if_index, tvb, - offset + 8, 4, ENC_BIG_ENDIAN); - break; - case TLV_ADDR_IPv6: - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ipv6, tvb, - offset + 4, 16, ENC_NA); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ipv6, tvb, - offset + 20, 16, ENC_NA); - rem -= 24; - offset += 24; + proto_tree *ti = NULL, *tlv_ds_map_tree = NULL; + guint16 mplen, idx = 1; + guint32 label; + guint8 exp, bos, proto; + guint8 hash_type, addr_type; + + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mtu, tvb, + offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_addr_type, tvb, + offset + 2, 1, ENC_BIG_ENDIAN); + ti = proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_res, tvb, + offset + 3, 1, ENC_BIG_ENDIAN); + tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); + + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_res, tvb, + offset + 3, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_i, tvb, + offset + 3, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_flag_n, tvb, + offset + 3, 1, ENC_BIG_ENDIAN); + + addr_type = tvb_get_guint8(tvb, offset + 2); + switch(addr_type) { + case TLV_ADDR_IPv4: + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ip, tvb, + offset + 8, 4, ENC_BIG_ENDIAN); + break; + case TLV_ADDR_UNNUM_IPv4: + case TLV_ADDR_UNNUM_IPv6: + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ip, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_if_index, tvb, + offset + 8, 4, ENC_BIG_ENDIAN); + break; + case TLV_ADDR_IPv6: + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ds_ipv6, tvb, + offset + 4, 16, ENC_NA); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_int_ipv6, tvb, + offset + 20, 16, ENC_NA); + rem -= 24; + offset += 24; + break; + case TLV_ADDR_NONIP : + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_ingress_if_num, tvb, + (offset + 4), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_egress_if_num, tvb, + (offset + 8), 4, ENC_BIG_ENDIAN); + break; + default: + proto_tree_add_text(tree, tvb, offset + 4, 8, + "Error processing TLV: Unknown Address Type of %u", + addr_type); + break; + } + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_hash_type, tvb, + offset + 12, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_depth, tvb, + offset + 13, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_muti_len, tvb, + offset + 14, 2, ENC_BIG_ENDIAN); + + /* Get the Multipath Length and Hash Type */ + mplen = tvb_get_ntohs(tvb, offset + 14); + hash_type = tvb_get_guint8(tvb, offset + 12); + + rem -= 16; + offset += 16; + if (rem < mplen) { + proto_tree_add_text(tree, tvb, offset, rem, + "Error processing TLV: Multi Path length is %d and reminder is %u", + mplen, rem); + return; + } + rem -= mplen; + if (mplen) { + switch(hash_type) { + case TLV_DS_MAP_HASH_IP: + if (mplen != 4) { + proto_tree_add_text(tree, tvb, offset, mplen, + "Multi Path length is %u and should be 4", mplen); + break; + } + ti = proto_tree_add_text(tree, tvb, offset, 4, + "Multipath Information"); + tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb, + offset, 4, ENC_BIG_ENDIAN); + break; + case TLV_DS_MAP_HASH_IP_RANGE: + if (mplen != 8) { + proto_tree_add_text(tree, tvb, offset, mplen, + "Multi Path length is %u and should be 8", mplen); break; - case TLV_ADDR_NONIP : - proto_tree_add_item (tree, hf_mpls_echo_tlv_ds_map_ingress_if_num, tvb, - (offset + 4), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (tree, hf_mpls_echo_tlv_ds_map_egress_if_num, tvb, - (offset + 8), 4, ENC_BIG_ENDIAN); + } + ti = proto_tree_add_text(tree, tvb, offset, 8, + "Multipath Information"); + tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_low, tvb, + offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_high, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + break; + case TLV_DS_MAP_HASH_NO_MP: + case TLV_DS_MAP_HASH_NO_LABEL: + case TLV_DS_MAP_HASH_ALL_IP: + case TLV_DS_MAP_HASH_NO_MATCH: + proto_tree_add_text(tree, tvb, offset, mplen, + "No Multipath Information"); + break; + case TLV_DS_MAP_HASH_BITMASK_IP: + if (mplen < 4) { + proto_tree_add_text(tree, tvb, offset, mplen, + "Multi Path length is %u and should be >= 4", mplen); break; - default: - proto_tree_add_text(tree, tvb, offset + 4, 8, - "Error processing TLV: Unknown Address Type of %u", - addr_type); - break; - } - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_hash_type, tvb, - offset + 12, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_depth, tvb, - offset + 13, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_muti_len, tvb, - offset + 14, 2, ENC_BIG_ENDIAN); - - /* Get the Multipath Length and Hash Type */ - mplen = tvb_get_ntohs(tvb, offset + 14); - hash_type = tvb_get_guint8(tvb, offset + 12); - - rem -= 16; - offset += 16; - if (rem < mplen){ - proto_tree_add_text(tree, tvb, offset, rem, - "Error processing TLV: Multi Path length is %d and reminder is %u", - mplen, rem); - return; - } - rem -= mplen; - if(mplen){ - switch(hash_type){ - case TLV_DS_MAP_HASH_IP: - if(mplen != 4){ - proto_tree_add_text(tree, tvb, offset, mplen, - "Multi Path length is %u and should be 4", mplen); - break; - } - ti = proto_tree_add_text(tree, tvb, offset, 4, - "Multipath Information"); - tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb, - offset, 4, ENC_BIG_ENDIAN); - break; - case TLV_DS_MAP_HASH_IP_RANGE: - if(mplen != 8){ - proto_tree_add_text(tree, tvb, offset, mplen, - "Multi Path length is %u and should be 8", mplen); - break; - } - ti = proto_tree_add_text(tree, tvb, offset, 8, - "Multipath Information"); - tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_low, tvb, - offset, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip_high, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - break; - case TLV_DS_MAP_HASH_NO_MP: - case TLV_DS_MAP_HASH_NO_LABEL: - case TLV_DS_MAP_HASH_ALL_IP: - case TLV_DS_MAP_HASH_NO_MATCH: - proto_tree_add_text(tree, tvb, offset, mplen, - "No Multipath Information"); - break; - case TLV_DS_MAP_HASH_BITMASK_IP: - if(mplen < 4){ - proto_tree_add_text(tree, tvb, offset, mplen, - "Multi Path length is %u and should be >= 4", mplen); - break; - } - ti = proto_tree_add_text(tree, tvb, offset, mplen, - "Multipath Information"); - tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb, - offset, 4, ENC_BIG_ENDIAN); - if(mplen > 4) - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_mask, tvb, - offset + 4, mplen - 4, ENC_NA); - break; - default: - proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_value, tvb, - offset, mplen, ENC_NA); - break; - } - } - - offset += mplen; - - while (rem >= 4){ - decode_mpls_label(tvb, offset, &label, &exp, &bos, &proto); - ti = proto_tree_add_text(tree, tvb, offset, 4, "Downstream Label Element %u", - idx); - tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); - proto_item_append_text(ti, ", Label: %u", label); - if (label <= LABEL_MAX_RESERVED){ - proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label, - tvb, offset, 3, label, "Downstream Label: %u (%s)", label, - val_to_str(label, special_labels, "Reserved - Unknown")); - proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, - "Reserved - Unknown")); - } else { - proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label, - tvb, offset, 3, label, "Downstream Label: %u", label); - } - proto_item_append_text(ti, ", Exp: %u, BOS: %u", exp, bos); - proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_exp, - tvb, offset + 2, 1, exp, "Downstream Exp: %u", exp); - proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_bos, - tvb, offset + 2, 1, bos, "Downstream BOS: %u", bos); - proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_proto, - tvb, offset + 3, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ti, ", Protocol: %u (%s)", proto, val_to_str(proto, - mpls_echo_tlv_ds_map_mp_proto, "Unknown")); - rem -= 4; - offset += 4; - idx++; - } + } + ti = proto_tree_add_text(tree, tvb, offset, mplen, + "Multipath Information"); + tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_ip, tvb, + offset, 4, ENC_BIG_ENDIAN); + if (mplen > 4) + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_mask, tvb, + offset + 4, mplen - 4, ENC_NA); + break; + default: + proto_tree_add_item(tree, hf_mpls_echo_tlv_ds_map_mp_value, tvb, + offset, mplen, ENC_NA); + break; + } + } + + offset += mplen; + + while (rem >= 4) { + decode_mpls_label(tvb, offset, &label, &exp, &bos, &proto); + ti = proto_tree_add_text(tree, tvb, offset, 4, "Downstream Label Element %u", + idx); + tlv_ds_map_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ds_map); + proto_item_append_text(ti, ", Label: %u", label); + if (label <= LABEL_MAX_RESERVED) { + proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label, + tvb, offset, 3, label, "Downstream Label: %u (%s)", label, + val_to_str(label, special_labels, "Reserved - Unknown")); + proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, + "Reserved - Unknown")); + } else { + proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_label, + tvb, offset, 3, label, "Downstream Label: %u", label); + } + proto_item_append_text(ti, ", Exp: %u, BOS: %u", exp, bos); + proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_exp, + tvb, offset + 2, 1, exp, "Downstream Exp: %u", exp); + proto_tree_add_uint_format(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_bos, + tvb, offset + 2, 1, bos, "Downstream BOS: %u", bos); + proto_tree_add_item(tlv_ds_map_tree, hf_mpls_echo_tlv_ds_map_mp_proto, + tvb, offset + 3, 1, ENC_BIG_ENDIAN); + proto_item_append_text(ti, ", Protocol: %u (%s)", proto, val_to_str(proto, + mpls_echo_tlv_ds_map_mp_proto, "Unknown")); + rem -= 4; + offset += 4; + idx++; + } } /* @@ -787,88 +787,88 @@ dissect_mpls_echo_tlv_ds_map(tvbuff_t *tvb, guint offset, proto_tree *tree, int static void dissect_mpls_echo_tlv_ilso(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem, gboolean is_ipv6) { - proto_tree *ti = NULL, *tlv_ilso = NULL; - guint8 type; - guint16 idx = 1; - guint32 label; - guint8 exp, bos, ttl; - - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN); - type = tvb_get_guint8(tvb, offset); - offset += 1; - rem -= 1; - - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_mbz, tvb, offset, 3, ENC_BIG_ENDIAN); - offset += 3; - rem -= 3; - - if ((type == TLV_ADDR_IPv4) || (type == TLV_ADDR_UNNUM_IPv4)) { - if (is_ipv6) { - proto_tree_add_text(tree, tvb, offset, 4, "Incorrect address type for TLV ?"); - } - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_addr, tvb, - offset, 4, ENC_BIG_ENDIAN); - if (type == TLV_ADDR_IPv4) { - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_int_addr, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - } - offset += 8; - rem -= 8; - } else if ((type == TLV_ADDR_IPv6) || (type == TLV_ADDR_UNNUM_IPv6)) { - if (!is_ipv6) { - proto_tree_add_text(tree, tvb, offset, 16, "Incorrect address type for TLV ?"); - } - - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_addr, tvb, - offset, 16, ENC_NA); - if (type == TLV_ADDR_IPv6) { - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_int_addr, tvb, - offset + 16, 16, ENC_NA); - offset += 32; - rem -= 32; - } else { - proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb, - offset + 16, 4, ENC_BIG_ENDIAN); - offset += 20; - rem -= 20; - } - } else { - proto_tree_add_text(tree, tvb, offset, 0, "Incorrect address type for TLV"); - return; - } - - - while (rem >= 4){ - decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl); - ti = proto_tree_add_text(tree, tvb, offset, 4, "Label Stack Element %u", - idx); - tlv_ilso = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ilso); - proto_item_append_text(ti, ", Label: %u", label); - if (label <= LABEL_MAX_RESERVED){ - proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_label, - tvb, offset, 3, label, "Label: %u (%s)", label, - val_to_str(label, special_labels, "Reserved - Unknown")); - proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, - "Reserved - Unknown")); - } else { - proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_label, - tvb, offset, 3, label, "Label: %u", label); - } - proto_item_append_text(ti, ", Exp: %u, BOS: %u, TTL: %u", - exp, bos, ttl); - proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_exp, - tvb, offset + 2, 1, exp, "Exp: %u", exp); - proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_bos, - tvb, offset + 2, 1, bos, "BOS: %u", bos); - proto_tree_add_item(tlv_ilso, hf_mpls_echo_tlv_ilso_ttl, - tvb, offset + 3, 1, ENC_BIG_ENDIAN); - rem -= 4; - offset += 4; - idx++; + proto_tree *ti = NULL, *tlv_ilso = NULL; + guint8 type; + guint16 idx = 1; + guint32 label; + guint8 exp, bos, ttl; + + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN); + type = tvb_get_guint8(tvb, offset); + offset += 1; + rem -= 1; + + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_mbz, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + rem -= 3; + + if ((type == TLV_ADDR_IPv4) || (type == TLV_ADDR_UNNUM_IPv4)) { + if (is_ipv6) { + proto_tree_add_text(tree, tvb, offset, 4, "Incorrect address type for TLV ?"); } + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_addr, tvb, + offset, 4, ENC_BIG_ENDIAN); + if (type == TLV_ADDR_IPv4) { + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv4_int_addr, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + } + offset += 8; + rem -= 8; + } else if ((type == TLV_ADDR_IPv6) || (type == TLV_ADDR_UNNUM_IPv6)) { + if (!is_ipv6) { + proto_tree_add_text(tree, tvb, offset, 16, "Incorrect address type for TLV ?"); + } + + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_addr, tvb, + offset, 16, ENC_NA); + if (type == TLV_ADDR_IPv6) { + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_ipv6_int_addr, tvb, + offset + 16, 16, ENC_NA); + offset += 32; + rem -= 32; + } else { + proto_tree_add_item(tree, hf_mpls_echo_tlv_ilso_int_index, tvb, + offset + 16, 4, ENC_BIG_ENDIAN); + offset += 20; + rem -= 20; + } + } else { + proto_tree_add_text(tree, tvb, offset, 0, "Incorrect address type for TLV"); + return; + } + + + while (rem >= 4) { + decode_mpls_label(tvb, offset, &label, &exp, &bos, &ttl); + ti = proto_tree_add_text(tree, tvb, offset, 4, "Label Stack Element %u", + idx); + tlv_ilso = proto_item_add_subtree(ti, ett_mpls_echo_tlv_ilso); + proto_item_append_text(ti, ", Label: %u", label); + if (label <= LABEL_MAX_RESERVED) { + proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_label, + tvb, offset, 3, label, "Label: %u (%s)", label, + val_to_str(label, special_labels, "Reserved - Unknown")); + proto_item_append_text(ti, " (%s)", val_to_str(label, special_labels, + "Reserved - Unknown")); + } else { + proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_label, + tvb, offset, 3, label, "Label: %u", label); + } + proto_item_append_text(ti, ", Exp: %u, BOS: %u, TTL: %u", + exp, bos, ttl); + proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_exp, + tvb, offset + 2, 1, exp, "Exp: %u", exp); + proto_tree_add_uint_format(tlv_ilso, hf_mpls_echo_tlv_ilso_bos, + tvb, offset + 2, 1, bos, "BOS: %u", bos); + proto_tree_add_item(tlv_ilso, hf_mpls_echo_tlv_ilso_ttl, + tvb, offset + 3, 1, ENC_BIG_ENDIAN); + rem -= 4; + offset += 4; + idx++; + } } static int @@ -880,13 +880,13 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem, gb static void dissect_mpls_echo_tlv_errored(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem) { - int errored_tlv_length; + int errored_tlv_length; - while(rem >= 4){ - errored_tlv_length = dissect_mpls_echo_tlv(tvb, offset, tree, rem, TRUE); - rem -= errored_tlv_length; - offset += errored_tlv_length; - } + while(rem >= 4) { + errored_tlv_length = dissect_mpls_echo_tlv(tvb, offset, tree, rem, TRUE); + rem -= errored_tlv_length; + offset += errored_tlv_length; + } } /* @@ -895,173 +895,173 @@ dissect_mpls_echo_tlv_errored(tvbuff_t *tvb, guint offset, proto_tree *tree, int static int dissect_mpls_echo_tlv(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem, gboolean in_errored) { - guint16 type, saved_type; - int length; - proto_tree *ti = NULL, *mpls_echo_tlv_tree = NULL; - - length = tvb_reported_length_remaining(tvb, offset); - rem = MIN(rem, length); - - if( rem < 4 ) { /* Type Length */ - if(tree) - proto_tree_add_text(tree, tvb, offset, rem, - "Error processing TLV: length is %d, should be >= 4", - rem); - return rem; - } - type = tvb_get_ntohs(tvb, offset); - length = tvb_get_ntohs(tvb, offset + 2), + guint16 type, saved_type; + int length; + proto_tree *ti = NULL, *mpls_echo_tlv_tree = NULL; + + length = tvb_reported_length_remaining(tvb, offset); + rem = MIN(rem, length); + + if ( rem < 4 ) { /* Type Length */ + if (tree) + proto_tree_add_text(tree, tvb, offset, rem, + "Error processing TLV: length is %d, should be >= 4", + rem); + return rem; + } + type = tvb_get_ntohs(tvb, offset); + length = tvb_get_ntohs(tvb, offset + 2), rem -= 4; /* do not count Type Length */ - length = MIN(length, rem); - - if (tree) { - /* Check for Vendor Private TLVs */ - saved_type = type; - if(type >= TLV_VENDOR_PRIVATE_START) /* && <= TLV_VENDOR_PRIVATE_END always true */ - type = TLV_VENDOR_PRIVATE_START; - - ti = proto_tree_add_text(tree, tvb, offset, length + 4, "%s%s", - in_errored ? "Errored TLV Type: " : "", - val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type (0x%04X)")); - mpls_echo_tlv_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv); - if(mpls_echo_tlv_tree == NULL) return length+4; - - /* MPLS Echo TLV Type and Length */ - if (in_errored){ - proto_tree_add_uint_format(mpls_echo_tlv_tree, hf_mpls_echo_tlv_errored_type, tvb, - offset, 2, saved_type, "Errored TLV Type: %s (%u)", - val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type"), saved_type); - } else { - proto_tree_add_uint_format(mpls_echo_tlv_tree, hf_mpls_echo_tlv_type, tvb, - offset, 2, saved_type, "Type: %s (%u)", - val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type"), saved_type); - } - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - - /* MPLS Echo TLV Value */ - if (length == 0) - return 4; /* Empty TLV, return Type and Length consumed. */ - - switch (type) { - case TLV_TARGET_FEC_STACK: - dissect_mpls_echo_tlv_fec(tvb, offset + 4, mpls_echo_tlv_tree, length); - break; - case TLV_PAD: - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padaction, tvb, - offset + 4, 1, ENC_BIG_ENDIAN); - if (length > 1) - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padding, tvb, - offset + 5, length - 1, ENC_NA); - break; - case TLV_VENDOR_CODE: - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - break; - case TLV_ILSO_IPv4: - if(length < 12) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be >= 12", - length); - break; - } - dissect_mpls_echo_tlv_ilso(tvb, offset + 4, mpls_echo_tlv_tree, length, FALSE); - break; - case TLV_ILSO_IPv6: - if(length < 24) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be >= 24", - length); - break; - } - dissect_mpls_echo_tlv_ilso(tvb, offset + 4, mpls_echo_tlv_tree, length, TRUE); - break; - case TLV_RTO_IPv4: - if(length != 4) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be 4", - length); - break; - } - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv4, - tvb, offset + 4, 4, ENC_BIG_ENDIAN); - break; - case TLV_RTO_IPv6: - if(length != 16) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be 16", - length); - break; - } - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv6, - tvb, offset + 4, 16, ENC_NA); - break; - case TLV_VENDOR_PRIVATE_START: - if (length < 4) { /* SMI Enterprise code */ - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing Vendor Private TLV: length is %d, should be >= 4", - length); - } else { - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb, - offset + 4, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, - offset + 8, length - 4, ENC_NA); - } - break; - case TLV_DOWNSTREAM_MAPPING: - if(length < 16) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be >= 16", - length); - break; - } - dissect_mpls_echo_tlv_ds_map(tvb, offset + 4, mpls_echo_tlv_tree, length); - break; - case TLV_ERRORED_TLV: - if (in_errored) - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, - offset + 4, length, ENC_NA); - else - dissect_mpls_echo_tlv_errored(tvb, offset + 4, mpls_echo_tlv_tree, length); - break; - case TLV_REPLY_TOS: - if(length != 4) { - proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, - "Error processing TLV: length is %d, should be 4", - length); - break; - } - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos, tvb, - offset + 4, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos_mbz, tvb, - offset + 5, 3, ENC_BIG_ENDIAN); - break; - case TLV_SRC_IDENTIFIER: - proto_tree_add_item (mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid, - tvb, (offset + 4), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid, - tvb, (offset + 8), 4, ENC_BIG_ENDIAN); - break; - case TLV_DST_IDENTIFIER: - proto_tree_add_item (mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid, - tvb, (offset + 4), 4, ENC_BIG_ENDIAN); - proto_tree_add_item (mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid, - tvb, (offset + 8), 4, ENC_BIG_ENDIAN); - break; - case TLV_REVERSE_PATH_FEC_STACK: - dissect_mpls_echo_tlv_fec (tvb, (offset + 4), mpls_echo_tlv_tree, length); - break ; - case TLV_ERROR_CODE: - default: - proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, - offset + 4, length, ENC_NA); - break; - } + length = MIN(length, rem); + + if (tree) { + /* Check for Vendor Private TLVs */ + saved_type = type; + if (type >= TLV_VENDOR_PRIVATE_START) /* && <= TLV_VENDOR_PRIVATE_END always true */ + type = TLV_VENDOR_PRIVATE_START; + + ti = proto_tree_add_text(tree, tvb, offset, length + 4, "%s%s", + in_errored ? "Errored TLV Type: " : "", + val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type (0x%04X)")); + mpls_echo_tlv_tree = proto_item_add_subtree(ti, ett_mpls_echo_tlv); + if (mpls_echo_tlv_tree == NULL) return length+4; + + /* MPLS Echo TLV Type and Length */ + if (in_errored) { + proto_tree_add_uint_format(mpls_echo_tlv_tree, hf_mpls_echo_tlv_errored_type, tvb, + offset, 2, saved_type, "Errored TLV Type: %s (%u)", + val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type"), saved_type); + } else { + proto_tree_add_uint_format(mpls_echo_tlv_tree, hf_mpls_echo_tlv_type, tvb, + offset, 2, saved_type, "Type: %s (%u)", + val_to_str(type, mpls_echo_tlv_type_names, "Unknown TLV type"), saved_type); + } + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_len, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + + /* MPLS Echo TLV Value */ + if (length == 0) + return 4; /* Empty TLV, return Type and Length consumed. */ + + switch (type) { + case TLV_TARGET_FEC_STACK: + dissect_mpls_echo_tlv_fec(tvb, offset + 4, mpls_echo_tlv_tree, length); + break; + case TLV_PAD: + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padaction, tvb, + offset + 4, 1, ENC_BIG_ENDIAN); + if (length > 1) + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_padding, tvb, + offset + 5, length - 1, ENC_NA); + break; + case TLV_VENDOR_CODE: + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + break; + case TLV_ILSO_IPv4: + if (length < 12) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be >= 12", + length); + break; + } + dissect_mpls_echo_tlv_ilso(tvb, offset + 4, mpls_echo_tlv_tree, length, FALSE); + break; + case TLV_ILSO_IPv6: + if (length < 24) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be >= 24", + length); + break; + } + dissect_mpls_echo_tlv_ilso(tvb, offset + 4, mpls_echo_tlv_tree, length, TRUE); + break; + case TLV_RTO_IPv4: + if (length != 4) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be 4", + length); + break; + } + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv4, + tvb, offset + 4, 4, ENC_BIG_ENDIAN); + break; + case TLV_RTO_IPv6: + if (length != 16) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be 16", + length); + break; + } + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_rto_ipv6, + tvb, offset + 4, 16, ENC_NA); + break; + case TLV_VENDOR_PRIVATE_START: + if (length < 4) { /* SMI Enterprise code */ + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing Vendor Private TLV: length is %d, should be >= 4", + length); + } else { + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_vendor, tvb, + offset + 4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, + offset + 8, length - 4, ENC_NA); + } + break; + case TLV_DOWNSTREAM_MAPPING: + if (length < 16) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be >= 16", + length); + break; + } + dissect_mpls_echo_tlv_ds_map(tvb, offset + 4, mpls_echo_tlv_tree, length); + break; + case TLV_ERRORED_TLV: + if (in_errored) + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, + offset + 4, length, ENC_NA); + else + dissect_mpls_echo_tlv_errored(tvb, offset + 4, mpls_echo_tlv_tree, length); + break; + case TLV_REPLY_TOS: + if (length != 4) { + proto_tree_add_text(mpls_echo_tlv_tree, tvb, offset + 4, length, + "Error processing TLV: length is %d, should be 4", + length); + break; + } + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos, tvb, + offset + 4, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_reply_tos_mbz, tvb, + offset + 5, 3, ENC_BIG_ENDIAN); + break; + case TLV_SRC_IDENTIFIER: + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid, + tvb, (offset + 4), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid, + tvb, (offset + 8), 4, ENC_BIG_ENDIAN); + break; + case TLV_DST_IDENTIFIER: + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_gid, + tvb, (offset + 4), 4, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_lspping_tlv_src_addr_nid, + tvb, (offset + 8), 4, ENC_BIG_ENDIAN); + break; + case TLV_REVERSE_PATH_FEC_STACK: + dissect_mpls_echo_tlv_fec (tvb, (offset + 4), mpls_echo_tlv_tree, length); + break ; + case TLV_ERROR_CODE: + default: + proto_tree_add_item(mpls_echo_tlv_tree, hf_mpls_echo_tlv_value, tvb, + offset + 4, length, ENC_NA); + break; } - return length + 4; /* Length of the Value field + Type Length */ + } + return length + 4; /* Length of the Value field + Type Length */ } -#define MSGTYPE_MPLS_ECHO(msgtype) ((msgtype == 1) || (msgtype == 2)) -#define MSGTYPE_DATAPLANE(msgtype) ((msgtype == 3) || (msgtype == 4)) +#define MSGTYPE_MPLS_ECHO(msgtype) ((msgtype == 1) || (msgtype == 2)) +#define MSGTYPE_DATAPLANE(msgtype) ((msgtype == 3) || (msgtype == 4)) /* * Dissector for MPLS Echo (LSP PING) packets @@ -1069,107 +1069,107 @@ dissect_mpls_echo_tlv(tvbuff_t *tvb, guint offset, proto_tree *tree, int rem, gb void dissect_mpls_echo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - int offset = 0, rem = 0, len; - proto_item *ti = NULL; - proto_tree *mpls_echo_tree = NULL, *mpls_echo_gflags = NULL; - guint8 msgtype; - - /* If version != 1 we assume it's not an mpls ping packet */ - if (tvb_length(tvb) < 5) { - return; /* Not enough information to tell version and message type. */ + int offset = 0, rem = 0, len; + proto_item *ti = NULL; + proto_tree *mpls_echo_tree = NULL, *mpls_echo_gflags = NULL; + guint8 msgtype; + + /* If version != 1 we assume it's not an mpls ping packet */ + if (tvb_length(tvb) < 5) { + return; /* Not enough information to tell version and message type. */ + } + if (tvb_get_ntohs(tvb, 0) != 1) { + return; /* Not version 1. */ + } + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPLS ECHO"); + + rem = tvb_reported_length_remaining(tvb, offset); + + /* Get the message type and fill in the Column info */ + msgtype = tvb_get_guint8(tvb, offset + 4); + + /* The minimum fixed part of the packet is 16 Bytes or 32 Bytes depending on Msg Type */ + if ( ((!MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 16)) || + ((MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 32)) ) { + col_set_str(pinfo->cinfo, COL_INFO, "Malformed Message"); + if (tree) { + ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA); + mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo); + proto_tree_add_text(mpls_echo_tree, tvb, offset, rem, + "Error processing Message: length is %d, should be >= %u", + rem, (MSGTYPE_MPLS_ECHO(msgtype)) ? 32 : 16); } - if (tvb_get_ntohs(tvb, 0) != 1) { - return; /* Not version 1. */ + return; + } + + if (check_col(pinfo->cinfo, COL_INFO)) + col_add_str(pinfo->cinfo, COL_INFO, + val_to_str(msgtype, mpls_echo_msgtype, "Unknown Message Type (0x%02X)")); + + + if (tree) { + + /* Add subtree and dissect the fixed part of the message */ + ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA); + mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo); + + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_version, tvb, offset, 2, ENC_BIG_ENDIAN); + + if (MSGTYPE_MPLS_ECHO(msgtype)) { + ti = proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_gflags, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + mpls_echo_gflags = proto_item_add_subtree(ti, ett_mpls_echo_gflags); + proto_tree_add_item(mpls_echo_gflags, + hf_mpls_echo_flag_sbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_gflags, + hf_mpls_echo_flag_v, tvb, offset + 2, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_gflags, + hf_mpls_echo_flag_t, tvb, (offset + 2), 2, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_gflags, + hf_mpls_echo_flag_r, tvb, (offset + 2), 2, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_mbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN); } - col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPLS ECHO"); - - rem = tvb_reported_length_remaining(tvb, offset); - - /* Get the message type and fill in the Column info */ - msgtype = tvb_get_guint8(tvb, offset + 4); - - /* The minimum fixed part of the packet is 16 Bytes or 32 Bytes depending on Msg Type */ - if( ((!MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 16)) || - ((MSGTYPE_MPLS_ECHO(msgtype)) && (rem < 32)) ) { - col_set_str(pinfo->cinfo, COL_INFO, "Malformed Message"); - if(tree) { - ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA); - mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo); - proto_tree_add_text(mpls_echo_tree, tvb, offset, rem, - "Error processing Message: length is %d, should be >= %u", - rem, (MSGTYPE_MPLS_ECHO(msgtype)) ? 32 : 16); - } - return; + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_msgtype, tvb, offset + 4, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_replymode, tvb, offset + 5, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_returncode, tvb, offset + 6, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_returnsubcode, tvb, offset + 7, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_handle, tvb, offset + 8, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, + hf_mpls_echo_sequence, tvb, offset + 12, 4, ENC_BIG_ENDIAN); + + if (MSGTYPE_MPLS_ECHO(msgtype)) { + proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_sent, tvb, + offset + 16, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN); + proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_rec, tvb, + offset + 24, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN); } - if (check_col(pinfo->cinfo, COL_INFO)) - col_add_str(pinfo->cinfo, COL_INFO, - val_to_str(msgtype, mpls_echo_msgtype, "Unknown Message Type (0x%02X)")); - + } - if (tree) { + if (MSGTYPE_MPLS_ECHO(msgtype)) { + offset += 32; + rem -= 32; + } else { + offset += 16; + rem -= 16; + } - /* Add subtree and dissect the fixed part of the message */ - ti = proto_tree_add_item(tree, proto_mpls_echo, tvb, 0, -1, ENC_NA); - mpls_echo_tree = proto_item_add_subtree(ti, ett_mpls_echo); - - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_version, tvb, offset, 2, ENC_BIG_ENDIAN); - - if(MSGTYPE_MPLS_ECHO(msgtype)){ - ti = proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_gflags, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - mpls_echo_gflags = proto_item_add_subtree(ti, ett_mpls_echo_gflags); - proto_tree_add_item(mpls_echo_gflags, - hf_mpls_echo_flag_sbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_gflags, - hf_mpls_echo_flag_v, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - proto_tree_add_item (mpls_echo_gflags, - hf_mpls_echo_flag_t, tvb, (offset + 2), 2, ENC_BIG_ENDIAN); - proto_tree_add_item (mpls_echo_gflags, - hf_mpls_echo_flag_r, tvb, (offset + 2), 2, ENC_BIG_ENDIAN); - } else { - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_mbz, tvb, offset + 2, 2, ENC_BIG_ENDIAN); - } - - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_msgtype, tvb, offset + 4, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_replymode, tvb, offset + 5, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_returncode, tvb, offset + 6, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_returnsubcode, tvb, offset + 7, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_handle, tvb, offset + 8, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, - hf_mpls_echo_sequence, tvb, offset + 12, 4, ENC_BIG_ENDIAN); - - if(MSGTYPE_MPLS_ECHO(msgtype)){ - proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_sent, tvb, - offset + 16, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN); - proto_tree_add_item(mpls_echo_tree, hf_mpls_echo_ts_rec, tvb, - offset + 24, 8, ENC_TIME_NTP|ENC_BIG_ENDIAN); - } - - } - - if(MSGTYPE_MPLS_ECHO(msgtype)){ - offset += 32; - rem -= 32; - } else { - offset += 16; - rem -= 16; - } - - /* Dissect all TLVs */ - while(tvb_reported_length_remaining(tvb, offset) > 0 ) { - len = dissect_mpls_echo_tlv(tvb, offset, mpls_echo_tree, rem, FALSE); - offset += len; - rem -= len; - } + /* Dissect all TLVs */ + while(tvb_reported_length_remaining(tvb, offset) > 0 ) { + len = dissect_mpls_echo_tlv(tvb, offset, mpls_echo_tree, rem, FALSE); + offset += len; + rem -= len; + } } @@ -1180,490 +1180,490 @@ void proto_register_mpls_echo(void) { - static hf_register_info hf[] = { - { &hf_mpls_echo_version, - { "Version", "mpls_echo.version", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO Version Number", HFILL} - }, - { &hf_mpls_echo_mbz, - { "MBZ", "mpls_echo.mbz", - FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Must be Zero", HFILL} - }, - { &hf_mpls_echo_gflags, - { "Global Flags", "mpls_echo.flags", - FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Global Flags", HFILL} - }, - { &hf_mpls_echo_flag_sbz, - { "Reserved", "mpls_echo.flag_sbz", - FT_UINT16, BASE_HEX, NULL, 0xFFF8, "MPLS ECHO Reserved Flags", HFILL} - }, - { &hf_mpls_echo_flag_v, - { "Validate FEC Stack", "mpls_echo.flag_v", - FT_BOOLEAN, 16, NULL, 0x0001, "MPLS ECHO Validate FEC Stack Flag", HFILL} - }, - { &hf_mpls_echo_flag_t, - { "Respond only if TTL expired", "mpls_echo.flag_t", - FT_BOOLEAN, 16, NULL, 0x0002, "MPLS ECHO Respond only if TTL expired Flag", HFILL} - }, - { &hf_mpls_echo_flag_r, - { "Validate Reverse Path", "mpls_echo.flag_r", - FT_BOOLEAN, 16, NULL, 0x0004, "MPLS ECHO Validate Reverse Path Flag", HFILL} - }, - { &hf_mpls_echo_msgtype, - { "Message Type", "mpls_echo.msg_type", - FT_UINT8, BASE_DEC, VALS(mpls_echo_msgtype), 0x0, "MPLS ECHO Message Type", HFILL} - }, - { &hf_mpls_echo_replymode, - { "Reply Mode", "mpls_echo.reply_mode", - FT_UINT8, BASE_DEC, VALS(mpls_echo_replymode), 0x0, "MPLS ECHO Reply Mode", HFILL} - }, - { &hf_mpls_echo_returncode, - { "Return Code", "mpls_echo.return_code", - FT_UINT8, BASE_DEC, VALS(mpls_echo_returncode), 0x0, "MPLS ECHO Return Code", HFILL} - }, - { &hf_mpls_echo_returnsubcode, - { "Return Subcode", "mpls_echo.return_subcode", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO Return Subcode", HFILL} - }, - { &hf_mpls_echo_handle, - { "Sender's Handle", "mpls_echo.sender_handle", - FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO Sender's Handle", HFILL} - }, - { &hf_mpls_echo_sequence, - { "Sequence Number", "mpls_echo.sequence", - FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Sequence Number", HFILL} - }, - { &hf_mpls_echo_ts_sent, - { "Timestamp Sent", "mpls_echo.timestamp_sent", - FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Sent", HFILL} - }, - { &hf_mpls_echo_ts_rec, - { "Timestamp Received", "mpls_echo.timestamp_rec", - FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Received", HFILL} - }, - { &hf_mpls_echo_tlv_type, - { "Type", "mpls_echo.tlv.type", - FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_type_names), 0x0, - "MPLS ECHO TLV Type", HFILL} - }, - { &hf_mpls_echo_tlv_len, - { "Length", "mpls_echo.tlv.len", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Length", HFILL} - }, - { &hf_mpls_echo_tlv_value, - { "Value", "mpls_echo.tlv.value", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Value", HFILL} - }, - { &hf_mpls_echo_tlv_fec_type, - { "Type", "mpls_echo.tlv.fec.type", - FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_fec_names), 0x0, - "MPLS ECHO TLV FEC Stack Type", HFILL} - }, - { &hf_mpls_echo_tlv_fec_len, - { "Length", "mpls_echo.tlv.fec.len", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_value, - { "Value", "mpls_echo.tlv.fec.value", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Value", HFILL} - }, - { &hf_mpls_echo_tlv_fec_ldp_ipv4, - { "IPv4 Prefix", "mpls_echo.tlv.fec.ldp_ipv4", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4", HFILL} - }, - { &hf_mpls_echo_tlv_fec_ldp_ipv4_mask, - { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv4_mask", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4 Prefix Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_ldp_ipv6, - { "IPv6 Prefix", "mpls_echo.tlv.fec.ldp_ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6", HFILL} - }, - { &hf_mpls_echo_tlv_fec_ldp_ipv6_mask, - { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv6_mask", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6 Prefix Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint, - { "IPv4 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv4_ep", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Tunnel Endpoint Address", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint, - { "IPv6 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv6_ep", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Tunnel Endpoint Address", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz1, - { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz1", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id, - { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_ip_tun_id", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP Tunnel ID", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id, - { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv4_ext_tun_id", - FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Extended Tunnel ID", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender, - { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv4_sender", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id, - { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv6_ext_tun_id", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Extended Tunnel ID", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender, - { "IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv6_sender", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz2, - { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz2", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL} - }, - { &hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id, - { "LSP ID", "mpls_echo.tlv.fec.rsvp_ip_lsp_id", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP LSP ID", HFILL} - }, - { &hf_mpls_echo_tlv_fec_l2cid_sender, - { "Sender's PE Address", "mpls_echo.tlv.fec.l2cid_sender", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Sender", HFILL} - }, - { &hf_mpls_echo_tlv_fec_l2cid_remote, - { "Remote PE Address", "mpls_echo.tlv.fec.l2cid_remote", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Remote", HFILL} - }, - { &hf_mpls_echo_tlv_fec_l2cid_vcid, - { "VC ID", "mpls_echo.tlv.fec.l2cid_vcid", - FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID VCID", HFILL} - }, - { &hf_mpls_echo_tlv_fec_l2cid_encap, - { "Encapsulation", "mpls_echo.tlv.fec.l2cid_encap", - FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2CID Encapsulation", HFILL} - }, - { &hf_mpls_echo_tlv_fec_l2cid_mbz, - { "MBZ", "mpls_echo.tlv.fec.l2cid_mbz", - FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID MBZ", HFILL} - }, - { &hf_mpls_echo_tlv_fec_bgp_nh, - { "BGP Next Hop", "mpls_echo.tlv.fec.bgp_nh", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Next Hop", HFILL} - }, - { &hf_mpls_echo_tlv_fec_bgp_ipv4, - { "IPv4 Prefix", "mpls_echo.tlv.fec.bgp_ipv4", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv4", HFILL} - }, - { &hf_mpls_echo_tlv_fec_bgp_len, - { "Prefix Length", "mpls_echo.tlv.fec.bgp_len", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Prefix Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_gen_ipv4, - { "IPv4 Prefix", "mpls_echo.tlv.fec.gen_ipv4", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4", HFILL} - }, - { &hf_mpls_echo_tlv_fec_gen_ipv4_mask, - { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv4_mask", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4 Prefix Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_gen_ipv6, - { "IPv6 Prefix", "mpls_echo.tlv.fec.gen_ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6", HFILL} - }, - { &hf_mpls_echo_tlv_fec_gen_ipv6_mask, - { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv6_mask", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6 Prefix Length", HFILL} - }, - { &hf_mpls_echo_tlv_fec_nil_label, - { "Label", "mpls_echo.tlv.fec.nil_label", - FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV FEC Stack NIL Label", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mtu, - { "MTU", "mpls_echo.tlv.ds_map.mtu", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map MTU", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_addr_type, - { "Address Type", "mpls_echo.tlv.ds_map.addr_type", - FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, - "MPLS ECHO TLV Downstream Map Address Type", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_res, - { "DS Flags", "mpls_echo.tlv.ds_map.res", - FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Downstream Map DS Flags", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_flag_res, - { "MBZ", "mpls_echo.tlv.ds_map.flag_res", - FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Downstream Map Reserved Flags", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_flag_i, - { "Interface and Label Stack Request", "mpls_echo.tlv.ds_map.flag_i", - FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Downstream Map I-Flag", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_flag_n, - { "Treat as Non-IP Packet", "mpls_echo.tlv.ds_map.flag_n", - FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Downstream Map N-Flag", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_ds_ip, - { "Downstream IP Address", "mpls_echo.tlv.ds_map.ds_ip", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IP Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_int_ip, - { "Downstream Interface Address", "mpls_echo.tlv.ds_map.int_ip", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_if_index, - { "Upstream Interface Index", "mpls_echo.tlv.ds_map.if_index", - FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Index", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_ds_ipv6, - { "Downstream IPv6 Address", "mpls_echo.tlv.ds_map.ds_ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IPv6 Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_int_ipv6, - { "Downstream Interface IPv6 Address", "mpls_echo.tlv.ds_map.int_ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface IPv6 Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_hash_type, - { "Multipath Type", "mpls_echo.tlv.ds_map.hash_type", - FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_hash_type), 0x0, - "MPLS ECHO TLV Downstream Map Multipath Type", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_depth, - { "Depth Limit", "mpls_echo.tlv.ds_map.depth", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Depth Limit", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_muti_len, - { "Multipath Length", "mpls_echo.tlv.ds_map.multi_len", - FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Length", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_ip, - { "IP Address", "mpls_echo.tlv.ds_map_mp.ip", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath IP Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_mask, - { "Mask", "mpls_echo.tlv.ds_map_mp.mask", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Mask", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_ip_low, - { "IP Address Low", "mpls_echo.tlv.ds_map_mp.ip_low", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Low IP Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_ip_high, - { "IP Address High", "mpls_echo.tlv.ds_map_mp.ip_high", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath High IP Address", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_value, - { "Multipath Value", "mpls_echo.tlv.ds_map_mp.value", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Multipath Value", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_label, - { "Downstream Label", "mpls_echo.tlv.ds_map.mp_label", - FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Downstream Map Downstream Label", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_exp, - { "Downstream Experimental", "mpls_echo.tlv.ds_map.mp_exp", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream Experimental", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_bos, - { "Downstream BOS", "mpls_echo.tlv.ds_map.mp_bos", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream BOS", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_mp_proto, - { "Downstream Protocol", "mpls_echo.tlv.ds_map.mp_proto", - FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0, - "MPLS ECHO TLV Downstream Map Downstream Protocol", HFILL} - }, - { &hf_mpls_echo_tlv_padaction, - { "Pad Action", "mpls_echo.tlv.pad_action", - FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_pad), 0x0, "MPLS ECHO Pad TLV Action", HFILL} - }, - { &hf_mpls_echo_tlv_padding, - { "Padding", "mpls_echo.tlv.pad_padding", - FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO Pad TLV Padding", HFILL} - }, - { &hf_mpls_echo_tlv_vendor, - { "Vendor Id", "mpls_echo.tlv.vendor_id", - FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sminmpec_values_ext, 0x0, "MPLS ECHO Vendor Id", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_addr_type, - { "Address Type", "mpls_echo.tlv.ilso.addr_type", - FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, - "MPLS ECHO TLV Interface and Label Stack Address Type", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_mbz, - { "Must Be Zero", "mpls_echo.tlv.ilso.mbz", - FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack MBZ", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_ipv4_addr, - { "Downstream IPv4 Address", "mpls_echo.tlv.ilso_ipv4.addr", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_ipv4_int_addr, - { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv4.int_addr", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_ipv6_addr, - { "Downstream IPv6 Address", "mpls_echo.tlv.ilso_ipv6.addr", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_ipv6_int_addr, - { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv6.int_addr", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_int_index, - { "Downstream Interface Index", "mpls_echo.tlv.ilso.int_index", - FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Index", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_label, - { "Label", "mpls_echo.tlv.ilso_ipv4.label", - FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Interface and Label Stack Label", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_exp, - { "Exp", "mpls_echo.tlv.ilso_ipv4.exp", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Exp", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_bos, - { "BOS", "mpls_echo.tlv.ilso_ipv4.bos", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack BOS", HFILL} - }, - { &hf_mpls_echo_tlv_ilso_ttl, - { "TTL", "mpls_echo.tlv.ilso_ipv4.ttl", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack TTL", HFILL} - }, - { &hf_mpls_echo_tlv_rto_ipv4, - { "Reply-to IPv4 Address", "mpls_echo.tlv.rto.ipv4", - FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv4 Reply-To Object", HFILL} - }, - { &hf_mpls_echo_tlv_rto_ipv6, - { "Reply-to IPv6 Address", "mpls_echo.tlv.rto.ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv6 Reply-To Object", HFILL} - }, - { &hf_mpls_echo_tlv_reply_tos, - { "Reply-TOS Byte", "mpls_echo.tlv.reply.tos", - FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Reply-TOS Byte", HFILL} - }, - { &hf_mpls_echo_tlv_reply_tos_mbz, - { "MBZ", "mpls_echo.tlv.reply.tos.mbz", - FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Reply-TOS MBZ", HFILL} - }, - { &hf_mpls_echo_tlv_errored_type, - { "Errored TLV Type", "mpls_echo.tlv.errored.type", - FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_type_names), 0x0, - "MPLS ECHO TLV Errored TLV Type", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_ingress_if_num, - { "Ingress Interface Number", "mpls_echo.tlv.ds_map.ingress.if.num", - FT_UINT32, BASE_DEC, NULL, 0x0, - "MPLS ECHO TLV DownStream Map Ingress Interface Number", HFILL} - }, - { &hf_mpls_echo_tlv_ds_map_egress_if_num, - { "Egress Interface Number", "mpls_echo.tlv.ds_map.egress.if.num", - FT_UINT32, BASE_DEC, NULL, 0x0, - "MPLS ECHO TLV DownStream Map Egress Interface Number", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_src_gid, - { "SRC GLOBAL ID", "mpls_echo_lspping.tlv.src.gid", - FT_UINT32, BASE_DEC, NULL, 0x0, "LSP SRC GID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_src_nid, - { "SRC NODE ID", "mpls_echo_lspping.tlv.src.nid", - FT_IPv4, BASE_NONE, NULL, 0x0, "LSP SRC NID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_src_tunnel_no, - { "SRC Tunnel Number", "mpls_echo_lspping.tlv.tunnel.no", - FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC Tunnel Number", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_lsp_no, - { "SRC LSP Number", "mpls_echo_lspping.tlv.lsp.no", - FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC LSP Number", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_dst_gid, - { "DST GLOBAL ID", "mpls_echo_lspping.tlv.dst.gid", - FT_UINT32, BASE_DEC, NULL, 0x0, "LSP FEC DST GID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_dst_nid, - { "DST NODE ID", "mpls_echo_lspping.tlv.dst.nid", - FT_IPv4, BASE_NONE, NULL, 0x0, "LSP FEC DST NID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_dst_tunnel_no, - { "DST Tunnel Number", "mpls_echo_lspping.tlv.dst.tunnel.no", - FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC DST Tunnel Number", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_resv, - { "RESERVED", "mpls_echo_lspping.tlv.resv", - FT_UINT16, BASE_DEC, NULL, 0x0, "RESERVED BITS", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_src_addr_gid, - { "Global ID", "mpls_echo_lspping.tlv.src.addr.gid", - FT_UINT32, BASE_DEC, NULL, 0x0, "SRC ADDR TLV GID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_src_addr_nid, - { "Node ID", "mpls_echo_lspping.tlv.src.addr.nid", - FT_IPv4, BASE_NONE, NULL, 0x0, "SRC ADDR TLV NID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_serv_identifier, - { "Service identifier", "mpls_echo_lspping.tlv.pw.serv.identifier", - FT_UINT64, BASE_DEC, NULL, 0x0, "PW FEC Service identifier", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_src_ac_id, - { "SRC AC ID", "mpls_echo_lspping.tlv.pw.src.ac.id", - FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC SRC AC ID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_dst_ac_id, - { "DST AC ID", "mpls_echo_lspping.tlv.pw.dst.ac.id", - FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC DST AC ID", HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_agi_type, - { "AGI TYPE", "mpls_echo_lspping.tlv.pw.agi.type", - FT_UINT8, BASE_DEC,NULL,0x0, "PW AGI TYPE",HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_agi_len, - { "AGI Length", "mpls_echo_lspping.tlv.pw.agi.len", - FT_UINT8, BASE_DEC,NULL,0x0, "PW AGI LENGTH",HFILL} - }, - { &hf_mpls_echo_lspping_tlv_pw_agi_val, - { "AGI VALUE", "mpls_echo_lspping.tlv.pw.agi.val", - FT_STRING, BASE_NONE,NULL,0x0, "PW AGI VALUE",HFILL} - } - }; - - static gint *ett[] = { - &ett_mpls_echo, - &ett_mpls_echo_gflags, - &ett_mpls_echo_tlv, - &ett_mpls_echo_tlv_fec, - &ett_mpls_echo_tlv_ds_map, - &ett_mpls_echo_tlv_ilso - }; - - module_t *mpls_echo_module; - - 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)); - - 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", - "Set the UDP port for messages (if other" - " than the default of 3503)", - 10, &global_mpls_echo_udp_port); + static hf_register_info hf[] = { + { &hf_mpls_echo_version, + { "Version", "mpls_echo.version", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO Version Number", HFILL} + }, + { &hf_mpls_echo_mbz, + { "MBZ", "mpls_echo.mbz", + FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Must be Zero", HFILL} + }, + { &hf_mpls_echo_gflags, + { "Global Flags", "mpls_echo.flags", + FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO Global Flags", HFILL} + }, + { &hf_mpls_echo_flag_sbz, + { "Reserved", "mpls_echo.flag_sbz", + FT_UINT16, BASE_HEX, NULL, 0xFFF8, "MPLS ECHO Reserved Flags", HFILL} + }, + { &hf_mpls_echo_flag_v, + { "Validate FEC Stack", "mpls_echo.flag_v", + FT_BOOLEAN, 16, NULL, 0x0001, "MPLS ECHO Validate FEC Stack Flag", HFILL} + }, + { &hf_mpls_echo_flag_t, + { "Respond only if TTL expired", "mpls_echo.flag_t", + FT_BOOLEAN, 16, NULL, 0x0002, "MPLS ECHO Respond only if TTL expired Flag", HFILL} + }, + { &hf_mpls_echo_flag_r, + { "Validate Reverse Path", "mpls_echo.flag_r", + FT_BOOLEAN, 16, NULL, 0x0004, "MPLS ECHO Validate Reverse Path Flag", HFILL} + }, + { &hf_mpls_echo_msgtype, + { "Message Type", "mpls_echo.msg_type", + FT_UINT8, BASE_DEC, VALS(mpls_echo_msgtype), 0x0, "MPLS ECHO Message Type", HFILL} + }, + { &hf_mpls_echo_replymode, + { "Reply Mode", "mpls_echo.reply_mode", + FT_UINT8, BASE_DEC, VALS(mpls_echo_replymode), 0x0, "MPLS ECHO Reply Mode", HFILL} + }, + { &hf_mpls_echo_returncode, + { "Return Code", "mpls_echo.return_code", + FT_UINT8, BASE_DEC, VALS(mpls_echo_returncode), 0x0, "MPLS ECHO Return Code", HFILL} + }, + { &hf_mpls_echo_returnsubcode, + { "Return Subcode", "mpls_echo.return_subcode", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO Return Subcode", HFILL} + }, + { &hf_mpls_echo_handle, + { "Sender's Handle", "mpls_echo.sender_handle", + FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO Sender's Handle", HFILL} + }, + { &hf_mpls_echo_sequence, + { "Sequence Number", "mpls_echo.sequence", + FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO Sequence Number", HFILL} + }, + { &hf_mpls_echo_ts_sent, + { "Timestamp Sent", "mpls_echo.timestamp_sent", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Sent", HFILL} + }, + { &hf_mpls_echo_ts_rec, + { "Timestamp Received", "mpls_echo.timestamp_rec", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, "MPLS ECHO Timestamp Received", HFILL} + }, + { &hf_mpls_echo_tlv_type, + { "Type", "mpls_echo.tlv.type", + FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_type_names), 0x0, + "MPLS ECHO TLV Type", HFILL} + }, + { &hf_mpls_echo_tlv_len, + { "Length", "mpls_echo.tlv.len", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Length", HFILL} + }, + { &hf_mpls_echo_tlv_value, + { "Value", "mpls_echo.tlv.value", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Value", HFILL} + }, + { &hf_mpls_echo_tlv_fec_type, + { "Type", "mpls_echo.tlv.fec.type", + FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_fec_names), 0x0, + "MPLS ECHO TLV FEC Stack Type", HFILL} + }, + { &hf_mpls_echo_tlv_fec_len, + { "Length", "mpls_echo.tlv.fec.len", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_value, + { "Value", "mpls_echo.tlv.fec.value", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Value", HFILL} + }, + { &hf_mpls_echo_tlv_fec_ldp_ipv4, + { "IPv4 Prefix", "mpls_echo.tlv.fec.ldp_ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4", HFILL} + }, + { &hf_mpls_echo_tlv_fec_ldp_ipv4_mask, + { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv4_mask", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv4 Prefix Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_ldp_ipv6, + { "IPv6 Prefix", "mpls_echo.tlv.fec.ldp_ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6", HFILL} + }, + { &hf_mpls_echo_tlv_fec_ldp_ipv6_mask, + { "Prefix Length", "mpls_echo.tlv.fec.ldp_ipv6_mask", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack LDP IPv6 Prefix Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_endpoint, + { "IPv4 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv4_ep", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Tunnel Endpoint Address", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_endpoint, + { "IPv6 Tunnel endpoint address", "mpls_echo.tlv.fec.rsvp_ipv6_ep", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Tunnel Endpoint Address", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz1, + { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz1", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ip_tunnel_id, + { "Tunnel ID", "mpls_echo.tlv.fec.rsvp_ip_tun_id", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP Tunnel ID", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ext_tunnel_id, + { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv4_ext_tun_id", + FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Extended Tunnel ID", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv4_ipv4_sender, + { "IPv4 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv4_sender", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ext_tunnel_id, + { "Extended Tunnel ID", "mpls_echo.tlv.fec.rsvp_ipv6_ext_tun_id", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv6 Extended Tunnel ID", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ipv6_ipv6_sender, + { "IPv6 Tunnel sender address", "mpls_echo.tlv.fec.rsvp_ipv6_sender", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP IPv4 Sender", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ip_mbz2, + { "Must Be Zero", "mpls_echo.tlv.fec.rsvp_ip_mbz2", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP MBZ", HFILL} + }, + { &hf_mpls_echo_tlv_fec_rsvp_ip_lsp_id, + { "LSP ID", "mpls_echo.tlv.fec.rsvp_ip_lsp_id", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack RSVP LSP ID", HFILL} + }, + { &hf_mpls_echo_tlv_fec_l2cid_sender, + { "Sender's PE Address", "mpls_echo.tlv.fec.l2cid_sender", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Sender", HFILL} + }, + { &hf_mpls_echo_tlv_fec_l2cid_remote, + { "Remote PE Address", "mpls_echo.tlv.fec.l2cid_remote", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID Remote", HFILL} + }, + { &hf_mpls_echo_tlv_fec_l2cid_vcid, + { "VC ID", "mpls_echo.tlv.fec.l2cid_vcid", + FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID VCID", HFILL} + }, + { &hf_mpls_echo_tlv_fec_l2cid_encap, + { "Encapsulation", "mpls_echo.tlv.fec.l2cid_encap", + FT_UINT16, BASE_DEC, VALS(fec_vc_types_vals), 0x0, "MPLS ECHO TLV FEC Stack L2CID Encapsulation", HFILL} + }, + { &hf_mpls_echo_tlv_fec_l2cid_mbz, + { "MBZ", "mpls_echo.tlv.fec.l2cid_mbz", + FT_UINT16, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV FEC Stack L2CID MBZ", HFILL} + }, + { &hf_mpls_echo_tlv_fec_bgp_nh, + { "BGP Next Hop", "mpls_echo.tlv.fec.bgp_nh", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Next Hop", HFILL} + }, + { &hf_mpls_echo_tlv_fec_bgp_ipv4, + { "IPv4 Prefix", "mpls_echo.tlv.fec.bgp_ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP IPv4", HFILL} + }, + { &hf_mpls_echo_tlv_fec_bgp_len, + { "Prefix Length", "mpls_echo.tlv.fec.bgp_len", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack BGP Prefix Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_gen_ipv4, + { "IPv4 Prefix", "mpls_echo.tlv.fec.gen_ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4", HFILL} + }, + { &hf_mpls_echo_tlv_fec_gen_ipv4_mask, + { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv4_mask", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv4 Prefix Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_gen_ipv6, + { "IPv6 Prefix", "mpls_echo.tlv.fec.gen_ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6", HFILL} + }, + { &hf_mpls_echo_tlv_fec_gen_ipv6_mask, + { "Prefix Length", "mpls_echo.tlv.fec.gen_ipv6_mask", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV FEC Stack Generic IPv6 Prefix Length", HFILL} + }, + { &hf_mpls_echo_tlv_fec_nil_label, + { "Label", "mpls_echo.tlv.fec.nil_label", + FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV FEC Stack NIL Label", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mtu, + { "MTU", "mpls_echo.tlv.ds_map.mtu", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map MTU", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_addr_type, + { "Address Type", "mpls_echo.tlv.ds_map.addr_type", + FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, + "MPLS ECHO TLV Downstream Map Address Type", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_res, + { "DS Flags", "mpls_echo.tlv.ds_map.res", + FT_UINT8, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Downstream Map DS Flags", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_flag_res, + { "MBZ", "mpls_echo.tlv.ds_map.flag_res", + FT_UINT8, BASE_HEX, NULL, 0xFC, "MPLS ECHO TLV Downstream Map Reserved Flags", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_flag_i, + { "Interface and Label Stack Request", "mpls_echo.tlv.ds_map.flag_i", + FT_BOOLEAN, 8, NULL, 0x02, "MPLS ECHO TLV Downstream Map I-Flag", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_flag_n, + { "Treat as Non-IP Packet", "mpls_echo.tlv.ds_map.flag_n", + FT_BOOLEAN, 8, NULL, 0x01, "MPLS ECHO TLV Downstream Map N-Flag", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_ds_ip, + { "Downstream IP Address", "mpls_echo.tlv.ds_map.ds_ip", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IP Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_int_ip, + { "Downstream Interface Address", "mpls_echo.tlv.ds_map.int_ip", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_if_index, + { "Upstream Interface Index", "mpls_echo.tlv.ds_map.if_index", + FT_UINT32, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface Index", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_ds_ipv6, + { "Downstream IPv6 Address", "mpls_echo.tlv.ds_map.ds_ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map IPv6 Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_int_ipv6, + { "Downstream Interface IPv6 Address", "mpls_echo.tlv.ds_map.int_ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Interface IPv6 Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_hash_type, + { "Multipath Type", "mpls_echo.tlv.ds_map.hash_type", + FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_hash_type), 0x0, + "MPLS ECHO TLV Downstream Map Multipath Type", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_depth, + { "Depth Limit", "mpls_echo.tlv.ds_map.depth", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Depth Limit", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_muti_len, + { "Multipath Length", "mpls_echo.tlv.ds_map.multi_len", + FT_UINT16, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Length", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_ip, + { "IP Address", "mpls_echo.tlv.ds_map_mp.ip", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath IP Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_mask, + { "Mask", "mpls_echo.tlv.ds_map_mp.mask", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Mask", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_ip_low, + { "IP Address Low", "mpls_echo.tlv.ds_map_mp.ip_low", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath Low IP Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_ip_high, + { "IP Address High", "mpls_echo.tlv.ds_map_mp.ip_high", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Downstream Map Multipath High IP Address", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_value, + { "Multipath Value", "mpls_echo.tlv.ds_map_mp.value", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Multipath Value", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_label, + { "Downstream Label", "mpls_echo.tlv.ds_map.mp_label", + FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Downstream Map Downstream Label", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_exp, + { "Downstream Experimental", "mpls_echo.tlv.ds_map.mp_exp", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream Experimental", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_bos, + { "Downstream BOS", "mpls_echo.tlv.ds_map.mp_bos", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Downstream Map Downstream BOS", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_mp_proto, + { "Downstream Protocol", "mpls_echo.tlv.ds_map.mp_proto", + FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_ds_map_mp_proto), 0x0, + "MPLS ECHO TLV Downstream Map Downstream Protocol", HFILL} + }, + { &hf_mpls_echo_tlv_padaction, + { "Pad Action", "mpls_echo.tlv.pad_action", + FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_pad), 0x0, "MPLS ECHO Pad TLV Action", HFILL} + }, + { &hf_mpls_echo_tlv_padding, + { "Padding", "mpls_echo.tlv.pad_padding", + FT_BYTES, BASE_NONE, NULL, 0x0, "MPLS ECHO Pad TLV Padding", HFILL} + }, + { &hf_mpls_echo_tlv_vendor, + { "Vendor Id", "mpls_echo.tlv.vendor_id", + FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sminmpec_values_ext, 0x0, "MPLS ECHO Vendor Id", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_addr_type, + { "Address Type", "mpls_echo.tlv.ilso.addr_type", + FT_UINT8, BASE_DEC, VALS(mpls_echo_tlv_addr_type), 0x0, + "MPLS ECHO TLV Interface and Label Stack Address Type", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_mbz, + { "Must Be Zero", "mpls_echo.tlv.ilso.mbz", + FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack MBZ", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_ipv4_addr, + { "Downstream IPv4 Address", "mpls_echo.tlv.ilso_ipv4.addr", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_ipv4_int_addr, + { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv4.int_addr", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_ipv6_addr, + { "Downstream IPv6 Address", "mpls_echo.tlv.ilso_ipv6.addr", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Address", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_ipv6_int_addr, + { "Downstream Interface Address", "mpls_echo.tlv.ilso_ipv6.int_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Address", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_int_index, + { "Downstream Interface Index", "mpls_echo.tlv.ilso.int_index", + FT_UINT32, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Interface Index", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_label, + { "Label", "mpls_echo.tlv.ilso_ipv4.label", + FT_UINT24, BASE_DEC, VALS(special_labels), 0x0, "MPLS ECHO TLV Interface and Label Stack Label", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_exp, + { "Exp", "mpls_echo.tlv.ilso_ipv4.exp", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack Exp", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_bos, + { "BOS", "mpls_echo.tlv.ilso_ipv4.bos", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack BOS", HFILL} + }, + { &hf_mpls_echo_tlv_ilso_ttl, + { "TTL", "mpls_echo.tlv.ilso_ipv4.ttl", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Interface and Label Stack TTL", HFILL} + }, + { &hf_mpls_echo_tlv_rto_ipv4, + { "Reply-to IPv4 Address", "mpls_echo.tlv.rto.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv4 Reply-To Object", HFILL} + }, + { &hf_mpls_echo_tlv_rto_ipv6, + { "Reply-to IPv6 Address", "mpls_echo.tlv.rto.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, "MPLS ECHO TLV IPv6 Reply-To Object", HFILL} + }, + { &hf_mpls_echo_tlv_reply_tos, + { "Reply-TOS Byte", "mpls_echo.tlv.reply.tos", + FT_UINT8, BASE_DEC, NULL, 0x0, "MPLS ECHO TLV Reply-TOS Byte", HFILL} + }, + { &hf_mpls_echo_tlv_reply_tos_mbz, + { "MBZ", "mpls_echo.tlv.reply.tos.mbz", + FT_UINT24, BASE_HEX, NULL, 0x0, "MPLS ECHO TLV Reply-TOS MBZ", HFILL} + }, + { &hf_mpls_echo_tlv_errored_type, + { "Errored TLV Type", "mpls_echo.tlv.errored.type", + FT_UINT16, BASE_DEC, VALS(mpls_echo_tlv_type_names), 0x0, + "MPLS ECHO TLV Errored TLV Type", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_ingress_if_num, + { "Ingress Interface Number", "mpls_echo.tlv.ds_map.ingress.if.num", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MPLS ECHO TLV DownStream Map Ingress Interface Number", HFILL} + }, + { &hf_mpls_echo_tlv_ds_map_egress_if_num, + { "Egress Interface Number", "mpls_echo.tlv.ds_map.egress.if.num", + FT_UINT32, BASE_DEC, NULL, 0x0, + "MPLS ECHO TLV DownStream Map Egress Interface Number", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_src_gid, + { "SRC GLOBAL ID", "mpls_echo_lspping.tlv.src.gid", + FT_UINT32, BASE_DEC, NULL, 0x0, "LSP SRC GID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_src_nid, + { "SRC NODE ID", "mpls_echo_lspping.tlv.src.nid", + FT_IPv4, BASE_NONE, NULL, 0x0, "LSP SRC NID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_src_tunnel_no, + { "SRC Tunnel Number", "mpls_echo_lspping.tlv.tunnel.no", + FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC Tunnel Number", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_lsp_no, + { "SRC LSP Number", "mpls_echo_lspping.tlv.lsp.no", + FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC LSP Number", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_dst_gid, + { "DST GLOBAL ID", "mpls_echo_lspping.tlv.dst.gid", + FT_UINT32, BASE_DEC, NULL, 0x0, "LSP FEC DST GID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_dst_nid, + { "DST NODE ID", "mpls_echo_lspping.tlv.dst.nid", + FT_IPv4, BASE_NONE, NULL, 0x0, "LSP FEC DST NID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_dst_tunnel_no, + { "DST Tunnel Number", "mpls_echo_lspping.tlv.dst.tunnel.no", + FT_UINT16, BASE_DEC, NULL, 0x0, "LSP FEC DST Tunnel Number", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_resv, + { "RESERVED", "mpls_echo_lspping.tlv.resv", + FT_UINT16, BASE_DEC, NULL, 0x0, "RESERVED BITS", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_src_addr_gid, + { "Global ID", "mpls_echo_lspping.tlv.src.addr.gid", + FT_UINT32, BASE_DEC, NULL, 0x0, "SRC ADDR TLV GID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_src_addr_nid, + { "Node ID", "mpls_echo_lspping.tlv.src.addr.nid", + FT_IPv4, BASE_NONE, NULL, 0x0, "SRC ADDR TLV NID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_serv_identifier, + { "Service identifier", "mpls_echo_lspping.tlv.pw.serv.identifier", + FT_UINT64, BASE_DEC, NULL, 0x0, "PW FEC Service identifier", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_src_ac_id, + { "SRC AC ID", "mpls_echo_lspping.tlv.pw.src.ac.id", + FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC SRC AC ID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_dst_ac_id, + { "DST AC ID", "mpls_echo_lspping.tlv.pw.dst.ac.id", + FT_UINT32, BASE_DEC, NULL, 0x0, "PW FEC DST AC ID", HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_agi_type, + { "AGI TYPE", "mpls_echo_lspping.tlv.pw.agi.type", + FT_UINT8, BASE_DEC,NULL,0x0, "PW AGI TYPE",HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_agi_len, + { "AGI Length", "mpls_echo_lspping.tlv.pw.agi.len", + FT_UINT8, BASE_DEC,NULL,0x0, "PW AGI LENGTH",HFILL} + }, + { &hf_mpls_echo_lspping_tlv_pw_agi_val, + { "AGI VALUE", "mpls_echo_lspping.tlv.pw.agi.val", + FT_STRING, BASE_NONE,NULL,0x0, "PW AGI VALUE",HFILL} + } + }; + + static gint *ett[] = { + &ett_mpls_echo, + &ett_mpls_echo_gflags, + &ett_mpls_echo_tlv, + &ett_mpls_echo_tlv_fec, + &ett_mpls_echo_tlv_ds_map, + &ett_mpls_echo_tlv_ilso + }; + + module_t *mpls_echo_module; + + 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)); + + 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", + "Set the UDP port for messages (if other" + " than the default of 3503)", + 10, &global_mpls_echo_udp_port); } void proto_reg_handoff_mpls_echo(void) { - static gboolean mpls_echo_prefs_initialized = FALSE; - static dissector_handle_t mpls_echo_handle; - static guint mpls_echo_udp_port; - - if(!mpls_echo_prefs_initialized) { - mpls_echo_handle = create_dissector_handle(dissect_mpls_echo, - proto_mpls_echo); - mpls_echo_prefs_initialized = TRUE; - } else { - dissector_delete_uint("udp.port", mpls_echo_udp_port, mpls_echo_handle); - } - - mpls_echo_udp_port = global_mpls_echo_udp_port; - dissector_add_uint("udp.port", global_mpls_echo_udp_port, mpls_echo_handle); + static gboolean mpls_echo_prefs_initialized = FALSE; + static dissector_handle_t mpls_echo_handle; + static guint mpls_echo_udp_port; + + if (!mpls_echo_prefs_initialized) { + mpls_echo_handle = create_dissector_handle(dissect_mpls_echo, + proto_mpls_echo); + mpls_echo_prefs_initialized = TRUE; + } else { + dissector_delete_uint("udp.port", mpls_echo_udp_port, mpls_echo_handle); + } + + mpls_echo_udp_port = global_mpls_echo_udp_port; + dissector_add_uint("udp.port", global_mpls_echo_udp_port, mpls_echo_handle); } |