From Roberto Morro: support for GMPLS UNI and E-NNI objects/TLVs.

svn path=/trunk/; revision=11452
This commit is contained in:
Guy Harris 2004-07-21 05:57:30 +00:00
parent c1b410806e
commit 0a4380f19e
4 changed files with 465 additions and 55 deletions

View File

@ -2167,6 +2167,11 @@ Henry Ptasinski <henryp [AT] broadcom.com> {
Support for 802.11e WME/QoS info
}
Roberto Morro <Roberto.Morro [AT] TILAB.COM> {
Support for GMPLS UNI and E-NNI objects/TLVs
in RSVP and OSPF
}
And assorted fixes and enhancements by the people listed above and by:

View File

@ -11,6 +11,9 @@
* Furthermore RFC2740 (OSPFv3 - OSPF for IPv6) is now supported
* - (c) 2001 Palle Lyckegaard <palle[AT]lyckegaard.dk>
*
* Added support to E-NNI routing (OIF2003.259.02)
* - (c) 2004 Roberto Morro <roberto.morro[AT]tilab.com>
* TOS - support is not fully implemented
*
* Ethereal - Network traffic analyzer
@ -205,6 +208,8 @@ static gint ett_ospf_lsa_mpls = -1;
static gint ett_ospf_lsa_mpls_router = -1;
static gint ett_ospf_lsa_mpls_link = -1;
static gint ett_ospf_lsa_mpls_link_stlv = -1;
static gint ett_ospf_lsa_oif_tna = -1;
static gint ett_ospf_lsa_oif_tna_stlv = -1;
/*-----------------------------------------------------------------------
* OSPF Filtering
@ -896,6 +901,7 @@ is_opaque(int lsa_type)
/* MPLS/TE TLV types */
#define MPLS_TLV_ROUTER 1
#define MPLS_TLV_LINK 2
#define OIF_TLV_TNA 32768
/* MPLS/TE Link STLV types */
enum {
@ -908,13 +914,23 @@ enum {
MPLS_LINK_MAX_RES_BW,
MPLS_LINK_UNRES_BW,
MPLS_LINK_COLOR,
MPLS_LINK_LOCAL_ID = 11,
MPLS_LINK_REMOTE_ID,
MPLS_LINK_LOCAL_REMOTE_ID = 11,
MPLS_LINK_PROTECTION = 14,
MPLS_LINK_IF_SWITCHING_DESC,
MPLS_LINK_SHARED_RISK_GROUP
};
/* OIF TLV types */
enum {
OIF_LOCAL_NODE_ID = 32773,
OIF_REMOTE_NODE_ID,
OIF_SONET_SDH_SWITCHING_CAPABILITY,
OIF_TNA_IPv4_ADDRESS,
OIF_NODE_ID,
OIF_TNA_IPv6_ADDRESS,
OIF_TNA_NSAP_ADDRESS
};
static const value_string mpls_link_stlv_str[] = {
{MPLS_LINK_TYPE, "Link Type"},
{MPLS_LINK_ID, "Link ID"},
@ -925,11 +941,21 @@ static const value_string mpls_link_stlv_str[] = {
{MPLS_LINK_MAX_RES_BW, "Maximum Reservable Bandwidth"},
{MPLS_LINK_UNRES_BW, "Unreserved Bandwidth"},
{MPLS_LINK_COLOR, "Resource Class/Color"},
{MPLS_LINK_LOCAL_ID, "Link Local Identifier"},
{MPLS_LINK_REMOTE_ID, "Link Remote Identifier"},
{MPLS_LINK_LOCAL_REMOTE_ID, "Link Local/Remote Identifier"},
{MPLS_LINK_PROTECTION, "Link Protection Type"},
{MPLS_LINK_IF_SWITCHING_DESC, "Interface Switching Capability Descriptor"},
{MPLS_LINK_SHARED_RISK_GROUP, "Shared Risk Link Group"},
{OIF_LOCAL_NODE_ID, "Local Node ID"},
{OIF_REMOTE_NODE_ID, "Remote Node ID"},
{OIF_SONET_SDH_SWITCHING_CAPABILITY, "Sonet/SDH Interface Switching Capability"},
{0, NULL},
};
static const value_string oif_stlv_str[] = {
{OIF_TNA_IPv4_ADDRESS, "TNA address"},
{OIF_NODE_ID, "Node ID"},
{OIF_TNA_IPv6_ADDRESS, "TNA address"},
{OIF_TNA_NSAP_ADDRESS, "TNA address"},
{0, NULL},
};
@ -952,6 +978,7 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
int stlv_type, stlv_len, stlv_offset;
char *stlv_name;
int i;
guint8 switch_cap;
ti = proto_tree_add_text(tree, tvb, offset, length,
"MPLS Traffic Engineering LSA");
@ -1084,20 +1111,25 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
}
break;
case MPLS_LINK_LOCAL_ID:
case MPLS_LINK_REMOTE_ID:
case MPLS_LINK_LOCAL_REMOTE_ID:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"Link Local/Remote Identifier");
"%s: %d (0x%x) - %d (0x%x)", stlv_name,
tvb_get_ntohl(tvb, stlv_offset + 4),
tvb_get_ntohl(tvb, stlv_offset + 4),
tvb_get_ntohl(tvb, stlv_offset + 8),
tvb_get_ntohl(tvb, stlv_offset + 8));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_mpls_link_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "Local ID: %s",
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
proto_tree_add_text(stlv_tree, tvb, stlv_offset+8, 4, "Remote ID: %s",
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 8, 4)));
proto_tree_add_item(stlv_tree,
ospf_filter[OSPFF_LS_MPLS_LOCAL_IFID],
tvb, stlv_offset+4, 4, FALSE);
proto_tree_add_item(stlv_tree,
ospf_filter[OSPFF_LS_MPLS_REMOTE_IFID],
tvb, stlv_offset+8, 4, FALSE);
break;
case MPLS_LINK_IF_SWITCHING_DESC:
@ -1108,6 +1140,7 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
switch_cap = tvb_get_guint8 (tvb, stlv_offset+4);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 1, "Switching Type: %s",
val_to_str(tvb_get_guint8(tvb,stlv_offset+4),
gmpls_switching_type_str, "Unknown (%d)"));
@ -1120,6 +1153,25 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
tvb_get_ntohieee_float(tvb, stlv_offset + 8 + i*4),
tvb_get_ntohieee_float(tvb, stlv_offset + 8 + i*4) * 8.0);
}
if (switch_cap >=1 && switch_cap <=4) { // PSC-1 .. PSC-4
proto_tree_add_text(stlv_tree, tvb, stlv_offset+40, 4,
"Minimum LSP bandwidth: %.10g bytes/s (%.0f bits/s)",
tvb_get_ntohieee_float(tvb, stlv_offset + 40),
tvb_get_ntohieee_float(tvb, stlv_offset + 40) * 8.0);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+44, 2,
"Interface MTU: %d", tvb_get_ntohs(tvb, stlv_offset+44));
}
if (switch_cap == 100) { // TDM
proto_tree_add_text(stlv_tree, tvb, stlv_offset+40, 4,
"Minimum LSP bandwidth: %.10g bytes/s (%.0f bits/s)",
tvb_get_ntohieee_float(tvb, stlv_offset + 40),
tvb_get_ntohieee_float(tvb, stlv_offset + 40) * 8.0);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+44, 2,
"SONET/SDH: %s",
tvb_get_guint8(tvb, stlv_offset+44) ?
"Arbitrary" : "Standard");
}
break;
case MPLS_LINK_PROTECTION:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
@ -1146,6 +1198,55 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
tvb_get_ntohl(tvb,stlv_offset+4+i));
break;
case OIF_LOCAL_NODE_ID:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"%s: %s", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_mpls_link_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "Local Node ID: %s",
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
break;
case OIF_REMOTE_NODE_ID:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"%s: %s", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_mpls_link_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "Remote Node ID: %s",
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
break;
case OIF_SONET_SDH_SWITCHING_CAPABILITY:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4, "%s", stlv_name);
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_mpls_link_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 1, "Switching Cap: %s",
val_to_str(tvb_get_guint8 (tvb, stlv_offset+4),
gmpls_switching_type_str, "Unknown (%d)"));
proto_tree_add_text(stlv_tree, tvb, stlv_offset+5, 1, "Encoding: %s",
val_to_str(tvb_get_guint8(tvb,stlv_offset+5),
gmpls_lsp_enc_str, "Unknown (%d)"));
for (i = 0; i < (stlv_len - 4) / 4; i++) {
proto_tree_add_text(stlv_tree, tvb, stlv_offset+8+(i*4), 4,
"%s: %d free timeslots",
val_to_str(tvb_get_guint8(tvb, stlv_offset+8+(i*4)),
gmpls_sonet_signal_type_str,
"Unknown Signal Type (%d)"),
tvb_get_ntoh24(tvb, stlv_offset + 9 + i*4));
}
break;
default:
proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"Unknown Link sub-TLV: %u", stlv_type);
@ -1155,6 +1256,87 @@ dissect_ospf_lsa_mpls(tvbuff_t *tvb, int offset, proto_tree *tree,
}
break;
case OIF_TLV_TNA:
ti = proto_tree_add_text(mpls_tree, tvb, offset, tlv_length+4,
"TNA Information");
tlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_oif_tna);
proto_tree_add_text(tlv_tree, tvb, offset, 2, "TLV Type: 32768 - TNA Information");
proto_tree_add_text(tlv_tree, tvb, offset+2, 2, "TLV Length: %u",
tlv_length);
stlv_offset = offset + 4;
/* Walk down the sub-TLVs for TNA information */
while (stlv_offset < tlv_end_offset) {
stlv_type = tvb_get_ntohs(tvb, stlv_offset);
stlv_len = tvb_get_ntohs(tvb, stlv_offset + 2);
stlv_name = val_to_str(stlv_type, oif_stlv_str, "Unknown sub-TLV");
switch (stlv_type) {
case OIF_NODE_ID:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"%s: %s", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_oif_tna_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u",
stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 4, "%s: %s", stlv_name,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 4, 4)));
break;
case OIF_TNA_IPv4_ADDRESS:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 8, 4)));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_oif_tna_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s (IPv4)", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u", stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 1, "Addr Length: %u",
tvb_get_guint8 (tvb, stlv_offset+4));
proto_tree_add_text(stlv_tree, tvb, stlv_offset+8, stlv_len - 4, "TNA Addr: %s",
ip_to_str(tvb_get_ptr(tvb, stlv_offset + 8, 4)));
break;
case OIF_TNA_IPv6_ADDRESS:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"%s (IPv6): %s", stlv_name,
ip6_to_str((const struct e_in6_addr *)
tvb_get_ptr(tvb, stlv_offset + 8, 16)));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_oif_tna_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s (IPv6)", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u", stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 1, "Addr Length: %u",
tvb_get_guint8 (tvb, stlv_offset+4));
proto_tree_add_text(stlv_tree, tvb, stlv_offset+8, stlv_len - 4, "TNA Addr: %s",
ip6_to_str((const struct e_in6_addr *)
tvb_get_ptr(tvb, stlv_offset + 8, 16)));
break;
case OIF_TNA_NSAP_ADDRESS:
ti = proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"%s (NSAP): %s", stlv_name,
tvb_bytes_to_str (tvb, stlv_offset + 8, stlv_len - 4));
stlv_tree = proto_item_add_subtree(ti, ett_ospf_lsa_oif_tna_stlv);
proto_tree_add_text(stlv_tree, tvb, stlv_offset, 2,
"TLV Type: %u: %s (NSAP)", stlv_type, stlv_name);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+2, 2, "TLV Length: %u", stlv_len);
proto_tree_add_text(stlv_tree, tvb, stlv_offset+4, 1, "Addr Length: %u",
tvb_get_guint8 (tvb, stlv_offset+4));
proto_tree_add_text(stlv_tree, tvb, stlv_offset+8, stlv_len - 4, "TNA Addr: %s",
tvb_bytes_to_str(tvb, stlv_offset+8, stlv_len - 4));
break;
default:
proto_tree_add_text(tlv_tree, tvb, stlv_offset, stlv_len+4,
"Unknown Link sub-TLV: %u", stlv_type);
break;
}
stlv_offset += ((stlv_len+4+3)/4)*4;
}
break;
default:
ti = proto_tree_add_text(mpls_tree, tvb, offset, tlv_length+4,
"Unknown LSA: %u", tlv_type);
@ -2125,7 +2307,9 @@ proto_register_ospf(void)
&ett_ospf_lsa_mpls,
&ett_ospf_lsa_mpls_router,
&ett_ospf_lsa_mpls_link,
&ett_ospf_lsa_mpls_link_stlv
&ett_ospf_lsa_mpls_link_stlv,
&ett_ospf_lsa_oif_tna,
&ett_ospf_lsa_oif_tna_stlv
};
proto_ospf = proto_register_protocol("Open Shortest Path First",

View File

@ -36,6 +36,14 @@
*
* Mar 3, 2000: Added support for MPLS/TE objects, as defined in
* <draft-ietf-mpls-rsvp-lsp-tunnel-04.txt>
*
* May 6, 2004: Added support for E-NNI objects, as defined in
* <OIF-E-NNI-01.0> (Roberto Morro)
* <roberto.morro[AT]tilab.com>
*
* May 6, 2004: Modified some UNI objects, as defined in
* <OIF2003.249.09> (Roberto Morro)
* <roberto.morro[AT]tilab.com>
*/
@ -104,6 +112,7 @@ enum {
TT_MESSAGE_ID_ACK,
TT_MESSAGE_ID_LIST,
TT_LABEL,
TT_LABEL_SET,
TT_LABEL_REQUEST,
TT_SESSION_ATTRIBUTE,
TT_SESSION_ATTRIBUTE_FLAGS,
@ -117,6 +126,7 @@ enum {
TT_ADMIN_STATUS_FLAGS,
TT_GEN_UNI,
TT_GEN_UNI_SUBOBJ,
TT_CALL_ID,
TT_BUNDLE_COMPMSG,
TT_RESTART_CAP,
TT_PROTECTION_INFO,
@ -240,7 +250,8 @@ enum rsvp_classes {
RSVP_CLASS_SESSION_ATTRIBUTE = 207,
RSVP_CLASS_DCLASS = 225,
RSVP_CLASS_LSP_TUNNEL_IF_ID = 227,
RSVP_CLASS_GENERALIZED_UNI = 229
RSVP_CLASS_GENERALIZED_UNI = 229,
RSVP_CLASS_CALL_ID
};
@ -282,6 +293,7 @@ static value_string rsvp_class_vals[] = {
{RSVP_CLASS_NOTIFY_REQUEST, "NOTIFY-REQUEST object"},
{RSVP_CLASS_ADMIN_STATUS, "ADMIN-STATUS object"},
{RSVP_CLASS_GENERALIZED_UNI, "GENERALIZED-UNI object"},
{RSVP_CLASS_CALL_ID, "CALL-ID object"},
{RSVP_CLASS_DETOUR, "DETOUR object"},
{RSVP_CLASS_FAST_REROUTE, "FAST-REROUTE object"},
{0, NULL}
@ -450,7 +462,8 @@ enum {
RSVP_SESSION_TYPE_IPV4_LSP = 7,
RSVP_SESSION_TYPE_IPV6_LSP,
RSVP_SESSION_TYPE_IPV4_UNI = 9
RSVP_SESSION_TYPE_IPV4_UNI = 11,
RSVP_SESSION_TYPE_IPV4_E_NNI = 15
};
/*
@ -610,7 +623,7 @@ static const value_string gmpls_gpid_str[] = {
{ 0, NULL },
};
static const value_string gmpls_sonet_signal_type_str[] = {
const value_string gmpls_sonet_signal_type_str[] = {
{ 1, "VT1.5 SPE / VC-11"},
{ 2, "VT2 SPE / VC-12"},
{ 3, "VT3 SPE"},
@ -632,6 +645,11 @@ static const value_string gmpls_sonet_signal_type_str[] = {
{17, "STSG-48 / AUG-16"},
{18, "STSG-192 / AUG-64"},
{19, "STSG-768 / AUG-256"},
/* Other SONEt signal types */
{21, "STS-12c SPE / VC-4-4c"},
{22, "STS-48c SPE / VC-4-16c"},
{23, "STS-192c SPE / VC-4-64c"},
};
static const value_string ouni_guni_diversity_str[] = {
@ -720,6 +738,7 @@ enum rsvp_filter_keys {
RSVPF_NOTIFY_REQUEST,
RSVPF_ADMIN_STATUS,
RSVPF_GENERALIZED_UNI,
RSVPF_CALL_ID,
RSVPF_UNKNOWN_OBJ,
/* Session object */
@ -889,7 +908,7 @@ static hf_register_info rsvpf_info[] = {
"", HFILL }},
{&rsvp_filter[RSVPF_LABEL_SET],
{ "RESTRICTED LABEL SET", "rsvp.label_set", FT_NONE, BASE_NONE, NULL, 0x0,
{ "LABEL SET", "rsvp.label_set", FT_NONE, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&rsvp_filter[RSVPF_ACCEPTABLE_LABEL_SET],
@ -956,6 +975,10 @@ static hf_register_info rsvpf_info[] = {
{ "GENERALIZED UNI", "rsvp.generalized_uni", FT_NONE, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&rsvp_filter[RSVPF_CALL_ID],
{ "CALL ID", "rsvp.call_id", FT_NONE, BASE_NONE, NULL, 0x0,
"", HFILL }},
{&rsvp_filter[RSVPF_UNKNOWN_OBJ],
{ "Unknown object", "rsvp.obj_unknown", FT_NONE, BASE_NONE, NULL, 0x0,
"", HFILL }},
@ -1080,6 +1103,8 @@ static inline int rsvp_class_to_filter_num(int classnum)
return RSVPF_SESSION_ATTRIBUTE;
case RSVP_CLASS_GENERALIZED_UNI :
return RSVPF_GENERALIZED_UNI;
case RSVP_CLASS_CALL_ID :
return RSVPF_CALL_ID;
case RSVP_CLASS_DCLASS :
return RSVPF_DCLASS;
case RSVP_CLASS_LSP_TUNNEL_IF_ID :
@ -1127,29 +1152,35 @@ find_rsvp_session_tempfilt(tvbuff_t *tvb, int hdr_offset, int *session_offp, int
static char *summary_session (tvbuff_t *tvb, int offset)
{
static char buf[80];
static char buf[100];
switch(tvb_get_guint8(tvb, offset+3)) {
case RSVP_SESSION_TYPE_IPV4:
snprintf(buf, 80, "SESSION: IPv4, Destination %s, Protocol %d, Port %d. ",
snprintf(buf, 100, "SESSION: IPv4, Destination %s, Protocol %d, Port %d. ",
ip_to_str(tvb_get_ptr(tvb, offset+4, 4)),
tvb_get_guint8(tvb, offset+8),
tvb_get_ntohs(tvb, offset+10));
break;
case RSVP_SESSION_TYPE_IPV4_LSP:
snprintf(buf, 80, "SESSION: IPv4-LSP, Destination %s, Tunnel ID %d, Ext ID %0x. ",
snprintf(buf, 100, "SESSION: IPv4-LSP, Destination %s, Tunnel ID %d, Ext ID %0x. ",
ip_to_str(tvb_get_ptr(tvb, offset+4, 4)),
tvb_get_ntohs(tvb, offset+10),
tvb_get_ntohl(tvb, offset+12));
break;
case RSVP_SESSION_TYPE_IPV4_UNI:
snprintf(buf, 80, "SESSION: IPv4-UNI, Destination %s, Tunnel ID %d, Ext Address %s. ",
snprintf(buf, 100, "SESSION: IPv4-UNI, Destination %s, Tunnel ID %d, Ext Address %s. ",
ip_to_str(tvb_get_ptr(tvb, offset+4, 4)),
tvb_get_ntohs(tvb, offset+10),
ip_to_str(tvb_get_ptr(tvb, offset+12, 4)));
break;
case RSVP_SESSION_TYPE_IPV4_E_NNI:
snprintf(buf, 100, "SESSION: IPv4-E-NNI, Destination %s, Tunnel ID %d, Ext Address %s. ",
ip_to_str(tvb_get_ptr(tvb, offset+4, 4)),
tvb_get_ntohs(tvb, offset+10),
ip_to_str(tvb_get_ptr(tvb, offset+12, 4)));
break;
default:
snprintf(buf, 80, "SESSION: Type %d. ", tvb_get_guint8(tvb, offset+3));
snprintf(buf, 100, "SESSION: Type %d. ", tvb_get_guint8(tvb, offset+3));
}
return buf;
@ -1261,7 +1292,26 @@ dissect_rsvp_session (proto_tree *ti, tvbuff_t *tvb,
case RSVP_SESSION_TYPE_IPV4_UNI:
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 9 - IPv4 UNI");
"C-type: 11 - IPv4 UNI");
proto_tree_add_item(rsvp_object_tree,
rsvp_filter[RSVPF_SESSION_IP],
tvb, offset2, 4, FALSE);
proto_tree_add_item(rsvp_object_tree,
rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
tvb, offset2+6, 2, FALSE);
proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
"Extended IPv4 Address: %s",
ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
proto_tree_add_item_hidden(rsvp_object_tree,
rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
tvb, offset2+8, 4, FALSE);
break;
case RSVP_SESSION_TYPE_IPV4_E_NNI:
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 15 - IPv4 E-NNI");
proto_tree_add_item(rsvp_object_tree,
rsvp_filter[RSVPF_SESSION_IP],
tvb, offset2, 4, FALSE);
@ -2824,6 +2874,50 @@ dissect_rsvp_label (proto_tree *ti, tvbuff_t *tvb,
}
}
/*------------------------------------------------------------------------------
* LABEL_SET
*------------------------------------------------------------------------------*/
static void
dissect_rsvp_label_set (proto_tree *ti, tvbuff_t *tvb,
int offset, int obj_length,
int class, int type,
char *type_str)
{
int offset2 = offset + 8;
proto_tree *rsvp_object_tree;
guint8 label_type;
int len, i;
static value_string action_type_vals[] = {
{0, "Inclusive list"},
{1, "Exclusive list"},
{2, "Inclusive range"},
{3, "Exclusive range"},
{0xff, NULL}
};
rsvp_object_tree = proto_item_add_subtree(ti, TREE(TT_LABEL_SET));
proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
"Length: %u", obj_length);
proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
"Class number: %u - %s",
class, type_str);
len = obj_length - 8;
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, "C-type: %u", type);
proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1, "Action: %s",
val_to_str(tvb_get_guint8(tvb, offset+4),
action_type_vals, "Unknown (%u)"));
label_type = tvb_get_guint8 (tvb, offset+7);
proto_tree_add_text(rsvp_object_tree, tvb, offset+7, 1, "Label type: %s",
label_type==1 ? "Packet Label" : "Generalized Label");
for (i = 0; i < len/4; i++) {
proto_tree_add_text(rsvp_object_tree, tvb, offset2+i*4, 4,
"Subchannel %u: %u", i+1,
tvb_get_ntohl(tvb, offset2+i*4));
}
}
/*------------------------------------------------------------------------------
* SESSION ATTRIBUTE
*------------------------------------------------------------------------------*/
@ -3838,45 +3932,51 @@ dissect_rsvp_gen_uni (proto_tree *ti, tvbuff_t *tvb,
case 4: /* Egress Label */
k = tvb_get_guint8(tvb, offset2+l+3);
switch(k) {
default:
case 1:
if (k == 1) // Egress label sub-type
ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
offset2+l, tvb_get_ntohs(tvb, offset2+l),
"Egress Label Subobject");
rsvp_gen_uni_subtree =
proto_item_add_subtree(ti2, TREE(TT_GEN_UNI_SUBOBJ));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1,
"Class: %d (Egress Label)", j);
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1,
"Type: %d", tvb_get_guint8(tvb, offset2+l+3));
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, 1,
"Direction: %s",
decode_boolean_bitfield(
tvb_get_guint8(tvb, offset2+l+4), 0x80, 8,
"U: 1 - Upstream label/port ID",
"U: 0 - Downstream label/port ID"));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+7, 1,
"Label type: %u", tvb_get_guint8(tvb, offset2+l+7));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, 4,
"Logical Port ID: %u", tvb_get_ntohl(tvb, offset2+l+8));
proto_item_append_text(ti2, ": %s, Label type %d, Port ID %d, Label ",
tvb_get_guint8(tvb, offset2+l+4) & 0x80 ?
"Upstream" : "Downstream",
tvb_get_guint8(tvb, offset2+l+7),
tvb_get_ntohl(tvb, offset2+l+8));
for (j=12; j < tvb_get_ntohs(tvb, offset2+l); j+=4) {
else if (k == 2) // SPC_label sub-type (see G.7713.2)
ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
offset2+l, tvb_get_ntohs(tvb, offset2+l),
"SPC Label Subobject");
else
ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
offset2+l, tvb_get_ntohs(tvb, offset2+l),
"Unknown Label Subobject");
rsvp_gen_uni_subtree = proto_item_add_subtree(ti2, TREE(TT_GEN_UNI_SUBOBJ));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1,
"Class: %d (Egress/SPC Label)", j);
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1,
"Type: %d", k);
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, 1,
"Direction: %s",
decode_boolean_bitfield(
tvb_get_guint8(tvb, offset2+l+4), 0x80, 8,
"U: 1 - Upstream label/port ID",
"U: 0 - Downstream label/port ID"));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+7, 1,
"Label type: %u", tvb_get_guint8(tvb, offset2+l+7));
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, 4,
"Logical Port ID: %u", tvb_get_ntohl(tvb, offset2+l+8));
proto_item_append_text(ti2, ": %s, Label type %d, Port ID %d, Label ",
tvb_get_guint8(tvb, offset2+l+4) & 0x80 ?
"Upstream" : "Downstream",
tvb_get_guint8(tvb, offset2+l+7),
tvb_get_ntohl(tvb, offset2+l+8));
for (j=12; j < tvb_get_ntohs(tvb, offset2+l); j+=4) {
proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, 4,
"Label: %u", tvb_get_ntohl(tvb, offset2+l+j));
proto_item_append_text(ti2, "%u ", tvb_get_ntohl(tvb, offset2+l+j));
}
if (i < 4) {
proto_item_append_text(ti, "Egress Label");
}
break;
}
if (i < 4) {
if (k == 1)
proto_item_append_text(ti, "Egress Label");
else if (k == 2)
proto_item_append_text(ti, "SPC Label");
}
break;
@ -3944,6 +4044,118 @@ dissect_rsvp_gen_uni (proto_tree *ti, tvbuff_t *tvb,
}
}
/*------------------------------------------------------------------------------
* CALL_ID
*------------------------------------------------------------------------------*/
static void
dissect_rsvp_call_id (proto_tree *ti, tvbuff_t *tvb,
int offset, int obj_length,
int class, int c_type,
char *type_str)
{
int type;
char *str;
int offset2 = offset + 4;
int offset3, offset4, len;
proto_tree *rsvp_object_tree;
static value_string address_type_vals[] = {
{1, "1 (IPv4)"},
{2, "2 (IPv6)"},
{3, "3 (NSAP)"},
{4, "4 (MAC)"},
{0x7f, "0x7f (Vendor-defined)"},
{0, NULL}
};
rsvp_object_tree = proto_item_add_subtree(ti, TREE(TT_CALL_ID));
proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
"Length: %u", obj_length);
proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
"Class number: %u - %s",
class, type_str);
proto_item_set_text(ti, "CALL-ID");
type = tvb_get_guint8 (tvb, offset2);
switch(c_type) {
case 1:
case 2:
if (c_type == 1) {
offset3 = offset2 + 4;
len = obj_length - 16;
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 1 (operator specific)");
proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, "Address type: %s",
val_to_str(type, address_type_vals, "Unknown (%u)"));
proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 3, "Reserved: %u",
tvb_get_ntoh24(tvb, offset2+1));
}
else {
offset3 = offset2 + 16;
len = obj_length - 28;
proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
"C-type: 2 (globally unique)");
proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, "Address type: %s",
val_to_str(type, address_type_vals, "Unknown (%u)"));
str = tvb_get_string (tvb, offset2 + 1, 3);
proto_tree_add_text(rsvp_object_tree, tvb, offset2 + 1, 3,
"International Segment: %s", str);
g_free (str);
str = tvb_get_string (tvb, offset2 + 4, 12);
proto_tree_add_text(rsvp_object_tree, tvb, offset2 + 4, 12,
"National Segment: %s", str);
g_free (str);
}
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)));
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)));
break;
case 3:
offset4 = offset3 + 20;
proto_tree_add_text(rsvp_object_tree, tvb, offset3, 20, "Source Transport Network addr: %s",
tvb_bytes_to_str(tvb, offset3, 20));
break;
case 4:
offset4 = offset3 + 6;
proto_tree_add_text(rsvp_object_tree, tvb, offset3, 6, "Source Transport Network addr: %s",
tvb_bytes_to_str(tvb, offset3, 6));
break;
case 0x7F:
offset4 = offset3 + len;
proto_tree_add_text(rsvp_object_tree, tvb, offset3, len, "Source Transport Network addr: %s",
tvb_bytes_to_str(tvb, offset3, len));
break;
default:
offset4 = offset3 + len;
proto_tree_add_text(rsvp_object_tree, tvb, offset3, len, "Unknow Transport Network type: %d",
type);
}
proto_tree_add_text(rsvp_object_tree, tvb, offset4, 8, "Local Identifier: %s",
tvb_bytes_to_str(tvb, offset4, 8));
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, offset2, obj_length - 4,
"Data (%d bytes)", obj_length - 4);
break;
}
}
/*------------------------------------------------------------------------------
* RESTART CAPABILITY
*------------------------------------------------------------------------------*/
@ -4434,6 +4646,10 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
dissect_rsvp_label(ti, tvb, offset, obj_length, class, type, type_str);
break;
case RSVP_CLASS_LABEL_SET:
dissect_rsvp_label_set(ti, tvb, offset, obj_length, class, type, type_str);
break;
case RSVP_CLASS_SESSION_ATTRIBUTE:
dissect_rsvp_session_attribute(ti, tvb, offset, obj_length, class, type, type_str);
break;
@ -4478,6 +4694,10 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
dissect_rsvp_gen_uni(ti, tvb, offset, obj_length, class, type, type_str);
break;
case RSVP_CLASS_CALL_ID:
dissect_rsvp_call_id(ti, tvb, offset, obj_length, class, type, type_str);
break;
case RSVP_CLASS_RESTART_CAP:
dissect_rsvp_restart_cap(ti, tvb, offset, obj_length, class, type, type_str);
break;

View File

@ -28,5 +28,6 @@
extern const value_string gmpls_switching_type_str[];
extern const value_string gmpls_lsp_enc_str[];
extern const value_string gmpls_protection_cap_str[];
extern const value_string gmpls_sonet_signal_type_str[];
#endif