aboutsummaryrefslogtreecommitdiffstats
path: root/packet-rsvp.c
diff options
context:
space:
mode:
authorAshok Narayanan <ashokn@cisco.com>2000-03-09 18:31:51 +0000
committerAshok Narayanan <ashokn@cisco.com>2000-03-09 18:31:51 +0000
commit519161968a99f0b6a73b76f1cbcf87d29533c580 (patch)
tree1299e821df881bb9008b1c69860edc62466ef7f4 /packet-rsvp.c
parentfafc03d37e64f2311beaa8f77b79422a9542a54b (diff)
downloadwireshark-519161968a99f0b6a73b76f1cbcf87d29533c580.tar.gz
wireshark-519161968a99f0b6a73b76f1cbcf87d29533c580.tar.bz2
wireshark-519161968a99f0b6a73b76f1cbcf87d29533c580.zip
Support for MultiProtocol Label Switching (MPLS). The following support
is being added - MPLS Traffic Engineering extensions for RSVP - MPLS-encapsulated IP packets on Ethernet - OSPF Extensions for MPLS (including generic opaque LSA support for OSPF) THe following features will be committed at a later date (if I get around to writing them :-) - Label Distribution Protocol (LDP) - IS-IS Extensions for MPLS svn path=/trunk/; revision=1707
Diffstat (limited to 'packet-rsvp.c')
-rw-r--r--packet-rsvp.c636
1 files changed, 502 insertions, 134 deletions
diff --git a/packet-rsvp.c b/packet-rsvp.c
index cb5188940b..9c19f410fd 100644
--- a/packet-rsvp.c
+++ b/packet-rsvp.c
@@ -3,7 +3,7 @@
*
* (c) Copyright Ashok Narayanan <ashokn@cisco.com>
*
- * $Id: packet-rsvp.c,v 1.14 2000/03/07 06:32:37 guy Exp $
+ * $Id: packet-rsvp.c,v 1.15 2000/03/09 18:31:51 ashokn Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -34,6 +34,9 @@
* defined in RFC2210 are also supported.
*
* IPv6 support is not completely tested
+ *
+ * Mar 3, 2000: Added support for MPLS/TE objects, as defined in
+ * <draft-ietf-mpls-rsvp-lsp-tunnel-04.txt>
*/
@@ -72,6 +75,7 @@
#include "packet-ip.h"
#include "packet-ipv6.h"
#include "packet-rsvp.h"
+#include "ieee-float.h"
static int proto_rsvp = -1;
@@ -92,6 +96,14 @@ static gint ett_rsvp_adspec = -1;
static gint ett_rsvp_adspec_subtree = -1;
static gint ett_rsvp_integrity = -1;
static gint ett_rsvp_policy = -1;
+static gint ett_rsvp_label = -1;
+static gint ett_rsvp_label_request = -1;
+static gint ett_rsvp_session_attribute = -1;
+static gint ett_rsvp_session_attribute_flags = -1;
+static gint ett_rsvp_explicit_route = -1;
+static gint ett_rsvp_explicit_route_subobj = -1;
+static gint ett_rsvp_record_route = -1;
+static gint ett_rsvp_record_route_subobj = -1;
static gint ett_rsvp_unknown_class = -1;
@@ -123,6 +135,7 @@ static value_string message_type_vals[] = {
enum rsvp_classes {
RSVP_CLASS_NULL=0,
RSVP_CLASS_SESSION,
+
RSVP_CLASS_HOP=3,
RSVP_CLASS_INTEGRITY,
RSVP_CLASS_TIME_VALUES,
@@ -135,7 +148,14 @@ enum rsvp_classes {
RSVP_CLASS_SENDER_TSPEC,
RSVP_CLASS_ADSPEC,
RSVP_CLASS_POLICY,
- RSVP_CLASS_CONFIRM
+ RSVP_CLASS_CONFIRM,
+ RSVP_CLASS_LABEL,
+
+ RSVP_CLASS_LABEL_REQUEST=19,
+ RSVP_CLASS_EXPLICIT_ROUTE,
+ RSVP_CLASS_RECORD_ROUTE,
+
+ RSVP_CLASS_SESSION_ATTRIBUTE=207,
};
static value_string rsvp_class_vals[] = {
@@ -153,7 +173,12 @@ static value_string rsvp_class_vals[] = {
{RSVP_CLASS_SENDER_TSPEC, "SENDER TSPEC object"},
{RSVP_CLASS_ADSPEC, "ADSPEC object"},
{RSVP_CLASS_POLICY, "POLICY object"},
- {RSVP_CLASS_CONFIRM, "CONFIRM object"}
+ {RSVP_CLASS_CONFIRM, "CONFIRM object"},
+ {RSVP_CLASS_LABEL, "LABEL object"},
+ {RSVP_CLASS_LABEL_REQUEST, "LABEL REQUEST object"},
+ {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
+ {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
+ {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
};
/*
@@ -525,24 +550,27 @@ static value_string adspec_params[] = {
{136, "Since-last-reshaping point composed D"},
};
+/* -------------------- Stuff for MPLS/TE objects -------------------- */
-/* Stuff for IEEE float handling */
-
-#define IEEE_NUMBER_WIDTH 32 /* bits in number */
-#define IEEE_EXP_WIDTH 8 /* bits in exponent */
-#define IEEE_MANTISSA_WIDTH 23 /* IEEE_NUMBER_WIDTH - 1 - IEEE_EXP_WIDTH */
-
-#define IEEE_SIGN_MASK 0x80000000
-#define IEEE_EXPONENT_MASK 0x7F800000
-#define IEEE_MANTISSA_MASK 0x007FFFFF
-#define IEEE_INFINITY IEEE_EXPONENT_MASK
+typedef struct {
+ rsvp_object base;
+ guint32 labels[0];
+} label;
-#define IEEE_IMPLIED_BIT (1 << IEEE_MANTISSA_WIDTH)
-#define IEEE_INFINITE ((1 << IEEE_EXP_WIDTH) - 1)
-#define IEEE_BIAS ((1 << (IEEE_EXP_WIDTH - 1)) - 1)
+typedef struct {
+ rsvp_object base;
+ guint16 _reserved;
+ guint16 l3pid;
+} label_request;
-#define MINUS_INFINITY (signed)0x80000000L
-#define PLUS_INFINITY 0x7FFFFFFF
+typedef struct {
+ rsvp_object base;
+ guint8 setup_prio;
+ guint8 hold_prio;
+ guint8 flags;
+ guint8 name_len;
+ guint8 name[0];
+} session_attribute;
static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
{IP_PROTO_IGMP, "IGMP"},
@@ -583,16 +611,28 @@ enum rsvp_filter_keys {
RSVPF_ADSPEC,
RSVPF_POLICY,
RSVPF_CONFIRM,
+ RSVPF_LABEL,
+ RSVPF_DUMMY_2,
+ RSVPF_DUMMY_3,
+ RSVPF_LABEL_REQUEST,
+ RSVPF_EXPLICIT_ROUTE,
+ RSVPF_RECORD_ROUTE,
+
+ RSVPF_SESSION_ATTRIBUTE,
+
RSVPF_UNKNOWN_OBJ,
/* Session object */
RSVPF_SESSION_IP,
RSVPF_SESSION_PROTO,
RSVPF_SESSION_PORT,
+ RSVPF_SESSION_TUNNEL_ID,
+ RSVPF_SESSION_EXT_TUNNEL_ID,
/* Sender template */
RSVPF_SENDER_IP,
RSVPF_SENDER_PORT,
+ RSVPF_SENDER_LSP_ID,
/* Sentinel */
RSVPF_MAX
@@ -698,6 +738,26 @@ static hf_register_info rsvpf_info[] = {
{ "CONFIRM", "rsvp.confirm", FT_UINT8, BASE_NONE, NULL, 0x0,
"" }},
+ {&rsvp_filter[RSVPF_LABEL],
+ { "LABEL", "rsvp.label", FT_UINT8, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_LABEL_REQUEST],
+ { "LABEL REQUEST", "rsvp.label_request", FT_UINT8, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE],
+ { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_UINT8, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_EXPLICIT_ROUTE],
+ { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_UINT8, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_RECORD_ROUTE],
+ { "RECORD ROUTE", "rsvp.record_route", FT_UINT8, BASE_NONE, NULL, 0x0,
+ "" }},
+
{&rsvp_filter[RSVPF_UNKNOWN_OBJ],
{ "Unknown object", "rsvp.obj_unknown", FT_UINT8, BASE_NONE, NULL, 0x0,
"" }},
@@ -715,13 +775,25 @@ static hf_register_info rsvpf_info[] = {
{ "Protocol", "rsvp.session.proto", FT_UINT8, BASE_NONE, VALS(proto_vals), 0x0,
"" }},
- /* Sender template fields */
+ {&rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
+ { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
+ { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ /* Sender template/Filterspec fields */
{&rsvp_filter[RSVPF_SENDER_IP],
- { "Sender Template IPv4 address", "rsvp.template.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
+ { "Sender IPv4 address", "rsvp.sender.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
"" }},
{&rsvp_filter[RSVPF_SENDER_PORT],
- { "Sender Template port number", "rsvp.template.port", FT_UINT16, BASE_NONE, NULL, 0x0,
+ { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_NONE, NULL, 0x0,
+ "" }},
+
+ {&rsvp_filter[RSVPF_SENDER_LSP_ID],
+ { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_NONE, NULL, 0x0,
"" }}
};
@@ -742,73 +814,37 @@ static inline int rsvp_class_to_filter_num(int classnum)
case RSVP_CLASS_ADSPEC :
case RSVP_CLASS_POLICY :
case RSVP_CLASS_CONFIRM :
+ case RSVP_CLASS_LABEL :
+ case RSVP_CLASS_LABEL_REQUEST :
+ case RSVP_CLASS_EXPLICIT_ROUTE :
+ case RSVP_CLASS_RECORD_ROUTE :
return classnum + RSVPF_OBJECT;
+ break;
+
+ case RSVP_CLASS_SESSION_ATTRIBUTE :
+ return RSVPF_SESSION_ATTRIBUTE;
default:
return RSVPF_UNKNOWN_OBJ;
}
}
-static inline int ieee_float_is_zero (long number)
-{
- return(!(number & ~IEEE_SIGN_MASK));
-}
-
-/*
- * simple conversion: ieee floating point to long
- */
-static long ieee_to_long (const void *p)
-{
- long number;
- long sign;
- long exponent;
- long mantissa;
-
- number = pntohl(p);
- sign = number & IEEE_SIGN_MASK;
- exponent = number & IEEE_EXPONENT_MASK;
- mantissa = number & IEEE_MANTISSA_MASK;
-
- if (ieee_float_is_zero(number)) {
- /* number is zero, unnormalized, or not-a-number */
- return 0;
- }
- if (IEEE_INFINITY == exponent) {
- /* number is positive or negative infinity, or a special value */
- return (sign? MINUS_INFINITY: PLUS_INFINITY);
- }
-
- exponent = (exponent >> IEEE_MANTISSA_WIDTH) - IEEE_BIAS;
- if (exponent < 0) {
- /* number is between zero and one */
- return 0;
- }
-
- mantissa |= IEEE_IMPLIED_BIT;
- if (exponent <= IEEE_MANTISSA_WIDTH)
- mantissa >>= IEEE_MANTISSA_WIDTH - exponent;
- else
- mantissa <<= exponent - IEEE_MANTISSA_WIDTH;
-
- if (sign)
- return -mantissa;
- else
- return mantissa;
-}
-
void
dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{
- proto_tree *rsvp_tree = NULL, *ti;
+ proto_tree *rsvp_tree = NULL, *ti, *ti2;
proto_tree *rsvp_header_tree;
proto_tree *rsvp_object_tree;
+ proto_tree *rsvp_sa_flags_tree;
+ proto_tree *rsvp_ero_subtree;
char *packet_type, *object_type;
rsvp_header *hdr;
rsvp_object *obj;
- int i, len, mylen;
+ int i, j, k, l, len, mylen;
int msg_length;
int obj_length;
int offset2;
+ struct e_in6_addr *ip6a;
hdr = (rsvp_header *)&pd[offset];
packet_type = match_strval(hdr->message_type, message_type_vals);
@@ -827,27 +863,27 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
rsvp_tree = proto_item_add_subtree(ti, ett_rsvp);
ti = proto_tree_add_text(rsvp_tree, offset,
- sizeof(rsvp_header), "RSVP Header");
+ sizeof(rsvp_header), "RSVP Header");
rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
proto_tree_add_text(rsvp_header_tree, offset, 1, "RSVP Version: %u",
- (hdr->ver_flags & 0xf0)>>4);
+ (hdr->ver_flags & 0xf0)>>4);
proto_tree_add_text(rsvp_header_tree, offset, 1, "Flags: %02X",
- hdr->ver_flags & 0xf);
+ hdr->ver_flags & 0xf);
proto_tree_add_item(rsvp_header_tree, rsvp_filter[RSVPF_MSG],
offset+1, 1, hdr->message_type);
if (hdr->message_type >= RSVPF_MAX) {
- proto_tree_add_text(rsvp_header_tree, offset+1, 1, "Message Type: %u - Unknown",
- hdr->message_type);
- return;
+ proto_tree_add_text(rsvp_header_tree, offset+1, 1, "Message Type: %u - Unknown",
+ hdr->message_type);
+ return;
}
proto_tree_add_item_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + hdr->message_type],
- offset+1, 1, 1);
+ offset+1, 1, 1);
proto_tree_add_text(rsvp_header_tree, offset + 2 , 2, "Message Checksum");
proto_tree_add_text(rsvp_header_tree, offset + 4 , 1, "Sending TTL: %u",
- hdr->sending_ttl);
+ hdr->sending_ttl);
proto_tree_add_text(rsvp_header_tree, offset + 6 , 2, "Message length: %d",
- msg_length);
+ msg_length);
offset += sizeof(rsvp_header);
len = 0;
@@ -856,19 +892,14 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
obj_length = pntohs(pd+offset);
if (!BYTES_ARE_IN_FRAME(offset, obj_length)) {
proto_tree_add_text(rsvp_tree, offset, 1,
- "Further data not captured");
+ "Further data not captured");
break;
}
object_type = match_strval(obj->class, rsvp_class_vals);
if (!object_type) object_type = "Unknown";
- /*
- ti = proto_tree_add_text(rsvp_tree, offset,
- obj_length,
- "%s (%u)", object_type, obj->class);
- */
ti = proto_tree_add_item_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT],
- offset, obj_length, obj->class);
+ offset, obj_length, obj->class);
ti = proto_tree_add_item(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(obj->class)],
offset, obj_length, obj->class);
@@ -885,26 +916,15 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
obj->class, object_type);
switch(obj->type) {
case 1: {
- /*rsvp_session_ipv4 *sess = (rsvp_session_ipv4 *)obj;*/
proto_tree_add_text(rsvp_object_tree, offset+3, 1,
"C-type: 1 - IPv4");
- /*
- proto_tree_add_text(rsvp_object_tree, offset2, 4,
- "Destination address: %s",
- ip_to_str((guint8 *) &(sess->destination)));
- */
proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP],
- offset2, 4, pntohl(pd+offset2));
+ offset2, 4, *(ulong *)(pd+offset2));
- /* proto_tree_add_text(rsvp_object_tree, offset2+4, 1,
- "Protocol: %u", sess->protocol);*/
proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PROTO],
- offset2+4, 1, pntohs(pd+offset2+4));
+ offset2+4, 1, *(pd+offset2+4));
proto_tree_add_text(rsvp_object_tree, offset2+5, 1,
"Flags: %x", pntohs(pd+offset2+5));
- /* proto_tree_add_text(rsvp_object_tree, offset2+6, 2,
- "Destination port: %u",
- pntohs(pd+offset2+6)); */
proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PORT],
offset2+6, 2, pntohs(pd+offset2+6));
break;
@@ -927,6 +947,19 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
break;
}
+ case 7: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 7 - IPv4 LSP");
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP],
+ offset2, 4, *(ulong *)(pd+offset2));
+
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
+ offset2+6, 2, pntohs(pd+offset2+6));
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
+ offset2+8, 4, *(ulong *)(pd+offset2+8));
+ break;
+ }
+
default: {
proto_tree_add_text(rsvp_object_tree, offset+3, 1,
"C-type: Unknown (%u)",
@@ -1099,14 +1132,13 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
}
case 2: {
- struct e_in6_addr *ip;
proto_tree_add_text(rsvp_object_tree, offset+3, 1,
"C-type: 2 - IPv6");
while (mylen>sizeof(rsvp_object)) {
- ip = (struct e_in6_addr *)pd+offset2;
+ ip6a = (struct e_in6_addr *)pd+offset2;
proto_tree_add_text(rsvp_object_tree, offset2, 16,
"IPv6 Address: %s",
- ip6_to_str(ip));
+ ip6_to_str(ip6a));
offset2 += 16;
mylen -= 16;
}
@@ -1212,14 +1244,13 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
common_template:
switch(obj->type) {
case 1: {
- rsvp_template_ipv4 *tem = (rsvp_template_ipv4 *)obj;
proto_tree_add_text(rsvp_object_tree, offset+3, 1,
"C-type: 1 - IPv4");
- proto_tree_add_text(rsvp_object_tree, offset2, 4,
- "Source address: %s",
- ip_to_str((guint8 *) &(tem->source)));
- proto_tree_add_text(rsvp_object_tree, offset2+6, 2,
- "Source port: %u", pntohs(pd+offset2+6));
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP],
+ offset2, 4, *(ulong *)(pd+offset2));
+
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_PORT],
+ offset2+6, 2, pntohs(pd+offset2+6));
break;
}
@@ -1235,6 +1266,17 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
break;
}
+ case 7: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 7 - IPv4 LSP");
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP],
+ offset2, 4, *(ulong *)(pd+offset2));
+
+ proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_LSP_ID],
+ offset2+6, 2, pntohs(pd+offset2+6));
+ break;
+ }
+
default: {
proto_tree_add_text(rsvp_object_tree, offset+3, 1,
"C-type: Unknown (%u)",
@@ -1262,11 +1304,11 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
obj->class, object_type);
proto_tree_add_text(rsvp_object_tree, offset2, 1,
- "Message format version: %u",
- tspec->version>>4);
+ "Message format version: %u",
+ tspec->version>>4);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
- "Data length: %u words, not including header",
- pntohs(pd+offset2+2));
+ "Data length: %u words, not including header",
+ pntohs(pd+offset2+2));
mylen -=4;
offset2 +=4;
@@ -1279,10 +1321,10 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
"Service header: %u - %s",
sh->service_num, str);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
- "Length of service %u data: %u words, "
- "not including header",
- sh->service_num,
- ntohs(sh->length));
+ "Length of service %u data: %u words, "
+ "not including header",
+ sh->service_num,
+ ntohs(sh->length));
offset2+=4; mylen -=4;
@@ -1308,13 +1350,13 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
ntohs(ist->parameter_length));
proto_tree_add_text(rsvp_object_tree, offset2+4, 4,
"Token bucket rate: %ld",
- ieee_to_long(pd+offset2+4));
+ pieee_to_long(pd+offset2+4));
proto_tree_add_text(rsvp_object_tree, offset2+8, 4,
"Token bucket size: %ld",
- ieee_to_long(pd+offset2+8));
+ pieee_to_long(pd+offset2+8));
proto_tree_add_text(rsvp_object_tree, offset2+12, 4,
"Peak data rate: %ld",
- ieee_to_long(pd+offset2+12));
+ pieee_to_long(pd+offset2+12));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Minimum policed unit: %u",
pntohl(pd+offset2+16));
@@ -1374,11 +1416,11 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
obj->class, object_type);
proto_tree_add_text(rsvp_object_tree, offset2, 1,
- "Message format version: %u",
- flowspec->version>>4);
+ "Message format version: %u",
+ flowspec->version>>4);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
- "Data length: %u words, not including header",
- pntohs(pd+offset2+2));
+ "Data length: %u words, not including header",
+ pntohs(pd+offset2+2));
mylen -=4;
offset2+=4;
@@ -1391,10 +1433,10 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
"Service header: %u - %s",
sh->service_num, str);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
- "Length of service %u data: %u words, "
- "not including header",
- sh->service_num,
- ntohs(sh->length));
+ "Length of service %u data: %u words, "
+ "not including header",
+ sh->service_num,
+ ntohs(sh->length));
offset2+=4; mylen -=4;
@@ -1420,13 +1462,13 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
ntohs(isf->tspec.parameter_length));
proto_tree_add_text(rsvp_object_tree, offset2+4, 4,
"Token bucket rate: %ld",
- ieee_to_long(pd+offset2+4));
+ pieee_to_long(pd+offset2+4));
proto_tree_add_text(rsvp_object_tree, offset2+8, 4,
"Token bucket size: %ld",
- ieee_to_long(pd+offset2+8));
+ pieee_to_long(pd+offset2+8));
proto_tree_add_text(rsvp_object_tree, offset2+12, 4,
"Peak data rate: %ld",
- ieee_to_long(pd+offset2+12));
+ pieee_to_long(pd+offset2+12));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Minimum policed unit: %u",
pntohl(pd+offset2+16));
@@ -1453,7 +1495,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(rsvp_object_tree, offset2+28, 4,
"Rate: %ld",
- ieee_to_long(pd+offset2+28));
+ pieee_to_long(pd+offset2+28));
proto_tree_add_text(rsvp_object_tree, offset2+32, 4,
"Slack term: %u",
pntohl(pd+offset2+32));
@@ -1519,7 +1561,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
(pntohs(&shdr->length)+1)<<2,
str?str:"Unknown");
adspec_tree = proto_item_add_subtree(ti,
- ett_rsvp_adspec_subtree);
+ ett_rsvp_adspec_subtree);
proto_tree_add_text(adspec_tree, offset2, 1,
"Service header %u - %s",
shdr->service_num, str);
@@ -1557,7 +1599,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
(pntohs(&phdr->length)+1)<<2,
"%s - %lu (type %u, length %u)",
str,
- ieee_to_long(&phdr->dataval),
+ pieee_to_long(&phdr->dataval),
phdr->id, pntohs(&phdr->length));
break;
default:
@@ -1599,6 +1641,324 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
obj->class, object_type);
goto default_class;
+ case RSVP_CLASS_LABEL_REQUEST :
+ rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request);
+ proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
+ obj_length);
+ proto_tree_add_text(rsvp_object_tree, offset+2, 1,
+ "Class number: %d - %s",
+ obj->class, object_type);
+ switch(obj->type) {
+ case 1: {
+ unsigned short l3pid = pntohs(pd+offset2+2);
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 1");
+ proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
+ "L3PID: 0x%04x", l3pid);
+ break;
+ }
+
+ default: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: Unknown (%d)",
+ obj->type);
+ i = obj_length - sizeof(rsvp_object);
+ proto_tree_add_text(rsvp_object_tree, offset2, i,
+ "Data (%d bytes)", i);
+ break;
+ }
+ }
+ break;
+
+ case RSVP_CLASS_LABEL :
+ rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
+ proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
+ obj_length);
+ proto_tree_add_text(rsvp_object_tree, offset+2, 1,
+ "Class number: %d - %s",
+ obj->class, object_type);
+ switch(obj->type) {
+ case 1: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 1");
+ for (i=1, l = 0; l < obj_length - 4; l+=4, i++)
+ proto_tree_add_text(rsvp_object_tree, offset2+l, 4,
+ "Label %d: %d %s",
+ i, pntohl(pd+offset2+l),
+ l == obj_length - 8 ?
+ "(Top label)" : "");
+ break;
+ }
+
+ default: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: Unknown (%d)",
+ obj->type);
+ i = obj_length - sizeof(rsvp_object);
+ proto_tree_add_text(rsvp_object_tree, offset2, i,
+ "Data (%d bytes)", i);
+ break;
+ }
+ }
+ break;
+
+ case RSVP_CLASS_SESSION_ATTRIBUTE :
+ rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
+ proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
+ obj_length);
+ proto_tree_add_text(rsvp_object_tree, offset+2, 1,
+ "Class number: %d - %s",
+ obj->class, object_type);
+ switch(obj->type) {
+ case 7: {
+ char s_name[64];
+ session_attribute *s_attr = (session_attribute *)&pd[offset];
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 7 - IPv4 LSP");
+ proto_tree_add_text(rsvp_object_tree, offset2, 1,
+ "Setup priority: %d", s_attr->setup_prio);
+ proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
+ "Hold priority: %d", s_attr->hold_prio);
+ ti2 = proto_tree_add_text(rsvp_object_tree, offset2+2, 1,
+ "Flags: %0x", s_attr->flags);
+ rsvp_sa_flags_tree = proto_item_add_subtree(ti2,
+ ett_rsvp_session_attribute_flags);
+ proto_tree_add_text(rsvp_sa_flags_tree, offset2+2, 1,
+ ".......%d: Local protection: %s",
+ s_attr->flags & 0x1 ? 1 : 0,
+ s_attr->flags & 0x1 ? "Set" : "Not set");
+ proto_tree_add_text(rsvp_sa_flags_tree, offset2+2, 1,
+ "......%d.: Merging permitted: %s",
+ s_attr->flags & 0x2 ? 1 : 0,
+ s_attr->flags & 0x2 ? "Set" : "Not set");
+ proto_tree_add_text(rsvp_sa_flags_tree, offset2+2, 1,
+ ".....%d..: Ingress note may reroute: %s",
+ s_attr->flags & 0x4 ? 1 : 0,
+ s_attr->flags & 0x4 ? "Set" : "Not set");
+
+ proto_tree_add_text(rsvp_object_tree, offset2+3, 1,
+ "Name length: %d", s_attr->name_len);
+ memset(s_name, 0, 64);
+ strncpy(s_name, s_attr->name, 60);
+ if (s_attr->name_len>60) sprintf(&(s_name[60]), "...");
+ proto_tree_add_text(rsvp_object_tree, offset2+4, s_attr->name_len,
+ "Name: %s", s_name);
+ break;
+ }
+
+ default: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: Unknown (%d)",
+ obj->type);
+ i = obj_length - sizeof(rsvp_object);
+ proto_tree_add_text(rsvp_object_tree, offset2, i,
+ "Data (%d bytes)", i);
+ break;
+ }
+ }
+ break;
+
+ case RSVP_CLASS_EXPLICIT_ROUTE :
+ rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route);
+ proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
+ obj_length);
+ proto_tree_add_text(rsvp_object_tree, offset+2, 1,
+ "Class number: %d - %s",
+ obj->class, object_type);
+ switch(obj->type) {
+ case 1: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 1");
+ for (i=1, l = 0; l < obj_length - 4; i++) {
+ j = ((unsigned char)pd[offset2+l]) & 0x7f;
+ switch(j) {
+ case 1: /* IPv4 */
+ k = ((unsigned char)pd[offset2+l]) & 0x80;
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 8,
+ "IPv4 Subobject - %s, %s",
+ ip_to_str(&pd[offset2+l+2]),
+ k ? "Loose" : "Strict");
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 1 (IPv4)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 4,
+ "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+6, 1,
+ "Prefix length: %d", pd[offset2+l+6]);
+ break;
+
+ case 2: /* IPv6 */
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 20,
+ "IPv6 Subobject");
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
+ k = ((unsigned char)pd[offset2+l]) & 0x80;
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 2 (IPv6)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ ip6a = (struct e_in6_addr *)pd+offset2+l+2;
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 16,
+ "IPv6 hop: %s", ip6_to_str(ip6a));
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+18, 1,
+ "Prefix length: %d", pd[offset2+l+6]);
+ break;
+
+ case 32: /* AS */
+ k = pntohs(offset2+l+2);
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 4,
+ "Autonomous System %d", k);
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 32 (Autonomous System Number)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 2,
+ "Autonomous System %d", k);
+ break;
+
+ case 64: /* Path Term */
+ k = ((unsigned char)pd[offset2+l]) & 0x80;
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 4,
+ "LSP Path Termination");
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 64 (MPLS LSP Path Termination)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ break;
+
+ default: /* Unknown subobject */
+ k = ((unsigned char)pd[offset2+l]) & 0x80;
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, pd[offset2+l+1],
+ "Unknown subobject: %d", j);
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: %d (Unknown)", j);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+
+ }
+
+ l += ((unsigned char)pd[offset2+l+1]);
+ }
+ break;
+ }
+ default: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: Unknown (%d)",
+ obj->type);
+ i = obj_length - sizeof(rsvp_object);
+ proto_tree_add_text(rsvp_object_tree, offset2, i,
+ "Data (%d bytes)", i);
+ break;
+ }
+ }
+ break;
+
+
+ case RSVP_CLASS_RECORD_ROUTE :
+ rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route);
+ proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
+ obj_length);
+ proto_tree_add_text(rsvp_object_tree, offset+2, 1,
+ "Class number: %d - %s",
+ obj->class, object_type);
+ switch(obj->type) {
+ case 1: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: 1");
+ for (i=1, l = 0; l < obj_length - 4; i++) {
+ j = (unsigned char)pd[offset2+l];
+ switch(j) {
+ case 1: /* IPv4 */
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 8,
+ "IPv4 Subobject - %s",
+ ip_to_str(&pd[offset2+l+2]));
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 1 (IPv4)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 4,
+ "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+6, 1,
+ "Prefix length: %d", pd[offset2+l+6]);
+ break;
+
+ case 2: /* IPv6 */
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, 20,
+ "IPv6 Subobject");
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: 2 (IPv6)");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+ ip6a = (struct e_in6_addr *)pd+offset2+l+2;
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 16,
+ "IPv6 hop: %s", ip6_to_str(ip6a));
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+18, 1,
+ "Prefix length: %d", pd[offset2+l+6]);
+ break;
+
+ default: /* Unknown subobject */
+ k = ((unsigned char)pd[offset2+l]) & 0x80;
+ ti2 = proto_tree_add_text(rsvp_object_tree,
+ offset2+l, pd[offset2+l+1],
+ "Unknown subobject: %d", j);
+ rsvp_ero_subtree =
+ proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1,
+ "Type: %d (Unknown)", j);
+ proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1,
+ "Length: %d", pd[offset2+l+1]);
+
+ }
+
+ l += ((unsigned char)pd[offset2+l+1]);
+ }
+ break;
+ }
+
+ default: {
+ proto_tree_add_text(rsvp_object_tree, offset+3, 1,
+ "C-type: Unknown (%d)",
+ obj->type);
+ i = obj_length - sizeof(rsvp_object);
+ proto_tree_add_text(rsvp_object_tree, offset2, i,
+ "Data (%d bytes)", i);
+ break;
+ }
+ }
+ break;
+
default :
rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
@@ -1609,7 +1969,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
default_class:
i = obj_length - sizeof(rsvp_object);
proto_tree_add_text(rsvp_object_tree, offset2, i,
- "Data (%d bytes)", i);
+ "Data (%d bytes)", i);
break;
case RSVP_CLASS_NULL :
@@ -1644,6 +2004,14 @@ proto_register_rsvp(void)
&ett_rsvp_adspec_subtree,
&ett_rsvp_integrity,
&ett_rsvp_policy,
+ &ett_rsvp_label,
+ &ett_rsvp_label_request,
+ &ett_rsvp_session_attribute,
+ &ett_rsvp_session_attribute_flags,
+ &ett_rsvp_explicit_route,
+ &ett_rsvp_explicit_route_subobj,
+ &ett_rsvp_record_route,
+ &ett_rsvp_record_route_subobj,
&ett_rsvp_unknown_class,
};