Added Ashok's fix for RSVP and support for RSVP+.
authorgram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 12 Aug 1999 05:19:06 +0000 (05:19 +0000)
committergram <gram@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 12 Aug 1999 05:19:06 +0000 (05:19 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@475 f5534014-38df-0310-8fa8-9805f1628bb7

NEWS
packet-rsvp.c
packet-rsvp.h

diff --git a/NEWS b/NEWS
index a23b5c1f8f4c0de27c4229e7bf71720b0abf8986..dd97dea65b58c9280727f407c56679c76ab87009 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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)
index eebedd0cf4309bf3ad032c42fcf9b2f8223f92a2..f5ea7d9f695361a527c5c2f4fef7a5ff4eb49782 100644 (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);
-
-               /* 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));
+                                sh->service_num,
+                                ntohs(sh->length));
+
+                   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;
-
-               /* 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));
+                                sh->service_num,
+                                ntohs(sh->length));
+
+                   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,
index 413f8d9939b081d33b8d98f466d97d552bf1b6b6..59cc571b8373b309ab75ed5e25832e81a73a19ef 100644 (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 */
+
+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;
 
-    unsigned char      param_id_rspec;
+typedef struct {
+    unsigned char      param_id;
     unsigned char      flags_rspec;
     unsigned short     param2_length;
     unsigned long      requested_rate;
     unsigned long      slack;
+} IS_rspec;
+
+typedef struct {
+    IS_tspec tspec;
+    IS_rspec rspec;
 } IS_flowspec; /* RFC 2210 */
 
-/*
- * ADSPEC objects */
+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 {
-    unsigned char service_num;
-    unsigned char break_bit;
-    unsigned short length;
-} service_hdr;
+    rsvp_object base;
+    unsigned char      version;        
+    unsigned char      __reserved_;
+    unsigned short     length_in_words;
 
-static value_string adspec_services[] = { 
-    {1, "Default General Parameters"},
-    {2, "Guaranteed"},
-    {5, "Controlled Load"},
-};
+    unsigned char data[0];      /* Don't change this to a pointer */
+} rsvp_flowspec;
+                                       
 
 typedef struct {
     unsigned char id;