Added Ashok's fix for RSVP and support for RSVP+.

svn path=/trunk/; revision=475
This commit is contained in:
Gilbert Ramirez 1999-08-12 05:19:06 +00:00
parent 0b424dc9b9
commit f5d36ff3cd
3 changed files with 311 additions and 188 deletions

3
NEWS
View File

@ -1,3 +1,6 @@
Overview of changes in Ethereal 0.7.3:
* Fixed bug in RSVP, added RSVP+ support (Ashok)
Overview of changes in Ethereal 0.7.2:
* Another memory leak fix (Jochen)
* Allow compilation from different directory (Laurent)

View File

@ -3,7 +3,7 @@
*
* (c) Copyright Ashok Narayanan <ashokn@cisco.com>
*
* $Id: packet-rsvp.c,v 1.4 1999/07/29 05:47:02 gram Exp $
* $Id: packet-rsvp.c,v 1.5 1999/08/12 05:19:05 gram Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -569,8 +569,13 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
break;
case RSVP_CLASS_SENDER_TSPEC : {
IS_tspec *tspec = (IS_tspec *)obj;
rsvp_tspec *tspec = (rsvp_tspec *)obj;
IS_tspec *ist;
QUAL_tspec *qt;
service_hdr *sh;
char *str;
mylen = obj_length;
rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_SENDER_TSPEC);
proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d",
obj_length);
@ -584,64 +589,111 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Data length: %d words, not including header",
pntohs(pd+offset2+2));
proto_tree_add_text(rsvp_object_tree, offset2+4, 1,
"Service header: %d - %s",
tspec->service_header,
tspec->service_header==1 ?
"Default/global information (INTSRV_GENERAL)" :
"Unknown");
proto_tree_add_text(rsvp_object_tree, offset2+6, 2,
mylen -=4;
offset2 +=4;
while (mylen > 4) {
sh = (service_hdr *)(pd+offset2);
str = match_strval(sh->service_num, qos_vals);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Service header: %d - %s",
sh->service_num, str);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Length of service %d data: %d words, "
"not including header",
tspec->service_header,
pntohs(pd+offset2+6)>>12);
sh->service_num,
ntohs(sh->length));
/* Token bucket TSPEC */
proto_tree_add_text(rsvp_object_tree, offset2+8, 1,
"Parameter ID: %d - %s",
tspec->param_id,
tspec->param_id==127 ? "Token Bucket TSpec" :
"Unknown");
proto_tree_add_text(rsvp_object_tree, offset2+9, 1,
"Parameter %d flags: %d",
tspec->param_id, tspec->flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+10, 2,
"Length of parameter %d data: %d words, "
"not including header",
tspec->param_id,
pntohs(pd+offset2+10));
proto_tree_add_text(rsvp_object_tree, offset2+12, 4,
"Token bucket rate: %ld",
ieee_to_long(pd+offset2+12));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Token bucket size: %ld",
ieee_to_long(pd+offset2+16));
proto_tree_add_text(rsvp_object_tree, offset2+20, 4,
"Peak data rate: %ld",
ieee_to_long(pd+offset2+20));
proto_tree_add_text(rsvp_object_tree, offset2+24, 4,
"Minimum policed unit: %d",
pntohl(pd+offset2+24));
proto_tree_add_text(rsvp_object_tree, offset2+28, 4,
"Maximum policed unit: %d",
pntohl(pd+offset2+28));
offset2+=4; mylen -=4;
switch(sh->service_num) {
case QOS_TSPEC :
ist = (IS_tspec *)sh;
/* Token bucket TSPEC */
str = match_strval(ist->param_id, svc_vals);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Parameter %d - %s",
ist->param_id, str);
proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
"Parameter %d flags: %d",
ist->param_id, ist->flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Parameter %d data length: %d words, "
"not including header",
ist->param_id,
/* pntohs(pd+offset2+10)); */
ntohs(ist->parameter_length));
proto_tree_add_text(rsvp_object_tree, offset2+4, 4,
"Token bucket rate: %ld",
ieee_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));
proto_tree_add_text(rsvp_object_tree, offset2+12, 4,
"Peak data rate: %ld",
ieee_to_long(pd+offset2+12));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Minimum policed unit: %d",
pntohl(pd+offset2+16));
proto_tree_add_text(rsvp_object_tree, offset2+20, 4,
"Maximum policed unit: %d",
pntohl(pd+offset2+20));
break;
case QOS_QUALITATIVE :
qt = (QUAL_tspec *)sh;
/* Token bucket TSPEC */
str = match_strval(qt->param_id, svc_vals);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Parameter %d - %s",
qt->param_id, str);
proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
"Parameter %d flags: %d",
qt->param_id, qt->flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Parameter %d data length: %d words, "
"not including header",
qt->param_id,
/* pntohs(pd+offset2+10)); */
ntohs(qt->parameter_length));
proto_tree_add_text(rsvp_object_tree, offset2+4, 4,
"Maximum policed unit: %d",
pntohl(pd+offset2+4));
break;
}
offset2 += ntohs(sh->length)*4;
mylen -= ntohs(sh->length)*4;
}
break;
}
case RSVP_CLASS_FLOWSPEC : {
IS_flowspec *flowspec = (IS_flowspec *)obj;
char *qos_str = match_strval(flowspec->service_header, qos_vals);
char *is_param_str = match_strval(flowspec->param_id, svc_vals);
rsvp_flowspec *flowspec = (rsvp_flowspec *)obj;
IS_flowspec *isf;
QUAL_flowspec *qf;
service_hdr *sh;
int mylen;
char *str;
mylen = obj_length;
rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_FLOWSPEC);
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);
if (!qos_str) qos_str = "Unknown";
if (!is_param_str) is_param_str="Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Message format version: %d",
@ -649,63 +701,111 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Data length: %d words, not including header",
pntohs(pd+offset2+2));
proto_tree_add_text(rsvp_object_tree, offset2+4, 1,
"Service header: %d - %s",
flowspec->service_header, qos_str);
proto_tree_add_text(rsvp_object_tree, offset2+6, 2,
mylen -=4;
offset2+=4;
while (mylen > 4) {
sh = (service_hdr *)(pd+offset2);
str = match_strval(sh->service_num, intsrv_services_str);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Service header: %d - %s",
sh->service_num, str);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Length of service %d data: %d words, "
"not including header",
flowspec->service_header,
pntohs(pd+offset2+6)>>12);
proto_tree_add_text(rsvp_object_tree, offset2+8, 1,
"Parameter ID: %d - %s",
flowspec->param_id, is_param_str);
proto_tree_add_text(rsvp_object_tree, offset2+9, 1,
"Parameter %d flags: %d",
flowspec->param_id, flowspec->flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+10, 2,
"Length of parameter %d data: %d words, "
"not including header",
flowspec->param_id,
pntohs(pd+offset2+10));
proto_tree_add_text(rsvp_object_tree, offset2+12, 4,
"Token bucket rate: %ld",
ieee_to_long(pd+offset2+12));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Token bucket size: %ld",
ieee_to_long(pd+offset2+16));
proto_tree_add_text(rsvp_object_tree, offset2+20, 4,
"Peak data rate: %ld",
ieee_to_long(pd+offset2+20));
proto_tree_add_text(rsvp_object_tree, offset2+24, 4,
"Minimum policed unit: %d",
pntohl(pd+offset2+24));
proto_tree_add_text(rsvp_object_tree, offset2+28, 4,
"Maximum policed unit: %d",
pntohl(pd+offset2+28));
if (flowspec->service_header!=QOS_GUARANTEED)
break;
sh->service_num,
ntohs(sh->length));
/* Guaranteed-rate RSpec */
is_param_str = match_strval(flowspec->param_id_rspec, svc_vals);
if (!is_param_str) is_param_str="Unknown";
proto_tree_add_text(rsvp_object_tree, offset2+32, 1,
"Parameter ID: %d - %s",
flowspec->param_id, is_param_str);
proto_tree_add_text(rsvp_object_tree, offset2+33, 1,
"Parameter %d flags: %d",
flowspec->param_id, flowspec->flags_rspec);
proto_tree_add_text(rsvp_object_tree, offset2+34, 2,
"Length of parameter %d data: %d words, "
"not including header",
flowspec->param_id,
pntohs(pd+offset2+34));
proto_tree_add_text(rsvp_object_tree, offset2+36, 4,
"Rate: %ld",
ieee_to_long(pd+offset2+36));
proto_tree_add_text(rsvp_object_tree, offset2+40, 4,
"Slack term: %d",
pntohl(pd+offset2+40));
offset2+=4; mylen -=4;
switch(sh->service_num) {
case QOS_CONTROLLED_LOAD :
case QOS_GUARANTEED :
/* Treat both these the same for now */
isf = (IS_flowspec *)sh;
str = match_strval(isf->tspec.param_id, svc_vals);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Parameter %d - %s",
isf->tspec.param_id, str);
proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
"Parameter %d flags: %d",
isf->tspec.param_id, isf->tspec.flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Parameter %d data length: %d words, "
"not including header",
isf->tspec.param_id,
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));
proto_tree_add_text(rsvp_object_tree, offset2+8, 4,
"Token bucket size: %ld",
ieee_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));
proto_tree_add_text(rsvp_object_tree, offset2+16, 4,
"Minimum policed unit: %d",
pntohl(pd+offset2+16));
proto_tree_add_text(rsvp_object_tree, offset2+20, 4,
"Maximum policed unit: %d",
pntohl(pd+offset2+20));
if (sh->service_num!=QOS_GUARANTEED)
break;
/* Guaranteed-rate RSpec */
str = match_strval(isf->rspec.param_id, svc_vals);
if (!str) str="Unknown";
proto_tree_add_text(rsvp_object_tree, offset2+24, 1,
"Parameter %d - %s",
isf->rspec.param_id, str);
proto_tree_add_text(rsvp_object_tree, offset2+25, 1,
"Parameter %d flags: %d",
isf->rspec.param_id, isf->rspec.flags_rspec);
proto_tree_add_text(rsvp_object_tree, offset2+26, 2,
"Parameter %d data length: %d words, "
"not including header",
isf->rspec.param_id,
ntohs(isf->rspec.param2_length));
proto_tree_add_text(rsvp_object_tree, offset2+28, 4,
"Rate: %ld",
ieee_to_long(pd+offset2+28));
proto_tree_add_text(rsvp_object_tree, offset2+32, 4,
"Slack term: %d",
pntohl(pd+offset2+32));
break;
case QOS_QUALITATIVE :
qf = (QUAL_flowspec *)sh;
str = match_strval(qf->param_id, svc_vals);
if (!str) str = "Unknown";
proto_tree_add_text(rsvp_object_tree, offset2, 1,
"Parameter %d - %s",
qf->param_id, str);
proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
"Parameter %d flags: %d",
qf->param_id, qf->flags_tspec);
proto_tree_add_text(rsvp_object_tree, offset2+2, 2,
"Parameter %d data length: %d words, "
"not including header",
qf->param_id,
ntohs(qf->parameter_length));
proto_tree_add_text(rsvp_object_tree, offset2+4, 4,
"Maximum policed unit: %ld",
pntohl(pd+offset2+4));
break;
}
offset2 += ntohs(sh->length)*4;
mylen -= ntohs(sh->length)*4;
}
break;
}
@ -737,7 +837,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
mylen -= 4;
while (mylen > 4) {
shdr = (service_hdr *)(pd + offset2);
str = match_strval(shdr->service_num, adspec_services);
str = match_strval(shdr->service_num, intsrv_services_str);
ti = proto_tree_add_text(rsvp_object_tree, offset2,
(pntohs(&shdr->length)+1)<<2,

View File

@ -4,7 +4,7 @@
*
* (C) Ashok Narayanan <ashokn@cisco.com>
*
* $Id: packet-rsvp.h,v 1.2 1999/07/13 02:52:55 gram Exp $
* $Id: packet-rsvp.h,v 1.3 1999/08/12 05:19:06 gram Exp $
*
* For license details, see the COPYING file with this distribution
*
@ -134,56 +134,6 @@ static value_string style_vals[] = {
{ RSVP_SE, "Shared-Explicit" }
};
/*
* Defines a desired QoS, in a RESV message.
*/
enum qos_service_type {
QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
QOS_GUARANTEED = 2, /* Guaranteed service */
QOS_DEFAULT = 1, /* Default general parameters */
QOS_TSPEC = 0, /* Traffic specification */
QOS_UNSPECIFIED = -1 /* unspecified */
};
static value_string qos_vals[] = {
{ QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
{ QOS_GUARANTEED, "Guaranteed rate QoS" },
{ QOS_DEFAULT, "Default general parameters" },
{ QOS_UNSPECIFIED, "Unspecified QoS" },
{ QOS_TSPEC, "Traffic specification" },
};
static value_string svc_vals[] = {
{ 127, "Token bucket TSpec" },
{ 130, "Guaranteed-rate RSpec" }
};
enum rsvp_spec_types { INTSRV = 2 };
enum intsrv_services {
INTSRV_GENERAL = 1,
INTSRV_GTD = 2,
INTSRV_CLOAD = 5
};
enum intsrv_field_name {
INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
INTSRV_PATH_BANDWIDTH, INTSRV_MIN_PATH_BANDWIDTH,
INTSRV_IF_LATENCY, INTSRV_PATH_LATENCY,
INTSRV_MTU, INTSRV_COMPOSED_MTU,
INTSRV_TOKEN_BUCKET_TSPEC = 127,
INTSRV_GTD_RSPEC = 130,
INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
};
/*------------------------------*
* Object definitions
*------------------------------*/
@ -195,7 +145,7 @@ typedef struct {
unsigned short length;
unsigned char class;
unsigned char type;
unsigned char *data;
unsigned char data[0]; /* Don't change this to a pointer */
} rsvp_object;
/*
@ -209,7 +159,7 @@ typedef struct {
unsigned char sending_ttl; /* ttl of message */
unsigned char reserved_byte; /* reserved */
unsigned short rsvp_length; /* length of RSVP data */
rsvp_object *rsvp_first_object;
rsvp_object rsvp_first_object[0]; /* Don't change this to a pointer */
} rsvp_header;
/*
@ -299,7 +249,7 @@ typedef struct {
*/
typedef struct {
rsvp_object base;
unsigned long *source;
unsigned long source[0]; /* Don't change this to a pointer */
} rsvp_scope;
/*
@ -340,19 +290,77 @@ typedef struct {
unsigned short source_port; /* port number */
} rsvp_template_ipv6;
/*
* Defines a desired QoS, in a RESV message.
*/
enum qos_service_type {
QOS_QUALITATIVE = 128, /* Qualitative service */
QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
QOS_GUARANTEED = 2, /* Guaranteed service */
QOS_TSPEC = 1, /* Traffic specification */
};
static value_string qos_vals[] = {
{ QOS_QUALITATIVE, "Qualitative QoS" },
{ QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
{ QOS_GUARANTEED, "Guaranteed rate QoS" },
{ QOS_TSPEC, "Traffic specification" },
};
static value_string svc_vals[] = {
{ 127, "Token bucket TSpec" },
{ 128, "Qualitative TSpec" },
{ 130, "Guaranteed-rate RSpec" }
};
enum rsvp_spec_types { INTSRV = 2 };
enum intsrv_services {
INTSRV_GENERAL = 1,
INTSRV_GTD = 2,
INTSRV_CLOAD = 5,
INTSRV_QUALITATIVE = 128,
};
static value_string intsrv_services_str[] = {
{INTSRV_GENERAL, "Default General Parameters"},
{INTSRV_GTD, "Guaranteed"},
{INTSRV_CLOAD, "Controlled Load"},
{INTSRV_QUALITATIVE, "Qualitative"},
};
enum intsrv_field_name {
INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
INTSRV_PATH_BANDWIDTH, INTSRV_MIN_PATH_BANDWIDTH,
INTSRV_IF_LATENCY, INTSRV_PATH_LATENCY,
INTSRV_MTU, INTSRV_COMPOSED_MTU,
INTSRV_TOKEN_BUCKET_TSPEC = 127,
INTSRV_QUALITATIVE_TSPEC = 128,
INTSRV_GTD_RSPEC = 130,
INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
};
/*
* Subobjects for Integrated Services
*/
typedef struct {
rsvp_object base;
unsigned char version;
unsigned char __reserved_;
unsigned short length_in_words;
unsigned char service_header;
unsigned char _reserved;
unsigned short service_length;
unsigned char service_num;
unsigned char break_bit;
unsigned short length;
} service_hdr;
typedef struct {
service_hdr svchdr;
unsigned char param_id;
unsigned char flags_tspec;
unsigned short parameter_length;
@ -365,45 +373,57 @@ typedef struct {
} IS_tspec; /* RFC2210 */
typedef struct {
rsvp_object base;
unsigned char version;
unsigned char __reserved_;
unsigned short length_in_words;
unsigned char service_header;
unsigned char _reserved;
unsigned short service_length;
service_hdr svchdr;
unsigned char param_id;
unsigned char flags_tspec;
unsigned short parameter_length;
unsigned long rate;
unsigned long depth;
unsigned long peak;
unsigned long min_unit;
unsigned long max_unit;
} QUAL_tspec; /* Qualitative */
unsigned char param_id_rspec;
typedef struct {
rsvp_object base;
unsigned char version;
unsigned char __reserved_;
unsigned short length_in_words;
unsigned char data[0]; /* Don't change this to a pointer */
} rsvp_tspec;
typedef struct {
unsigned char param_id;
unsigned char flags_rspec;
unsigned short param2_length;
unsigned long requested_rate;
unsigned long slack;
} IS_flowspec; /* RFC 2210 */
/*
* ADSPEC objects */
} IS_rspec;
typedef struct {
unsigned char service_num;
unsigned char break_bit;
unsigned short length;
} service_hdr;
IS_tspec tspec;
IS_rspec rspec;
} IS_flowspec; /* RFC 2210 */
static value_string adspec_services[] = {
{1, "Default General Parameters"},
{2, "Guaranteed"},
{5, "Controlled Load"},
};
typedef struct {
service_hdr svchdr;
unsigned char param_id;
unsigned char flags_tspec;
unsigned short parameter_length;
unsigned long max_unit;
} QUAL_flowspec; /* Qualitative */
typedef struct {
rsvp_object base;
unsigned char version;
unsigned char __reserved_;
unsigned short length_in_words;
unsigned char data[0]; /* Don't change this to a pointer */
} rsvp_flowspec;
typedef struct {
unsigned char id;