diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2008-04-14 19:43:39 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2008-04-14 19:43:39 +0000 |
commit | 5acf099bd294bdf77176489d3feb0a95dcee1f71 (patch) | |
tree | 4201a1e0d882a06cb0a7e4dcd770e075d038ae4e /epan/dissectors/packet-rsvp.c | |
parent | 7bad41d7aa7f7e5d6d3d59b4cf559a269fd101fb (diff) |
From Roberto Morro (bug 2416):
Added support for Ethernet SENDER_TSPEC and FLOWSPEC objects according to
draft-ietf-ccamp-ethernet-traffic-parameters-02.
Added support for enhancements in the LSP_TUNNEL_INTERFACE_ID object according
to draft-ietf-ccamp-lsp-hierarchy-bis-02.
Added support for NOTIFY_REQUEST and RECOVERY_LABEL objects.
Added display filters for some fields of the GENERALIZED_UNI and CALL_ID
objects.
svn path=/trunk/; revision=25023
Diffstat (limited to 'epan/dissectors/packet-rsvp.c')
-rw-r--r-- | epan/dissectors/packet-rsvp.c | 472 |
1 files changed, 446 insertions, 26 deletions
diff --git a/epan/dissectors/packet-rsvp.c b/epan/dissectors/packet-rsvp.c index f3dcb447d5..e5f33778c0 100644 --- a/epan/dissectors/packet-rsvp.c +++ b/epan/dissectors/packet-rsvp.c @@ -58,6 +58,10 @@ * * July 4, 2006: added support for RFC4124; new CLASSTYPE object dissector * (FF) <francesco.fondelli[AT]gmail.com> + * + * June 9, 2007: added support for draft-ietf-ccamp-ethernet-traffic-parameters-02 + * and draft-ietf-ccamp-lsp-hierarchy-bis-02; added support for NOTIFY_REQUEST + * and RECOVERY_LABEL objects (Roberto Morro) * <roberto.morro[AT]tilab.com> */ @@ -216,12 +220,14 @@ enum { TT_TSPEC_SUBTREE, TT_FLOWSPEC, TT_FLOWSPEC_SUBTREE, + TT_ETHSPEC_SUBTREE, TT_ADSPEC, TT_ADSPEC_SUBTREE, TT_INTEGRITY, TT_INTEGRITY_FLAGS, TT_DCLASS, TT_LSP_TUNNEL_IF_ID, + TT_LSP_TUNNEL_IF_ID_SUBTREE, TT_POLICY, TT_MESSAGE_ID, TT_MESSAGE_ID_ACK, @@ -762,6 +768,7 @@ const value_string gmpls_lsp_enc_str[] = { { 2, "Ethernet v2/DIX"}, { 3, "ANSI PDH"}, { 5, "SONET/SDH"}, + { 6, "VCAT"}, /* provisional value */ { 7, "Digital Wrapper"}, { 8, "Lambda (photonic)"}, { 9, "Fiber"}, @@ -982,6 +989,16 @@ enum rsvp_filter_keys { /* Diffserv-aware TE object */ RSVPF_DSTE_CLASSTYPE, + /* Generalized UNI object */ + RSVPF_GUNI_SRC_IPV4, + RSVPF_GUNI_DST_IPV4, + RSVPF_GUNI_SRC_IPV6, + RSVPF_GUNI_DST_IPV6, + + /* CALL ID object */ + RSVPF_CALL_ID_SRC_ADDR_IPV4, + RSVPF_CALL_ID_SRC_ADDR_IPV6, + /* Sentinel */ RSVPF_MAX }; @@ -1284,7 +1301,33 @@ static hf_register_info rsvpf_info[] = { /* Diffserv-aware TE object field */ {&rsvp_filter[RSVPF_DSTE_CLASSTYPE], { "CT", "rsvp.dste.classtype", FT_UINT8, BASE_DEC, NULL, 0x0, - NULL, HFILL }} + NULL, HFILL }}, + + /* Generalized UNI object field */ + {&rsvp_filter[RSVPF_GUNI_SRC_IPV4], + { "Source TNA", "rsvp.guni.srctna.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "", HFILL }}, + + {&rsvp_filter[RSVPF_GUNI_DST_IPV4], + { "Destination TNA", "rsvp.guni.dsttna.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, + "", HFILL }}, + + {&rsvp_filter[RSVPF_GUNI_SRC_IPV6], + { "Source TNA", "rsvp.guni.srctna.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "", HFILL }}, + + {&rsvp_filter[RSVPF_GUNI_DST_IPV6], + { "Destination TNA", "rsvp.guni.dsttna.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, + "", HFILL }}, + + /* Generalized UNI object field */ + {&rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV4], + { "Source Transport Network Address", "rsvp.callid.srcaddr.ipv4", FT_IPv4, + BASE_NONE, NULL, 0x0, "", HFILL }}, + + {&rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV6], + { "Source Transport Network Address", "rsvp.callid.srcaddr.ipv6", FT_IPv6, + BASE_NONE, NULL, 0x0, "", HFILL }} }; /* RSVP Conversation related Hash functions */ @@ -1457,6 +1500,7 @@ static inline int rsvp_class_to_filter_num(int classnum) case RSVP_CLASS_MESSAGE_ID_ACK : case RSVP_CLASS_MESSAGE_ID_LIST : return classnum + RSVPF_OBJECT; + break; case RSVP_CLASS_RECOVERY_LABEL : case RSVP_CLASS_UPSTREAM_LABEL : @@ -1529,6 +1573,7 @@ static inline int rsvp_class_to_tree_type(int classnum) return TT_POLICY; case RSVP_CLASS_CONFIRM : return TT_CONFIRM; + case RSVP_CLASS_RECOVERY_LABEL : case RSVP_CLASS_UPSTREAM_LABEL : case RSVP_CLASS_SUGGESTED_LABEL : case RSVP_CLASS_LABEL : @@ -1547,8 +1592,6 @@ static inline int rsvp_class_to_tree_type(int classnum) return TT_MESSAGE_ID_ACK; case RSVP_CLASS_MESSAGE_ID_LIST : return TT_MESSAGE_ID_LIST; - case RSVP_CLASS_RECOVERY_LABEL : - return TT_UNKNOWN_CLASS; case RSVP_CLASS_LABEL_SET : return TT_LABEL_SET; case RSVP_CLASS_PROTECTION : @@ -2423,6 +2466,100 @@ dissect_rsvp_template_filter (proto_item *ti, proto_tree *rsvp_object_tree, } /*------------------------------------------------------------------------------ + * TLVs for Ethernet SENDER TSPEC and FLOWSPEC + * draft-ietf-ccamp-ethernet-traffic-parameters-02 + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_eth_tspec_tlv(proto_item *ti, proto_tree *rsvp_object_tree, + tvbuff_t *tvb, int offset, int tlv_length, + int subtree_type) +{ + int tlv_off; + guint16 tlv_type; + int tlv_len; + guint8 profile; + proto_tree *rsvp_ethspec_subtree, *ethspec_profile_subtree, *ti2, *ti3; + + for (tlv_off = 0; tlv_off < tlv_length; ) { + tlv_type = tvb_get_ntohs(tvb, offset+tlv_off); + tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2); + + if (tlv_len == 0 || tlv_off+tlv_len > tlv_length) { + proto_tree_add_text(rsvp_object_tree, tvb, offset+tlv_off+2, 2, + "Invalid length"); + return; + } + switch(tlv_type) { + case 128: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset+tlv_off, tlv_len, + "RESERVED (TBD)"); + rsvp_ethspec_subtree = proto_item_add_subtree(ti2, subtree_type); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off, 2, + "Type: 128 (RESERVED)"); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+2, 2, + "Length: %u", tlv_len); + break; + + case 129: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset+tlv_off, tlv_len, + "Ethernet Bandwidth Profile TLV: CIR=%.10g, CBS=%.10g, " + "EIR=%.10g, EBS=%.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+8), + tvb_get_ntohieee_float(tvb, offset+tlv_off+12), + tvb_get_ntohieee_float(tvb, offset+tlv_off+16), + tvb_get_ntohieee_float(tvb, offset+tlv_off+20)); + rsvp_ethspec_subtree = proto_item_add_subtree(ti2, subtree_type); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off, 2, + "Type: %d - Ethernet Bandwidth Profile", tlv_type); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+2, 2, + "Length: %u", tlv_len); + profile = tvb_get_guint8(tvb, offset+tlv_off+4); + ti3 = proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+4, 1, + "Profile: 0x%02x", profile); + ethspec_profile_subtree = proto_item_add_subtree(ti3, TREE(TT_ETHSPEC_SUBTREE)); + proto_tree_add_text(ethspec_profile_subtree, tvb, offset+tlv_off+4, 1, + decode_boolean_bitfield(profile, 0x02, 8, + "Color Mode (CM) set", + "Color Mode (CM) NOT set")); + proto_tree_add_text(ethspec_profile_subtree, tvb, offset+tlv_off+4, 1, + decode_boolean_bitfield(profile, 0x01, 8, + "Coupling Flag (CF) set", + "Coupling Flag (CF) NOT set")); + proto_item_append_text(ti3, " %s %s", + (profile & (1<<1)) ? "CM" : "", + (profile & (1<<0)) ? "CF" : ""); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+5, 1, + "Index: %x", tvb_get_guint8(tvb, offset+tlv_off+5)); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+6, 2, + "Reserved: %x", tvb_get_ntohs(tvb, offset+tlv_off+6)); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+8, 4, "CIR: %.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+8)); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+12, 4, "CBS: %.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+12)); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+16, 4, "EIR: %.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+16)); + proto_tree_add_text(rsvp_ethspec_subtree, tvb, offset+tlv_off+20, 4, "EBS: %.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+20)); + + proto_item_append_text(ti, "ETH profile: CIR=%.10g, CBS=%.10g, EIR=%.10g, " + "EBS=%.10g", + tvb_get_ntohieee_float(tvb, offset+tlv_off+8), + tvb_get_ntohieee_float(tvb, offset+tlv_off+12), + tvb_get_ntohieee_float(tvb, offset+tlv_off+16), + tvb_get_ntohieee_float(tvb, offset+tlv_off+20)); + break; + + default: + proto_tree_add_text(rsvp_object_tree, tvb, offset+tlv_off, 2, + "Unknown TLV: %u", tlv_type); + } + tlv_off += tlv_len; + } +} + +/*------------------------------------------------------------------------------ * SENDER TSPEC *------------------------------------------------------------------------------*/ static void @@ -2435,6 +2572,7 @@ dissect_rsvp_tspec (proto_item *ti, proto_tree *rsvp_object_tree, int mylen; proto_tree *tspec_tree, *ti2; guint8 signal_type; + guint16 switch_gran; mylen = obj_length - 4; @@ -2700,6 +2838,28 @@ dissect_rsvp_tspec (proto_item *ti, proto_tree *rsvp_object_tree, tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12)); break; + case 6: /* Ethernet TSPEC draft-ietf-ccamp-ethernet-traffic-parameters-02 */ + proto_item_set_text(ti, "SENDER TSPEC: Ethernet: "); + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 6 - Ethernet"); + switch_gran = tvb_get_ntohs(tvb, offset2); + if (switch_gran == 1) + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: 1 - Ethernet port"); + else if (switch_gran == 2) + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: 2 - Ethernet frame"); + else + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: %u - ???", switch_gran); + + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "MTU: %u", tvb_get_ntohs(tvb, offset2+2)); + + dissect_rsvp_eth_tspec_tlv(ti, rsvp_object_tree, tvb, offset+8, obj_length-8, + TREE(TT_TSPEC_SUBTREE)); + break; + default: /* Unknown TSpec */ proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, "C-type: Unknown (%u)", @@ -2724,6 +2884,7 @@ dissect_rsvp_flowspec (proto_item *ti, proto_tree *rsvp_object_tree, int mylen, signal_type; proto_tree *flowspec_tree, *ti2; proto_item *item; + guint16 switch_gran; proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, "C-type: %u", type); @@ -3008,6 +3169,28 @@ dissect_rsvp_flowspec (proto_item *ti, proto_tree *rsvp_object_tree, tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12)); break; + case 6: /* Ethernet FLOWSPEC draft-ietf-ccamp-ethernet-traffic-parameters-02 */ + proto_item_set_text(ti, "FLOWSPEC: Ethernet: "); + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 6 - Ethernet"); + switch_gran = tvb_get_ntohs(tvb, offset2); + if (switch_gran == 1) + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: 1 - Ethernet port"); + else if (switch_gran == 2) + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: 2 - Ethernet frame"); + else + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 2, + "Switching granularity: %u - ???", switch_gran); + + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "MTU: %u", tvb_get_ntohs(tvb, offset2+2)); + + dissect_rsvp_eth_tspec_tlv(ti, rsvp_object_tree, tvb, offset+8, obj_length-8, + TREE(TT_FLOWSPEC_SUBTREE)); + break; + default: break; } @@ -3321,7 +3504,8 @@ dissect_rsvp_label (proto_tree *ti, proto_tree *rsvp_object_tree, name = (class==RSVP_CLASS_SUGGESTED_LABEL ? "SUGGESTED LABEL": (class==RSVP_CLASS_UPSTREAM_LABEL ? "UPSTREAM LABEL": - "LABEL")); + (class==RSVP_CLASS_RECOVERY_LABEL ? "RECOVERY LABEL": + "LABEL"))); mylen = obj_length - 4; switch(type) { case 1: @@ -3340,7 +3524,8 @@ dissect_rsvp_label (proto_tree *ti, proto_tree *rsvp_object_tree, proto_item_set_text(ti, "%s: Generalized: ", name); for (i = 0; i < mylen; i += 4) { proto_tree_add_text(rsvp_object_tree, tvb, offset2+i, 4, - "Generalized Label: %u", + "Generalized Label: %u (0x%x)", + tvb_get_ntohl(tvb, offset2+i), tvb_get_ntohl(tvb, offset2+i)); if (i < 16) { proto_item_append_text(ti, "0x%x%s", @@ -3399,7 +3584,8 @@ dissect_rsvp_label_set (proto_item *ti, proto_tree *rsvp_object_tree, for (i = 0; i < len/4; i++) { proto_tree_add_text(rsvp_object_tree, tvb, offset2+i*4, 4, - "Subchannel %u: %u", i+1, + "Subchannel %u: %u (0x%x)", i+1, + tvb_get_ntohl(tvb, offset2+i*4), tvb_get_ntohl(tvb, offset2+i*4)); if (i<5) { @@ -4037,7 +4223,8 @@ dissect_rsvp_hello (proto_tree *ti, proto_tree *rsvp_object_tree, case 1: case 2: proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-Type: 1 - HELLO %s object", + "C-Type: %d - HELLO %s object", + tvb_get_guint8 (tvb, offset+3), type==1 ? "REQUEST" : "ACK"); proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4, "Source Instance: 0x%x",tvb_get_ntohl(tvb, offset+4)); @@ -4221,6 +4408,108 @@ dissect_rsvp_association (proto_tree *ti, proto_tree *rsvp_object_tree, } /*------------------------------------------------------------------------------ + * TLVs for LSP TUNNEL IF ID object + * draft-ietf-ccamp-lsp-hierarchy-bis-02 + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_lsp_tunnel_if_id_tlv(proto_tree *rsvp_object_tree, + tvbuff_t *tvb, int offset, int tlv_length, + int subtree_type) +{ + int tlv_off; + guint16 tlv_type; + int tlv_len; + proto_tree *ti, *rsvp_lsp_tunnel_if_id_subtree; + + for (tlv_off = 0; tlv_off < tlv_length; ) { + tlv_type = tvb_get_ntohs(tvb, offset+tlv_off); + tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2); + + if (tlv_len == 0 || tlv_off+tlv_len > tlv_length) { + proto_tree_add_text(rsvp_object_tree, tvb, offset+tlv_off+2, 2, + "Invalid length"); + return; + } + switch(tlv_type) { + case 1: + ti = proto_tree_add_text(rsvp_object_tree, tvb, + offset+tlv_off, tlv_len, + "Unnumbered component link identifier: %u", + tvb_get_ntohl(tvb, offset+tlv_off+4)); + rsvp_lsp_tunnel_if_id_subtree = proto_item_add_subtree(ti, subtree_type); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off, 2, + "Type: 1 (Unnumbered component link identifier)"); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+2, 2, + "Length: %u", tlv_len); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+4, 4, + "Component link identifier: %u", + tvb_get_ntohl(tvb, offset+tlv_off+4)); + break; + + case 2: + ti = proto_tree_add_text(rsvp_object_tree, tvb, + offset+tlv_off, tlv_len, + "IPv4 component link identifier: %s", + ip_to_str(tvb_get_ptr(tvb, offset+tlv_off+4, 4))); + rsvp_lsp_tunnel_if_id_subtree = proto_item_add_subtree(ti, subtree_type); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off, 2, + "Type: 2 (IPv4 component link identifier)"); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+2, 2, + "Length: %u", tlv_len); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+4, 4, + "Component link identifier: %s", + ip_to_str(tvb_get_ptr(tvb, offset+tlv_off+4, 4))); + break; + + case 32769: /* oif-p0040.002.09 demo spec */ + ti = proto_tree_add_text(rsvp_object_tree, tvb, + offset+tlv_off, tlv_len, + "Targeted client layer: "); + rsvp_lsp_tunnel_if_id_subtree = proto_item_add_subtree(ti, subtree_type); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off, 2, + "Type: 32769 (Targeted client layer)"); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+2, 2, + "Length: %u", tlv_len); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+4, 1, + "LSP Encoding Type: %s", + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+4), + gmpls_lsp_enc_str, "Unknown (%d)")); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+5, 1, + "Switching Type: %s", + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+5), + gmpls_switching_type_str, "Unknown (%d)")); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+6, 1, + "Signal Type: %s", + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+6), + gmpls_sonet_signal_type_str, "Unknown (%d)")); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+8, 8, + "Sub Interface/Connection ID: %" G_GINT64_MODIFIER "u (0x%s)", + tvb_get_ntoh64(tvb, offset+tlv_off+8), + tvb_bytes_to_str(tvb, offset+tlv_off+8, 8)); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+16, 4, + "SC PC ID: %s", + ip_to_str(tvb_get_ptr(tvb, offset+tlv_off+16, 4))); + proto_tree_add_text(rsvp_lsp_tunnel_if_id_subtree, tvb, offset+tlv_off+20, 4, + "SC PC SCN Address: %s", + ip_to_str(tvb_get_ptr(tvb, offset+tlv_off+20, 4))); + proto_item_append_text(ti, "LSP Encoding=%s, Switching Type=%s, Signal Type=%s", + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+4), + gmpls_lsp_enc_str, "Unknown (%d)"), + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+5), + gmpls_switching_type_str, "Unknown (%d)"), + val_to_str(tvb_get_guint8(tvb,offset+tlv_off+6), + gmpls_sonet_signal_type_str, "Unknown (%d)")); + break; + + default: + proto_tree_add_text(rsvp_object_tree, tvb, offset+tlv_off, 2, + "Unknown TLV: %u", tlv_type); + } + tlv_off += tlv_len; + } +} + +/*------------------------------------------------------------------------------ * LSP TUNNEL INTERFACE ID *------------------------------------------------------------------------------*/ static void @@ -4229,22 +4518,144 @@ dissect_rsvp_lsp_tunnel_if_id (proto_tree *ti, proto_tree *rsvp_object_tree, int offset, int obj_length, int class _U_, int type) { - int offset2 = offset + 4; + guint8 action; + + static const value_string lsp_tunnel_if_id_action_str[] = { + {0, "LSP is FA (MPLS-TE topology advertisement only)"}, + {1, "LSP is RA (IP network advertisement only)"}, + {2, "LSP is RA (both IP and MPLS-TE topology advertisement)"}, + {3, "LSP is to be used as a virtual local link"} + }; proto_item_set_text(ti, "LSP INTERFACE-ID: "); switch(type) { case 1: proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1 - Unnumbered interface"); + proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4, + "Router ID: %s", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4))); + proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4, + "Interface ID: %u", tvb_get_ntohl(tvb, offset+8)); + proto_item_set_text(ti, "LSP INTERFACE-ID: Unnumbered, Router-ID %s, Interface-ID %d", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), + tvb_get_ntohl(tvb, offset+8)); + break; + + case 2: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv4"); + proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4, + "IPv4 interface address: %s", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4))); + proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4, + "Target IGP instance: %s", + ip_to_str(tvb_get_ptr(tvb, offset+8, 4))); + proto_item_set_text(ti, "LSP INTERFACE-ID: IPv4, interface address %s," + "IGP instance %s", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), + ip_to_str(tvb_get_ptr(tvb, offset+8, 4))); + action = tvb_get_guint8(tvb, offset+12); + action >>= 4; + proto_tree_add_text(rsvp_object_tree, tvb, offset+12, 1, "Action: %d - %s", + action, + val_to_str(action, lsp_tunnel_if_id_action_str, "Unknown")); + dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, tvb, offset+16, obj_length-16, + TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE)); + break; + + case 3: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 3 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 16, + "IPv6 interface address: %s", + ip6_to_str((const struct e_in6_addr *) + tvb_get_ptr(tvb, offset+4, 16))); + proto_tree_add_text(rsvp_object_tree, tvb, offset+20, 4, + "Target IGP instance: %s", + ip_to_str(tvb_get_ptr(tvb, offset+20, 4))); + proto_item_set_text(ti, "LSP INTERFACE-ID: IPv6, interface address %s," + "IGP instance %s", + ip6_to_str((const struct e_in6_addr *) + tvb_get_ptr(tvb, offset+4, 16)), + ip_to_str(tvb_get_ptr(tvb, offset+20, 4))); + action = tvb_get_guint8(tvb, offset+24); + action >>= 4; + proto_tree_add_text(rsvp_object_tree, tvb, offset+24, 1, "Action: %d - %s", + action, + val_to_str(action, lsp_tunnel_if_id_action_str, "Unknown")); + dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, tvb, offset+28, obj_length-28, + TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE)); + break; + + case 4: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 4 - Unnumbered interface with target"); + proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4, + "Router ID: %s", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4))); + proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4, + "Interface ID: %u", tvb_get_ntohl(tvb, offset+8)); + proto_tree_add_text(rsvp_object_tree, tvb, offset+12, 4, + "Target IGP instance: %s", + ip_to_str(tvb_get_ptr(tvb, offset+12, 4))); + proto_item_set_text(ti, "LSP INTERFACE-ID: Unnumbered with target, Router-ID %s," + " Interface-ID %d, IGP instance %s", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), + tvb_get_ntohl(tvb, offset+8), + ip_to_str(tvb_get_ptr(tvb, offset+12, 4))); + action = tvb_get_guint8(tvb, offset+16); + action >>= 4; + proto_tree_add_text(rsvp_object_tree, tvb, offset+16, 1, "Action: %d - %s", + action, + val_to_str(action, lsp_tunnel_if_id_action_str, "Unknown")); + dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, tvb, offset+20, obj_length-20, + TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE)); + break; + + default: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset+4, obj_length-4, + "Data (%d bytes)", obj_length-4); + break; + } +} + +/*------------------------------------------------------------------------------ + * NOTIFY REQUEST + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_notify_request (proto_item *ti, proto_tree *rsvp_object_tree, + tvbuff_t *tvb, + int offset, int obj_length, + int class _U_, int type) +{ + int offset2 = offset + 4; + + switch(type) { + case 1: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, "C-type: 1 - IPv4"); proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, - "Router ID: %s", + "Notify node address: %s", + ip_to_str(tvb_get_ptr(tvb, offset2, 4))); + proto_item_append_text(ti, ": Notify node: %s", ip_to_str(tvb_get_ptr(tvb, offset2, 4))); - proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4, - "Interface ID: %u", tvb_get_ntohl(tvb, offset2+4)); - proto_item_set_text(ti, "LSP INTERFACE-ID: IPv4, Router-ID %s, Interface-ID %d", - ip_to_str(tvb_get_ptr(tvb, offset2, 4)), - tvb_get_ntohl(tvb, offset2+4)); break; + } + + case 2: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "Notify node address: %s", + ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); + proto_item_append_text(ti, ": Notify node: %s", + ip6_to_str((const struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); + break; + } default: proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, @@ -4252,7 +4663,6 @@ dissect_rsvp_lsp_tunnel_if_id (proto_tree *ti, proto_tree *rsvp_object_tree, type); proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, "Data (%d bytes)", obj_length - 4); - break; } } @@ -4303,9 +4713,12 @@ dissect_rsvp_gen_uni (proto_tree *ti, proto_tree *rsvp_object_tree, proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, "Length: %u", tvb_get_ntohs(tvb, offset2+l)); - proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 4, - "IPv4 hop: %s", - ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4))); + if (j==1) + proto_tree_add_item(rsvp_gen_uni_subtree, rsvp_filter[RSVPF_GUNI_SRC_IPV4], + tvb, offset2+l+4, 4, FALSE); + else + proto_tree_add_item(rsvp_gen_uni_subtree, rsvp_filter[RSVPF_GUNI_DST_IPV4], + tvb, offset2+l+4, 4, FALSE); if (i < 4) { proto_item_append_text(ti, "%s IPv4 TNA: %s", c, ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4))); @@ -4325,10 +4738,12 @@ dissect_rsvp_gen_uni (proto_tree *ti, proto_tree *rsvp_object_tree, proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, "Length: %u", tvb_get_ntohs(tvb, offset2+l)); - proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 16, - "IPv6 hop: %s", - ip6_to_str((const struct e_in6_addr *) - tvb_get_ptr(tvb, offset2+l+4, 16))); + if (j==1) + proto_tree_add_item(rsvp_gen_uni_subtree, rsvp_filter[RSVPF_GUNI_SRC_IPV6], + tvb, offset2+l+4, 16, FALSE); + else + proto_tree_add_item(rsvp_gen_uni_subtree, rsvp_filter[RSVPF_GUNI_DST_IPV6], + tvb, offset2+l+4, 16, FALSE); if (i < 4) { proto_item_append_text(ti, "%s IPv6 %s", c, ip6_to_str((const struct e_in6_addr *) @@ -4634,15 +5049,15 @@ dissect_rsvp_call_id (proto_tree *ti, proto_tree *rsvp_object_tree, switch(type) { case 1: offset4 = offset3 + 4; - proto_tree_add_text(rsvp_object_tree, tvb, offset3, 4, "Source Transport Network addr: %s", - ip_to_str(tvb_get_ptr(tvb, offset3, 4))); + proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV4], + tvb, offset3, 4, FALSE); proto_item_append_text(ti, "Src: %s. ", ip_to_str(tvb_get_ptr(tvb, offset3, 4))); break; case 2: offset4 = offset3 + 16; - proto_tree_add_text(rsvp_object_tree, tvb, offset3, 16, "Source Transport Network addr: %s", - ip6_to_str((const struct e_in6_addr *) tvb_get_ptr(tvb, offset3, 16))); + proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV6], + tvb, offset3, 16, FALSE); proto_item_append_text(ti, "Src: %s. ", ip6_to_str((const struct e_in6_addr *) tvb_get_ptr(tvb, offset3, 16))); break; @@ -5218,6 +5633,7 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dissect_rsvp_label_request(ti, rsvp_object_tree, tvb, offset, obj_length, class, type); break; + case RSVP_CLASS_RECOVERY_LABEL: case RSVP_CLASS_UPSTREAM_LABEL: case RSVP_CLASS_SUGGESTED_LABEL: case RSVP_CLASS_LABEL: @@ -5272,6 +5688,10 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dissect_rsvp_lsp_tunnel_if_id(ti, rsvp_object_tree, tvb, offset, obj_length, class, type); break; + case RSVP_CLASS_NOTIFY_REQUEST: + dissect_rsvp_notify_request(ti, rsvp_object_tree, tvb, offset, obj_length, class, type); + break; + case RSVP_CLASS_GENERALIZED_UNI: dissect_rsvp_gen_uni(ti, rsvp_object_tree, tvb, offset, obj_length, class, type, rsvph); break; |