diff options
author | Anders Broman <anders.broman@ericsson.com> | 2006-07-13 05:57:20 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2006-07-13 05:57:20 +0000 |
commit | 917bdbc87767216a5b520ecfe92d7969d4809a4a (patch) | |
tree | 84f7b9825aa51a6ff5ef165215acd80299b9a0f9 /epan/dissectors/packet-rsvp.c | |
parent | 4070ac69674c7f1be76b6c8170553db5a699bc24 (diff) |
Francesco Fondelli:
Protocol Extensions for Support of Diffserv-aware MPLS Traffic Engineering
(DSTE) as per RFC 4124.
svn path=/trunk/; revision=18727
Diffstat (limited to 'epan/dissectors/packet-rsvp.c')
-rw-r--r-- | epan/dissectors/packet-rsvp.c | 99 |
1 files changed, 97 insertions, 2 deletions
diff --git a/epan/dissectors/packet-rsvp.c b/epan/dissectors/packet-rsvp.c index 76a9891682..8e1117b0a7 100644 --- a/epan/dissectors/packet-rsvp.c +++ b/epan/dissectors/packet-rsvp.c @@ -55,6 +55,9 @@ * * August 22, 2005: added support for tapping and conversations. * (Manu Pathak) <mapathak[AT]cisco.com> + * + * July 4, 2006: added support for RFC4124; new CLASSTYPE object dissector + * (FF) <francesco.fondelli[AT]gmail.com> */ @@ -240,6 +243,7 @@ enum { TT_DIFFSERV, TT_DIFFSERV_MAP, TT_DIFFSERV_MAP_PHBID, + TT_CLASSTYPE, TT_UNKNOWN_CLASS, TT_MAX @@ -343,6 +347,8 @@ enum rsvp_classes { RSVP_CLASS_DIFFSERV = 65, + RSVP_CLASS_CLASSTYPE = 66, /* FF: RFC4124 */ + RSVP_CLASS_SUGGESTED_LABEL = 129, RSVP_CLASS_ACCEPTABLE_LABEL_SET, RSVP_CLASS_RESTART_CAP, @@ -390,6 +396,7 @@ static value_string rsvp_class_vals[] = { {RSVP_CLASS_LABEL_SET, "LABEL-SET object"}, {RSVP_CLASS_PROTECTION, "PROTECTION object"}, {RSVP_CLASS_DIFFSERV, "DIFFSERV object"}, + {RSVP_CLASS_CLASSTYPE, "CLASSTYPE object"}, {RSVP_CLASS_SUGGESTED_LABEL, "SUGGESTED-LABEL object"}, {RSVP_CLASS_ACCEPTABLE_LABEL_SET, "ACCEPTABLE-LABEL-SET object"}, {RSVP_CLASS_RESTART_CAP, "RESTART-CAPABILITY object"}, @@ -426,7 +433,8 @@ enum rsvp_error_types { RSVP_ERROR_SYSTEM, RSVP_ERROR_ROUTING, RSVP_ERROR_NOTIFY, - RSVP_ERROR_DIFFSERV = 27 + RSVP_ERROR_DIFFSERV = 27, + RSVP_ERROR_DSTE = 28 /* FF: RFC4124 */ }; enum { @@ -470,6 +478,18 @@ enum { RSVP_DIFFSERV_ERROR_PERLSP_CONTEXT_ALLOC_FAIL }; +/* FF: RFC4124 */ +enum { + RSVP_DSTE_ERROR_UNEXPECTED_CLASSTYPEOBJ = 1, + RSVP_DSTE_ERROR_UNSUPPORTED_CLASSTYPE, + RSVP_DSTE_ERROR_INVALID_CLASSTYPE_VALUE, + RSVP_DSTE_ERROR_CT_SETUP_PRIO_NOT_CONFIGURED, + RSVP_DSTE_ERROR_CT_HOLDING_PRIO_NOT_CONFIGURED, + RSVP_DSTE_ERROR_CT_SETUP_PRIO_AND_CT_HOLDING_PRIO_NOT_CONFIGURED, + RSVP_DSTE_ERROR_INCONSISTENCY_PSC_CT, + RSVP_DSTE_ERROR_INCONSISTENCY_PHB_CT +}; + static value_string rsvp_error_codes[] = { {RSVP_ERROR_CONFIRM, "Confirmation"}, {RSVP_ERROR_ADMISSION, "Admission Control Failure "}, @@ -489,6 +509,7 @@ static value_string rsvp_error_codes[] = { {RSVP_ERROR_ROUTING, "Routing Error"}, {RSVP_ERROR_NOTIFY, "RSVP Notify Error"}, {RSVP_ERROR_DIFFSERV, "RSVP Diff-Serv Error"}, + {RSVP_ERROR_DSTE, "RSVP DiffServ-aware TE Error"}, {0, NULL} }; @@ -538,6 +559,20 @@ static value_string rsvp_diffserv_error_vals[] = { {0, NULL} }; +/* FF: RFC4124 */ +static value_string rsvp_diffserv_aware_te_error_vals[] = { + {RSVP_DSTE_ERROR_UNEXPECTED_CLASSTYPEOBJ, "Unexpected CLASSTYPE object"}, + {RSVP_DSTE_ERROR_UNSUPPORTED_CLASSTYPE, "Unsupported Class-Type"}, + {RSVP_DSTE_ERROR_INVALID_CLASSTYPE_VALUE, "Invalid Class-Type value"}, + {RSVP_DSTE_ERROR_CT_SETUP_PRIO_NOT_CONFIGURED, "CT and setup priority do not form a configured TE-Class"}, + {RSVP_DSTE_ERROR_CT_HOLDING_PRIO_NOT_CONFIGURED, "CT and holding priority do not form a configured TE-Class"}, + {RSVP_DSTE_ERROR_CT_SETUP_PRIO_AND_CT_HOLDING_PRIO_NOT_CONFIGURED, + "CT and setup priority do not form a configured TE-Class AND CT and holding priority do not form a configured TE-Class"}, + {RSVP_DSTE_ERROR_INCONSISTENCY_PSC_CT, "Inconsistency between signaled PSC and signaled CT"}, + {RSVP_DSTE_ERROR_INCONSISTENCY_PHB_CT, "Inconsistency between signaled PHBs and signaled CT"}, + {0, NULL} +}; + /* * Defines the reservation style plus style-specific information that * is not a FLOWSPEC or FILTER_SPEC object, in a RESV message. @@ -835,6 +870,7 @@ enum rsvp_filter_keys { RSVPF_LABEL_SET, RSVPF_PROTECTION, RSVPF_DIFFSERV, + RSVPF_DSTE, RSVPF_SUGGESTED_LABEL, RSVPF_ACCEPTABLE_LABEL_SET, @@ -872,6 +908,9 @@ enum rsvp_filter_keys { RSVPF_DIFFSERV_PHBID_BIT14, RSVPF_DIFFSERV_PHBID_BIT15, + /* Diffserv-aware TE object */ + RSVPF_DSTE_CLASSTYPE, + /* Sentinel */ RSVPF_MAX }; @@ -1032,6 +1071,10 @@ static hf_register_info rsvpf_info[] = { { "DIFFSERV", "rsvp.diffserv", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, + {&rsvp_filter[RSVPF_DSTE], + { "CLASSTYPE", "rsvp.dste", FT_NONE, BASE_NONE, NULL, 0x0, + "", HFILL }}, + {&rsvp_filter[RSVPF_RESTART_CAP], { "RESTART CAPABILITY", "rsvp.restart", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, @@ -1161,8 +1204,12 @@ static hf_register_info rsvpf_info[] = { {&rsvp_filter[RSVPF_DIFFSERV_PHBID_BIT15], { PHBID_BIT15_DESCRIPTION, "rsvp.diffserv.phbid.bit15", FT_UINT16, - BASE_DEC, VALS(phbid_bit15_vals), PHBID_BIT15_MASK, "Bit 15", HFILL }} + BASE_DEC, VALS(phbid_bit15_vals), PHBID_BIT15_MASK, "Bit 15", HFILL }}, + /* Diffserv-aware TE object field */ + {&rsvp_filter[RSVPF_DSTE_CLASSTYPE], + { "CT", "rsvp.dste.classtype", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }} }; /* RSVP Conversation related Hash functions */ @@ -1337,6 +1384,9 @@ static inline int rsvp_class_to_filter_num(int classnum) case RSVP_CLASS_DIFFSERV : return RSVPF_DIFFSERV; + case RSVP_CLASS_CLASSTYPE : + return RSVPF_DSTE; + case RSVP_CLASS_NOTIFY_REQUEST : return RSVPF_NOTIFY_REQUEST; case RSVP_CLASS_ADMIN_STATUS : @@ -1421,6 +1471,8 @@ static inline int rsvp_class_to_tree_type(int classnum) return TT_RESTART_CAP; case RSVP_CLASS_DIFFSERV : return TT_DIFFSERV; + case RSVP_CLASS_CLASSTYPE: + return TT_CLASSTYPE; case RSVP_CLASS_NOTIFY_REQUEST : return TT_UNKNOWN_CLASS; case RSVP_CLASS_ADMIN_STATUS : @@ -1916,6 +1968,10 @@ dissect_rsvp_error_value (proto_tree *ti, tvbuff_t *tvb, break; case RSVP_ERROR_DIFFSERV: rsvp_error_vals = rsvp_diffserv_error_vals; + break; + case RSVP_ERROR_DSTE: + rsvp_error_vals = rsvp_diffserv_aware_te_error_vals; + break; } switch (error_code) { case RSVP_ERROR_ADMISSION: @@ -1923,6 +1979,7 @@ dissect_rsvp_error_value (proto_tree *ti, tvbuff_t *tvb, case RSVP_ERROR_NOTIFY: case RSVP_ERROR_ROUTING: case RSVP_ERROR_DIFFSERV: + case RSVP_ERROR_DSTE: if ((error_val & 0xc0) == 0) { proto_tree_add_text(ti, tvb, offset, 2, "Error value: %u - %s", error_val, @@ -4747,6 +4804,40 @@ dissect_rsvp_diffserv (proto_tree *ti, proto_tree *rsvp_object_tree, } /*------------------------------------------------------------------------------ + * CLASSTYPE + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_diffserv_aware_te(proto_tree *ti, proto_tree *rsvp_object_tree, + tvbuff_t *tvb, + int offset, int obj_length, + int class _U_, int type) +{ + int offset2 = offset + 4; + guint8 ct = 0; + + proto_tree_add_item_hidden(rsvp_object_tree, + rsvp_filter[RSVPF_DSTE], + tvb, offset, 8, FALSE); + switch(type) { + case 1: + ct = tvb_get_guint8(tvb, offset2+3); + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, "C-type: 1"); + proto_tree_add_item(rsvp_object_tree, + rsvp_filter[RSVPF_DSTE_CLASSTYPE], + tvb, offset2+3, 1, FALSE); + proto_item_set_text(ti, "CLASSTYPE: CT %u", ct); + break; + default: + proto_item_set_text(ti, "CLASSTYPE: (Unknown C-type)"); + 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; + } +} + +/*------------------------------------------------------------------------------ * Dissect a single RSVP message in a tree *------------------------------------------------------------------------------*/ static void @@ -5034,6 +5125,10 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dissect_rsvp_diffserv(ti, rsvp_object_tree, tvb, offset, obj_length, class, type); break; + case RSVP_CLASS_CLASSTYPE: + dissect_rsvp_diffserv_aware_te(ti, rsvp_object_tree, tvb, offset, obj_length, class, type); + break; + case RSVP_CLASS_NULL: default: proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, |