xref: /dflybsd-src/contrib/tcpdump/print-rsvp.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (c) 1998-2007 The TCPDUMP project
341c99275SPeter Avalos  *
441c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
541c99275SPeter Avalos  * modification, are permitted provided that: (1) source code
641c99275SPeter Avalos  * distributions retain the above copyright notice and this paragraph
741c99275SPeter Avalos  * in its entirety, and (2) distributions including binary code include
841c99275SPeter Avalos  * the above copyright notice and this paragraph in its entirety in
941c99275SPeter Avalos  * the documentation or other materials provided with the distribution.
1041c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1141c99275SPeter Avalos  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1241c99275SPeter Avalos  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1341c99275SPeter Avalos  * FOR A PARTICULAR PURPOSE.
1441c99275SPeter Avalos  *
15411677aeSAaron LI  * Original code by Hannes Gredler (hannes@gredler.at)
1641c99275SPeter Avalos  */
1741c99275SPeter Avalos 
18411677aeSAaron LI /* \summary: Resource ReSerVation Protocol (RSVP) printer */
1941c99275SPeter Avalos 
20*ed775ee7SAntonio Huete Jimenez /* specification: RFC 2205 */
21*ed775ee7SAntonio Huete Jimenez 
2241c99275SPeter Avalos #ifdef HAVE_CONFIG_H
23*ed775ee7SAntonio Huete Jimenez #include <config.h>
2441c99275SPeter Avalos #endif
2541c99275SPeter Avalos 
26*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
2741c99275SPeter Avalos 
28411677aeSAaron LI #include "netdissect.h"
2941c99275SPeter Avalos #include "extract.h"
3041c99275SPeter Avalos #include "addrtoname.h"
3141c99275SPeter Avalos #include "ethertype.h"
3241c99275SPeter Avalos #include "gmpls.h"
3341c99275SPeter Avalos #include "af.h"
3427bfbee1SPeter Avalos #include "signature.h"
3541c99275SPeter Avalos 
36411677aeSAaron LI 
3741c99275SPeter Avalos /*
3841c99275SPeter Avalos  * RFC 2205 common header
3941c99275SPeter Avalos  *
4041c99275SPeter Avalos  *               0             1              2             3
4141c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
4241c99275SPeter Avalos  *        | Vers | Flags|  Msg Type   |       RSVP Checksum       |
4341c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
4441c99275SPeter Avalos  *        |  Send_TTL   | (Reserved)  |        RSVP Length        |
4541c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
4641c99275SPeter Avalos  *
4741c99275SPeter Avalos  */
4841c99275SPeter Avalos 
4941c99275SPeter Avalos struct rsvp_common_header {
50*ed775ee7SAntonio Huete Jimenez     nd_uint8_t  version_flags;
51*ed775ee7SAntonio Huete Jimenez     nd_uint8_t  msg_type;
52*ed775ee7SAntonio Huete Jimenez     nd_uint16_t checksum;
53*ed775ee7SAntonio Huete Jimenez     nd_uint8_t  ttl;
54*ed775ee7SAntonio Huete Jimenez     nd_byte     reserved[1];
55*ed775ee7SAntonio Huete Jimenez     nd_uint16_t length;
5641c99275SPeter Avalos };
5741c99275SPeter Avalos 
5841c99275SPeter Avalos /*
5941c99275SPeter Avalos  * RFC2205 object header
6041c99275SPeter Avalos  *
6141c99275SPeter Avalos  *
6241c99275SPeter Avalos  *               0             1              2             3
6341c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
6441c99275SPeter Avalos  *        |       Length (bytes)      |  Class-Num  |   C-Type    |
6541c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
6641c99275SPeter Avalos  *        |                                                       |
6741c99275SPeter Avalos  *        //                  (Object contents)                   //
6841c99275SPeter Avalos  *        |                                                       |
6941c99275SPeter Avalos  *        +-------------+-------------+-------------+-------------+
7041c99275SPeter Avalos  */
7141c99275SPeter Avalos 
7241c99275SPeter Avalos struct rsvp_object_header {
73*ed775ee7SAntonio Huete Jimenez     nd_uint16_t length;
74*ed775ee7SAntonio Huete Jimenez     nd_uint8_t  class_num;
75*ed775ee7SAntonio Huete Jimenez     nd_uint8_t  ctype;
7641c99275SPeter Avalos };
7741c99275SPeter Avalos 
7841c99275SPeter Avalos #define RSVP_VERSION            1
7941c99275SPeter Avalos #define	RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
8041c99275SPeter Avalos #define	RSVP_EXTRACT_FLAGS(x)   ((x)&0x0f)
8141c99275SPeter Avalos 
8241c99275SPeter Avalos #define	RSVP_MSGTYPE_PATH       1
8341c99275SPeter Avalos #define	RSVP_MSGTYPE_RESV       2
8441c99275SPeter Avalos #define	RSVP_MSGTYPE_PATHERR    3
8541c99275SPeter Avalos #define	RSVP_MSGTYPE_RESVERR    4
8641c99275SPeter Avalos #define	RSVP_MSGTYPE_PATHTEAR   5
8741c99275SPeter Avalos #define	RSVP_MSGTYPE_RESVTEAR   6
8841c99275SPeter Avalos #define	RSVP_MSGTYPE_RESVCONF   7
89411677aeSAaron LI #define RSVP_MSGTYPE_BUNDLE     12
9041c99275SPeter Avalos #define RSVP_MSGTYPE_ACK        13
9141c99275SPeter Avalos #define RSVP_MSGTYPE_HELLO_OLD  14      /* ancient Hellos */
9241c99275SPeter Avalos #define RSVP_MSGTYPE_SREFRESH   15
9341c99275SPeter Avalos #define	RSVP_MSGTYPE_HELLO      20
9441c99275SPeter Avalos 
9541c99275SPeter Avalos static const struct tok rsvp_msg_type_values[] = {
9641c99275SPeter Avalos     { RSVP_MSGTYPE_PATH,	"Path" },
9741c99275SPeter Avalos     { RSVP_MSGTYPE_RESV,	"Resv" },
9841c99275SPeter Avalos     { RSVP_MSGTYPE_PATHERR,	"PathErr" },
9941c99275SPeter Avalos     { RSVP_MSGTYPE_RESVERR,	"ResvErr" },
10041c99275SPeter Avalos     { RSVP_MSGTYPE_PATHTEAR,	"PathTear" },
10141c99275SPeter Avalos     { RSVP_MSGTYPE_RESVTEAR,	"ResvTear" },
10241c99275SPeter Avalos     { RSVP_MSGTYPE_RESVCONF,	"ResvConf" },
103411677aeSAaron LI     { RSVP_MSGTYPE_BUNDLE,	"Bundle" },
10441c99275SPeter Avalos     { RSVP_MSGTYPE_ACK,	        "Acknowledgement" },
10541c99275SPeter Avalos     { RSVP_MSGTYPE_HELLO_OLD,	"Hello (Old)" },
10641c99275SPeter Avalos     { RSVP_MSGTYPE_SREFRESH,	"Refresh" },
10741c99275SPeter Avalos     { RSVP_MSGTYPE_HELLO,	"Hello" },
10841c99275SPeter Avalos     { 0, NULL}
10941c99275SPeter Avalos };
11041c99275SPeter Avalos 
11141c99275SPeter Avalos static const struct tok rsvp_header_flag_values[] = {
11241c99275SPeter Avalos     { 0x01,	              "Refresh reduction capable" }, /* rfc2961 */
11341c99275SPeter Avalos     { 0, NULL}
11441c99275SPeter Avalos };
11541c99275SPeter Avalos 
116*ed775ee7SAntonio Huete Jimenez static const struct tok rsvp_obj_capability_flag_values[] = {
117*ed775ee7SAntonio Huete Jimenez     { 0x0004,                "RecoveryPath Transmit Enabled" },
118*ed775ee7SAntonio Huete Jimenez     { 0x0002,                "RecoveryPath Desired" },
119*ed775ee7SAntonio Huete Jimenez     { 0x0001,                "RecoveryPath Srefresh Capable" },
120*ed775ee7SAntonio Huete Jimenez     { 0, NULL}
121*ed775ee7SAntonio Huete Jimenez };
122*ed775ee7SAntonio Huete Jimenez 
12341c99275SPeter Avalos #define	RSVP_OBJ_SESSION            1   /* rfc2205 */
12441c99275SPeter Avalos #define	RSVP_OBJ_RSVP_HOP           3   /* rfc2205, rfc3473 */
12541c99275SPeter Avalos #define	RSVP_OBJ_INTEGRITY          4   /* rfc2747 */
12641c99275SPeter Avalos #define	RSVP_OBJ_TIME_VALUES        5   /* rfc2205 */
12741c99275SPeter Avalos #define	RSVP_OBJ_ERROR_SPEC         6
12841c99275SPeter Avalos #define	RSVP_OBJ_SCOPE              7
12941c99275SPeter Avalos #define	RSVP_OBJ_STYLE              8   /* rfc2205 */
13041c99275SPeter Avalos #define	RSVP_OBJ_FLOWSPEC           9   /* rfc2215 */
13141c99275SPeter Avalos #define	RSVP_OBJ_FILTERSPEC         10  /* rfc2215 */
13241c99275SPeter Avalos #define	RSVP_OBJ_SENDER_TEMPLATE    11
13341c99275SPeter Avalos #define	RSVP_OBJ_SENDER_TSPEC       12  /* rfc2215 */
13441c99275SPeter Avalos #define	RSVP_OBJ_ADSPEC             13  /* rfc2215 */
13541c99275SPeter Avalos #define	RSVP_OBJ_POLICY_DATA        14
13641c99275SPeter Avalos #define	RSVP_OBJ_CONFIRM            15  /* rfc2205 */
13741c99275SPeter Avalos #define	RSVP_OBJ_LABEL              16  /* rfc3209 */
13841c99275SPeter Avalos #define	RSVP_OBJ_LABEL_REQ          19  /* rfc3209 */
13941c99275SPeter Avalos #define	RSVP_OBJ_ERO                20  /* rfc3209 */
14041c99275SPeter Avalos #define	RSVP_OBJ_RRO                21  /* rfc3209 */
14141c99275SPeter Avalos #define	RSVP_OBJ_HELLO              22  /* rfc3209 */
14241c99275SPeter Avalos #define	RSVP_OBJ_MESSAGE_ID         23  /* rfc2961 */
14341c99275SPeter Avalos #define	RSVP_OBJ_MESSAGE_ID_ACK     24  /* rfc2961 */
14441c99275SPeter Avalos #define	RSVP_OBJ_MESSAGE_ID_LIST    25  /* rfc2961 */
14541c99275SPeter Avalos #define	RSVP_OBJ_RECOVERY_LABEL     34  /* rfc3473 */
14641c99275SPeter Avalos #define	RSVP_OBJ_UPSTREAM_LABEL     35  /* rfc3473 */
14741c99275SPeter Avalos #define	RSVP_OBJ_LABEL_SET          36  /* rfc3473 */
14841c99275SPeter Avalos #define	RSVP_OBJ_PROTECTION         37  /* rfc3473 */
14927bfbee1SPeter Avalos #define RSVP_OBJ_S2L                50  /* rfc4875 */
150*ed775ee7SAntonio Huete Jimenez #define	RSVP_OBJ_DETOUR             63  /* rfc4090 */
15141c99275SPeter Avalos #define	RSVP_OBJ_CLASSTYPE          66  /* rfc4124 */
15241c99275SPeter Avalos #define RSVP_OBJ_CLASSTYPE_OLD      125 /* draft-ietf-tewg-diff-te-proto-07 */
15341c99275SPeter Avalos #define	RSVP_OBJ_SUGGESTED_LABEL    129 /* rfc3473 */
15441c99275SPeter Avalos #define	RSVP_OBJ_ACCEPT_LABEL_SET   130 /* rfc3473 */
15541c99275SPeter Avalos #define	RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
156*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_CAPABILITY         134 /* rfc5063 */
15741c99275SPeter Avalos #define	RSVP_OBJ_NOTIFY_REQ         195 /* rfc3473 */
15841c99275SPeter Avalos #define	RSVP_OBJ_ADMIN_STATUS       196 /* rfc3473 */
15941c99275SPeter Avalos #define	RSVP_OBJ_PROPERTIES         204 /* juniper proprietary */
160*ed775ee7SAntonio Huete Jimenez #define	RSVP_OBJ_FASTREROUTE        205 /* rfc4090 */
16141c99275SPeter Avalos #define	RSVP_OBJ_SESSION_ATTRIBUTE  207 /* rfc3209 */
16241c99275SPeter Avalos #define RSVP_OBJ_GENERALIZED_UNI    229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
16341c99275SPeter Avalos #define RSVP_OBJ_CALL_ID            230 /* rfc3474 */
16441c99275SPeter Avalos #define RSVP_OBJ_CALL_OPS           236 /* rfc3474 */
16541c99275SPeter Avalos 
16641c99275SPeter Avalos static const struct tok rsvp_obj_values[] = {
16741c99275SPeter Avalos     { RSVP_OBJ_SESSION,            "Session" },
16841c99275SPeter Avalos     { RSVP_OBJ_RSVP_HOP,           "RSVP Hop" },
16941c99275SPeter Avalos     { RSVP_OBJ_INTEGRITY,          "Integrity" },
17041c99275SPeter Avalos     { RSVP_OBJ_TIME_VALUES,        "Time Values" },
17141c99275SPeter Avalos     { RSVP_OBJ_ERROR_SPEC,         "Error Spec" },
17241c99275SPeter Avalos     { RSVP_OBJ_SCOPE,              "Scope" },
17341c99275SPeter Avalos     { RSVP_OBJ_STYLE,              "Style" },
17441c99275SPeter Avalos     { RSVP_OBJ_FLOWSPEC,           "Flowspec" },
17541c99275SPeter Avalos     { RSVP_OBJ_FILTERSPEC,         "FilterSpec" },
17641c99275SPeter Avalos     { RSVP_OBJ_SENDER_TEMPLATE,    "Sender Template" },
17741c99275SPeter Avalos     { RSVP_OBJ_SENDER_TSPEC,       "Sender TSpec" },
17841c99275SPeter Avalos     { RSVP_OBJ_ADSPEC,             "Adspec" },
17941c99275SPeter Avalos     { RSVP_OBJ_POLICY_DATA,        "Policy Data" },
18041c99275SPeter Avalos     { RSVP_OBJ_CONFIRM,            "Confirm" },
18141c99275SPeter Avalos     { RSVP_OBJ_LABEL,              "Label" },
18241c99275SPeter Avalos     { RSVP_OBJ_LABEL_REQ,          "Label Request" },
18341c99275SPeter Avalos     { RSVP_OBJ_ERO,                "ERO" },
18441c99275SPeter Avalos     { RSVP_OBJ_RRO,                "RRO" },
18541c99275SPeter Avalos     { RSVP_OBJ_HELLO,              "Hello" },
18641c99275SPeter Avalos     { RSVP_OBJ_MESSAGE_ID,         "Message ID" },
18741c99275SPeter Avalos     { RSVP_OBJ_MESSAGE_ID_ACK,     "Message ID Ack" },
18841c99275SPeter Avalos     { RSVP_OBJ_MESSAGE_ID_LIST,    "Message ID List" },
18941c99275SPeter Avalos     { RSVP_OBJ_RECOVERY_LABEL,     "Recovery Label" },
19041c99275SPeter Avalos     { RSVP_OBJ_UPSTREAM_LABEL,     "Upstream Label" },
19141c99275SPeter Avalos     { RSVP_OBJ_LABEL_SET,          "Label Set" },
19241c99275SPeter Avalos     { RSVP_OBJ_ACCEPT_LABEL_SET,   "Acceptable Label Set" },
19341c99275SPeter Avalos     { RSVP_OBJ_DETOUR,             "Detour" },
19441c99275SPeter Avalos     { RSVP_OBJ_CLASSTYPE,          "Class Type" },
19541c99275SPeter Avalos     { RSVP_OBJ_CLASSTYPE_OLD,      "Class Type (old)" },
19641c99275SPeter Avalos     { RSVP_OBJ_SUGGESTED_LABEL,    "Suggested Label" },
19741c99275SPeter Avalos     { RSVP_OBJ_PROPERTIES,         "Properties" },
19841c99275SPeter Avalos     { RSVP_OBJ_FASTREROUTE,        "Fast Re-Route" },
19941c99275SPeter Avalos     { RSVP_OBJ_SESSION_ATTRIBUTE,  "Session Attribute" },
20041c99275SPeter Avalos     { RSVP_OBJ_GENERALIZED_UNI,    "Generalized UNI" },
20141c99275SPeter Avalos     { RSVP_OBJ_CALL_ID,            "Call-ID" },
20241c99275SPeter Avalos     { RSVP_OBJ_CALL_OPS,           "Call Capability" },
20341c99275SPeter Avalos     { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
204*ed775ee7SAntonio Huete Jimenez     { RSVP_OBJ_CAPABILITY,         "Capability" },
20541c99275SPeter Avalos     { RSVP_OBJ_NOTIFY_REQ,         "Notify Request" },
20641c99275SPeter Avalos     { RSVP_OBJ_PROTECTION,         "Protection" },
20741c99275SPeter Avalos     { RSVP_OBJ_ADMIN_STATUS,       "Administrative Status" },
20827bfbee1SPeter Avalos     { RSVP_OBJ_S2L,                "Sub-LSP to LSP" },
20941c99275SPeter Avalos     { 0, NULL}
21041c99275SPeter Avalos };
21141c99275SPeter Avalos 
21241c99275SPeter Avalos #define	RSVP_CTYPE_IPV4        1
21341c99275SPeter Avalos #define	RSVP_CTYPE_IPV6        2
21441c99275SPeter Avalos #define	RSVP_CTYPE_TUNNEL_IPV4 7
21541c99275SPeter Avalos #define	RSVP_CTYPE_TUNNEL_IPV6 8
21641c99275SPeter Avalos #define	RSVP_CTYPE_UNI_IPV4    11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
21741c99275SPeter Avalos #define RSVP_CTYPE_1           1
21841c99275SPeter Avalos #define RSVP_CTYPE_2           2
21941c99275SPeter Avalos #define RSVP_CTYPE_3           3
22041c99275SPeter Avalos #define RSVP_CTYPE_4           4
22127bfbee1SPeter Avalos #define RSVP_CTYPE_12         12
22227bfbee1SPeter Avalos #define RSVP_CTYPE_13         13
22327bfbee1SPeter Avalos #define RSVP_CTYPE_14         14
22441c99275SPeter Avalos 
22541c99275SPeter Avalos /*
22641c99275SPeter Avalos  * the ctypes are not globally unique so for
22741c99275SPeter Avalos  * translating it to strings we build a table based
22841c99275SPeter Avalos  * on objects offsetted by the ctype
22941c99275SPeter Avalos  */
23041c99275SPeter Avalos 
23141c99275SPeter Avalos static const struct tok rsvp_ctype_values[] = {
23241c99275SPeter Avalos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4,	             "IPv4" },
23341c99275SPeter Avalos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6,	             "IPv6" },
23441c99275SPeter Avalos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3,	             "IPv4 plus opt. TLVs" },
23541c99275SPeter Avalos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4,	             "IPv6 plus opt. TLVs" },
23641c99275SPeter Avalos     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4,	             "IPv4" },
23741c99275SPeter Avalos     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6,	             "IPv6" },
23841c99275SPeter Avalos     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4,	             "IPv4" },
23941c99275SPeter Avalos     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6,	             "IPv6" },
24041c99275SPeter Avalos     { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1,	             "1" },
24141c99275SPeter Avalos     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1,	             "obsolete" },
24241c99275SPeter Avalos     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2,	             "IntServ" },
24341c99275SPeter Avalos     { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2,	             "IntServ" },
24441c99275SPeter Avalos     { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2,	                     "IntServ" },
24541c99275SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4,	             "IPv4" },
24641c99275SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6,	             "IPv6" },
24741c99275SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3,	             "IPv6 Flow-label" },
24841c99275SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4,	     "Tunnel IPv4" },
24927bfbee1SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12,                 "IPv4 P2MP LSP Tunnel" },
25027bfbee1SPeter Avalos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13,                 "IPv6 P2MP LSP Tunnel" },
25141c99275SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4,	             "IPv4" },
25241c99275SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6,	             "IPv6" },
25341c99275SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4,           "Tunnel IPv4" },
25441c99275SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4,              "UNI IPv4" },
25527bfbee1SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13,                    "IPv4 P2MP LSP Tunnel" },
25627bfbee1SPeter Avalos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14,                    "IPv6 P2MP LSP Tunnel" },
25741c99275SPeter Avalos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4,          "IPv4" },
25841c99275SPeter Avalos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6,          "IPv6" },
25941c99275SPeter Avalos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4,   "Tunnel IPv4" },
26027bfbee1SPeter Avalos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12,            "IPv4 P2MP LSP Tunnel" },
26127bfbee1SPeter Avalos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13,            "IPv6 P2MP LSP Tunnel" },
26241c99275SPeter Avalos     { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1,                  "1" },
26341c99275SPeter Avalos     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1,              "Message id ack" },
26441c99275SPeter Avalos     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2,              "Message id nack" },
26541c99275SPeter Avalos     { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1,             "1" },
26641c99275SPeter Avalos     { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1,                       "1" },
26741c99275SPeter Avalos     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1,                       "Hello Request" },
26841c99275SPeter Avalos     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2,                       "Hello Ack" },
26941c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1,	             "without label range" },
27041c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2,	             "with ATM label range" },
27141c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3,                   "with FR label range" },
27241c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4,                   "Generalized Label" },
27341c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1,                       "Label" },
27441c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2,                       "Generalized Label" },
27541c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3,                       "Waveband Switching" },
27641c99275SPeter Avalos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1,             "Label" },
27741c99275SPeter Avalos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2,             "Generalized Label" },
27841c99275SPeter Avalos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3,             "Waveband Switching" },
27941c99275SPeter Avalos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1,              "Label" },
28041c99275SPeter Avalos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
28141c99275SPeter Avalos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
28241c99275SPeter Avalos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1,              "Label" },
28341c99275SPeter Avalos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
28441c99275SPeter Avalos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
28541c99275SPeter Avalos     { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4,                      "IPv4" },
28641c99275SPeter Avalos     { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4,                      "IPv4" },
28741c99275SPeter Avalos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4,               "IPv4" },
28841c99275SPeter Avalos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6,               "IPv6" },
28941c99275SPeter Avalos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3,                  "IPv4 plus opt. TLVs" },
29041c99275SPeter Avalos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4,                  "IPv6 plus opt. TLVs" },
29141c99275SPeter Avalos     { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1,          "IPv4" },
292*ed775ee7SAntonio Huete Jimenez     { 256*RSVP_OBJ_CAPABILITY+RSVP_CTYPE_1,                  "1" },
29341c99275SPeter Avalos     { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
29441c99275SPeter Avalos     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4,       "Tunnel IPv4" }, /* old style*/
29541c99275SPeter Avalos     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1,                 "1" }, /* new style */
29641c99275SPeter Avalos     { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4,            "Tunnel IPv4" },
29741c99275SPeter Avalos     { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1,                  "1" },
29841c99275SPeter Avalos     { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1,                "1" },
29941c99275SPeter Avalos     { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1,                   "1" },
30041c99275SPeter Avalos     { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1,               "1" },
30141c99275SPeter Avalos     { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1,                   "1" },
30241c99275SPeter Avalos     { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1,             "1" },
30327bfbee1SPeter Avalos     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4,                      "IPv4 sub-LSP" },
30427bfbee1SPeter Avalos     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6,                      "IPv6 sub-LSP" },
30541c99275SPeter Avalos     { 0, NULL}
30641c99275SPeter Avalos };
30741c99275SPeter Avalos 
308*ed775ee7SAntonio Huete Jimenez /*
309*ed775ee7SAntonio Huete Jimenez  * XXX - this assumes a 16-byte digest, which is true for HMAC-MD5, but
310*ed775ee7SAntonio Huete Jimenez  * isn't necessarily the case for other hash algorithms.
311*ed775ee7SAntonio Huete Jimenez  *
312*ed775ee7SAntonio Huete Jimenez  * Unless I've missed something, there's nothing in RFC 2747 to indicate
313*ed775ee7SAntonio Huete Jimenez  * the hash algorithm being used, so it's presumably something set up
314*ed775ee7SAntonio Huete Jimenez  * out-of-band, or negotiated by other RSVP objects.
315*ed775ee7SAntonio Huete Jimenez  */
31641c99275SPeter Avalos struct rsvp_obj_integrity_t {
317411677aeSAaron LI     uint8_t flags;
318411677aeSAaron LI     uint8_t res;
319411677aeSAaron LI     uint8_t key_id[6];
320411677aeSAaron LI     uint8_t sequence[8];
321411677aeSAaron LI     uint8_t digest[16];
32241c99275SPeter Avalos };
32341c99275SPeter Avalos 
32441c99275SPeter Avalos static const struct tok rsvp_obj_integrity_flag_values[] = {
32541c99275SPeter Avalos     { 0x80, "Handshake" },
32641c99275SPeter Avalos     { 0, NULL}
32741c99275SPeter Avalos };
32841c99275SPeter Avalos 
32941c99275SPeter Avalos struct rsvp_obj_frr_t {
330411677aeSAaron LI     uint8_t setup_prio;
331411677aeSAaron LI     uint8_t hold_prio;
332411677aeSAaron LI     uint8_t hop_limit;
333411677aeSAaron LI     uint8_t flags;
334411677aeSAaron LI     uint8_t bandwidth[4];
335411677aeSAaron LI     uint8_t include_any[4];
336411677aeSAaron LI     uint8_t exclude_any[4];
337411677aeSAaron LI     uint8_t include_all[4];
33841c99275SPeter Avalos };
33941c99275SPeter Avalos 
34041c99275SPeter Avalos 
34141c99275SPeter Avalos #define RSVP_OBJ_XRO_MASK_SUBOBJ(x)   ((x)&0x7f)
34241c99275SPeter Avalos #define RSVP_OBJ_XRO_MASK_LOOSE(x)    ((x)&0x80)
34341c99275SPeter Avalos 
344*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_CAPABILITY_FLAGS_MASK  0x7U
345*ed775ee7SAntonio Huete Jimenez 
34641c99275SPeter Avalos #define	RSVP_OBJ_XRO_RES       0
34741c99275SPeter Avalos #define	RSVP_OBJ_XRO_IPV4      1
34841c99275SPeter Avalos #define	RSVP_OBJ_XRO_IPV6      2
34927bfbee1SPeter Avalos #define	RSVP_OBJ_XRO_LABEL     3
35041c99275SPeter Avalos #define	RSVP_OBJ_XRO_ASN       32
35141c99275SPeter Avalos #define	RSVP_OBJ_XRO_MPLS      64
35241c99275SPeter Avalos 
35341c99275SPeter Avalos static const struct tok rsvp_obj_xro_values[] = {
35441c99275SPeter Avalos     { RSVP_OBJ_XRO_RES,	      "Reserved" },
35541c99275SPeter Avalos     { RSVP_OBJ_XRO_IPV4,      "IPv4 prefix" },
35641c99275SPeter Avalos     { RSVP_OBJ_XRO_IPV6,      "IPv6 prefix" },
35727bfbee1SPeter Avalos     { RSVP_OBJ_XRO_LABEL,     "Label" },
35841c99275SPeter Avalos     { RSVP_OBJ_XRO_ASN,       "Autonomous system number" },
35941c99275SPeter Avalos     { RSVP_OBJ_XRO_MPLS,      "MPLS label switched path termination" },
36041c99275SPeter Avalos     { 0, NULL}
36141c99275SPeter Avalos };
36241c99275SPeter Avalos 
363*ed775ee7SAntonio Huete Jimenez /* RFC4090 */
36441c99275SPeter Avalos static const struct tok rsvp_obj_rro_flag_values[] = {
36541c99275SPeter Avalos     { 0x01,	              "Local protection available" },
36641c99275SPeter Avalos     { 0x02,                   "Local protection in use" },
36741c99275SPeter Avalos     { 0x04,                   "Bandwidth protection" },
36841c99275SPeter Avalos     { 0x08,                   "Node protection" },
36941c99275SPeter Avalos     { 0, NULL}
37041c99275SPeter Avalos };
37141c99275SPeter Avalos 
37227bfbee1SPeter Avalos /* RFC3209 */
37327bfbee1SPeter Avalos static const struct tok rsvp_obj_rro_label_flag_values[] = {
37427bfbee1SPeter Avalos     { 0x01,                   "Global" },
37527bfbee1SPeter Avalos     { 0, NULL}
37627bfbee1SPeter Avalos };
37727bfbee1SPeter Avalos 
37841c99275SPeter Avalos static const struct tok rsvp_resstyle_values[] = {
37941c99275SPeter Avalos     { 17,	              "Wildcard Filter" },
38041c99275SPeter Avalos     { 10,                     "Fixed Filter" },
38141c99275SPeter Avalos     { 18,                     "Shared Explicit" },
38241c99275SPeter Avalos     { 0, NULL}
38341c99275SPeter Avalos };
38441c99275SPeter Avalos 
38541c99275SPeter Avalos #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
38641c99275SPeter Avalos #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
38741c99275SPeter Avalos 
38841c99275SPeter Avalos static const struct tok rsvp_intserv_service_type_values[] = {
38941c99275SPeter Avalos     { 1,                                "Default/Global Information" },
39041c99275SPeter Avalos     { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
39141c99275SPeter Avalos     { RSVP_OBJ_INTSERV_CONTROLLED_LOAD,	"Controlled Load" },
39241c99275SPeter Avalos     { 0, NULL}
39341c99275SPeter Avalos };
39441c99275SPeter Avalos 
39541c99275SPeter Avalos static const struct tok rsvp_intserv_parameter_id_values[] = {
39641c99275SPeter Avalos     { 4,                     "IS hop cnt" },
39741c99275SPeter Avalos     { 6,                     "Path b/w estimate" },
39841c99275SPeter Avalos     { 8,                     "Minimum path latency" },
39941c99275SPeter Avalos     { 10,                    "Composed MTU" },
40041c99275SPeter Avalos     { 127,                   "Token Bucket TSpec" },
40141c99275SPeter Avalos     { 130,                   "Guaranteed Service RSpec" },
40241c99275SPeter Avalos     { 133,                   "End-to-end composed value for C" },
40341c99275SPeter Avalos     { 134,                   "End-to-end composed value for D" },
40441c99275SPeter Avalos     { 135,                   "Since-last-reshaping point composed C" },
40541c99275SPeter Avalos     { 136,                   "Since-last-reshaping point composed D" },
40641c99275SPeter Avalos     { 0, NULL}
40741c99275SPeter Avalos };
40841c99275SPeter Avalos 
409411677aeSAaron LI static const struct tok rsvp_session_attribute_flag_values[] = {
41027bfbee1SPeter Avalos     { 0x01,	              "Local Protection" },
41127bfbee1SPeter Avalos     { 0x02,                   "Label Recording" },
41227bfbee1SPeter Avalos     { 0x04,                   "SE Style" },
41327bfbee1SPeter Avalos     { 0x08,                   "Bandwidth protection" }, /* RFC4090 */
41427bfbee1SPeter Avalos     { 0x10,                   "Node protection" },      /* RFC4090 */
41541c99275SPeter Avalos     { 0, NULL}
41641c99275SPeter Avalos };
41741c99275SPeter Avalos 
418411677aeSAaron LI static const struct tok rsvp_obj_prop_tlv_values[] = {
41941c99275SPeter Avalos     { 0x01,                   "Cos" },
42041c99275SPeter Avalos     { 0x02,                   "Metric 1" },
42141c99275SPeter Avalos     { 0x04,                   "Metric 2" },
42241c99275SPeter Avalos     { 0x08,                   "CCC Status" },
42341c99275SPeter Avalos     { 0x10,                   "Path Type" },
42441c99275SPeter Avalos     { 0, NULL}
42541c99275SPeter Avalos };
42641c99275SPeter Avalos 
42741c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
42841c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY  25
42941c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
43041c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
43141c99275SPeter Avalos 
432411677aeSAaron LI static const struct tok rsvp_obj_error_code_values[] = {
43341c99275SPeter Avalos     { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
43441c99275SPeter Avalos     { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY,  "Notify Error" },
43541c99275SPeter Avalos     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
43641c99275SPeter Avalos     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
43741c99275SPeter Avalos     { 0, NULL}
43841c99275SPeter Avalos };
43941c99275SPeter Avalos 
440411677aeSAaron LI static const struct tok rsvp_obj_error_code_routing_values[] = {
44141c99275SPeter Avalos     { 1,                      "Bad EXPLICIT_ROUTE object" },
44241c99275SPeter Avalos     { 2,                      "Bad strict node" },
44341c99275SPeter Avalos     { 3,                      "Bad loose node" },
44441c99275SPeter Avalos     { 4,                      "Bad initial subobject" },
44541c99275SPeter Avalos     { 5,                      "No route available toward destination" },
44641c99275SPeter Avalos     { 6,                      "Unacceptable label value" },
44741c99275SPeter Avalos     { 7,                      "RRO indicated routing loops" },
44841c99275SPeter Avalos     { 8,                      "non-RSVP-capable router in the path" },
44941c99275SPeter Avalos     { 9,                      "MPLS label allocation failure" },
45041c99275SPeter Avalos     { 10,                     "Unsupported L3PID" },
45141c99275SPeter Avalos     { 0, NULL}
45241c99275SPeter Avalos };
45341c99275SPeter Avalos 
454411677aeSAaron LI static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
45541c99275SPeter Avalos     { 1,                      "Unexpected CT object" },
45641c99275SPeter Avalos     { 2,                      "Unsupported CT" },
45741c99275SPeter Avalos     { 3,                      "Invalid CT value" },
45841c99275SPeter Avalos     { 4,                      "CT/setup priority do not form a configured TE-Class" },
45941c99275SPeter Avalos     { 5,                      "CT/holding priority do not form a configured TE-Class" },
46041c99275SPeter Avalos     { 6,                      "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
46141c99275SPeter Avalos     { 7,                      "Inconsistency between signaled PSC and signaled CT" },
46241c99275SPeter Avalos     { 8,                      "Inconsistency between signaled PHBs and signaled CT" },
46341c99275SPeter Avalos    { 0, NULL}
46441c99275SPeter Avalos };
46541c99275SPeter Avalos 
46641c99275SPeter Avalos /* rfc3473 / rfc 3471 */
46741c99275SPeter Avalos static const struct tok rsvp_obj_admin_status_flag_values[] = {
46841c99275SPeter Avalos     { 0x80000000, "Reflect" },
46941c99275SPeter Avalos     { 0x00000004, "Testing" },
47041c99275SPeter Avalos     { 0x00000002, "Admin-down" },
47141c99275SPeter Avalos     { 0x00000001, "Delete-in-progress" },
47241c99275SPeter Avalos     { 0, NULL}
47341c99275SPeter Avalos };
47441c99275SPeter Avalos 
47541c99275SPeter Avalos /* label set actions - rfc3471 */
47641c99275SPeter Avalos #define LABEL_SET_INCLUSIVE_LIST  0
47741c99275SPeter Avalos #define LABEL_SET_EXCLUSIVE_LIST  1
47841c99275SPeter Avalos #define LABEL_SET_INCLUSIVE_RANGE 2
47941c99275SPeter Avalos #define LABEL_SET_EXCLUSIVE_RANGE 3
48041c99275SPeter Avalos 
48141c99275SPeter Avalos static const struct tok rsvp_obj_label_set_action_values[] = {
48241c99275SPeter Avalos     { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
48341c99275SPeter Avalos     { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
48441c99275SPeter Avalos     { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
48541c99275SPeter Avalos     { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
48641c99275SPeter Avalos     { 0, NULL}
48741c99275SPeter Avalos };
48841c99275SPeter Avalos 
48941c99275SPeter Avalos /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
49041c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS	    1
49141c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
49241c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY		    3
49341c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL            4
49441c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL           5
49541c99275SPeter Avalos 
49641c99275SPeter Avalos static const struct tok rsvp_obj_generalized_uni_values[] = {
49741c99275SPeter Avalos     { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
49841c99275SPeter Avalos     { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
49941c99275SPeter Avalos     { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
50041c99275SPeter Avalos     { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
50141c99275SPeter Avalos     { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
50241c99275SPeter Avalos     { 0, NULL}
50341c99275SPeter Avalos };
50441c99275SPeter Avalos 
50541c99275SPeter Avalos /*
50641c99275SPeter Avalos  * this is a dissector for all the intserv defined
50741c99275SPeter Avalos  * specs as defined per rfc2215
50841c99275SPeter Avalos  * it is called from various rsvp objects;
50941c99275SPeter Avalos  * returns the amount of bytes being processed
51041c99275SPeter Avalos  */
511*ed775ee7SAntonio Huete Jimenez static u_int
rsvp_intserv_print(netdissect_options * ndo,const u_char * tptr,u_int obj_tlen)512411677aeSAaron LI rsvp_intserv_print(netdissect_options *ndo,
513*ed775ee7SAntonio Huete Jimenez                    const u_char *tptr, u_int obj_tlen)
514411677aeSAaron LI {
515*ed775ee7SAntonio Huete Jimenez     u_int parameter_id,parameter_length;
51641c99275SPeter Avalos     union {
51741c99275SPeter Avalos 	float f;
518411677aeSAaron LI 	uint32_t i;
51941c99275SPeter Avalos     } bw;
52041c99275SPeter Avalos 
52141c99275SPeter Avalos     if (obj_tlen < 4)
52241c99275SPeter Avalos         return 0;
523*ed775ee7SAntonio Huete Jimenez     parameter_id = GET_U_1(tptr);
524*ed775ee7SAntonio Huete Jimenez     parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */
52541c99275SPeter Avalos 
526*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t      Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
52741c99275SPeter Avalos            tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
52841c99275SPeter Avalos            parameter_id,
52941c99275SPeter Avalos            parameter_length,
530*ed775ee7SAntonio Huete Jimenez            GET_U_1(tptr + 1));
53141c99275SPeter Avalos 
53241c99275SPeter Avalos     if (obj_tlen < parameter_length+4)
53341c99275SPeter Avalos         return 0;
53441c99275SPeter Avalos     switch(parameter_id) { /* parameter_id */
53541c99275SPeter Avalos 
53641c99275SPeter Avalos     case 4:
53741c99275SPeter Avalos        /*
53841c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53941c99275SPeter Avalos         * |    4 (e)      |    (f)        |           1 (g)               |
54041c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54141c99275SPeter Avalos         * |        IS hop cnt (32-bit unsigned integer)                   |
54241c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54341c99275SPeter Avalos         */
544411677aeSAaron LI         if (parameter_length == 4) {
545*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4));
546411677aeSAaron LI         }
54741c99275SPeter Avalos         break;
54841c99275SPeter Avalos 
54941c99275SPeter Avalos     case 6:
55041c99275SPeter Avalos        /*
55141c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55241c99275SPeter Avalos         * |    6 (h)      |    (i)        |           1 (j)               |
55341c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55441c99275SPeter Avalos         * |  Path b/w estimate  (32-bit IEEE floating point number)       |
55541c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55641c99275SPeter Avalos         */
55741c99275SPeter Avalos         if (parameter_length == 4) {
558*ed775ee7SAntonio Huete Jimenez             bw.i = GET_BE_U_4(tptr + 4);
559*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000);
56041c99275SPeter Avalos         }
56141c99275SPeter Avalos         break;
56241c99275SPeter Avalos 
56341c99275SPeter Avalos     case 8:
56441c99275SPeter Avalos        /*
56541c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56641c99275SPeter Avalos         * |     8 (k)     |    (l)        |           1 (m)               |
56741c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56841c99275SPeter Avalos         * |        Minimum path latency (32-bit integer)                  |
56941c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57041c99275SPeter Avalos         */
57141c99275SPeter Avalos         if (parameter_length == 4) {
572*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tMinimum path latency: ");
573*ed775ee7SAntonio Huete Jimenez             if (GET_BE_U_4(tptr + 4) == 0xffffffff)
574*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("don't care");
57541c99275SPeter Avalos             else
576*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%u", GET_BE_U_4(tptr + 4));
57741c99275SPeter Avalos         }
57841c99275SPeter Avalos         break;
57941c99275SPeter Avalos 
58041c99275SPeter Avalos     case 10:
58141c99275SPeter Avalos 
58241c99275SPeter Avalos        /*
58341c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58441c99275SPeter Avalos         * |     10 (n)    |      (o)      |           1 (p)               |
58541c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58641c99275SPeter Avalos         * |      Composed MTU (32-bit unsigned integer)                   |
58741c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58841c99275SPeter Avalos         */
589411677aeSAaron LI         if (parameter_length == 4) {
590*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4));
591411677aeSAaron LI         }
59241c99275SPeter Avalos         break;
59341c99275SPeter Avalos     case 127:
59441c99275SPeter Avalos        /*
59541c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59641c99275SPeter Avalos         * |   127 (e)     |    0 (f)      |             5 (g)             |
59741c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59841c99275SPeter Avalos         * |  Token Bucket Rate [r] (32-bit IEEE floating point number)    |
59941c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60041c99275SPeter Avalos         * |  Token Bucket Size [b] (32-bit IEEE floating point number)    |
60141c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60241c99275SPeter Avalos         * |  Peak Data Rate [p] (32-bit IEEE floating point number)       |
60341c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60441c99275SPeter Avalos         * |  Minimum Policed Unit [m] (32-bit integer)                    |
60541c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60641c99275SPeter Avalos         * |  Maximum Packet Size [M]  (32-bit integer)                    |
60741c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60841c99275SPeter Avalos         */
60941c99275SPeter Avalos 
61041c99275SPeter Avalos         if (parameter_length == 20) {
611*ed775ee7SAntonio Huete Jimenez 	    ND_TCHECK_LEN(tptr + 4, 20);
612*ed775ee7SAntonio Huete Jimenez             bw.i = GET_BE_U_4(tptr + 4);
613*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000);
614*ed775ee7SAntonio Huete Jimenez             bw.i = GET_BE_U_4(tptr + 8);
615*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tToken Bucket Size: %.10g bytes", bw.f);
616*ed775ee7SAntonio Huete Jimenez             bw.i = GET_BE_U_4(tptr + 12);
617*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000);
618*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tMinimum Policed Unit: %u bytes",
619*ed775ee7SAntonio Huete Jimenez                      GET_BE_U_4(tptr + 16));
620*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tMaximum Packet Size: %u bytes",
621*ed775ee7SAntonio Huete Jimenez                      GET_BE_U_4(tptr + 20));
62241c99275SPeter Avalos         }
62341c99275SPeter Avalos         break;
62441c99275SPeter Avalos 
62541c99275SPeter Avalos     case 130:
62641c99275SPeter Avalos        /*
62741c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62841c99275SPeter Avalos         * |     130 (h)   |    0 (i)      |            2 (j)              |
62941c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63041c99275SPeter Avalos         * |  Rate [R]  (32-bit IEEE floating point number)                |
63141c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63241c99275SPeter Avalos         * |  Slack Term [S]  (32-bit integer)                             |
63341c99275SPeter Avalos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63441c99275SPeter Avalos         */
63541c99275SPeter Avalos 
63641c99275SPeter Avalos         if (parameter_length == 8) {
637*ed775ee7SAntonio Huete Jimenez 	    ND_TCHECK_8(tptr + 4);
638*ed775ee7SAntonio Huete Jimenez             bw.i = GET_BE_U_4(tptr + 4);
639*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000);
640*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8));
64141c99275SPeter Avalos         }
64241c99275SPeter Avalos         break;
64341c99275SPeter Avalos 
64441c99275SPeter Avalos     case 133:
64541c99275SPeter Avalos     case 134:
64641c99275SPeter Avalos     case 135:
64741c99275SPeter Avalos     case 136:
648411677aeSAaron LI         if (parameter_length == 4) {
649*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4));
650411677aeSAaron LI         }
65141c99275SPeter Avalos         break;
65241c99275SPeter Avalos 
65341c99275SPeter Avalos     default:
654411677aeSAaron LI         if (ndo->ndo_vflag <= 1)
655411677aeSAaron LI             print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
65641c99275SPeter Avalos     }
65741c99275SPeter Avalos     return (parameter_length+4); /* header length 4 bytes */
658411677aeSAaron LI 
659411677aeSAaron LI trunc:
660*ed775ee7SAntonio Huete Jimenez     nd_print_trunc(ndo);
661411677aeSAaron LI     return 0;
662411677aeSAaron LI }
663411677aeSAaron LI 
664411677aeSAaron LI /*
665411677aeSAaron LI  * Clear checksum prior to signature verification.
666411677aeSAaron LI  */
667411677aeSAaron LI static void
rsvp_clear_checksum(void * header)668411677aeSAaron LI rsvp_clear_checksum(void *header)
669411677aeSAaron LI {
670411677aeSAaron LI     struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header;
671411677aeSAaron LI 
672411677aeSAaron LI     rsvp_com_header->checksum[0] = 0;
673411677aeSAaron LI     rsvp_com_header->checksum[1] = 0;
67441c99275SPeter Avalos }
67541c99275SPeter Avalos 
67641c99275SPeter Avalos static int
rsvp_obj_print(netdissect_options * ndo,const u_char * pptr,u_int plen,const u_char * tptr,const char * indent,u_int tlen,const struct rsvp_common_header * rsvp_com_header)677411677aeSAaron LI rsvp_obj_print(netdissect_options *ndo,
678411677aeSAaron LI                const u_char *pptr, u_int plen, const u_char *tptr,
679*ed775ee7SAntonio Huete Jimenez                const char *indent, u_int tlen,
680411677aeSAaron LI                const struct rsvp_common_header *rsvp_com_header)
681411677aeSAaron LI {
68241c99275SPeter Avalos     const struct rsvp_object_header *rsvp_obj_header;
68341c99275SPeter Avalos     const u_char *obj_tptr;
68441c99275SPeter Avalos     union {
68541c99275SPeter Avalos         const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
68641c99275SPeter Avalos         const struct rsvp_obj_frr_t *rsvp_obj_frr;
68741c99275SPeter Avalos     } obj_ptr;
68841c99275SPeter Avalos 
689*ed775ee7SAntonio Huete Jimenez     u_short rsvp_obj_len,rsvp_obj_ctype,rsvp_obj_class_num;
690*ed775ee7SAntonio Huete Jimenez     u_int obj_tlen,intserv_serv_tlen;
691*ed775ee7SAntonio Huete Jimenez     int hexdump;
692*ed775ee7SAntonio Huete Jimenez     u_int processed,padbytes,error_code,error_value,i,sigcheck;
69341c99275SPeter Avalos     union {
69441c99275SPeter Avalos 	float f;
695411677aeSAaron LI 	uint32_t i;
69641c99275SPeter Avalos     } bw;
697*ed775ee7SAntonio Huete Jimenez     u_int namelen;
69841c99275SPeter Avalos 
69941c99275SPeter Avalos     u_int action, subchannel;
70041c99275SPeter Avalos 
70141c99275SPeter Avalos     while(tlen>=sizeof(struct rsvp_object_header)) {
70241c99275SPeter Avalos         /* did we capture enough for fully decoding the object header ? */
703*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header));
70441c99275SPeter Avalos 
70541c99275SPeter Avalos         rsvp_obj_header = (const struct rsvp_object_header *)tptr;
706*ed775ee7SAntonio Huete Jimenez         rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length);
707*ed775ee7SAntonio Huete Jimenez         rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype);
70841c99275SPeter Avalos 
70941c99275SPeter Avalos         if(rsvp_obj_len % 4) {
710*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%sERROR: object header size %u not a multiple of 4", indent, rsvp_obj_len);
71141c99275SPeter Avalos             return -1;
71241c99275SPeter Avalos         }
71341c99275SPeter Avalos         if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
714*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%sERROR: object header too short %u < %zu", indent, rsvp_obj_len,
715*ed775ee7SAntonio Huete Jimenez                    sizeof(struct rsvp_object_header));
71641c99275SPeter Avalos             return -1;
71741c99275SPeter Avalos         }
71841c99275SPeter Avalos 
719*ed775ee7SAntonio Huete Jimenez         rsvp_obj_class_num = GET_U_1(rsvp_obj_header->class_num);
720*ed775ee7SAntonio Huete Jimenez         ND_PRINT("%s%s Object (%u) Flags: [%s",
721*ed775ee7SAntonio Huete Jimenez                indent,
72241c99275SPeter Avalos                tok2str(rsvp_obj_values,
72341c99275SPeter Avalos                        "Unknown",
724*ed775ee7SAntonio Huete Jimenez                        rsvp_obj_class_num),
725*ed775ee7SAntonio Huete Jimenez                rsvp_obj_class_num,
726*ed775ee7SAntonio Huete Jimenez                (rsvp_obj_class_num & 0x80) ?
727*ed775ee7SAntonio Huete Jimenez                    ((rsvp_obj_class_num & 0x40) ? "ignore and forward" :
728*ed775ee7SAntonio Huete Jimenez                                          "ignore silently") :
729*ed775ee7SAntonio Huete Jimenez                    "reject");
73041c99275SPeter Avalos 
731*ed775ee7SAntonio Huete Jimenez         ND_PRINT(" if unknown], Class-Type: %s (%u), length: %u",
73241c99275SPeter Avalos                tok2str(rsvp_ctype_values,
73341c99275SPeter Avalos                        "Unknown",
734*ed775ee7SAntonio Huete Jimenez                        (rsvp_obj_class_num<<8)+rsvp_obj_ctype),
73541c99275SPeter Avalos                rsvp_obj_ctype,
736*ed775ee7SAntonio Huete Jimenez                rsvp_obj_len);
73741c99275SPeter Avalos 
73841c99275SPeter Avalos         if(tlen < rsvp_obj_len) {
739*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%sERROR: object goes past end of objects TLV", indent);
74041c99275SPeter Avalos             return -1;
74141c99275SPeter Avalos         }
74241c99275SPeter Avalos 
74341c99275SPeter Avalos         obj_tptr=tptr+sizeof(struct rsvp_object_header);
74441c99275SPeter Avalos         obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
74541c99275SPeter Avalos 
74641c99275SPeter Avalos         /* did we capture enough for fully decoding the object ? */
747*ed775ee7SAntonio Huete Jimenez         ND_TCHECK_LEN(tptr, rsvp_obj_len);
74841c99275SPeter Avalos         hexdump=FALSE;
74941c99275SPeter Avalos 
750*ed775ee7SAntonio Huete Jimenez         switch(rsvp_obj_class_num) {
75141c99275SPeter Avalos         case RSVP_OBJ_SESSION:
75241c99275SPeter Avalos             switch(rsvp_obj_ctype) {
75341c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
75441c99275SPeter Avalos                 if (obj_tlen < 8)
755*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
756*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 DestAddress: %s, Protocol ID: 0x%02x",
757*ed775ee7SAntonio Huete Jimenez                        indent,
758*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
759*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + sizeof(nd_ipv4)));
760*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
761*ed775ee7SAntonio Huete Jimenez                        indent,
762*ed775ee7SAntonio Huete Jimenez                        GET_U_1((obj_tptr + 5)),
763*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6));
76441c99275SPeter Avalos                 obj_tlen-=8;
76541c99275SPeter Avalos                 obj_tptr+=8;
76641c99275SPeter Avalos                 break;
76741c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
76841c99275SPeter Avalos                 if (obj_tlen < 20)
769*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
770*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 DestAddress: %s, Protocol ID: 0x%02x",
771*ed775ee7SAntonio Huete Jimenez                        indent,
772*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
773*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + sizeof(nd_ipv6)));
774*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
775*ed775ee7SAntonio Huete Jimenez                        indent,
776*ed775ee7SAntonio Huete Jimenez                        GET_U_1((obj_tptr + sizeof(nd_ipv6) + 1)),
777*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + sizeof(nd_ipv6) + 2));
77841c99275SPeter Avalos                 obj_tlen-=20;
77941c99275SPeter Avalos                 obj_tptr+=20;
78041c99275SPeter Avalos                 break;
78141c99275SPeter Avalos 
78241c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV6:
78341c99275SPeter Avalos                 if (obj_tlen < 36)
784*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
785*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
786*ed775ee7SAntonio Huete Jimenez                        indent,
787*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
788*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18),
789*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr + 20));
79041c99275SPeter Avalos                 obj_tlen-=36;
79141c99275SPeter Avalos                 obj_tptr+=36;
79241c99275SPeter Avalos                 break;
79327bfbee1SPeter Avalos 
79427bfbee1SPeter Avalos             case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
79527bfbee1SPeter Avalos                 if (obj_tlen < 26)
796*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
797*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
798*ed775ee7SAntonio Huete Jimenez                        indent,
799*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr),
800*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6),
801*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr + 8));
80227bfbee1SPeter Avalos                 obj_tlen-=26;
80327bfbee1SPeter Avalos                 obj_tptr+=26;
80427bfbee1SPeter Avalos                 break;
80527bfbee1SPeter Avalos             case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
80627bfbee1SPeter Avalos                 if (obj_tlen < 12)
807*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
808*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
809*ed775ee7SAntonio Huete Jimenez                        indent,
810*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
811*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6),
812*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr + 8));
81327bfbee1SPeter Avalos                 obj_tlen-=12;
81427bfbee1SPeter Avalos                 obj_tptr+=12;
81527bfbee1SPeter Avalos                 break;
81641c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4:
81741c99275SPeter Avalos             case RSVP_CTYPE_UNI_IPV4:
81841c99275SPeter Avalos                 if (obj_tlen < 12)
819*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
820*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
821*ed775ee7SAntonio Huete Jimenez                        indent,
822*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
823*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6),
824*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr + 8));
82541c99275SPeter Avalos                 obj_tlen-=12;
82641c99275SPeter Avalos                 obj_tptr+=12;
82741c99275SPeter Avalos                 break;
82841c99275SPeter Avalos             default:
82941c99275SPeter Avalos                 hexdump=TRUE;
83041c99275SPeter Avalos             }
83141c99275SPeter Avalos             break;
83241c99275SPeter Avalos 
83341c99275SPeter Avalos         case RSVP_OBJ_CONFIRM:
83441c99275SPeter Avalos             switch(rsvp_obj_ctype) {
83541c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
836*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < sizeof(nd_ipv4))
837*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
838*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Receiver Address: %s",
839*ed775ee7SAntonio Huete Jimenez                        indent,
840*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr));
841*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=sizeof(nd_ipv4);
842*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=sizeof(nd_ipv4);
84341c99275SPeter Avalos                 break;
84441c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
845*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < sizeof(nd_ipv6))
846*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
847*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 Receiver Address: %s",
848*ed775ee7SAntonio Huete Jimenez                        indent,
849*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr));
850*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=sizeof(nd_ipv6);
851*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=sizeof(nd_ipv6);
85241c99275SPeter Avalos                 break;
85341c99275SPeter Avalos             default:
85441c99275SPeter Avalos                 hexdump=TRUE;
85541c99275SPeter Avalos             }
85641c99275SPeter Avalos             break;
85741c99275SPeter Avalos 
85841c99275SPeter Avalos         case RSVP_OBJ_NOTIFY_REQ:
85941c99275SPeter Avalos             switch(rsvp_obj_ctype) {
86041c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
861*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < sizeof(nd_ipv4))
862*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
863*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Notify Node Address: %s",
864*ed775ee7SAntonio Huete Jimenez                        indent,
865*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr));
866*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=sizeof(nd_ipv4);
867*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=sizeof(nd_ipv4);
86841c99275SPeter Avalos                 break;
86941c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
870*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < sizeof(nd_ipv6))
871*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
872*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 Notify Node Address: %s",
873*ed775ee7SAntonio Huete Jimenez                        indent,
874*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr));
875*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=sizeof(nd_ipv6);
876*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=sizeof(nd_ipv6);
87741c99275SPeter Avalos                 break;
87841c99275SPeter Avalos             default:
87941c99275SPeter Avalos                 hexdump=TRUE;
88041c99275SPeter Avalos             }
88141c99275SPeter Avalos             break;
88241c99275SPeter Avalos 
88341c99275SPeter Avalos         case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
88441c99275SPeter Avalos         case RSVP_OBJ_UPSTREAM_LABEL:  /* fall through */
88541c99275SPeter Avalos         case RSVP_OBJ_RECOVERY_LABEL:  /* fall through */
88641c99275SPeter Avalos         case RSVP_OBJ_LABEL:
88741c99275SPeter Avalos             switch(rsvp_obj_ctype) {
88841c99275SPeter Avalos             case RSVP_CTYPE_1:
88941c99275SPeter Avalos                 while(obj_tlen >= 4 ) {
890*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  Label: %u", indent, GET_BE_U_4(obj_tptr));
89141c99275SPeter Avalos                     obj_tlen-=4;
89241c99275SPeter Avalos                     obj_tptr+=4;
89341c99275SPeter Avalos                 }
89441c99275SPeter Avalos                 break;
89541c99275SPeter Avalos             case RSVP_CTYPE_2:
89641c99275SPeter Avalos                 if (obj_tlen < 4)
897*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
898*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Generalized Label: %u",
899*ed775ee7SAntonio Huete Jimenez                        indent,
900*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr));
90141c99275SPeter Avalos                 obj_tlen-=4;
90241c99275SPeter Avalos                 obj_tptr+=4;
90341c99275SPeter Avalos                 break;
90441c99275SPeter Avalos             case RSVP_CTYPE_3:
90541c99275SPeter Avalos                 if (obj_tlen < 12)
906*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
907*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Waveband ID: %u%s  Start Label: %u, Stop Label: %u",
908*ed775ee7SAntonio Huete Jimenez                        indent,
909*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr),
910*ed775ee7SAntonio Huete Jimenez                        indent,
911*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 4),
912*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 8));
91341c99275SPeter Avalos                 obj_tlen-=12;
91441c99275SPeter Avalos                 obj_tptr+=12;
91541c99275SPeter Avalos                 break;
91641c99275SPeter Avalos             default:
91741c99275SPeter Avalos                 hexdump=TRUE;
91841c99275SPeter Avalos             }
91941c99275SPeter Avalos             break;
92041c99275SPeter Avalos 
92141c99275SPeter Avalos         case RSVP_OBJ_STYLE:
92241c99275SPeter Avalos             switch(rsvp_obj_ctype) {
92341c99275SPeter Avalos             case RSVP_CTYPE_1:
92441c99275SPeter Avalos                 if (obj_tlen < 4)
925*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
926*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Reservation Style: %s, Flags: [0x%02x]",
927*ed775ee7SAntonio Huete Jimenez                        indent,
92841c99275SPeter Avalos                        tok2str(rsvp_resstyle_values,
92941c99275SPeter Avalos                                "Unknown",
930*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_3(obj_tptr + 1)),
931*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr));
93241c99275SPeter Avalos                 obj_tlen-=4;
93341c99275SPeter Avalos                 obj_tptr+=4;
93441c99275SPeter Avalos                 break;
93541c99275SPeter Avalos             default:
93641c99275SPeter Avalos                 hexdump=TRUE;
93741c99275SPeter Avalos             }
93841c99275SPeter Avalos             break;
93941c99275SPeter Avalos 
94041c99275SPeter Avalos         case RSVP_OBJ_SENDER_TEMPLATE:
94141c99275SPeter Avalos             switch(rsvp_obj_ctype) {
94241c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
94341c99275SPeter Avalos                 if (obj_tlen < 8)
944*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
945*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
946*ed775ee7SAntonio Huete Jimenez                        indent,
947*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
948*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6));
94941c99275SPeter Avalos                 obj_tlen-=8;
95041c99275SPeter Avalos                 obj_tptr+=8;
95141c99275SPeter Avalos                 break;
95241c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
95341c99275SPeter Avalos                 if (obj_tlen < 20)
954*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
955*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
956*ed775ee7SAntonio Huete Jimenez                        indent,
957*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
958*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18));
95941c99275SPeter Avalos                 obj_tlen-=20;
96041c99275SPeter Avalos                 obj_tptr+=20;
96141c99275SPeter Avalos                 break;
96227bfbee1SPeter Avalos             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
96327bfbee1SPeter Avalos                 if (obj_tlen < 40)
964*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
965*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
96627bfbee1SPeter Avalos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
967*ed775ee7SAntonio Huete Jimenez                        indent,
968*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
969*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18),
970*ed775ee7SAntonio Huete Jimenez                        indent,
971*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr+20),
972*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 38));
97327bfbee1SPeter Avalos                 obj_tlen-=40;
97427bfbee1SPeter Avalos                 obj_tptr+=40;
97527bfbee1SPeter Avalos                 break;
97641c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4:
97741c99275SPeter Avalos                 if (obj_tlen < 8)
978*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
979*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
980*ed775ee7SAntonio Huete Jimenez                        indent,
981*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
982*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6));
98341c99275SPeter Avalos                 obj_tlen-=8;
98441c99275SPeter Avalos                 obj_tptr+=8;
98541c99275SPeter Avalos                 break;
98627bfbee1SPeter Avalos             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
98727bfbee1SPeter Avalos                 if (obj_tlen < 16)
988*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
989*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
99027bfbee1SPeter Avalos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
991*ed775ee7SAntonio Huete Jimenez                        indent,
992*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
993*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6),
994*ed775ee7SAntonio Huete Jimenez                        indent,
995*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr+8),
996*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 12));
99727bfbee1SPeter Avalos                 obj_tlen-=16;
99827bfbee1SPeter Avalos                 obj_tptr+=16;
99927bfbee1SPeter Avalos                 break;
100041c99275SPeter Avalos             default:
100141c99275SPeter Avalos                 hexdump=TRUE;
100241c99275SPeter Avalos             }
100341c99275SPeter Avalos             break;
100441c99275SPeter Avalos 
100541c99275SPeter Avalos         case RSVP_OBJ_LABEL_REQ:
100641c99275SPeter Avalos             switch(rsvp_obj_ctype) {
100741c99275SPeter Avalos             case RSVP_CTYPE_1:
100841c99275SPeter Avalos                 while(obj_tlen >= 4 ) {
1009*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  L3 Protocol ID: %s",
1010*ed775ee7SAntonio Huete Jimenez                            indent,
101141c99275SPeter Avalos                            tok2str(ethertype_values,
101241c99275SPeter Avalos                                    "Unknown Protocol (0x%04x)",
1013*ed775ee7SAntonio Huete Jimenez                                    GET_BE_U_2(obj_tptr + 2)));
101441c99275SPeter Avalos                     obj_tlen-=4;
101541c99275SPeter Avalos                     obj_tptr+=4;
101641c99275SPeter Avalos                 }
101741c99275SPeter Avalos                 break;
101841c99275SPeter Avalos             case RSVP_CTYPE_2:
101941c99275SPeter Avalos                 if (obj_tlen < 12)
1020*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1021*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  L3 Protocol ID: %s",
1022*ed775ee7SAntonio Huete Jimenez                        indent,
102341c99275SPeter Avalos                        tok2str(ethertype_values,
102441c99275SPeter Avalos                                "Unknown Protocol (0x%04x)",
1025*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_2(obj_tptr + 2)));
1026*ed775ee7SAntonio Huete Jimenez                 ND_PRINT(",%s merge capability",
1027*ed775ee7SAntonio Huete Jimenez                          ((GET_U_1(obj_tptr + 4)) & 0x80) ? "no" : "" );
1028*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Minimum VPI/VCI: %u/%u",
1029*ed775ee7SAntonio Huete Jimenez                        indent,
1030*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_2(obj_tptr + 4))&0xfff,
1031*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_2(obj_tptr + 6)) & 0xfff);
1032*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Maximum VPI/VCI: %u/%u",
1033*ed775ee7SAntonio Huete Jimenez                        indent,
1034*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_2(obj_tptr + 8))&0xfff,
1035*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_2(obj_tptr + 10)) & 0xfff);
103641c99275SPeter Avalos                 obj_tlen-=12;
103741c99275SPeter Avalos                 obj_tptr+=12;
103841c99275SPeter Avalos                 break;
103941c99275SPeter Avalos             case RSVP_CTYPE_3:
104041c99275SPeter Avalos                 if (obj_tlen < 12)
1041*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1042*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  L3 Protocol ID: %s",
1043*ed775ee7SAntonio Huete Jimenez                        indent,
104441c99275SPeter Avalos                        tok2str(ethertype_values,
104541c99275SPeter Avalos                                "Unknown Protocol (0x%04x)",
1046*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_2(obj_tptr + 2)));
1047*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
1048*ed775ee7SAntonio Huete Jimenez                        indent,
1049*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_4(obj_tptr + 4))&0x7fffff,
1050*ed775ee7SAntonio Huete Jimenez                        (GET_BE_U_4(obj_tptr + 8))&0x7fffff,
1051*ed775ee7SAntonio Huete Jimenez                        (((GET_BE_U_2(obj_tptr + 4)>>7)&3) == 0 ) ? "10" : "",
1052*ed775ee7SAntonio Huete Jimenez                        (((GET_BE_U_2(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : "");
105341c99275SPeter Avalos                 obj_tlen-=12;
105441c99275SPeter Avalos                 obj_tptr+=12;
105541c99275SPeter Avalos                 break;
105641c99275SPeter Avalos             case RSVP_CTYPE_4:
105741c99275SPeter Avalos                 if (obj_tlen < 4)
1058*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1059*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  LSP Encoding Type: %s (%u)",
1060*ed775ee7SAntonio Huete Jimenez                        indent,
106141c99275SPeter Avalos                        tok2str(gmpls_encoding_values,
106241c99275SPeter Avalos                                "Unknown",
1063*ed775ee7SAntonio Huete Jimenez                                GET_U_1(obj_tptr)),
1064*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr));
1065*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Switching Type: %s (%u), Payload ID: %s (0x%04x)",
1066*ed775ee7SAntonio Huete Jimenez                        indent,
106741c99275SPeter Avalos                        tok2str(gmpls_switch_cap_values,
106841c99275SPeter Avalos                                "Unknown",
1069*ed775ee7SAntonio Huete Jimenez                                GET_U_1((obj_tptr + 1))),
1070*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + 1),
107141c99275SPeter Avalos                        tok2str(gmpls_payload_values,
107241c99275SPeter Avalos                                "Unknown",
1073*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_2(obj_tptr + 2)),
1074*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 2));
107541c99275SPeter Avalos                 obj_tlen-=4;
107641c99275SPeter Avalos                 obj_tptr+=4;
107741c99275SPeter Avalos                 break;
107841c99275SPeter Avalos             default:
107941c99275SPeter Avalos                 hexdump=TRUE;
108041c99275SPeter Avalos             }
108141c99275SPeter Avalos             break;
108241c99275SPeter Avalos 
108341c99275SPeter Avalos         case RSVP_OBJ_RRO:
108441c99275SPeter Avalos         case RSVP_OBJ_ERO:
108541c99275SPeter Avalos             switch(rsvp_obj_ctype) {
108641c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
108741c99275SPeter Avalos                 while(obj_tlen >= 4 ) {
1088411677aeSAaron LI 		    u_char length;
1089411677aeSAaron LI 
1090*ed775ee7SAntonio Huete Jimenez 		    ND_TCHECK_4(obj_tptr);
1091*ed775ee7SAntonio Huete Jimenez 		    length = GET_U_1(obj_tptr + 1);
1092*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  Subobject Type: %s, length %u",
1093*ed775ee7SAntonio Huete Jimenez                            indent,
109441c99275SPeter Avalos                            tok2str(rsvp_obj_xro_values,
109541c99275SPeter Avalos                                    "Unknown %u",
1096*ed775ee7SAntonio Huete Jimenez                                    RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))),
1097*ed775ee7SAntonio Huete Jimenez                            length);
1098*ed775ee7SAntonio Huete Jimenez                     if (obj_tlen < length) {
1099*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s  ERROR: ERO subobject length > object length", indent);
110041c99275SPeter Avalos                         break;
110141c99275SPeter Avalos                     }
110241c99275SPeter Avalos 
1103*ed775ee7SAntonio Huete Jimenez                     if (length == 0) { /* prevent infinite loops */
1104*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s  ERROR: zero length ERO subtype", indent);
1105*ed775ee7SAntonio Huete Jimenez                         break;
1106*ed775ee7SAntonio Huete Jimenez                     }
1107*ed775ee7SAntonio Huete Jimenez 
1108*ed775ee7SAntonio Huete Jimenez                     switch(RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))) {
1109411677aeSAaron LI 		    u_char prefix_length;
1110411677aeSAaron LI 
111141c99275SPeter Avalos                     case RSVP_OBJ_XRO_IPV4:
1112411677aeSAaron LI 			if (length != 8) {
1113*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" ERROR: length != 8");
1114411677aeSAaron LI 				goto invalid;
1115411677aeSAaron LI 			}
1116*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_8(obj_tptr);
1117*ed775ee7SAntonio Huete Jimenez 			prefix_length = GET_U_1(obj_tptr + 6);
1118411677aeSAaron LI 			if (prefix_length != 32) {
1119*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" ERROR: Prefix length %u != 32",
1120*ed775ee7SAntonio Huete Jimenez 					  prefix_length);
1121411677aeSAaron LI 				goto invalid;
1122411677aeSAaron LI 			}
1123*ed775ee7SAntonio Huete Jimenez                         ND_PRINT(", %s, %s/%u, Flags: [%s]",
1124*ed775ee7SAntonio Huete Jimenez                                RSVP_OBJ_XRO_MASK_LOOSE(GET_U_1(obj_tptr)) ? "Loose" : "Strict",
1125*ed775ee7SAntonio Huete Jimenez                                GET_IPADDR_STRING(obj_tptr+2),
1126*ed775ee7SAntonio Huete Jimenez                                GET_U_1((obj_tptr + 6)),
112741c99275SPeter Avalos                                bittok2str(rsvp_obj_rro_flag_values,
112841c99275SPeter Avalos                                    "none",
1129*ed775ee7SAntonio Huete Jimenez                                    GET_U_1((obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
113027bfbee1SPeter Avalos                     break;
113127bfbee1SPeter Avalos                     case RSVP_OBJ_XRO_LABEL:
1132411677aeSAaron LI 			if (length != 8) {
1133*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" ERROR: length != 8");
1134411677aeSAaron LI 				goto invalid;
1135411677aeSAaron LI 			}
1136*ed775ee7SAntonio Huete Jimenez 			ND_TCHECK_8(obj_tptr);
1137*ed775ee7SAntonio Huete Jimenez                         ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
113827bfbee1SPeter Avalos                                bittok2str(rsvp_obj_rro_label_flag_values,
113927bfbee1SPeter Avalos                                    "none",
1140*ed775ee7SAntonio Huete Jimenez                                    GET_U_1((obj_tptr + 2))),
1141*ed775ee7SAntonio Huete Jimenez                                GET_U_1(obj_tptr + 2),
114227bfbee1SPeter Avalos                                tok2str(rsvp_ctype_values,
114327bfbee1SPeter Avalos                                        "Unknown",
1144*ed775ee7SAntonio Huete Jimenez                                        GET_U_1((obj_tptr + 3)) + (256 * RSVP_OBJ_RRO)),
1145*ed775ee7SAntonio Huete Jimenez                                GET_U_1((obj_tptr + 3)),
1146*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_4(obj_tptr + 4));
114741c99275SPeter Avalos                     }
1148*ed775ee7SAntonio Huete Jimenez                     obj_tlen-=length;
1149*ed775ee7SAntonio Huete Jimenez                     obj_tptr+=length;
115041c99275SPeter Avalos                 }
115141c99275SPeter Avalos                 break;
115241c99275SPeter Avalos             default:
115341c99275SPeter Avalos                 hexdump=TRUE;
115441c99275SPeter Avalos             }
115541c99275SPeter Avalos             break;
115641c99275SPeter Avalos 
115741c99275SPeter Avalos         case RSVP_OBJ_HELLO:
115841c99275SPeter Avalos             switch(rsvp_obj_ctype) {
115941c99275SPeter Avalos             case RSVP_CTYPE_1:
116041c99275SPeter Avalos             case RSVP_CTYPE_2:
116141c99275SPeter Avalos                 if (obj_tlen < 8)
1162*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1163*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Instance: 0x%08x, Destination Instance: 0x%08x",
1164*ed775ee7SAntonio Huete Jimenez                        indent,
1165*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr),
1166*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 4));
116741c99275SPeter Avalos                 obj_tlen-=8;
116841c99275SPeter Avalos                 obj_tptr+=8;
116941c99275SPeter Avalos                 break;
117041c99275SPeter Avalos             default:
117141c99275SPeter Avalos                 hexdump=TRUE;
117241c99275SPeter Avalos             }
117341c99275SPeter Avalos             break;
117441c99275SPeter Avalos 
117541c99275SPeter Avalos         case RSVP_OBJ_RESTART_CAPABILITY:
117641c99275SPeter Avalos             switch(rsvp_obj_ctype) {
117741c99275SPeter Avalos             case RSVP_CTYPE_1:
117841c99275SPeter Avalos                 if (obj_tlen < 8)
1179*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1180*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Restart  Time: %ums, Recovery Time: %ums",
1181*ed775ee7SAntonio Huete Jimenez                        indent,
1182*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr),
1183*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 4));
118441c99275SPeter Avalos                 obj_tlen-=8;
118541c99275SPeter Avalos                 obj_tptr+=8;
118641c99275SPeter Avalos                 break;
118741c99275SPeter Avalos             default:
118841c99275SPeter Avalos                 hexdump=TRUE;
118941c99275SPeter Avalos             }
119041c99275SPeter Avalos             break;
119141c99275SPeter Avalos 
1192*ed775ee7SAntonio Huete Jimenez         case RSVP_OBJ_CAPABILITY:
1193*ed775ee7SAntonio Huete Jimenez             switch(rsvp_obj_ctype) {
1194*ed775ee7SAntonio Huete Jimenez             case RSVP_CTYPE_1:
1195*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < 4)
1196*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1197*ed775ee7SAntonio Huete Jimenez                 uint32_t unused_and_flags = GET_BE_U_4(obj_tptr);
1198*ed775ee7SAntonio Huete Jimenez                 if (unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK)
1199*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  [reserved=0x%08x must be zero]", indent,
1200*ed775ee7SAntonio Huete Jimenez                         unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK);
1201*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Flags: [%s]",
1202*ed775ee7SAntonio Huete Jimenez                        indent,
1203*ed775ee7SAntonio Huete Jimenez                        bittok2str(rsvp_obj_capability_flag_values,
1204*ed775ee7SAntonio Huete Jimenez                                   "none",
1205*ed775ee7SAntonio Huete Jimenez                                   (unused_and_flags & RSVP_OBJ_CAPABILITY_FLAGS_MASK)));
1206*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=4;
1207*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=4;
1208*ed775ee7SAntonio Huete Jimenez                 break;
1209*ed775ee7SAntonio Huete Jimenez             default:
1210*ed775ee7SAntonio Huete Jimenez                 hexdump=TRUE;
1211*ed775ee7SAntonio Huete Jimenez             }
1212*ed775ee7SAntonio Huete Jimenez             break;
1213*ed775ee7SAntonio Huete Jimenez 
121441c99275SPeter Avalos         case RSVP_OBJ_SESSION_ATTRIBUTE:
121541c99275SPeter Avalos             switch(rsvp_obj_ctype) {
121641c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4:
121741c99275SPeter Avalos                 if (obj_tlen < 4)
1218*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1219*ed775ee7SAntonio Huete Jimenez                 namelen = GET_U_1(obj_tptr + 3);
122041c99275SPeter Avalos                 if (obj_tlen < 4+namelen)
1221*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1222*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Session Name: ", indent);
122341c99275SPeter Avalos                 for (i = 0; i < namelen; i++)
1224*ed775ee7SAntonio Huete Jimenez                     fn_print_char(ndo, GET_U_1(obj_tptr + 4 + i));
1225*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
1226*ed775ee7SAntonio Huete Jimenez                        indent,
1227*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr),
1228*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + 1),
122927bfbee1SPeter Avalos                        bittok2str(rsvp_session_attribute_flag_values,
123041c99275SPeter Avalos                                   "none",
1231*ed775ee7SAntonio Huete Jimenez                                   GET_U_1((obj_tptr + 2))),
1232*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + 2));
1233*ed775ee7SAntonio Huete Jimenez                 obj_tlen-=4+namelen;
1234*ed775ee7SAntonio Huete Jimenez                 obj_tptr+=4+namelen;
123541c99275SPeter Avalos                 break;
123641c99275SPeter Avalos             default:
123741c99275SPeter Avalos                 hexdump=TRUE;
123841c99275SPeter Avalos             }
123941c99275SPeter Avalos             break;
124041c99275SPeter Avalos 
124141c99275SPeter Avalos 	case RSVP_OBJ_GENERALIZED_UNI:
124241c99275SPeter Avalos             switch(rsvp_obj_ctype) {
1243*ed775ee7SAntonio Huete Jimenez 		u_int subobj_type,af,subobj_len,total_subobj_len;
124441c99275SPeter Avalos 
124541c99275SPeter Avalos             case RSVP_CTYPE_1:
124641c99275SPeter Avalos 
124741c99275SPeter Avalos                 if (obj_tlen < 4)
1248*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
124941c99275SPeter Avalos 
125041c99275SPeter Avalos 		/* read variable length subobjects */
125141c99275SPeter Avalos 		total_subobj_len = obj_tlen;
125241c99275SPeter Avalos                 while(total_subobj_len > 0) {
1253411677aeSAaron LI                     /* If RFC 3476 Section 3.1 defined that a sub-object of the
1254411677aeSAaron LI                      * GENERALIZED_UNI RSVP object must have the Length field as
1255411677aeSAaron LI                      * a multiple of 4, instead of the check below it would be
1256411677aeSAaron LI                      * better to test total_subobj_len only once before the loop.
1257411677aeSAaron LI                      * So long as it does not define it and this while loop does
1258411677aeSAaron LI                      * not implement such a requirement, let's accept that within
1259411677aeSAaron LI                      * each iteration subobj_len may happen to be a multiple of 1
1260411677aeSAaron LI                      * and test it and total_subobj_len respectively.
1261411677aeSAaron LI                      */
1262411677aeSAaron LI                     if (total_subobj_len < 4)
1263411677aeSAaron LI                         goto invalid;
1264*ed775ee7SAntonio Huete Jimenez                     subobj_len  = GET_BE_U_2(obj_tptr);
1265*ed775ee7SAntonio Huete Jimenez                     subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8;
1266*ed775ee7SAntonio Huete Jimenez                     af = (GET_BE_U_2(obj_tptr + 2))&0x00FF;
126741c99275SPeter Avalos 
1268*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  Subobject Type: %s (%u), AF: %s (%u), length: %u",
1269*ed775ee7SAntonio Huete Jimenez                            indent,
127041c99275SPeter Avalos                            tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
127141c99275SPeter Avalos                            subobj_type,
127241c99275SPeter Avalos                            tok2str(af_values, "Unknown", af), af,
1273*ed775ee7SAntonio Huete Jimenez                            subobj_len);
1274411677aeSAaron LI 
1275411677aeSAaron LI                     /* In addition to what is explained above, the same spec does not
1276411677aeSAaron LI                      * explicitly say that the same Length field includes the 4-octet
1277411677aeSAaron LI                      * sub-object header, but as long as this while loop implements it
1278411677aeSAaron LI                      * as it does include, let's keep the check below consistent with
1279411677aeSAaron LI                      * the rest of the code.
1280*ed775ee7SAntonio Huete Jimenez                      *
1281*ed775ee7SAntonio Huete Jimenez                      * XXX - RFC 3476 Section 3.1 says "The contents of these
1282*ed775ee7SAntonio Huete Jimenez                      * sub-objects are described in [8]", where [8] is
1283*ed775ee7SAntonio Huete Jimenez                      * UNI 1.0 Signaling Specification, The Optical
1284*ed775ee7SAntonio Huete Jimenez                      * Internetworking Forum.  The URL they give for that
1285*ed775ee7SAntonio Huete Jimenez                      * document is
1286*ed775ee7SAntonio Huete Jimenez                      *
1287*ed775ee7SAntonio Huete Jimenez                      *    http://www.oiforum.com/public/UNI_1.0_ia.html
1288*ed775ee7SAntonio Huete Jimenez                      *
1289*ed775ee7SAntonio Huete Jimenez                      * but that doesn't work; the new URL appears to be
1290*ed775ee7SAntonio Huete Jimenez                      *
1291*ed775ee7SAntonio Huete Jimenez                      *    https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf
1292*ed775ee7SAntonio Huete Jimenez                      *
1293*ed775ee7SAntonio Huete Jimenez                      * and *that* document, in section 12.5.2.3
1294*ed775ee7SAntonio Huete Jimenez                      * "GENERALIZED_UNI Object (Class-Num=11bbbbbb (TBA))",
1295*ed775ee7SAntonio Huete Jimenez                      * says nothing about the length field in general, but
1296*ed775ee7SAntonio Huete Jimenez                      * some of the examples it gives in subsections have
1297*ed775ee7SAntonio Huete Jimenez                      * length field values that clearly includes the length
1298*ed775ee7SAntonio Huete Jimenez                      * of the sub-object header as well as the length of the
1299*ed775ee7SAntonio Huete Jimenez                      * value.
1300411677aeSAaron LI                      */
1301*ed775ee7SAntonio Huete Jimenez                     if(subobj_len < 4 || subobj_len > total_subobj_len ||
1302*ed775ee7SAntonio Huete Jimenez                        obj_tlen < subobj_len)
1303411677aeSAaron LI                         goto invalid;
130441c99275SPeter Avalos 
130541c99275SPeter Avalos                     switch(subobj_type) {
130641c99275SPeter Avalos                     case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
130741c99275SPeter Avalos                     case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
130841c99275SPeter Avalos 
130941c99275SPeter Avalos                         switch(af) {
131041c99275SPeter Avalos                         case AFNUM_INET:
131141c99275SPeter Avalos                             if (subobj_len < 8)
1312*ed775ee7SAntonio Huete Jimenez                                 goto subobj_tooshort;
1313*ed775ee7SAntonio Huete Jimenez                             ND_PRINT("%s    UNI IPv4 TNA address: %s",
1314*ed775ee7SAntonio Huete Jimenez                                    indent, GET_IPADDR_STRING(obj_tptr + 4));
131541c99275SPeter Avalos                             break;
131641c99275SPeter Avalos                         case AFNUM_INET6:
131741c99275SPeter Avalos                             if (subobj_len < 20)
1318*ed775ee7SAntonio Huete Jimenez                                 goto subobj_tooshort;
1319*ed775ee7SAntonio Huete Jimenez                             ND_PRINT("%s    UNI IPv6 TNA address: %s",
1320*ed775ee7SAntonio Huete Jimenez                                    indent, GET_IP6ADDR_STRING(obj_tptr + 4));
132141c99275SPeter Avalos                             break;
132241c99275SPeter Avalos                         case AFNUM_NSAP:
132341c99275SPeter Avalos                             if (subobj_len) {
132441c99275SPeter Avalos                                 /* unless we have a TLV parser lets just hexdump */
132541c99275SPeter Avalos                                 hexdump=TRUE;
132641c99275SPeter Avalos                             }
132741c99275SPeter Avalos                             break;
132841c99275SPeter Avalos                         }
132941c99275SPeter Avalos                         break;
133041c99275SPeter Avalos 
133141c99275SPeter Avalos                     case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
1332*ed775ee7SAntonio Huete Jimenez                         if (subobj_len > 4) {
133341c99275SPeter Avalos                             /* unless we have a TLV parser lets just hexdump */
133441c99275SPeter Avalos                             hexdump=TRUE;
133541c99275SPeter Avalos                         }
133641c99275SPeter Avalos                         break;
133741c99275SPeter Avalos 
133841c99275SPeter Avalos                     case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
133941c99275SPeter Avalos                         if (subobj_len < 16) {
1340*ed775ee7SAntonio Huete Jimenez                             goto subobj_tooshort;
134141c99275SPeter Avalos                         }
134241c99275SPeter Avalos 
1343*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s    U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
1344*ed775ee7SAntonio Huete Jimenez                                indent,
1345*ed775ee7SAntonio Huete Jimenez                                ((GET_BE_U_4(obj_tptr + 4))>>31),
1346*ed775ee7SAntonio Huete Jimenez                                ((GET_BE_U_4(obj_tptr + 4))&0xFF),
1347*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_4(obj_tptr + 8),
1348*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_4(obj_tptr + 12));
134941c99275SPeter Avalos                         break;
135041c99275SPeter Avalos 
135141c99275SPeter Avalos                     case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
135241c99275SPeter Avalos                         if (subobj_len < 8) {
1353*ed775ee7SAntonio Huete Jimenez                             goto subobj_tooshort;
135441c99275SPeter Avalos                         }
135541c99275SPeter Avalos 
1356*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s    Service level: %u",
1357*ed775ee7SAntonio Huete Jimenez                                indent, (GET_BE_U_4(obj_tptr + 4)) >> 24);
135841c99275SPeter Avalos                         break;
135941c99275SPeter Avalos 
136041c99275SPeter Avalos                     default:
136141c99275SPeter Avalos                         hexdump=TRUE;
136241c99275SPeter Avalos                         break;
136341c99275SPeter Avalos                     }
136441c99275SPeter Avalos                     total_subobj_len-=subobj_len;
136541c99275SPeter Avalos                     obj_tptr+=subobj_len;
136641c99275SPeter Avalos                     obj_tlen+=subobj_len;
136741c99275SPeter Avalos 		}
136841c99275SPeter Avalos                 break;
136941c99275SPeter Avalos 
137041c99275SPeter Avalos             default:
137141c99275SPeter Avalos                 hexdump=TRUE;
137241c99275SPeter Avalos             }
137341c99275SPeter Avalos             break;
137441c99275SPeter Avalos 
137541c99275SPeter Avalos         case RSVP_OBJ_RSVP_HOP:
137641c99275SPeter Avalos             switch(rsvp_obj_ctype) {
137741c99275SPeter Avalos             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
137841c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
137941c99275SPeter Avalos                 if (obj_tlen < 8)
1380*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1381*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1382*ed775ee7SAntonio Huete Jimenez                        indent,
1383*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1384*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 4));
138541c99275SPeter Avalos                 obj_tlen-=8;
138641c99275SPeter Avalos                 obj_tptr+=8;
138741c99275SPeter Avalos                 if (obj_tlen)
138841c99275SPeter Avalos                     hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
138941c99275SPeter Avalos                 break;
139041c99275SPeter Avalos             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
139141c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
139241c99275SPeter Avalos                 if (obj_tlen < 20)
1393*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1394*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1395*ed775ee7SAntonio Huete Jimenez                        indent,
1396*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
1397*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr + 16));
139841c99275SPeter Avalos                 obj_tlen-=20;
139941c99275SPeter Avalos                 obj_tptr+=20;
140041c99275SPeter Avalos                 hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
140141c99275SPeter Avalos                 break;
140241c99275SPeter Avalos             default:
140341c99275SPeter Avalos                 hexdump=TRUE;
140441c99275SPeter Avalos             }
140541c99275SPeter Avalos             break;
140641c99275SPeter Avalos 
140741c99275SPeter Avalos         case RSVP_OBJ_TIME_VALUES:
140841c99275SPeter Avalos             switch(rsvp_obj_ctype) {
140941c99275SPeter Avalos             case RSVP_CTYPE_1:
141041c99275SPeter Avalos                 if (obj_tlen < 4)
1411*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1412*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Refresh Period: %ums",
1413*ed775ee7SAntonio Huete Jimenez                        indent,
1414*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr));
141541c99275SPeter Avalos                 obj_tlen-=4;
141641c99275SPeter Avalos                 obj_tptr+=4;
141741c99275SPeter Avalos                 break;
141841c99275SPeter Avalos             default:
141941c99275SPeter Avalos                 hexdump=TRUE;
142041c99275SPeter Avalos             }
142141c99275SPeter Avalos             break;
142241c99275SPeter Avalos 
142341c99275SPeter Avalos         /* those three objects do share the same semantics */
142441c99275SPeter Avalos         case RSVP_OBJ_SENDER_TSPEC:
142541c99275SPeter Avalos         case RSVP_OBJ_ADSPEC:
142641c99275SPeter Avalos         case RSVP_OBJ_FLOWSPEC:
142741c99275SPeter Avalos             switch(rsvp_obj_ctype) {
142841c99275SPeter Avalos             case RSVP_CTYPE_2:
142941c99275SPeter Avalos                 if (obj_tlen < 4)
1430*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1431*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Msg-Version: %u, length: %u",
1432*ed775ee7SAntonio Huete Jimenez                        indent,
1433*ed775ee7SAntonio Huete Jimenez                        (GET_U_1(obj_tptr) & 0xf0) >> 4,
1434*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 2) << 2);
143541c99275SPeter Avalos                 obj_tptr+=4; /* get to the start of the service header */
143641c99275SPeter Avalos                 obj_tlen-=4;
143741c99275SPeter Avalos 
143841c99275SPeter Avalos                 while (obj_tlen >= 4) {
1439*ed775ee7SAntonio Huete Jimenez                     intserv_serv_tlen=GET_BE_U_2(obj_tptr + 2)<<2;
1440*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  Service Type: %s (%u), break bit %sset, Service length: %u",
1441*ed775ee7SAntonio Huete Jimenez                            indent,
1442*ed775ee7SAntonio Huete Jimenez                            tok2str(rsvp_intserv_service_type_values,"unknown",GET_U_1((obj_tptr))),
1443*ed775ee7SAntonio Huete Jimenez                            GET_U_1(obj_tptr),
1444*ed775ee7SAntonio Huete Jimenez                            (GET_U_1(obj_tptr + 1)&0x80) ? "" : "not ",
1445*ed775ee7SAntonio Huete Jimenez                            intserv_serv_tlen);
144641c99275SPeter Avalos 
144741c99275SPeter Avalos                     obj_tptr+=4; /* get to the start of the parameter list */
144841c99275SPeter Avalos                     obj_tlen-=4;
144941c99275SPeter Avalos 
145041c99275SPeter Avalos                     while (intserv_serv_tlen>=4) {
1451411677aeSAaron LI                         processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
145241c99275SPeter Avalos                         if (processed == 0)
145341c99275SPeter Avalos                             break;
145441c99275SPeter Avalos                         obj_tlen-=processed;
145541c99275SPeter Avalos                         intserv_serv_tlen-=processed;
145641c99275SPeter Avalos                         obj_tptr+=processed;
145741c99275SPeter Avalos                     }
145841c99275SPeter Avalos                 }
145941c99275SPeter Avalos                 break;
146041c99275SPeter Avalos             default:
146141c99275SPeter Avalos                 hexdump=TRUE;
146241c99275SPeter Avalos             }
146341c99275SPeter Avalos             break;
146441c99275SPeter Avalos 
146541c99275SPeter Avalos         case RSVP_OBJ_FILTERSPEC:
146641c99275SPeter Avalos             switch(rsvp_obj_ctype) {
146741c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
146841c99275SPeter Avalos                 if (obj_tlen < 8)
1469*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1470*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1471*ed775ee7SAntonio Huete Jimenez                        indent,
1472*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1473*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6));
147441c99275SPeter Avalos                 obj_tlen-=8;
147541c99275SPeter Avalos                 obj_tptr+=8;
147641c99275SPeter Avalos                 break;
147741c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
147841c99275SPeter Avalos                 if (obj_tlen < 20)
1479*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1480*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1481*ed775ee7SAntonio Huete Jimenez                        indent,
1482*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
1483*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18));
148441c99275SPeter Avalos                 obj_tlen-=20;
148541c99275SPeter Avalos                 obj_tptr+=20;
148641c99275SPeter Avalos                 break;
148741c99275SPeter Avalos             case RSVP_CTYPE_3:
148841c99275SPeter Avalos                 if (obj_tlen < 20)
1489*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1490*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, Flow Label: %u",
1491*ed775ee7SAntonio Huete Jimenez                        indent,
1492*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
1493*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_3(obj_tptr + 17));
149441c99275SPeter Avalos                 obj_tlen-=20;
149541c99275SPeter Avalos                 obj_tptr+=20;
149641c99275SPeter Avalos                 break;
149741c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV6:
149841c99275SPeter Avalos                 if (obj_tlen < 20)
1499*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1500*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1501*ed775ee7SAntonio Huete Jimenez                        indent,
1502*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1503*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18));
150441c99275SPeter Avalos                 obj_tlen-=20;
150541c99275SPeter Avalos                 obj_tptr+=20;
150641c99275SPeter Avalos                 break;
150727bfbee1SPeter Avalos             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
150827bfbee1SPeter Avalos                 if (obj_tlen < 40)
1509*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1510*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
151127bfbee1SPeter Avalos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1512*ed775ee7SAntonio Huete Jimenez                        indent,
1513*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
1514*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 18),
1515*ed775ee7SAntonio Huete Jimenez                        indent,
1516*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr+20),
1517*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 38));
151827bfbee1SPeter Avalos                 obj_tlen-=40;
151927bfbee1SPeter Avalos                 obj_tptr+=40;
152027bfbee1SPeter Avalos                 break;
152141c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4:
152241c99275SPeter Avalos                 if (obj_tlen < 8)
1523*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1524*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1525*ed775ee7SAntonio Huete Jimenez                        indent,
1526*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1527*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6));
152841c99275SPeter Avalos                 obj_tlen-=8;
152941c99275SPeter Avalos                 obj_tptr+=8;
153041c99275SPeter Avalos                 break;
153127bfbee1SPeter Avalos             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
153227bfbee1SPeter Avalos                 if (obj_tlen < 16)
1533*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1534*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
153527bfbee1SPeter Avalos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1536*ed775ee7SAntonio Huete Jimenez                        indent,
1537*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1538*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 6),
1539*ed775ee7SAntonio Huete Jimenez                        indent,
1540*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr+8),
1541*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr + 12));
154227bfbee1SPeter Avalos                 obj_tlen-=16;
154327bfbee1SPeter Avalos                 obj_tptr+=16;
154427bfbee1SPeter Avalos                 break;
154541c99275SPeter Avalos             default:
154641c99275SPeter Avalos                 hexdump=TRUE;
154741c99275SPeter Avalos             }
154841c99275SPeter Avalos             break;
154941c99275SPeter Avalos 
155041c99275SPeter Avalos         case RSVP_OBJ_FASTREROUTE:
155141c99275SPeter Avalos             /* the differences between c-type 1 and 7 are minor */
155241c99275SPeter Avalos             obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
155341c99275SPeter Avalos 
155441c99275SPeter Avalos             switch(rsvp_obj_ctype) {
155541c99275SPeter Avalos             case RSVP_CTYPE_1: /* new style */
155641c99275SPeter Avalos                 if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
1557*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1558*ed775ee7SAntonio Huete Jimenez                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1559*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1560*ed775ee7SAntonio Huete Jimenez                        indent,
1561*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->setup_prio,
1562*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->hold_prio,
1563*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->hop_limit,
1564*ed775ee7SAntonio Huete Jimenez                        bw.f * 8 / 1000000);
1565*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
1566*ed775ee7SAntonio Huete Jimenez                        indent,
1567*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1568*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any),
1569*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all));
157041c99275SPeter Avalos                 obj_tlen-=sizeof(struct rsvp_obj_frr_t);
157141c99275SPeter Avalos                 obj_tptr+=sizeof(struct rsvp_obj_frr_t);
157241c99275SPeter Avalos                 break;
157341c99275SPeter Avalos 
157441c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
157541c99275SPeter Avalos                 if (obj_tlen < 16)
1576*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1577*ed775ee7SAntonio Huete Jimenez                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1578*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1579*ed775ee7SAntonio Huete Jimenez                        indent,
1580*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->setup_prio,
1581*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->hold_prio,
1582*ed775ee7SAntonio Huete Jimenez                        obj_ptr.rsvp_obj_frr->hop_limit,
1583*ed775ee7SAntonio Huete Jimenez                        bw.f * 8 / 1000000);
1584*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Include Colors: 0x%08x, Exclude Colors: 0x%08x",
1585*ed775ee7SAntonio Huete Jimenez                        indent,
1586*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1587*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any));
158841c99275SPeter Avalos                 obj_tlen-=16;
158941c99275SPeter Avalos                 obj_tptr+=16;
159041c99275SPeter Avalos                 break;
159141c99275SPeter Avalos 
159241c99275SPeter Avalos             default:
159341c99275SPeter Avalos                 hexdump=TRUE;
159441c99275SPeter Avalos             }
159541c99275SPeter Avalos             break;
159641c99275SPeter Avalos 
159741c99275SPeter Avalos         case RSVP_OBJ_DETOUR:
159841c99275SPeter Avalos             switch(rsvp_obj_ctype) {
159941c99275SPeter Avalos             case RSVP_CTYPE_TUNNEL_IPV4:
160041c99275SPeter Avalos                 while(obj_tlen >= 8) {
1601*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s  PLR-ID: %s, Avoid-Node-ID: %s",
1602*ed775ee7SAntonio Huete Jimenez                            indent,
1603*ed775ee7SAntonio Huete Jimenez                            GET_IPADDR_STRING(obj_tptr),
1604*ed775ee7SAntonio Huete Jimenez                            GET_IPADDR_STRING(obj_tptr + 4));
160541c99275SPeter Avalos                     obj_tlen-=8;
160641c99275SPeter Avalos                     obj_tptr+=8;
160741c99275SPeter Avalos                 }
160841c99275SPeter Avalos                 break;
160941c99275SPeter Avalos             default:
161041c99275SPeter Avalos                 hexdump=TRUE;
161141c99275SPeter Avalos             }
161241c99275SPeter Avalos             break;
161341c99275SPeter Avalos 
161441c99275SPeter Avalos         case RSVP_OBJ_CLASSTYPE:
161541c99275SPeter Avalos         case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
161641c99275SPeter Avalos             switch(rsvp_obj_ctype) {
161741c99275SPeter Avalos             case RSVP_CTYPE_1:
1618*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < 4)
1619*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1620*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  CT: %u",
1621*ed775ee7SAntonio Huete Jimenez                        indent,
1622*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_tptr) & 0x7);
162341c99275SPeter Avalos                 obj_tlen-=4;
162441c99275SPeter Avalos                 obj_tptr+=4;
162541c99275SPeter Avalos                 break;
162641c99275SPeter Avalos             default:
162741c99275SPeter Avalos                 hexdump=TRUE;
162841c99275SPeter Avalos             }
162941c99275SPeter Avalos             break;
163041c99275SPeter Avalos 
163141c99275SPeter Avalos         case RSVP_OBJ_ERROR_SPEC:
163241c99275SPeter Avalos             switch(rsvp_obj_ctype) {
163341c99275SPeter Avalos             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
163441c99275SPeter Avalos             case RSVP_CTYPE_IPV4:
163541c99275SPeter Avalos                 if (obj_tlen < 8)
1636*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1637*ed775ee7SAntonio Huete Jimenez                 error_code=GET_U_1(obj_tptr + 5);
1638*ed775ee7SAntonio Huete Jimenez                 error_value=GET_BE_U_2(obj_tptr + 6);
1639*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1640*ed775ee7SAntonio Huete Jimenez                        indent,
1641*ed775ee7SAntonio Huete Jimenez                        GET_IPADDR_STRING(obj_tptr),
1642*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + 4),
1643*ed775ee7SAntonio Huete Jimenez                        indent,
164441c99275SPeter Avalos                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1645*ed775ee7SAntonio Huete Jimenez                        error_code);
164641c99275SPeter Avalos                 switch (error_code) {
164741c99275SPeter Avalos                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1648*ed775ee7SAntonio Huete Jimenez                     ND_PRINT(", Error Value: %s (%u)",
164941c99275SPeter Avalos                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1650*ed775ee7SAntonio Huete Jimenez                            error_value);
165141c99275SPeter Avalos                     break;
165241c99275SPeter Avalos                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
165341c99275SPeter Avalos                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
1654*ed775ee7SAntonio Huete Jimenez                     ND_PRINT(", Error Value: %s (%u)",
165541c99275SPeter Avalos                            tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
1656*ed775ee7SAntonio Huete Jimenez                            error_value);
165741c99275SPeter Avalos                     break;
165841c99275SPeter Avalos                 default:
1659*ed775ee7SAntonio Huete Jimenez                     ND_PRINT(", Unknown Error Value (%u)", error_value);
166041c99275SPeter Avalos                     break;
166141c99275SPeter Avalos                 }
166241c99275SPeter Avalos                 obj_tlen-=8;
166341c99275SPeter Avalos                 obj_tptr+=8;
166441c99275SPeter Avalos                 break;
166541c99275SPeter Avalos             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
166641c99275SPeter Avalos             case RSVP_CTYPE_IPV6:
166741c99275SPeter Avalos                 if (obj_tlen < 20)
1668*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1669*ed775ee7SAntonio Huete Jimenez                 error_code=GET_U_1(obj_tptr + 17);
1670*ed775ee7SAntonio Huete Jimenez                 error_value=GET_BE_U_2(obj_tptr + 18);
1671*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1672*ed775ee7SAntonio Huete Jimenez                        indent,
1673*ed775ee7SAntonio Huete Jimenez                        GET_IP6ADDR_STRING(obj_tptr),
1674*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr + 16),
1675*ed775ee7SAntonio Huete Jimenez                        indent,
167641c99275SPeter Avalos                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1677*ed775ee7SAntonio Huete Jimenez                        error_code);
167841c99275SPeter Avalos 
167941c99275SPeter Avalos                 switch (error_code) {
168041c99275SPeter Avalos                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1681*ed775ee7SAntonio Huete Jimenez                     ND_PRINT(", Error Value: %s (%u)",
168241c99275SPeter Avalos                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1683*ed775ee7SAntonio Huete Jimenez 			   error_value);
168441c99275SPeter Avalos                     break;
168541c99275SPeter Avalos                 default:
168641c99275SPeter Avalos                     break;
168741c99275SPeter Avalos                 }
168841c99275SPeter Avalos                 obj_tlen-=20;
168941c99275SPeter Avalos                 obj_tptr+=20;
169041c99275SPeter Avalos                 break;
169141c99275SPeter Avalos             default:
169241c99275SPeter Avalos                 hexdump=TRUE;
169341c99275SPeter Avalos             }
169441c99275SPeter Avalos             break;
169541c99275SPeter Avalos 
169641c99275SPeter Avalos         case RSVP_OBJ_PROPERTIES:
169741c99275SPeter Avalos             switch(rsvp_obj_ctype) {
169841c99275SPeter Avalos             case RSVP_CTYPE_1:
169941c99275SPeter Avalos                 if (obj_tlen < 4)
1700*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1701*ed775ee7SAntonio Huete Jimenez                 padbytes = GET_BE_U_2(obj_tptr + 2);
1702*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  TLV count: %u, padding bytes: %u",
1703*ed775ee7SAntonio Huete Jimenez                        indent,
1704*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_tptr),
1705*ed775ee7SAntonio Huete Jimenez                        padbytes);
170641c99275SPeter Avalos                 obj_tlen-=4;
170741c99275SPeter Avalos                 obj_tptr+=4;
170841c99275SPeter Avalos                 /* loop through as long there is anything longer than the TLV header (2) */
170941c99275SPeter Avalos                 while(obj_tlen >= 2 + padbytes) {
1710*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s    %s TLV (0x%02x), length: %u", /* length includes header */
1711*ed775ee7SAntonio Huete Jimenez                            indent,
1712*ed775ee7SAntonio Huete Jimenez                            tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)),
1713*ed775ee7SAntonio Huete Jimenez                            GET_U_1(obj_tptr),
1714*ed775ee7SAntonio Huete Jimenez                            GET_U_1(obj_tptr + 1));
1715*ed775ee7SAntonio Huete Jimenez                     if (obj_tlen < GET_U_1(obj_tptr + 1))
1716*ed775ee7SAntonio Huete Jimenez                         goto obj_tooshort;
1717*ed775ee7SAntonio Huete Jimenez                     if (GET_U_1(obj_tptr + 1) < 2) {
1718*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%sERROR: property TLV is too short", indent);
171941c99275SPeter Avalos                         return -1;
1720*ed775ee7SAntonio Huete Jimenez                     }
1721*ed775ee7SAntonio Huete Jimenez                     print_unknown_data(ndo, obj_tptr + 2, "\n\t\t",
1722*ed775ee7SAntonio Huete Jimenez                                        GET_U_1(obj_tptr + 1) - 2);
1723*ed775ee7SAntonio Huete Jimenez                     obj_tlen-=GET_U_1(obj_tptr + 1);
1724*ed775ee7SAntonio Huete Jimenez                     obj_tptr+=GET_U_1(obj_tptr + 1);
172541c99275SPeter Avalos                 }
172641c99275SPeter Avalos                 break;
172741c99275SPeter Avalos             default:
172841c99275SPeter Avalos                 hexdump=TRUE;
172941c99275SPeter Avalos             }
173041c99275SPeter Avalos             break;
173141c99275SPeter Avalos 
173241c99275SPeter Avalos         case RSVP_OBJ_MESSAGE_ID:     /* fall through */
173341c99275SPeter Avalos         case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
173441c99275SPeter Avalos         case RSVP_OBJ_MESSAGE_ID_LIST:
173541c99275SPeter Avalos             switch(rsvp_obj_ctype) {
173641c99275SPeter Avalos             case RSVP_CTYPE_1:
173741c99275SPeter Avalos             case RSVP_CTYPE_2:
1738*ed775ee7SAntonio Huete Jimenez                 if (obj_tlen < 4)
1739*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1740*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Flags [0x%02x], epoch: %u",
1741*ed775ee7SAntonio Huete Jimenez                        indent,
1742*ed775ee7SAntonio Huete Jimenez                        GET_U_1(obj_tptr),
1743*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_3(obj_tptr + 1));
174441c99275SPeter Avalos                 obj_tlen-=4;
174541c99275SPeter Avalos                 obj_tptr+=4;
174641c99275SPeter Avalos                 /* loop through as long there are no messages left */
174741c99275SPeter Avalos                 while(obj_tlen >= 4) {
1748*ed775ee7SAntonio Huete Jimenez                     ND_PRINT("%s    Message-ID 0x%08x (%u)",
1749*ed775ee7SAntonio Huete Jimenez                            indent,
1750*ed775ee7SAntonio Huete Jimenez                            GET_BE_U_4(obj_tptr),
1751*ed775ee7SAntonio Huete Jimenez                            GET_BE_U_4(obj_tptr));
175241c99275SPeter Avalos                     obj_tlen-=4;
175341c99275SPeter Avalos                     obj_tptr+=4;
175441c99275SPeter Avalos                 }
175541c99275SPeter Avalos                 break;
175641c99275SPeter Avalos             default:
175741c99275SPeter Avalos                 hexdump=TRUE;
175841c99275SPeter Avalos             }
175941c99275SPeter Avalos             break;
176041c99275SPeter Avalos 
176141c99275SPeter Avalos         case RSVP_OBJ_INTEGRITY:
176241c99275SPeter Avalos             switch(rsvp_obj_ctype) {
176341c99275SPeter Avalos             case RSVP_CTYPE_1:
176441c99275SPeter Avalos                 if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
1765*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
176641c99275SPeter Avalos                 obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
1767*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
1768*ed775ee7SAntonio Huete Jimenez                        indent,
1769*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id),
1770*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2),
1771*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence),
1772*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4),
177341c99275SPeter Avalos                        bittok2str(rsvp_obj_integrity_flag_values,
177441c99275SPeter Avalos                                   "none",
1775*ed775ee7SAntonio Huete Jimenez                                   obj_ptr.rsvp_obj_integrity->flags));
1776*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  MD5-sum 0x%08x%08x%08x%08x ",
1777*ed775ee7SAntonio Huete Jimenez                        indent,
1778*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest),
1779*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4),
1780*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8),
1781*ed775ee7SAntonio Huete Jimenez                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12));
178227bfbee1SPeter Avalos 
1783411677aeSAaron LI                 sigcheck = signature_verify(ndo, pptr, plen,
1784411677aeSAaron LI                                             obj_ptr.rsvp_obj_integrity->digest,
1785411677aeSAaron LI                                             rsvp_clear_checksum,
1786411677aeSAaron LI                                             rsvp_com_header);
1787*ed775ee7SAntonio Huete Jimenez                 ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
178827bfbee1SPeter Avalos 
178941c99275SPeter Avalos                 obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
179041c99275SPeter Avalos                 obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
179141c99275SPeter Avalos                 break;
179241c99275SPeter Avalos             default:
179341c99275SPeter Avalos                 hexdump=TRUE;
179441c99275SPeter Avalos             }
179541c99275SPeter Avalos             break;
179641c99275SPeter Avalos 
179741c99275SPeter Avalos         case RSVP_OBJ_ADMIN_STATUS:
179841c99275SPeter Avalos             switch(rsvp_obj_ctype) {
179941c99275SPeter Avalos             case RSVP_CTYPE_1:
180041c99275SPeter Avalos                 if (obj_tlen < 4)
1801*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1802*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Flags [%s]", indent,
180341c99275SPeter Avalos                        bittok2str(rsvp_obj_admin_status_flag_values, "none",
1804*ed775ee7SAntonio Huete Jimenez                                   GET_BE_U_4(obj_tptr)));
180541c99275SPeter Avalos                 obj_tlen-=4;
180641c99275SPeter Avalos                 obj_tptr+=4;
180741c99275SPeter Avalos                 break;
180841c99275SPeter Avalos             default:
180941c99275SPeter Avalos                 hexdump=TRUE;
181041c99275SPeter Avalos             }
181141c99275SPeter Avalos             break;
181241c99275SPeter Avalos 
181341c99275SPeter Avalos         case RSVP_OBJ_LABEL_SET:
181441c99275SPeter Avalos             switch(rsvp_obj_ctype) {
181541c99275SPeter Avalos             case RSVP_CTYPE_1:
181641c99275SPeter Avalos                 if (obj_tlen < 4)
1817*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1818*ed775ee7SAntonio Huete Jimenez                 action = (GET_BE_U_2(obj_tptr)>>8);
181941c99275SPeter Avalos 
1820*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Action: %s (%u), Label type: %u", indent,
182141c99275SPeter Avalos                        tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
1822*ed775ee7SAntonio Huete Jimenez                        action, (GET_BE_U_4(obj_tptr) & 0x7F));
182341c99275SPeter Avalos 
182441c99275SPeter Avalos                 switch (action) {
182541c99275SPeter Avalos                 case LABEL_SET_INCLUSIVE_RANGE:
182641c99275SPeter Avalos                 case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
182741c99275SPeter Avalos 
182841c99275SPeter Avalos 		    /* only a couple of subchannels are expected */
182941c99275SPeter Avalos 		    if (obj_tlen < 12)
1830*ed775ee7SAntonio Huete Jimenez 			goto obj_tooshort;
1831*ed775ee7SAntonio Huete Jimenez 		    ND_PRINT("%s  Start range: %u, End range: %u", indent,
1832*ed775ee7SAntonio Huete Jimenez                            GET_BE_U_4(obj_tptr + 4),
1833*ed775ee7SAntonio Huete Jimenez                            GET_BE_U_4(obj_tptr + 8));
183441c99275SPeter Avalos 		    obj_tlen-=12;
183541c99275SPeter Avalos 		    obj_tptr+=12;
183641c99275SPeter Avalos                     break;
183741c99275SPeter Avalos 
183841c99275SPeter Avalos                 default:
183941c99275SPeter Avalos                     obj_tlen-=4;
184041c99275SPeter Avalos                     obj_tptr+=4;
184141c99275SPeter Avalos                     subchannel = 1;
184241c99275SPeter Avalos                     while(obj_tlen >= 4 ) {
1843*ed775ee7SAntonio Huete Jimenez                         ND_PRINT("%s  Subchannel #%u: %u", indent, subchannel,
1844*ed775ee7SAntonio Huete Jimenez                                GET_BE_U_4(obj_tptr));
184541c99275SPeter Avalos                         obj_tptr+=4;
184641c99275SPeter Avalos                         obj_tlen-=4;
184741c99275SPeter Avalos                         subchannel++;
184841c99275SPeter Avalos                     }
184941c99275SPeter Avalos                     break;
185041c99275SPeter Avalos                 }
185141c99275SPeter Avalos                 break;
185227bfbee1SPeter Avalos             default:
185327bfbee1SPeter Avalos                 hexdump=TRUE;
185427bfbee1SPeter Avalos             }
1855*ed775ee7SAntonio Huete Jimenez             break;
185641c99275SPeter Avalos 
185727bfbee1SPeter Avalos         case RSVP_OBJ_S2L:
185827bfbee1SPeter Avalos             switch (rsvp_obj_ctype) {
185927bfbee1SPeter Avalos             case RSVP_CTYPE_IPV4:
186027bfbee1SPeter Avalos                 if (obj_tlen < 4)
1861*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1862*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Sub-LSP destination address: %s",
1863*ed775ee7SAntonio Huete Jimenez                        indent, GET_IPADDR_STRING(obj_tptr));
186427bfbee1SPeter Avalos 
186527bfbee1SPeter Avalos                 obj_tlen-=4;
186627bfbee1SPeter Avalos                 obj_tptr+=4;
186727bfbee1SPeter Avalos                 break;
186827bfbee1SPeter Avalos             case RSVP_CTYPE_IPV6:
186927bfbee1SPeter Avalos                 if (obj_tlen < 16)
1870*ed775ee7SAntonio Huete Jimenez                     goto obj_tooshort;
1871*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%s  Sub-LSP destination address: %s",
1872*ed775ee7SAntonio Huete Jimenez                        indent, GET_IP6ADDR_STRING(obj_tptr));
187327bfbee1SPeter Avalos 
187427bfbee1SPeter Avalos                 obj_tlen-=16;
187527bfbee1SPeter Avalos                 obj_tptr+=16;
187627bfbee1SPeter Avalos                 break;
187741c99275SPeter Avalos             default:
187841c99275SPeter Avalos                 hexdump=TRUE;
187941c99275SPeter Avalos             }
1880*ed775ee7SAntonio Huete Jimenez             break;
188141c99275SPeter Avalos 
188241c99275SPeter Avalos         /*
188341c99275SPeter Avalos          *  FIXME those are the defined objects that lack a decoder
188441c99275SPeter Avalos          *  you are welcome to contribute code ;-)
188541c99275SPeter Avalos          */
188641c99275SPeter Avalos 
188741c99275SPeter Avalos         case RSVP_OBJ_SCOPE:
188841c99275SPeter Avalos         case RSVP_OBJ_POLICY_DATA:
188941c99275SPeter Avalos         case RSVP_OBJ_ACCEPT_LABEL_SET:
189041c99275SPeter Avalos         case RSVP_OBJ_PROTECTION:
189141c99275SPeter Avalos         default:
1892411677aeSAaron LI             if (ndo->ndo_vflag <= 1)
1893411677aeSAaron LI                 print_unknown_data(ndo, obj_tptr, "\n\t    ", obj_tlen); /* FIXME indentation */
189441c99275SPeter Avalos             break;
189541c99275SPeter Avalos         }
189641c99275SPeter Avalos         /* do we also want to see a hex dump ? */
1897411677aeSAaron LI         if (ndo->ndo_vflag > 1 || hexdump == TRUE)
1898411677aeSAaron LI             print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t    ", /* FIXME indentation */
189941c99275SPeter Avalos                                rsvp_obj_len - sizeof(struct rsvp_object_header));
190041c99275SPeter Avalos 
190141c99275SPeter Avalos         tptr+=rsvp_obj_len;
190241c99275SPeter Avalos         tlen-=rsvp_obj_len;
190341c99275SPeter Avalos     }
190441c99275SPeter Avalos     return 0;
1905*ed775ee7SAntonio Huete Jimenez subobj_tooshort:
1906*ed775ee7SAntonio Huete Jimenez     ND_PRINT("%sERROR: sub-object is too short", indent);
1907*ed775ee7SAntonio Huete Jimenez     return -1;
1908*ed775ee7SAntonio Huete Jimenez obj_tooshort:
1909*ed775ee7SAntonio Huete Jimenez     ND_PRINT("%sERROR: object is too short", indent);
1910*ed775ee7SAntonio Huete Jimenez     return -1;
1911411677aeSAaron LI invalid:
1912*ed775ee7SAntonio Huete Jimenez     nd_print_invalid(ndo);
1913411677aeSAaron LI     return -1;
191441c99275SPeter Avalos trunc:
1915*ed775ee7SAntonio Huete Jimenez     nd_print_trunc(ndo);
191641c99275SPeter Avalos     return -1;
191741c99275SPeter Avalos }
191841c99275SPeter Avalos 
191941c99275SPeter Avalos void
rsvp_print(netdissect_options * ndo,const u_char * pptr,u_int len)1920411677aeSAaron LI rsvp_print(netdissect_options *ndo,
1921*ed775ee7SAntonio Huete Jimenez            const u_char *pptr, u_int len)
1922411677aeSAaron LI {
1923411677aeSAaron LI     const struct rsvp_common_header *rsvp_com_header;
1924*ed775ee7SAntonio Huete Jimenez     uint8_t version_flags, msg_type;
1925411677aeSAaron LI     const u_char *tptr;
1926411677aeSAaron LI     u_short plen, tlen;
192741c99275SPeter Avalos 
1928*ed775ee7SAntonio Huete Jimenez     ndo->ndo_protocol = "rsvp";
192941c99275SPeter Avalos     tptr=pptr;
193041c99275SPeter Avalos 
1931411677aeSAaron LI     rsvp_com_header = (const struct rsvp_common_header *)pptr;
1932*ed775ee7SAntonio Huete Jimenez     ND_TCHECK_SIZE(rsvp_com_header);
1933*ed775ee7SAntonio Huete Jimenez     version_flags = GET_U_1(rsvp_com_header->version_flags);
193441c99275SPeter Avalos 
193541c99275SPeter Avalos     /*
193641c99275SPeter Avalos      * Sanity checking of the header.
193741c99275SPeter Avalos      */
1938*ed775ee7SAntonio Huete Jimenez     if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1939*ed775ee7SAntonio Huete Jimenez 	ND_PRINT("ERROR: RSVP version %u packet not supported",
1940*ed775ee7SAntonio Huete Jimenez                RSVP_EXTRACT_VERSION(version_flags));
194141c99275SPeter Avalos 	return;
194241c99275SPeter Avalos     }
194341c99275SPeter Avalos 
1944*ed775ee7SAntonio Huete Jimenez     msg_type = GET_U_1(rsvp_com_header->msg_type);
1945*ed775ee7SAntonio Huete Jimenez 
194641c99275SPeter Avalos     /* in non-verbose mode just lets print the basic Message Type*/
1947411677aeSAaron LI     if (ndo->ndo_vflag < 1) {
1948*ed775ee7SAntonio Huete Jimenez         ND_PRINT("RSVPv%u %s Message, length: %u",
1949*ed775ee7SAntonio Huete Jimenez                RSVP_EXTRACT_VERSION(version_flags),
1950*ed775ee7SAntonio Huete Jimenez                tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type),
1951*ed775ee7SAntonio Huete Jimenez                len);
195241c99275SPeter Avalos         return;
195341c99275SPeter Avalos     }
195441c99275SPeter Avalos 
195541c99275SPeter Avalos     /* ok they seem to want to know everything - lets fully decode it */
195641c99275SPeter Avalos 
1957*ed775ee7SAntonio Huete Jimenez     plen = tlen = GET_BE_U_2(rsvp_com_header->length);
195841c99275SPeter Avalos 
1959*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
1960*ed775ee7SAntonio Huete Jimenez            RSVP_EXTRACT_VERSION(version_flags),
1961*ed775ee7SAntonio Huete Jimenez            tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
1962*ed775ee7SAntonio Huete Jimenez            msg_type,
1963*ed775ee7SAntonio Huete Jimenez            bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
196441c99275SPeter Avalos            tlen,
1965*ed775ee7SAntonio Huete Jimenez            GET_U_1(rsvp_com_header->ttl),
1966*ed775ee7SAntonio Huete Jimenez            GET_BE_U_2(rsvp_com_header->checksum));
196727bfbee1SPeter Avalos 
1968*ed775ee7SAntonio Huete Jimenez     if (tlen < sizeof(struct rsvp_common_header)) {
1969*ed775ee7SAntonio Huete Jimenez         ND_PRINT("ERROR: common header too short %u < %zu", tlen,
1970*ed775ee7SAntonio Huete Jimenez                sizeof(struct rsvp_common_header));
197141c99275SPeter Avalos         return;
197241c99275SPeter Avalos     }
197341c99275SPeter Avalos 
1974*ed775ee7SAntonio Huete Jimenez     tptr+=sizeof(struct rsvp_common_header);
1975*ed775ee7SAntonio Huete Jimenez     tlen-=sizeof(struct rsvp_common_header);
197641c99275SPeter Avalos 
1977*ed775ee7SAntonio Huete Jimenez     switch(msg_type) {
197841c99275SPeter Avalos 
1979411677aeSAaron LI     case RSVP_MSGTYPE_BUNDLE:
1980411677aeSAaron LI         /*
1981411677aeSAaron LI          * Process each submessage in the bundle message.
1982411677aeSAaron LI          * Bundle messages may not contain bundle submessages, so we don't
1983411677aeSAaron LI          * need to handle bundle submessages specially.
1984411677aeSAaron LI          */
198541c99275SPeter Avalos         while(tlen > 0) {
1986411677aeSAaron LI             const u_char *subpptr=tptr, *subtptr;
1987411677aeSAaron LI             u_short subplen, subtlen;
1988411677aeSAaron LI 
1989411677aeSAaron LI             subtptr=subpptr;
1990411677aeSAaron LI 
1991411677aeSAaron LI             rsvp_com_header = (const struct rsvp_common_header *)subpptr;
1992*ed775ee7SAntonio Huete Jimenez             ND_TCHECK_SIZE(rsvp_com_header);
1993*ed775ee7SAntonio Huete Jimenez             version_flags = GET_U_1(rsvp_com_header->version_flags);
199441c99275SPeter Avalos 
199541c99275SPeter Avalos             /*
199641c99275SPeter Avalos              * Sanity checking of the header.
199741c99275SPeter Avalos              */
1998*ed775ee7SAntonio Huete Jimenez             if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1999*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("ERROR: RSVP version %u packet not supported",
2000*ed775ee7SAntonio Huete Jimenez                        RSVP_EXTRACT_VERSION(version_flags));
200141c99275SPeter Avalos                 return;
200241c99275SPeter Avalos             }
200341c99275SPeter Avalos 
2004*ed775ee7SAntonio Huete Jimenez             subplen = subtlen = GET_BE_U_2(rsvp_com_header->length);
2005411677aeSAaron LI 
2006*ed775ee7SAntonio Huete Jimenez             msg_type = GET_U_1(rsvp_com_header->msg_type);
2007*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t  RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
2008*ed775ee7SAntonio Huete Jimenez                    RSVP_EXTRACT_VERSION(version_flags),
2009*ed775ee7SAntonio Huete Jimenez                    tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
2010*ed775ee7SAntonio Huete Jimenez                    msg_type,
2011*ed775ee7SAntonio Huete Jimenez                    bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
201241c99275SPeter Avalos                    subtlen,
2013*ed775ee7SAntonio Huete Jimenez                    GET_U_1(rsvp_com_header->ttl),
2014*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(rsvp_com_header->checksum));
201527bfbee1SPeter Avalos 
2016*ed775ee7SAntonio Huete Jimenez             if (subtlen < sizeof(struct rsvp_common_header)) {
2017*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("ERROR: common header too short %u < %zu", subtlen,
2018*ed775ee7SAntonio Huete Jimenez                        sizeof(struct rsvp_common_header));
201941c99275SPeter Avalos                 return;
202041c99275SPeter Avalos             }
202141c99275SPeter Avalos 
202241c99275SPeter Avalos             if (tlen < subtlen) {
2023*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("ERROR: common header too large %u > %u", subtlen,
2024*ed775ee7SAntonio Huete Jimenez                        tlen);
202541c99275SPeter Avalos                 return;
202641c99275SPeter Avalos             }
202741c99275SPeter Avalos 
2028*ed775ee7SAntonio Huete Jimenez             subtptr+=sizeof(struct rsvp_common_header);
2029*ed775ee7SAntonio Huete Jimenez             subtlen-=sizeof(struct rsvp_common_header);
203041c99275SPeter Avalos 
2031411677aeSAaron LI             /*
2032411677aeSAaron LI              * Print all objects in the submessage.
2033411677aeSAaron LI              */
2034411677aeSAaron LI             if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t    ", subtlen, rsvp_com_header) == -1)
203541c99275SPeter Avalos                 return;
203641c99275SPeter Avalos 
2037*ed775ee7SAntonio Huete Jimenez             tptr+=subtlen+sizeof(struct rsvp_common_header);
2038*ed775ee7SAntonio Huete Jimenez             tlen-=subtlen+sizeof(struct rsvp_common_header);
203941c99275SPeter Avalos         }
204041c99275SPeter Avalos 
204141c99275SPeter Avalos         break;
204241c99275SPeter Avalos 
204341c99275SPeter Avalos     case RSVP_MSGTYPE_PATH:
204441c99275SPeter Avalos     case RSVP_MSGTYPE_RESV:
204541c99275SPeter Avalos     case RSVP_MSGTYPE_PATHERR:
204641c99275SPeter Avalos     case RSVP_MSGTYPE_RESVERR:
204741c99275SPeter Avalos     case RSVP_MSGTYPE_PATHTEAR:
204841c99275SPeter Avalos     case RSVP_MSGTYPE_RESVTEAR:
204941c99275SPeter Avalos     case RSVP_MSGTYPE_RESVCONF:
205041c99275SPeter Avalos     case RSVP_MSGTYPE_HELLO_OLD:
205141c99275SPeter Avalos     case RSVP_MSGTYPE_HELLO:
205241c99275SPeter Avalos     case RSVP_MSGTYPE_ACK:
205341c99275SPeter Avalos     case RSVP_MSGTYPE_SREFRESH:
2054411677aeSAaron LI         /*
2055411677aeSAaron LI          * Print all objects in the message.
2056411677aeSAaron LI          */
2057411677aeSAaron LI         if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t  ", tlen, rsvp_com_header) == -1)
205841c99275SPeter Avalos             return;
205941c99275SPeter Avalos         break;
206041c99275SPeter Avalos 
206141c99275SPeter Avalos     default:
2062411677aeSAaron LI         print_unknown_data(ndo, tptr, "\n\t    ", tlen);
206341c99275SPeter Avalos         break;
206441c99275SPeter Avalos     }
206541c99275SPeter Avalos 
206641c99275SPeter Avalos     return;
206741c99275SPeter Avalos trunc:
2068*ed775ee7SAntonio Huete Jimenez     nd_print_trunc(ndo);
206941c99275SPeter Avalos }
2070