xref: /netbsd-src/external/bsd/tcpdump/dist/print-rsvp.c (revision 26ba0b503b498a5194a71ac319838b7f5497f3fe)
10f74e101Schristos /*
20f74e101Schristos  * Copyright (c) 1998-2007 The TCPDUMP project
30f74e101Schristos  *
40f74e101Schristos  * Redistribution and use in source and binary forms, with or without
50f74e101Schristos  * modification, are permitted provided that: (1) source code
60f74e101Schristos  * distributions retain the above copyright notice and this paragraph
70f74e101Schristos  * in its entirety, and (2) distributions including binary code include
80f74e101Schristos  * the above copyright notice and this paragraph in its entirety in
90f74e101Schristos  * the documentation or other materials provided with the distribution.
100f74e101Schristos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
110f74e101Schristos  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
120f74e101Schristos  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
130f74e101Schristos  * FOR A PARTICULAR PURPOSE.
140f74e101Schristos  *
1572c96ff3Schristos  * Original code by Hannes Gredler (hannes@gredler.at)
160f74e101Schristos  */
170f74e101Schristos 
1811b3aaa1Schristos #include <sys/cdefs.h>
190f74e101Schristos #ifndef lint
20*26ba0b50Schristos __RCSID("$NetBSD: print-rsvp.c,v 1.13 2024/09/02 16:15:32 christos Exp $");
210f74e101Schristos #endif
220f74e101Schristos 
23dc860a36Sspz /* \summary: Resource ReSerVation Protocol (RSVP) printer */
24dc860a36Sspz 
25c74ad251Schristos /* specification: RFC 2205 */
26c74ad251Schristos 
27c74ad251Schristos #include <config.h>
280f74e101Schristos 
29c74ad251Schristos #include "netdissect-stdinc.h"
300f74e101Schristos 
31fdccd7e4Schristos #include "netdissect.h"
320f74e101Schristos #include "extract.h"
330f74e101Schristos #include "addrtoname.h"
340f74e101Schristos #include "ethertype.h"
350f74e101Schristos #include "gmpls.h"
360f74e101Schristos #include "af.h"
370f74e101Schristos #include "signature.h"
380f74e101Schristos 
39fdccd7e4Schristos 
400f74e101Schristos /*
410f74e101Schristos  * RFC 2205 common header
420f74e101Schristos  *
430f74e101Schristos  *               0             1              2             3
440f74e101Schristos  *        +-------------+-------------+-------------+-------------+
450f74e101Schristos  *        | Vers | Flags|  Msg Type   |       RSVP Checksum       |
460f74e101Schristos  *        +-------------+-------------+-------------+-------------+
470f74e101Schristos  *        |  Send_TTL   | (Reserved)  |        RSVP Length        |
480f74e101Schristos  *        +-------------+-------------+-------------+-------------+
490f74e101Schristos  *
500f74e101Schristos  */
510f74e101Schristos 
520f74e101Schristos struct rsvp_common_header {
53c74ad251Schristos     nd_uint8_t  version_flags;
54c74ad251Schristos     nd_uint8_t  msg_type;
55c74ad251Schristos     nd_uint16_t checksum;
56c74ad251Schristos     nd_uint8_t  ttl;
57c74ad251Schristos     nd_byte     reserved[1];
58c74ad251Schristos     nd_uint16_t length;
590f74e101Schristos };
600f74e101Schristos 
610f74e101Schristos /*
620f74e101Schristos  * RFC2205 object header
630f74e101Schristos  *
640f74e101Schristos  *
650f74e101Schristos  *               0             1              2             3
660f74e101Schristos  *        +-------------+-------------+-------------+-------------+
670f74e101Schristos  *        |       Length (bytes)      |  Class-Num  |   C-Type    |
680f74e101Schristos  *        +-------------+-------------+-------------+-------------+
690f74e101Schristos  *        |                                                       |
700f74e101Schristos  *        //                  (Object contents)                   //
710f74e101Schristos  *        |                                                       |
720f74e101Schristos  *        +-------------+-------------+-------------+-------------+
730f74e101Schristos  */
740f74e101Schristos 
750f74e101Schristos struct rsvp_object_header {
76c74ad251Schristos     nd_uint16_t length;
77c74ad251Schristos     nd_uint8_t  class_num;
78c74ad251Schristos     nd_uint8_t  ctype;
790f74e101Schristos };
800f74e101Schristos 
810f74e101Schristos #define RSVP_VERSION            1
820f74e101Schristos #define	RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
830f74e101Schristos #define	RSVP_EXTRACT_FLAGS(x)   ((x)&0x0f)
840f74e101Schristos 
850f74e101Schristos #define	RSVP_MSGTYPE_PATH       1
860f74e101Schristos #define	RSVP_MSGTYPE_RESV       2
870f74e101Schristos #define	RSVP_MSGTYPE_PATHERR    3
880f74e101Schristos #define	RSVP_MSGTYPE_RESVERR    4
890f74e101Schristos #define	RSVP_MSGTYPE_PATHTEAR   5
900f74e101Schristos #define	RSVP_MSGTYPE_RESVTEAR   6
910f74e101Schristos #define	RSVP_MSGTYPE_RESVCONF   7
92fdccd7e4Schristos #define RSVP_MSGTYPE_BUNDLE     12
930f74e101Schristos #define RSVP_MSGTYPE_ACK        13
940f74e101Schristos #define RSVP_MSGTYPE_HELLO_OLD  14      /* ancient Hellos */
950f74e101Schristos #define RSVP_MSGTYPE_SREFRESH   15
960f74e101Schristos #define	RSVP_MSGTYPE_HELLO      20
970f74e101Schristos 
980f74e101Schristos static const struct tok rsvp_msg_type_values[] = {
990f74e101Schristos     { RSVP_MSGTYPE_PATH,	"Path" },
1000f74e101Schristos     { RSVP_MSGTYPE_RESV,	"Resv" },
1010f74e101Schristos     { RSVP_MSGTYPE_PATHERR,	"PathErr" },
1020f74e101Schristos     { RSVP_MSGTYPE_RESVERR,	"ResvErr" },
1030f74e101Schristos     { RSVP_MSGTYPE_PATHTEAR,	"PathTear" },
1040f74e101Schristos     { RSVP_MSGTYPE_RESVTEAR,	"ResvTear" },
1050f74e101Schristos     { RSVP_MSGTYPE_RESVCONF,	"ResvConf" },
106fdccd7e4Schristos     { RSVP_MSGTYPE_BUNDLE,	"Bundle" },
1070f74e101Schristos     { RSVP_MSGTYPE_ACK,	        "Acknowledgement" },
1080f74e101Schristos     { RSVP_MSGTYPE_HELLO_OLD,	"Hello (Old)" },
1090f74e101Schristos     { RSVP_MSGTYPE_SREFRESH,	"Refresh" },
1100f74e101Schristos     { RSVP_MSGTYPE_HELLO,	"Hello" },
1110f74e101Schristos     { 0, NULL}
1120f74e101Schristos };
1130f74e101Schristos 
1140f74e101Schristos static const struct tok rsvp_header_flag_values[] = {
1150f74e101Schristos     { 0x01,	              "Refresh reduction capable" }, /* rfc2961 */
1160f74e101Schristos     { 0, NULL}
1170f74e101Schristos };
1180f74e101Schristos 
119c74ad251Schristos static const struct tok rsvp_obj_capability_flag_values[] = {
120c74ad251Schristos     { 0x0004,                "RecoveryPath Transmit Enabled" },
121c74ad251Schristos     { 0x0002,                "RecoveryPath Desired" },
122c74ad251Schristos     { 0x0001,                "RecoveryPath Srefresh Capable" },
123c74ad251Schristos     { 0, NULL}
124c74ad251Schristos };
125c74ad251Schristos 
1260f74e101Schristos #define	RSVP_OBJ_SESSION            1   /* rfc2205 */
1270f74e101Schristos #define	RSVP_OBJ_RSVP_HOP           3   /* rfc2205, rfc3473 */
1280f74e101Schristos #define	RSVP_OBJ_INTEGRITY          4   /* rfc2747 */
1290f74e101Schristos #define	RSVP_OBJ_TIME_VALUES        5   /* rfc2205 */
1300f74e101Schristos #define	RSVP_OBJ_ERROR_SPEC         6
1310f74e101Schristos #define	RSVP_OBJ_SCOPE              7
1320f74e101Schristos #define	RSVP_OBJ_STYLE              8   /* rfc2205 */
1330f74e101Schristos #define	RSVP_OBJ_FLOWSPEC           9   /* rfc2215 */
1340f74e101Schristos #define	RSVP_OBJ_FILTERSPEC         10  /* rfc2215 */
1350f74e101Schristos #define	RSVP_OBJ_SENDER_TEMPLATE    11
1360f74e101Schristos #define	RSVP_OBJ_SENDER_TSPEC       12  /* rfc2215 */
1370f74e101Schristos #define	RSVP_OBJ_ADSPEC             13  /* rfc2215 */
1380f74e101Schristos #define	RSVP_OBJ_POLICY_DATA        14
1390f74e101Schristos #define	RSVP_OBJ_CONFIRM            15  /* rfc2205 */
1400f74e101Schristos #define	RSVP_OBJ_LABEL              16  /* rfc3209 */
1410f74e101Schristos #define	RSVP_OBJ_LABEL_REQ          19  /* rfc3209 */
1420f74e101Schristos #define	RSVP_OBJ_ERO                20  /* rfc3209 */
1430f74e101Schristos #define	RSVP_OBJ_RRO                21  /* rfc3209 */
1440f74e101Schristos #define	RSVP_OBJ_HELLO              22  /* rfc3209 */
1450f74e101Schristos #define	RSVP_OBJ_MESSAGE_ID         23  /* rfc2961 */
1460f74e101Schristos #define	RSVP_OBJ_MESSAGE_ID_ACK     24  /* rfc2961 */
1470f74e101Schristos #define	RSVP_OBJ_MESSAGE_ID_LIST    25  /* rfc2961 */
1480f74e101Schristos #define	RSVP_OBJ_RECOVERY_LABEL     34  /* rfc3473 */
1490f74e101Schristos #define	RSVP_OBJ_UPSTREAM_LABEL     35  /* rfc3473 */
1500f74e101Schristos #define	RSVP_OBJ_LABEL_SET          36  /* rfc3473 */
1510f74e101Schristos #define	RSVP_OBJ_PROTECTION         37  /* rfc3473 */
1520f74e101Schristos #define RSVP_OBJ_S2L                50  /* rfc4875 */
153c74ad251Schristos #define	RSVP_OBJ_DETOUR             63  /* rfc4090 */
1540f74e101Schristos #define	RSVP_OBJ_CLASSTYPE          66  /* rfc4124 */
1550f74e101Schristos #define RSVP_OBJ_CLASSTYPE_OLD      125 /* draft-ietf-tewg-diff-te-proto-07 */
1560f74e101Schristos #define	RSVP_OBJ_SUGGESTED_LABEL    129 /* rfc3473 */
1570f74e101Schristos #define	RSVP_OBJ_ACCEPT_LABEL_SET   130 /* rfc3473 */
1580f74e101Schristos #define	RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
159c74ad251Schristos #define RSVP_OBJ_CAPABILITY         134 /* rfc5063 */
1600f74e101Schristos #define	RSVP_OBJ_NOTIFY_REQ         195 /* rfc3473 */
1610f74e101Schristos #define	RSVP_OBJ_ADMIN_STATUS       196 /* rfc3473 */
1620f74e101Schristos #define	RSVP_OBJ_PROPERTIES         204 /* juniper proprietary */
163c74ad251Schristos #define	RSVP_OBJ_FASTREROUTE        205 /* rfc4090 */
1640f74e101Schristos #define	RSVP_OBJ_SESSION_ATTRIBUTE  207 /* rfc3209 */
1650f74e101Schristos #define RSVP_OBJ_GENERALIZED_UNI    229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
1660f74e101Schristos #define RSVP_OBJ_CALL_ID            230 /* rfc3474 */
1670f74e101Schristos #define RSVP_OBJ_CALL_OPS           236 /* rfc3474 */
1680f74e101Schristos 
1690f74e101Schristos static const struct tok rsvp_obj_values[] = {
1700f74e101Schristos     { RSVP_OBJ_SESSION,            "Session" },
1710f74e101Schristos     { RSVP_OBJ_RSVP_HOP,           "RSVP Hop" },
1720f74e101Schristos     { RSVP_OBJ_INTEGRITY,          "Integrity" },
1730f74e101Schristos     { RSVP_OBJ_TIME_VALUES,        "Time Values" },
1740f74e101Schristos     { RSVP_OBJ_ERROR_SPEC,         "Error Spec" },
1750f74e101Schristos     { RSVP_OBJ_SCOPE,              "Scope" },
1760f74e101Schristos     { RSVP_OBJ_STYLE,              "Style" },
1770f74e101Schristos     { RSVP_OBJ_FLOWSPEC,           "Flowspec" },
1780f74e101Schristos     { RSVP_OBJ_FILTERSPEC,         "FilterSpec" },
1790f74e101Schristos     { RSVP_OBJ_SENDER_TEMPLATE,    "Sender Template" },
1800f74e101Schristos     { RSVP_OBJ_SENDER_TSPEC,       "Sender TSpec" },
1810f74e101Schristos     { RSVP_OBJ_ADSPEC,             "Adspec" },
1820f74e101Schristos     { RSVP_OBJ_POLICY_DATA,        "Policy Data" },
1830f74e101Schristos     { RSVP_OBJ_CONFIRM,            "Confirm" },
1840f74e101Schristos     { RSVP_OBJ_LABEL,              "Label" },
1850f74e101Schristos     { RSVP_OBJ_LABEL_REQ,          "Label Request" },
1860f74e101Schristos     { RSVP_OBJ_ERO,                "ERO" },
1870f74e101Schristos     { RSVP_OBJ_RRO,                "RRO" },
1880f74e101Schristos     { RSVP_OBJ_HELLO,              "Hello" },
1890f74e101Schristos     { RSVP_OBJ_MESSAGE_ID,         "Message ID" },
1900f74e101Schristos     { RSVP_OBJ_MESSAGE_ID_ACK,     "Message ID Ack" },
1910f74e101Schristos     { RSVP_OBJ_MESSAGE_ID_LIST,    "Message ID List" },
1920f74e101Schristos     { RSVP_OBJ_RECOVERY_LABEL,     "Recovery Label" },
1930f74e101Schristos     { RSVP_OBJ_UPSTREAM_LABEL,     "Upstream Label" },
1940f74e101Schristos     { RSVP_OBJ_LABEL_SET,          "Label Set" },
1950f74e101Schristos     { RSVP_OBJ_ACCEPT_LABEL_SET,   "Acceptable Label Set" },
1960f74e101Schristos     { RSVP_OBJ_DETOUR,             "Detour" },
1970f74e101Schristos     { RSVP_OBJ_CLASSTYPE,          "Class Type" },
1980f74e101Schristos     { RSVP_OBJ_CLASSTYPE_OLD,      "Class Type (old)" },
1990f74e101Schristos     { RSVP_OBJ_SUGGESTED_LABEL,    "Suggested Label" },
2000f74e101Schristos     { RSVP_OBJ_PROPERTIES,         "Properties" },
2010f74e101Schristos     { RSVP_OBJ_FASTREROUTE,        "Fast Re-Route" },
2020f74e101Schristos     { RSVP_OBJ_SESSION_ATTRIBUTE,  "Session Attribute" },
2030f74e101Schristos     { RSVP_OBJ_GENERALIZED_UNI,    "Generalized UNI" },
2040f74e101Schristos     { RSVP_OBJ_CALL_ID,            "Call-ID" },
2050f74e101Schristos     { RSVP_OBJ_CALL_OPS,           "Call Capability" },
2060f74e101Schristos     { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
207c74ad251Schristos     { RSVP_OBJ_CAPABILITY,         "Capability" },
2080f74e101Schristos     { RSVP_OBJ_NOTIFY_REQ,         "Notify Request" },
2090f74e101Schristos     { RSVP_OBJ_PROTECTION,         "Protection" },
2100f74e101Schristos     { RSVP_OBJ_ADMIN_STATUS,       "Administrative Status" },
2110f74e101Schristos     { RSVP_OBJ_S2L,                "Sub-LSP to LSP" },
2120f74e101Schristos     { 0, NULL}
2130f74e101Schristos };
2140f74e101Schristos 
2150f74e101Schristos #define	RSVP_CTYPE_IPV4        1
2160f74e101Schristos #define	RSVP_CTYPE_IPV6        2
2170f74e101Schristos #define	RSVP_CTYPE_TUNNEL_IPV4 7
2180f74e101Schristos #define	RSVP_CTYPE_TUNNEL_IPV6 8
2190f74e101Schristos #define	RSVP_CTYPE_UNI_IPV4    11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
2200f74e101Schristos #define RSVP_CTYPE_1           1
2210f74e101Schristos #define RSVP_CTYPE_2           2
2220f74e101Schristos #define RSVP_CTYPE_3           3
2230f74e101Schristos #define RSVP_CTYPE_4           4
2240f74e101Schristos #define RSVP_CTYPE_12         12
2250f74e101Schristos #define RSVP_CTYPE_13         13
2260f74e101Schristos #define RSVP_CTYPE_14         14
2270f74e101Schristos 
2280f74e101Schristos /*
2290f74e101Schristos  * the ctypes are not globally unique so for
2300f74e101Schristos  * translating it to strings we build a table based
2310f74e101Schristos  * on objects offsetted by the ctype
2320f74e101Schristos  */
2330f74e101Schristos 
2340f74e101Schristos static const struct tok rsvp_ctype_values[] = {
2350f74e101Schristos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4,	             "IPv4" },
2360f74e101Schristos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6,	             "IPv6" },
2370f74e101Schristos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3,	             "IPv4 plus opt. TLVs" },
2380f74e101Schristos     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4,	             "IPv6 plus opt. TLVs" },
2390f74e101Schristos     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4,	             "IPv4" },
2400f74e101Schristos     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6,	             "IPv6" },
2410f74e101Schristos     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4,	             "IPv4" },
2420f74e101Schristos     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6,	             "IPv6" },
2430f74e101Schristos     { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1,	             "1" },
2440f74e101Schristos     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1,	             "obsolete" },
2450f74e101Schristos     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2,	             "IntServ" },
2460f74e101Schristos     { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2,	             "IntServ" },
2470f74e101Schristos     { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2,	                     "IntServ" },
2480f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4,	             "IPv4" },
2490f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6,	             "IPv6" },
2500f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3,	             "IPv6 Flow-label" },
2510f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4,	     "Tunnel IPv4" },
2520f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12,                 "IPv4 P2MP LSP Tunnel" },
2530f74e101Schristos     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13,                 "IPv6 P2MP LSP Tunnel" },
2540f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4,	             "IPv4" },
2550f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6,	             "IPv6" },
2560f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4,           "Tunnel IPv4" },
2570f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4,              "UNI IPv4" },
2580f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13,                    "IPv4 P2MP LSP Tunnel" },
2590f74e101Schristos     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14,                    "IPv6 P2MP LSP Tunnel" },
2600f74e101Schristos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4,          "IPv4" },
2610f74e101Schristos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6,          "IPv6" },
2620f74e101Schristos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4,   "Tunnel IPv4" },
2630f74e101Schristos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12,            "IPv4 P2MP LSP Tunnel" },
2640f74e101Schristos     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13,            "IPv6 P2MP LSP Tunnel" },
2650f74e101Schristos     { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1,                  "1" },
2660f74e101Schristos     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1,              "Message id ack" },
2670f74e101Schristos     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2,              "Message id nack" },
2680f74e101Schristos     { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1,             "1" },
2690f74e101Schristos     { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1,                       "1" },
2700f74e101Schristos     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1,                       "Hello Request" },
2710f74e101Schristos     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2,                       "Hello Ack" },
2720f74e101Schristos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1,	             "without label range" },
2730f74e101Schristos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2,	             "with ATM label range" },
2740f74e101Schristos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3,                   "with FR label range" },
2750f74e101Schristos     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4,                   "Generalized Label" },
2760f74e101Schristos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1,                       "Label" },
2770f74e101Schristos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2,                       "Generalized Label" },
2780f74e101Schristos     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3,                       "Waveband Switching" },
2790f74e101Schristos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1,             "Label" },
2800f74e101Schristos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2,             "Generalized Label" },
2810f74e101Schristos     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3,             "Waveband Switching" },
2820f74e101Schristos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1,              "Label" },
2830f74e101Schristos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
2840f74e101Schristos     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
2850f74e101Schristos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1,              "Label" },
2860f74e101Schristos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
2870f74e101Schristos     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
2880f74e101Schristos     { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4,                      "IPv4" },
2890f74e101Schristos     { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4,                      "IPv4" },
2900f74e101Schristos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4,               "IPv4" },
2910f74e101Schristos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6,               "IPv6" },
2920f74e101Schristos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3,                  "IPv4 plus opt. TLVs" },
2930f74e101Schristos     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4,                  "IPv6 plus opt. TLVs" },
2940f74e101Schristos     { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1,          "IPv4" },
295c74ad251Schristos     { 256*RSVP_OBJ_CAPABILITY+RSVP_CTYPE_1,                  "1" },
2960f74e101Schristos     { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
2970f74e101Schristos     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4,       "Tunnel IPv4" }, /* old style*/
2980f74e101Schristos     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1,                 "1" }, /* new style */
2990f74e101Schristos     { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4,            "Tunnel IPv4" },
3000f74e101Schristos     { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1,                  "1" },
3010f74e101Schristos     { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1,                "1" },
3020f74e101Schristos     { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1,                   "1" },
3030f74e101Schristos     { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1,               "1" },
3040f74e101Schristos     { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1,                   "1" },
3050f74e101Schristos     { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1,             "1" },
3060f74e101Schristos     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4,                      "IPv4 sub-LSP" },
3070f74e101Schristos     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6,                      "IPv6 sub-LSP" },
3080f74e101Schristos     { 0, NULL}
3090f74e101Schristos };
3100f74e101Schristos 
311c74ad251Schristos /*
312c74ad251Schristos  * XXX - this assumes a 16-byte digest, which is true for HMAC-MD5, but
313c74ad251Schristos  * isn't necessarily the case for other hash algorithms.
314c74ad251Schristos  *
315c74ad251Schristos  * Unless I've missed something, there's nothing in RFC 2747 to indicate
316c74ad251Schristos  * the hash algorithm being used, so it's presumably something set up
317c74ad251Schristos  * out-of-band, or negotiated by other RSVP objects.
318c74ad251Schristos  */
3190f74e101Schristos struct rsvp_obj_integrity_t {
320b3a00663Schristos     uint8_t flags;
321b3a00663Schristos     uint8_t res;
322b3a00663Schristos     uint8_t key_id[6];
323b3a00663Schristos     uint8_t sequence[8];
324b3a00663Schristos     uint8_t digest[16];
3250f74e101Schristos };
3260f74e101Schristos 
3270f74e101Schristos static const struct tok rsvp_obj_integrity_flag_values[] = {
3280f74e101Schristos     { 0x80, "Handshake" },
3290f74e101Schristos     { 0, NULL}
3300f74e101Schristos };
3310f74e101Schristos 
3320f74e101Schristos struct rsvp_obj_frr_t {
333b3a00663Schristos     uint8_t setup_prio;
334b3a00663Schristos     uint8_t hold_prio;
335b3a00663Schristos     uint8_t hop_limit;
336b3a00663Schristos     uint8_t flags;
337b3a00663Schristos     uint8_t bandwidth[4];
338b3a00663Schristos     uint8_t include_any[4];
339b3a00663Schristos     uint8_t exclude_any[4];
340b3a00663Schristos     uint8_t include_all[4];
3410f74e101Schristos };
3420f74e101Schristos 
3430f74e101Schristos 
3440f74e101Schristos #define RSVP_OBJ_XRO_MASK_SUBOBJ(x)   ((x)&0x7f)
3450f74e101Schristos #define RSVP_OBJ_XRO_MASK_LOOSE(x)    ((x)&0x80)
3460f74e101Schristos 
347c74ad251Schristos #define RSVP_OBJ_CAPABILITY_FLAGS_MASK  0x7U
348c74ad251Schristos 
3490f74e101Schristos #define	RSVP_OBJ_XRO_RES       0
3500f74e101Schristos #define	RSVP_OBJ_XRO_IPV4      1
3510f74e101Schristos #define	RSVP_OBJ_XRO_IPV6      2
3520f74e101Schristos #define	RSVP_OBJ_XRO_LABEL     3
3530f74e101Schristos #define	RSVP_OBJ_XRO_ASN       32
3540f74e101Schristos #define	RSVP_OBJ_XRO_MPLS      64
3550f74e101Schristos 
3560f74e101Schristos static const struct tok rsvp_obj_xro_values[] = {
3570f74e101Schristos     { RSVP_OBJ_XRO_RES,	      "Reserved" },
3580f74e101Schristos     { RSVP_OBJ_XRO_IPV4,      "IPv4 prefix" },
3590f74e101Schristos     { RSVP_OBJ_XRO_IPV6,      "IPv6 prefix" },
3600f74e101Schristos     { RSVP_OBJ_XRO_LABEL,     "Label" },
3610f74e101Schristos     { RSVP_OBJ_XRO_ASN,       "Autonomous system number" },
3620f74e101Schristos     { RSVP_OBJ_XRO_MPLS,      "MPLS label switched path termination" },
3630f74e101Schristos     { 0, NULL}
3640f74e101Schristos };
3650f74e101Schristos 
366c74ad251Schristos /* RFC4090 */
3670f74e101Schristos static const struct tok rsvp_obj_rro_flag_values[] = {
3680f74e101Schristos     { 0x01,	              "Local protection available" },
3690f74e101Schristos     { 0x02,                   "Local protection in use" },
3700f74e101Schristos     { 0x04,                   "Bandwidth protection" },
3710f74e101Schristos     { 0x08,                   "Node protection" },
3720f74e101Schristos     { 0, NULL}
3730f74e101Schristos };
3740f74e101Schristos 
3750f74e101Schristos /* RFC3209 */
3760f74e101Schristos static const struct tok rsvp_obj_rro_label_flag_values[] = {
3770f74e101Schristos     { 0x01,                   "Global" },
3780f74e101Schristos     { 0, NULL}
3790f74e101Schristos };
3800f74e101Schristos 
3810f74e101Schristos static const struct tok rsvp_resstyle_values[] = {
3820f74e101Schristos     { 17,	              "Wildcard Filter" },
3830f74e101Schristos     { 10,                     "Fixed Filter" },
3840f74e101Schristos     { 18,                     "Shared Explicit" },
3850f74e101Schristos     { 0, NULL}
3860f74e101Schristos };
3870f74e101Schristos 
3880f74e101Schristos #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
3890f74e101Schristos #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
3900f74e101Schristos 
3910f74e101Schristos static const struct tok rsvp_intserv_service_type_values[] = {
3920f74e101Schristos     { 1,                                "Default/Global Information" },
3930f74e101Schristos     { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
3940f74e101Schristos     { RSVP_OBJ_INTSERV_CONTROLLED_LOAD,	"Controlled Load" },
3950f74e101Schristos     { 0, NULL}
3960f74e101Schristos };
3970f74e101Schristos 
3980f74e101Schristos static const struct tok rsvp_intserv_parameter_id_values[] = {
3990f74e101Schristos     { 4,                     "IS hop cnt" },
4000f74e101Schristos     { 6,                     "Path b/w estimate" },
4010f74e101Schristos     { 8,                     "Minimum path latency" },
4020f74e101Schristos     { 10,                    "Composed MTU" },
4030f74e101Schristos     { 127,                   "Token Bucket TSpec" },
4040f74e101Schristos     { 130,                   "Guaranteed Service RSpec" },
4050f74e101Schristos     { 133,                   "End-to-end composed value for C" },
4060f74e101Schristos     { 134,                   "End-to-end composed value for D" },
4070f74e101Schristos     { 135,                   "Since-last-reshaping point composed C" },
4080f74e101Schristos     { 136,                   "Since-last-reshaping point composed D" },
4090f74e101Schristos     { 0, NULL}
4100f74e101Schristos };
4110f74e101Schristos 
412870189d2Schristos static const struct tok rsvp_session_attribute_flag_values[] = {
4130f74e101Schristos     { 0x01,	              "Local Protection" },
4140f74e101Schristos     { 0x02,                   "Label Recording" },
4150f74e101Schristos     { 0x04,                   "SE Style" },
4160f74e101Schristos     { 0x08,                   "Bandwidth protection" }, /* RFC4090 */
4170f74e101Schristos     { 0x10,                   "Node protection" },      /* RFC4090 */
4180f74e101Schristos     { 0, NULL}
4190f74e101Schristos };
4200f74e101Schristos 
421870189d2Schristos static const struct tok rsvp_obj_prop_tlv_values[] = {
4220f74e101Schristos     { 0x01,                   "Cos" },
4230f74e101Schristos     { 0x02,                   "Metric 1" },
4240f74e101Schristos     { 0x04,                   "Metric 2" },
4250f74e101Schristos     { 0x08,                   "CCC Status" },
4260f74e101Schristos     { 0x10,                   "Path Type" },
4270f74e101Schristos     { 0, NULL}
4280f74e101Schristos };
4290f74e101Schristos 
4300f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
4310f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY  25
4320f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
4330f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
4340f74e101Schristos 
435870189d2Schristos static const struct tok rsvp_obj_error_code_values[] = {
4360f74e101Schristos     { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
4370f74e101Schristos     { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY,  "Notify Error" },
4380f74e101Schristos     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
4390f74e101Schristos     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
4400f74e101Schristos     { 0, NULL}
4410f74e101Schristos };
4420f74e101Schristos 
443870189d2Schristos static const struct tok rsvp_obj_error_code_routing_values[] = {
4440f74e101Schristos     { 1,                      "Bad EXPLICIT_ROUTE object" },
4450f74e101Schristos     { 2,                      "Bad strict node" },
4460f74e101Schristos     { 3,                      "Bad loose node" },
4470f74e101Schristos     { 4,                      "Bad initial subobject" },
4480f74e101Schristos     { 5,                      "No route available toward destination" },
4490f74e101Schristos     { 6,                      "Unacceptable label value" },
4500f74e101Schristos     { 7,                      "RRO indicated routing loops" },
4510f74e101Schristos     { 8,                      "non-RSVP-capable router in the path" },
4520f74e101Schristos     { 9,                      "MPLS label allocation failure" },
4530f74e101Schristos     { 10,                     "Unsupported L3PID" },
4540f74e101Schristos     { 0, NULL}
4550f74e101Schristos };
4560f74e101Schristos 
457870189d2Schristos static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
4580f74e101Schristos     { 1,                      "Unexpected CT object" },
4590f74e101Schristos     { 2,                      "Unsupported CT" },
4600f74e101Schristos     { 3,                      "Invalid CT value" },
4610f74e101Schristos     { 4,                      "CT/setup priority do not form a configured TE-Class" },
4620f74e101Schristos     { 5,                      "CT/holding priority do not form a configured TE-Class" },
4630f74e101Schristos     { 6,                      "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
4640f74e101Schristos     { 7,                      "Inconsistency between signaled PSC and signaled CT" },
4650f74e101Schristos     { 8,                      "Inconsistency between signaled PHBs and signaled CT" },
4660f74e101Schristos    { 0, NULL}
4670f74e101Schristos };
4680f74e101Schristos 
4690f74e101Schristos /* rfc3473 / rfc 3471 */
4700f74e101Schristos static const struct tok rsvp_obj_admin_status_flag_values[] = {
4710f74e101Schristos     { 0x80000000, "Reflect" },
4720f74e101Schristos     { 0x00000004, "Testing" },
4730f74e101Schristos     { 0x00000002, "Admin-down" },
4740f74e101Schristos     { 0x00000001, "Delete-in-progress" },
4750f74e101Schristos     { 0, NULL}
4760f74e101Schristos };
4770f74e101Schristos 
4780f74e101Schristos /* label set actions - rfc3471 */
4790f74e101Schristos #define LABEL_SET_INCLUSIVE_LIST  0
4800f74e101Schristos #define LABEL_SET_EXCLUSIVE_LIST  1
4810f74e101Schristos #define LABEL_SET_INCLUSIVE_RANGE 2
4820f74e101Schristos #define LABEL_SET_EXCLUSIVE_RANGE 3
4830f74e101Schristos 
4840f74e101Schristos static const struct tok rsvp_obj_label_set_action_values[] = {
4850f74e101Schristos     { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
4860f74e101Schristos     { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
4870f74e101Schristos     { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
4880f74e101Schristos     { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
4890f74e101Schristos     { 0, NULL}
4900f74e101Schristos };
4910f74e101Schristos 
4920f74e101Schristos /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
4930f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS	    1
4940f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
4950f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY		    3
4960f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL            4
4970f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL           5
4980f74e101Schristos 
4990f74e101Schristos static const struct tok rsvp_obj_generalized_uni_values[] = {
5000f74e101Schristos     { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
5010f74e101Schristos     { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
5020f74e101Schristos     { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
5030f74e101Schristos     { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
5040f74e101Schristos     { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
5050f74e101Schristos     { 0, NULL}
5060f74e101Schristos };
5070f74e101Schristos 
5080f74e101Schristos /*
5090f74e101Schristos  * this is a dissector for all the intserv defined
5100f74e101Schristos  * specs as defined per rfc2215
5110f74e101Schristos  * it is called from various rsvp objects;
5120f74e101Schristos  * returns the amount of bytes being processed
5130f74e101Schristos  */
514c74ad251Schristos static u_int
515b3a00663Schristos rsvp_intserv_print(netdissect_options *ndo,
516c74ad251Schristos                    const u_char *tptr, u_int obj_tlen)
517ba2ff121Schristos {
518c74ad251Schristos     u_int parameter_id,parameter_length;
5190f74e101Schristos     union {
5200f74e101Schristos 	float f;
521b3a00663Schristos 	uint32_t i;
5220f74e101Schristos     } bw;
5230f74e101Schristos 
5240f74e101Schristos     if (obj_tlen < 4)
5250f74e101Schristos         return 0;
526c74ad251Schristos     parameter_id = GET_U_1(tptr);
527c74ad251Schristos     parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */
5280f74e101Schristos 
529c74ad251Schristos     ND_PRINT("\n\t      Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
5300f74e101Schristos            tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
5310f74e101Schristos            parameter_id,
5320f74e101Schristos            parameter_length,
533c74ad251Schristos            GET_U_1(tptr + 1));
5340f74e101Schristos 
5350f74e101Schristos     if (obj_tlen < parameter_length+4)
5360f74e101Schristos         return 0;
5370f74e101Schristos     switch(parameter_id) { /* parameter_id */
5380f74e101Schristos 
5390f74e101Schristos     case 4:
5400f74e101Schristos        /*
5410f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5420f74e101Schristos         * |    4 (e)      |    (f)        |           1 (g)               |
5430f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5440f74e101Schristos         * |        IS hop cnt (32-bit unsigned integer)                   |
5450f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5460f74e101Schristos         */
547dc860a36Sspz         if (parameter_length == 4) {
548c74ad251Schristos             ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4));
549dc860a36Sspz         }
5500f74e101Schristos         break;
5510f74e101Schristos 
5520f74e101Schristos     case 6:
5530f74e101Schristos        /*
5540f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5550f74e101Schristos         * |    6 (h)      |    (i)        |           1 (j)               |
5560f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5570f74e101Schristos         * |  Path b/w estimate  (32-bit IEEE floating point number)       |
5580f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5590f74e101Schristos         */
5600f74e101Schristos         if (parameter_length == 4) {
561c74ad251Schristos             bw.i = GET_BE_U_4(tptr + 4);
562c74ad251Schristos             ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000);
5630f74e101Schristos         }
5640f74e101Schristos         break;
5650f74e101Schristos 
5660f74e101Schristos     case 8:
5670f74e101Schristos        /*
5680f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5690f74e101Schristos         * |     8 (k)     |    (l)        |           1 (m)               |
5700f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5710f74e101Schristos         * |        Minimum path latency (32-bit integer)                  |
5720f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5730f74e101Schristos         */
5740f74e101Schristos         if (parameter_length == 4) {
575c74ad251Schristos             ND_PRINT("\n\t\tMinimum path latency: ");
576c74ad251Schristos             if (GET_BE_U_4(tptr + 4) == 0xffffffff)
577c74ad251Schristos                 ND_PRINT("don't care");
5780f74e101Schristos             else
579c74ad251Schristos                 ND_PRINT("%u", GET_BE_U_4(tptr + 4));
5800f74e101Schristos         }
5810f74e101Schristos         break;
5820f74e101Schristos 
5830f74e101Schristos     case 10:
5840f74e101Schristos 
5850f74e101Schristos        /*
5860f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5870f74e101Schristos         * |     10 (n)    |      (o)      |           1 (p)               |
5880f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5890f74e101Schristos         * |      Composed MTU (32-bit unsigned integer)                   |
5900f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5910f74e101Schristos         */
592dc860a36Sspz         if (parameter_length == 4) {
593c74ad251Schristos             ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4));
594dc860a36Sspz         }
5950f74e101Schristos         break;
5960f74e101Schristos     case 127:
5970f74e101Schristos        /*
5980f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5990f74e101Schristos         * |   127 (e)     |    0 (f)      |             5 (g)             |
6000f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6010f74e101Schristos         * |  Token Bucket Rate [r] (32-bit IEEE floating point number)    |
6020f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6030f74e101Schristos         * |  Token Bucket Size [b] (32-bit IEEE floating point number)    |
6040f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6050f74e101Schristos         * |  Peak Data Rate [p] (32-bit IEEE floating point number)       |
6060f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6070f74e101Schristos         * |  Minimum Policed Unit [m] (32-bit integer)                    |
6080f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6090f74e101Schristos         * |  Maximum Packet Size [M]  (32-bit integer)                    |
6100f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6110f74e101Schristos         */
6120f74e101Schristos 
6130f74e101Schristos         if (parameter_length == 20) {
614c74ad251Schristos 	    ND_TCHECK_LEN(tptr + 4, 20);
615c74ad251Schristos             bw.i = GET_BE_U_4(tptr + 4);
616c74ad251Schristos             ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000);
617c74ad251Schristos             bw.i = GET_BE_U_4(tptr + 8);
618c74ad251Schristos             ND_PRINT("\n\t\tToken Bucket Size: %.10g bytes", bw.f);
619c74ad251Schristos             bw.i = GET_BE_U_4(tptr + 12);
620c74ad251Schristos             ND_PRINT("\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000);
621c74ad251Schristos             ND_PRINT("\n\t\tMinimum Policed Unit: %u bytes",
622c74ad251Schristos                      GET_BE_U_4(tptr + 16));
623c74ad251Schristos             ND_PRINT("\n\t\tMaximum Packet Size: %u bytes",
624c74ad251Schristos                      GET_BE_U_4(tptr + 20));
6250f74e101Schristos         }
6260f74e101Schristos         break;
6270f74e101Schristos 
6280f74e101Schristos     case 130:
6290f74e101Schristos        /*
6300f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6310f74e101Schristos         * |     130 (h)   |    0 (i)      |            2 (j)              |
6320f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6330f74e101Schristos         * |  Rate [R]  (32-bit IEEE floating point number)                |
6340f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6350f74e101Schristos         * |  Slack Term [S]  (32-bit integer)                             |
6360f74e101Schristos         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6370f74e101Schristos         */
6380f74e101Schristos 
6390f74e101Schristos         if (parameter_length == 8) {
640c74ad251Schristos 	    ND_TCHECK_8(tptr + 4);
641c74ad251Schristos             bw.i = GET_BE_U_4(tptr + 4);
642c74ad251Schristos             ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000);
643c74ad251Schristos             ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8));
6440f74e101Schristos         }
6450f74e101Schristos         break;
6460f74e101Schristos 
6470f74e101Schristos     case 133:
6480f74e101Schristos     case 134:
6490f74e101Schristos     case 135:
6500f74e101Schristos     case 136:
651dc860a36Sspz         if (parameter_length == 4) {
652c74ad251Schristos             ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4));
653dc860a36Sspz         }
6540f74e101Schristos         break;
6550f74e101Schristos 
6560f74e101Schristos     default:
657b3a00663Schristos         if (ndo->ndo_vflag <= 1)
658b3a00663Schristos             print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
6590f74e101Schristos     }
6600f74e101Schristos     return (parameter_length+4); /* header length 4 bytes */
661fdccd7e4Schristos 
662fdccd7e4Schristos trunc:
663c74ad251Schristos     nd_print_trunc(ndo);
664fdccd7e4Schristos     return 0;
665fdccd7e4Schristos }
666fdccd7e4Schristos 
667fdccd7e4Schristos /*
668fdccd7e4Schristos  * Clear checksum prior to signature verification.
669fdccd7e4Schristos  */
670fdccd7e4Schristos static void
671fdccd7e4Schristos rsvp_clear_checksum(void *header)
672fdccd7e4Schristos {
673fdccd7e4Schristos     struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header;
674fdccd7e4Schristos 
675fdccd7e4Schristos     rsvp_com_header->checksum[0] = 0;
676fdccd7e4Schristos     rsvp_com_header->checksum[1] = 0;
6770f74e101Schristos }
6780f74e101Schristos 
6790f74e101Schristos static int
680b3a00663Schristos rsvp_obj_print(netdissect_options *ndo,
681fdccd7e4Schristos                const u_char *pptr, u_int plen, const u_char *tptr,
682c74ad251Schristos                const char *indent, u_int tlen,
683fdccd7e4Schristos                const struct rsvp_common_header *rsvp_com_header)
684ba2ff121Schristos {
6850f74e101Schristos     const struct rsvp_object_header *rsvp_obj_header;
6860f74e101Schristos     const u_char *obj_tptr;
6870f74e101Schristos     union {
6880f74e101Schristos         const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
6890f74e101Schristos         const struct rsvp_obj_frr_t *rsvp_obj_frr;
6900f74e101Schristos     } obj_ptr;
6910f74e101Schristos 
692c74ad251Schristos     u_short rsvp_obj_len,rsvp_obj_ctype,rsvp_obj_class_num;
693c74ad251Schristos     u_int obj_tlen,intserv_serv_tlen;
694c74ad251Schristos     int hexdump;
695c74ad251Schristos     u_int processed,padbytes,error_code,error_value,i,sigcheck;
6960f74e101Schristos     union {
6970f74e101Schristos 	float f;
698b3a00663Schristos 	uint32_t i;
6990f74e101Schristos     } bw;
700c74ad251Schristos     u_int namelen;
7010f74e101Schristos 
7020f74e101Schristos     u_int action, subchannel;
7030f74e101Schristos 
7040f74e101Schristos     while(tlen>=sizeof(struct rsvp_object_header)) {
7050f74e101Schristos         /* did we capture enough for fully decoding the object header ? */
706c74ad251Schristos         ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header));
7070f74e101Schristos 
7080f74e101Schristos         rsvp_obj_header = (const struct rsvp_object_header *)tptr;
709c74ad251Schristos         rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length);
710c74ad251Schristos         rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype);
7110f74e101Schristos 
7120f74e101Schristos         if(rsvp_obj_len % 4) {
713c74ad251Schristos             ND_PRINT("%sERROR: object header size %u not a multiple of 4", indent, rsvp_obj_len);
7140f74e101Schristos             return -1;
7150f74e101Schristos         }
7160f74e101Schristos         if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
717c74ad251Schristos             ND_PRINT("%sERROR: object header too short %u < %zu", indent, rsvp_obj_len,
718c74ad251Schristos                    sizeof(struct rsvp_object_header));
7190f74e101Schristos             return -1;
7200f74e101Schristos         }
7210f74e101Schristos 
722c74ad251Schristos         rsvp_obj_class_num = GET_U_1(rsvp_obj_header->class_num);
723c74ad251Schristos         ND_PRINT("%s%s Object (%u) Flags: [%s",
724c74ad251Schristos                indent,
7250f74e101Schristos                tok2str(rsvp_obj_values,
7260f74e101Schristos                        "Unknown",
727c74ad251Schristos                        rsvp_obj_class_num),
728c74ad251Schristos                rsvp_obj_class_num,
729c74ad251Schristos                (rsvp_obj_class_num & 0x80) ?
730c74ad251Schristos                    ((rsvp_obj_class_num & 0x40) ? "ignore and forward" :
731c74ad251Schristos                                          "ignore silently") :
732c74ad251Schristos                    "reject");
7330f74e101Schristos 
734c74ad251Schristos         ND_PRINT(" if unknown], Class-Type: %s (%u), length: %u",
7350f74e101Schristos                tok2str(rsvp_ctype_values,
7360f74e101Schristos                        "Unknown",
737c74ad251Schristos                        (rsvp_obj_class_num<<8)+rsvp_obj_ctype),
7380f74e101Schristos                rsvp_obj_ctype,
739c74ad251Schristos                rsvp_obj_len);
7400f74e101Schristos 
7410f74e101Schristos         if(tlen < rsvp_obj_len) {
742c74ad251Schristos             ND_PRINT("%sERROR: object goes past end of objects TLV", indent);
7430f74e101Schristos             return -1;
7440f74e101Schristos         }
7450f74e101Schristos 
7460f74e101Schristos         obj_tptr=tptr+sizeof(struct rsvp_object_header);
7470f74e101Schristos         obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
7480f74e101Schristos 
7490f74e101Schristos         /* did we capture enough for fully decoding the object ? */
750c74ad251Schristos         ND_TCHECK_LEN(tptr, rsvp_obj_len);
7510f74e101Schristos         hexdump=FALSE;
7520f74e101Schristos 
753c74ad251Schristos         switch(rsvp_obj_class_num) {
7540f74e101Schristos         case RSVP_OBJ_SESSION:
7550f74e101Schristos             switch(rsvp_obj_ctype) {
7560f74e101Schristos             case RSVP_CTYPE_IPV4:
7570f74e101Schristos                 if (obj_tlen < 8)
758c74ad251Schristos                     goto obj_tooshort;
759c74ad251Schristos                 ND_PRINT("%s  IPv4 DestAddress: %s, Protocol ID: 0x%02x",
760c74ad251Schristos                        indent,
761c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
762c74ad251Schristos                        GET_U_1(obj_tptr + sizeof(nd_ipv4)));
763c74ad251Schristos                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
764c74ad251Schristos                        indent,
765c74ad251Schristos                        GET_U_1((obj_tptr + 5)),
766c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6));
7670f74e101Schristos                 obj_tlen-=8;
7680f74e101Schristos                 obj_tptr+=8;
7690f74e101Schristos                 break;
7700f74e101Schristos             case RSVP_CTYPE_IPV6:
7710f74e101Schristos                 if (obj_tlen < 20)
772c74ad251Schristos                     goto obj_tooshort;
773c74ad251Schristos                 ND_PRINT("%s  IPv6 DestAddress: %s, Protocol ID: 0x%02x",
774c74ad251Schristos                        indent,
775c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
776c74ad251Schristos                        GET_U_1(obj_tptr + sizeof(nd_ipv6)));
777c74ad251Schristos                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
778c74ad251Schristos                        indent,
779c74ad251Schristos                        GET_U_1((obj_tptr + sizeof(nd_ipv6) + 1)),
780c74ad251Schristos                        GET_BE_U_2(obj_tptr + sizeof(nd_ipv6) + 2));
7810f74e101Schristos                 obj_tlen-=20;
7820f74e101Schristos                 obj_tptr+=20;
7830f74e101Schristos                 break;
7840f74e101Schristos 
7850f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV6:
7860f74e101Schristos                 if (obj_tlen < 36)
787c74ad251Schristos                     goto obj_tooshort;
788c74ad251Schristos                 ND_PRINT("%s  IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
789c74ad251Schristos                        indent,
790c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
791c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18),
792c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr + 20));
7930f74e101Schristos                 obj_tlen-=36;
7940f74e101Schristos                 obj_tptr+=36;
7950f74e101Schristos                 break;
7960f74e101Schristos 
7970f74e101Schristos             case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
7980f74e101Schristos                 if (obj_tlen < 26)
799c74ad251Schristos                     goto obj_tooshort;
800c74ad251Schristos                 ND_PRINT("%s  IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
801c74ad251Schristos                        indent,
802c74ad251Schristos                        GET_BE_U_4(obj_tptr),
803c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6),
804c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr + 8));
8050f74e101Schristos                 obj_tlen-=26;
8060f74e101Schristos                 obj_tptr+=26;
8070f74e101Schristos                 break;
8080f74e101Schristos             case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
8090f74e101Schristos                 if (obj_tlen < 12)
810c74ad251Schristos                     goto obj_tooshort;
811c74ad251Schristos                 ND_PRINT("%s  IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
812c74ad251Schristos                        indent,
813c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
814c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6),
815c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr + 8));
8160f74e101Schristos                 obj_tlen-=12;
8170f74e101Schristos                 obj_tptr+=12;
8180f74e101Schristos                 break;
8190f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4:
8200f74e101Schristos             case RSVP_CTYPE_UNI_IPV4:
8210f74e101Schristos                 if (obj_tlen < 12)
822c74ad251Schristos                     goto obj_tooshort;
823c74ad251Schristos                 ND_PRINT("%s  IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
824c74ad251Schristos                        indent,
825c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
826c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6),
827c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr + 8));
8280f74e101Schristos                 obj_tlen-=12;
8290f74e101Schristos                 obj_tptr+=12;
8300f74e101Schristos                 break;
8310f74e101Schristos             default:
8320f74e101Schristos                 hexdump=TRUE;
8330f74e101Schristos             }
8340f74e101Schristos             break;
8350f74e101Schristos 
8360f74e101Schristos         case RSVP_OBJ_CONFIRM:
8370f74e101Schristos             switch(rsvp_obj_ctype) {
8380f74e101Schristos             case RSVP_CTYPE_IPV4:
839c74ad251Schristos                 if (obj_tlen < sizeof(nd_ipv4))
840c74ad251Schristos                     goto obj_tooshort;
841c74ad251Schristos                 ND_PRINT("%s  IPv4 Receiver Address: %s",
842c74ad251Schristos                        indent,
843c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr));
844c74ad251Schristos                 obj_tlen-=sizeof(nd_ipv4);
845c74ad251Schristos                 obj_tptr+=sizeof(nd_ipv4);
8460f74e101Schristos                 break;
8470f74e101Schristos             case RSVP_CTYPE_IPV6:
848c74ad251Schristos                 if (obj_tlen < sizeof(nd_ipv6))
849c74ad251Schristos                     goto obj_tooshort;
850c74ad251Schristos                 ND_PRINT("%s  IPv6 Receiver Address: %s",
851c74ad251Schristos                        indent,
852c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr));
853c74ad251Schristos                 obj_tlen-=sizeof(nd_ipv6);
854c74ad251Schristos                 obj_tptr+=sizeof(nd_ipv6);
8550f74e101Schristos                 break;
8560f74e101Schristos             default:
8570f74e101Schristos                 hexdump=TRUE;
8580f74e101Schristos             }
8590f74e101Schristos             break;
8600f74e101Schristos 
8610f74e101Schristos         case RSVP_OBJ_NOTIFY_REQ:
8620f74e101Schristos             switch(rsvp_obj_ctype) {
8630f74e101Schristos             case RSVP_CTYPE_IPV4:
864c74ad251Schristos                 if (obj_tlen < sizeof(nd_ipv4))
865c74ad251Schristos                     goto obj_tooshort;
866c74ad251Schristos                 ND_PRINT("%s  IPv4 Notify Node Address: %s",
867c74ad251Schristos                        indent,
868c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr));
869c74ad251Schristos                 obj_tlen-=sizeof(nd_ipv4);
870c74ad251Schristos                 obj_tptr+=sizeof(nd_ipv4);
8710f74e101Schristos                 break;
8720f74e101Schristos             case RSVP_CTYPE_IPV6:
873c74ad251Schristos                 if (obj_tlen < sizeof(nd_ipv6))
874c74ad251Schristos                     goto obj_tooshort;
875c74ad251Schristos                 ND_PRINT("%s  IPv6 Notify Node Address: %s",
876c74ad251Schristos                        indent,
877c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr));
878c74ad251Schristos                 obj_tlen-=sizeof(nd_ipv6);
879c74ad251Schristos                 obj_tptr+=sizeof(nd_ipv6);
8800f74e101Schristos                 break;
8810f74e101Schristos             default:
8820f74e101Schristos                 hexdump=TRUE;
8830f74e101Schristos             }
8840f74e101Schristos             break;
8850f74e101Schristos 
8860f74e101Schristos         case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
8870f74e101Schristos         case RSVP_OBJ_UPSTREAM_LABEL:  /* fall through */
8880f74e101Schristos         case RSVP_OBJ_RECOVERY_LABEL:  /* fall through */
8890f74e101Schristos         case RSVP_OBJ_LABEL:
8900f74e101Schristos             switch(rsvp_obj_ctype) {
8910f74e101Schristos             case RSVP_CTYPE_1:
8920f74e101Schristos                 while(obj_tlen >= 4 ) {
893c74ad251Schristos                     ND_PRINT("%s  Label: %u", indent, GET_BE_U_4(obj_tptr));
8940f74e101Schristos                     obj_tlen-=4;
8950f74e101Schristos                     obj_tptr+=4;
8960f74e101Schristos                 }
8970f74e101Schristos                 break;
8980f74e101Schristos             case RSVP_CTYPE_2:
8990f74e101Schristos                 if (obj_tlen < 4)
900c74ad251Schristos                     goto obj_tooshort;
901c74ad251Schristos                 ND_PRINT("%s  Generalized Label: %u",
902c74ad251Schristos                        indent,
903c74ad251Schristos                        GET_BE_U_4(obj_tptr));
9040f74e101Schristos                 obj_tlen-=4;
9050f74e101Schristos                 obj_tptr+=4;
9060f74e101Schristos                 break;
9070f74e101Schristos             case RSVP_CTYPE_3:
9080f74e101Schristos                 if (obj_tlen < 12)
909c74ad251Schristos                     goto obj_tooshort;
910c74ad251Schristos                 ND_PRINT("%s  Waveband ID: %u%s  Start Label: %u, Stop Label: %u",
911c74ad251Schristos                        indent,
912c74ad251Schristos                        GET_BE_U_4(obj_tptr),
913c74ad251Schristos                        indent,
914c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4),
915c74ad251Schristos                        GET_BE_U_4(obj_tptr + 8));
9160f74e101Schristos                 obj_tlen-=12;
9170f74e101Schristos                 obj_tptr+=12;
9180f74e101Schristos                 break;
9190f74e101Schristos             default:
9200f74e101Schristos                 hexdump=TRUE;
9210f74e101Schristos             }
9220f74e101Schristos             break;
9230f74e101Schristos 
9240f74e101Schristos         case RSVP_OBJ_STYLE:
9250f74e101Schristos             switch(rsvp_obj_ctype) {
9260f74e101Schristos             case RSVP_CTYPE_1:
9270f74e101Schristos                 if (obj_tlen < 4)
928c74ad251Schristos                     goto obj_tooshort;
929c74ad251Schristos                 ND_PRINT("%s  Reservation Style: %s, Flags: [0x%02x]",
930c74ad251Schristos                        indent,
9310f74e101Schristos                        tok2str(rsvp_resstyle_values,
9320f74e101Schristos                                "Unknown",
933c74ad251Schristos                                GET_BE_U_3(obj_tptr + 1)),
934c74ad251Schristos                        GET_U_1(obj_tptr));
9350f74e101Schristos                 obj_tlen-=4;
9360f74e101Schristos                 obj_tptr+=4;
9370f74e101Schristos                 break;
9380f74e101Schristos             default:
9390f74e101Schristos                 hexdump=TRUE;
9400f74e101Schristos             }
9410f74e101Schristos             break;
9420f74e101Schristos 
9430f74e101Schristos         case RSVP_OBJ_SENDER_TEMPLATE:
9440f74e101Schristos             switch(rsvp_obj_ctype) {
9450f74e101Schristos             case RSVP_CTYPE_IPV4:
9460f74e101Schristos                 if (obj_tlen < 8)
947c74ad251Schristos                     goto obj_tooshort;
948c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
949c74ad251Schristos                        indent,
950c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
951c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6));
9520f74e101Schristos                 obj_tlen-=8;
9530f74e101Schristos                 obj_tptr+=8;
9540f74e101Schristos                 break;
9550f74e101Schristos             case RSVP_CTYPE_IPV6:
9560f74e101Schristos                 if (obj_tlen < 20)
957c74ad251Schristos                     goto obj_tooshort;
958c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
959c74ad251Schristos                        indent,
960c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
961c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18));
9620f74e101Schristos                 obj_tlen-=20;
9630f74e101Schristos                 obj_tptr+=20;
9640f74e101Schristos                 break;
9650f74e101Schristos             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
9660f74e101Schristos                 if (obj_tlen < 40)
967c74ad251Schristos                     goto obj_tooshort;
968c74ad251Schristos                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
9690f74e101Schristos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
970c74ad251Schristos                        indent,
971c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
972c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18),
973c74ad251Schristos                        indent,
974c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+20),
975c74ad251Schristos                        GET_BE_U_2(obj_tptr + 38));
9760f74e101Schristos                 obj_tlen-=40;
9770f74e101Schristos                 obj_tptr+=40;
9780f74e101Schristos                 break;
9790f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4:
9800f74e101Schristos                 if (obj_tlen < 8)
981c74ad251Schristos                     goto obj_tooshort;
982c74ad251Schristos                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
983c74ad251Schristos                        indent,
984c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
985c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6));
9860f74e101Schristos                 obj_tlen-=8;
9870f74e101Schristos                 obj_tptr+=8;
9880f74e101Schristos                 break;
9890f74e101Schristos             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
9900f74e101Schristos                 if (obj_tlen < 16)
991c74ad251Schristos                     goto obj_tooshort;
992c74ad251Schristos                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
9930f74e101Schristos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
994c74ad251Schristos                        indent,
995c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
996c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6),
997c74ad251Schristos                        indent,
998c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+8),
999c74ad251Schristos                        GET_BE_U_2(obj_tptr + 12));
10000f74e101Schristos                 obj_tlen-=16;
10010f74e101Schristos                 obj_tptr+=16;
10020f74e101Schristos                 break;
10030f74e101Schristos             default:
10040f74e101Schristos                 hexdump=TRUE;
10050f74e101Schristos             }
10060f74e101Schristos             break;
10070f74e101Schristos 
10080f74e101Schristos         case RSVP_OBJ_LABEL_REQ:
10090f74e101Schristos             switch(rsvp_obj_ctype) {
10100f74e101Schristos             case RSVP_CTYPE_1:
10110f74e101Schristos                 while(obj_tlen >= 4 ) {
1012c74ad251Schristos                     ND_PRINT("%s  L3 Protocol ID: %s",
1013c74ad251Schristos                            indent,
10140f74e101Schristos                            tok2str(ethertype_values,
10150f74e101Schristos                                    "Unknown Protocol (0x%04x)",
1016c74ad251Schristos                                    GET_BE_U_2(obj_tptr + 2)));
10170f74e101Schristos                     obj_tlen-=4;
10180f74e101Schristos                     obj_tptr+=4;
10190f74e101Schristos                 }
10200f74e101Schristos                 break;
10210f74e101Schristos             case RSVP_CTYPE_2:
10220f74e101Schristos                 if (obj_tlen < 12)
1023c74ad251Schristos                     goto obj_tooshort;
1024c74ad251Schristos                 ND_PRINT("%s  L3 Protocol ID: %s",
1025c74ad251Schristos                        indent,
10260f74e101Schristos                        tok2str(ethertype_values,
10270f74e101Schristos                                "Unknown Protocol (0x%04x)",
1028c74ad251Schristos                                GET_BE_U_2(obj_tptr + 2)));
1029c74ad251Schristos                 ND_PRINT(",%s merge capability",
1030c74ad251Schristos                          ((GET_U_1(obj_tptr + 4)) & 0x80) ? "no" : "" );
1031c74ad251Schristos                 ND_PRINT("%s  Minimum VPI/VCI: %u/%u",
1032c74ad251Schristos                        indent,
1033c74ad251Schristos                        (GET_BE_U_2(obj_tptr + 4))&0xfff,
1034c74ad251Schristos                        (GET_BE_U_2(obj_tptr + 6)) & 0xfff);
1035c74ad251Schristos                 ND_PRINT("%s  Maximum VPI/VCI: %u/%u",
1036c74ad251Schristos                        indent,
1037c74ad251Schristos                        (GET_BE_U_2(obj_tptr + 8))&0xfff,
1038c74ad251Schristos                        (GET_BE_U_2(obj_tptr + 10)) & 0xfff);
10390f74e101Schristos                 obj_tlen-=12;
10400f74e101Schristos                 obj_tptr+=12;
10410f74e101Schristos                 break;
10420f74e101Schristos             case RSVP_CTYPE_3:
10430f74e101Schristos                 if (obj_tlen < 12)
1044c74ad251Schristos                     goto obj_tooshort;
1045c74ad251Schristos                 ND_PRINT("%s  L3 Protocol ID: %s",
1046c74ad251Schristos                        indent,
10470f74e101Schristos                        tok2str(ethertype_values,
10480f74e101Schristos                                "Unknown Protocol (0x%04x)",
1049c74ad251Schristos                                GET_BE_U_2(obj_tptr + 2)));
1050c74ad251Schristos                 ND_PRINT("%s  Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
1051c74ad251Schristos                        indent,
1052c74ad251Schristos                        (GET_BE_U_4(obj_tptr + 4))&0x7fffff,
1053c74ad251Schristos                        (GET_BE_U_4(obj_tptr + 8))&0x7fffff,
1054c74ad251Schristos                        (((GET_BE_U_2(obj_tptr + 4)>>7)&3) == 0 ) ? "10" : "",
1055c74ad251Schristos                        (((GET_BE_U_2(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : "");
10560f74e101Schristos                 obj_tlen-=12;
10570f74e101Schristos                 obj_tptr+=12;
10580f74e101Schristos                 break;
10590f74e101Schristos             case RSVP_CTYPE_4:
10600f74e101Schristos                 if (obj_tlen < 4)
1061c74ad251Schristos                     goto obj_tooshort;
1062c74ad251Schristos                 ND_PRINT("%s  LSP Encoding Type: %s (%u)",
1063c74ad251Schristos                        indent,
10640f74e101Schristos                        tok2str(gmpls_encoding_values,
10650f74e101Schristos                                "Unknown",
1066c74ad251Schristos                                GET_U_1(obj_tptr)),
1067c74ad251Schristos                        GET_U_1(obj_tptr));
1068c74ad251Schristos                 ND_PRINT("%s  Switching Type: %s (%u), Payload ID: %s (0x%04x)",
1069c74ad251Schristos                        indent,
10700f74e101Schristos                        tok2str(gmpls_switch_cap_values,
10710f74e101Schristos                                "Unknown",
1072c74ad251Schristos                                GET_U_1((obj_tptr + 1))),
1073c74ad251Schristos                        GET_U_1(obj_tptr + 1),
10740f74e101Schristos                        tok2str(gmpls_payload_values,
10750f74e101Schristos                                "Unknown",
1076c74ad251Schristos                                GET_BE_U_2(obj_tptr + 2)),
1077c74ad251Schristos                        GET_BE_U_2(obj_tptr + 2));
10780f74e101Schristos                 obj_tlen-=4;
10790f74e101Schristos                 obj_tptr+=4;
10800f74e101Schristos                 break;
10810f74e101Schristos             default:
10820f74e101Schristos                 hexdump=TRUE;
10830f74e101Schristos             }
10840f74e101Schristos             break;
10850f74e101Schristos 
10860f74e101Schristos         case RSVP_OBJ_RRO:
10870f74e101Schristos         case RSVP_OBJ_ERO:
10880f74e101Schristos             switch(rsvp_obj_ctype) {
10890f74e101Schristos             case RSVP_CTYPE_IPV4:
10900f74e101Schristos                 while(obj_tlen >= 4 ) {
1091fdccd7e4Schristos 		    u_char length;
1092fdccd7e4Schristos 
1093c74ad251Schristos 		    ND_TCHECK_4(obj_tptr);
1094c74ad251Schristos 		    length = GET_U_1(obj_tptr + 1);
1095c74ad251Schristos                     ND_PRINT("%s  Subobject Type: %s, length %u",
1096c74ad251Schristos                            indent,
10970f74e101Schristos                            tok2str(rsvp_obj_xro_values,
10980f74e101Schristos                                    "Unknown %u",
1099c74ad251Schristos                                    RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))),
1100c74ad251Schristos                            length);
1101c74ad251Schristos                     if (obj_tlen < length) {
1102c74ad251Schristos                         ND_PRINT("%s  ERROR: ERO subobject length > object length", indent);
11030f74e101Schristos                         break;
11040f74e101Schristos                     }
11050f74e101Schristos 
1106c74ad251Schristos                     if (length == 0) { /* prevent infinite loops */
1107c74ad251Schristos                         ND_PRINT("%s  ERROR: zero length ERO subtype", indent);
1108c74ad251Schristos                         break;
1109c74ad251Schristos                     }
1110c74ad251Schristos 
1111c74ad251Schristos                     switch(RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))) {
1112fdccd7e4Schristos 		    u_char prefix_length;
1113fdccd7e4Schristos 
11140f74e101Schristos                     case RSVP_OBJ_XRO_IPV4:
1115fdccd7e4Schristos 			if (length != 8) {
1116c74ad251Schristos 				ND_PRINT(" ERROR: length != 8");
1117fdccd7e4Schristos 				goto invalid;
1118fdccd7e4Schristos 			}
1119c74ad251Schristos 			ND_TCHECK_8(obj_tptr);
1120c74ad251Schristos 			prefix_length = GET_U_1(obj_tptr + 6);
1121fdccd7e4Schristos 			if (prefix_length != 32) {
1122c74ad251Schristos 				ND_PRINT(" ERROR: Prefix length %u != 32",
1123c74ad251Schristos 					  prefix_length);
1124fdccd7e4Schristos 				goto invalid;
1125fdccd7e4Schristos 			}
1126c74ad251Schristos                         ND_PRINT(", %s, %s/%u, Flags: [%s]",
1127c74ad251Schristos                                RSVP_OBJ_XRO_MASK_LOOSE(GET_U_1(obj_tptr)) ? "Loose" : "Strict",
1128c74ad251Schristos                                GET_IPADDR_STRING(obj_tptr+2),
1129c74ad251Schristos                                GET_U_1((obj_tptr + 6)),
11300f74e101Schristos                                bittok2str(rsvp_obj_rro_flag_values,
11310f74e101Schristos                                    "none",
1132c74ad251Schristos                                    GET_U_1((obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
11330f74e101Schristos                     break;
11340f74e101Schristos                     case RSVP_OBJ_XRO_LABEL:
1135fdccd7e4Schristos 			if (length != 8) {
1136c74ad251Schristos 				ND_PRINT(" ERROR: length != 8");
1137fdccd7e4Schristos 				goto invalid;
1138fdccd7e4Schristos 			}
1139c74ad251Schristos 			ND_TCHECK_8(obj_tptr);
1140c74ad251Schristos                         ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
11410f74e101Schristos                                bittok2str(rsvp_obj_rro_label_flag_values,
11420f74e101Schristos                                    "none",
1143c74ad251Schristos                                    GET_U_1((obj_tptr + 2))),
1144c74ad251Schristos                                GET_U_1(obj_tptr + 2),
11450f74e101Schristos                                tok2str(rsvp_ctype_values,
11460f74e101Schristos                                        "Unknown",
1147c74ad251Schristos                                        GET_U_1((obj_tptr + 3)) + (256 * RSVP_OBJ_RRO)),
1148c74ad251Schristos                                GET_U_1((obj_tptr + 3)),
1149c74ad251Schristos                                GET_BE_U_4(obj_tptr + 4));
11500f74e101Schristos                     }
1151c74ad251Schristos                     obj_tlen-=length;
1152c74ad251Schristos                     obj_tptr+=length;
11530f74e101Schristos                 }
11540f74e101Schristos                 break;
11550f74e101Schristos             default:
11560f74e101Schristos                 hexdump=TRUE;
11570f74e101Schristos             }
11580f74e101Schristos             break;
11590f74e101Schristos 
11600f74e101Schristos         case RSVP_OBJ_HELLO:
11610f74e101Schristos             switch(rsvp_obj_ctype) {
11620f74e101Schristos             case RSVP_CTYPE_1:
11630f74e101Schristos             case RSVP_CTYPE_2:
11640f74e101Schristos                 if (obj_tlen < 8)
1165c74ad251Schristos                     goto obj_tooshort;
1166c74ad251Schristos                 ND_PRINT("%s  Source Instance: 0x%08x, Destination Instance: 0x%08x",
1167c74ad251Schristos                        indent,
1168c74ad251Schristos                        GET_BE_U_4(obj_tptr),
1169c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4));
11700f74e101Schristos                 obj_tlen-=8;
11710f74e101Schristos                 obj_tptr+=8;
11720f74e101Schristos                 break;
11730f74e101Schristos             default:
11740f74e101Schristos                 hexdump=TRUE;
11750f74e101Schristos             }
11760f74e101Schristos             break;
11770f74e101Schristos 
11780f74e101Schristos         case RSVP_OBJ_RESTART_CAPABILITY:
11790f74e101Schristos             switch(rsvp_obj_ctype) {
11800f74e101Schristos             case RSVP_CTYPE_1:
11810f74e101Schristos                 if (obj_tlen < 8)
1182c74ad251Schristos                     goto obj_tooshort;
1183c74ad251Schristos                 ND_PRINT("%s  Restart  Time: %ums, Recovery Time: %ums",
1184c74ad251Schristos                        indent,
1185c74ad251Schristos                        GET_BE_U_4(obj_tptr),
1186c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4));
11870f74e101Schristos                 obj_tlen-=8;
11880f74e101Schristos                 obj_tptr+=8;
11890f74e101Schristos                 break;
11900f74e101Schristos             default:
11910f74e101Schristos                 hexdump=TRUE;
11920f74e101Schristos             }
11930f74e101Schristos             break;
11940f74e101Schristos 
1195c74ad251Schristos         case RSVP_OBJ_CAPABILITY:
1196c74ad251Schristos             switch(rsvp_obj_ctype) {
1197c74ad251Schristos             case RSVP_CTYPE_1:
1198c74ad251Schristos                 if (obj_tlen < 4)
1199c74ad251Schristos                     goto obj_tooshort;
1200c74ad251Schristos                 uint32_t unused_and_flags = GET_BE_U_4(obj_tptr);
1201c74ad251Schristos                 if (unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK)
1202c74ad251Schristos                     ND_PRINT("%s  [reserved=0x%08x must be zero]", indent,
1203c74ad251Schristos                         unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK);
1204c74ad251Schristos                 ND_PRINT("%s  Flags: [%s]",
1205c74ad251Schristos                        indent,
1206c74ad251Schristos                        bittok2str(rsvp_obj_capability_flag_values,
1207c74ad251Schristos                                   "none",
1208c74ad251Schristos                                   (unused_and_flags & RSVP_OBJ_CAPABILITY_FLAGS_MASK)));
1209c74ad251Schristos                 obj_tlen-=4;
1210c74ad251Schristos                 obj_tptr+=4;
1211c74ad251Schristos                 break;
1212c74ad251Schristos             default:
1213c74ad251Schristos                 hexdump=TRUE;
1214c74ad251Schristos             }
1215c74ad251Schristos             break;
1216c74ad251Schristos 
12170f74e101Schristos         case RSVP_OBJ_SESSION_ATTRIBUTE:
12180f74e101Schristos             switch(rsvp_obj_ctype) {
12190f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4:
12200f74e101Schristos                 if (obj_tlen < 4)
1221c74ad251Schristos                     goto obj_tooshort;
1222c74ad251Schristos                 namelen = GET_U_1(obj_tptr + 3);
12230f74e101Schristos                 if (obj_tlen < 4+namelen)
1224c74ad251Schristos                     goto obj_tooshort;
1225c74ad251Schristos                 ND_PRINT("%s  Session Name: ", indent);
12260f74e101Schristos                 for (i = 0; i < namelen; i++)
1227c74ad251Schristos                     fn_print_char(ndo, GET_U_1(obj_tptr + 4 + i));
1228c74ad251Schristos                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
1229c74ad251Schristos                        indent,
1230c74ad251Schristos                        GET_U_1(obj_tptr),
1231c74ad251Schristos                        GET_U_1(obj_tptr + 1),
12320f74e101Schristos                        bittok2str(rsvp_session_attribute_flag_values,
12330f74e101Schristos                                   "none",
1234c74ad251Schristos                                   GET_U_1((obj_tptr + 2))),
1235c74ad251Schristos                        GET_U_1(obj_tptr + 2));
1236c74ad251Schristos                 obj_tlen-=4+namelen;
1237c74ad251Schristos                 obj_tptr+=4+namelen;
12380f74e101Schristos                 break;
12390f74e101Schristos             default:
12400f74e101Schristos                 hexdump=TRUE;
12410f74e101Schristos             }
12420f74e101Schristos             break;
12430f74e101Schristos 
12440f74e101Schristos 	case RSVP_OBJ_GENERALIZED_UNI:
12450f74e101Schristos             switch(rsvp_obj_ctype) {
1246c74ad251Schristos 		u_int subobj_type,af,subobj_len,total_subobj_len;
12470f74e101Schristos 
12480f74e101Schristos             case RSVP_CTYPE_1:
12490f74e101Schristos 
12500f74e101Schristos                 if (obj_tlen < 4)
1251c74ad251Schristos                     goto obj_tooshort;
12520f74e101Schristos 
12530f74e101Schristos 		/* read variable length subobjects */
12540f74e101Schristos 		total_subobj_len = obj_tlen;
12550f74e101Schristos                 while(total_subobj_len > 0) {
125672c96ff3Schristos                     /* If RFC 3476 Section 3.1 defined that a sub-object of the
125772c96ff3Schristos                      * GENERALIZED_UNI RSVP object must have the Length field as
125872c96ff3Schristos                      * a multiple of 4, instead of the check below it would be
125972c96ff3Schristos                      * better to test total_subobj_len only once before the loop.
126072c96ff3Schristos                      * So long as it does not define it and this while loop does
126172c96ff3Schristos                      * not implement such a requirement, let's accept that within
126272c96ff3Schristos                      * each iteration subobj_len may happen to be a multiple of 1
126372c96ff3Schristos                      * and test it and total_subobj_len respectively.
126472c96ff3Schristos                      */
126572c96ff3Schristos                     if (total_subobj_len < 4)
126672c96ff3Schristos                         goto invalid;
1267c74ad251Schristos                     subobj_len  = GET_BE_U_2(obj_tptr);
1268c74ad251Schristos                     subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8;
1269c74ad251Schristos                     af = (GET_BE_U_2(obj_tptr + 2))&0x00FF;
12700f74e101Schristos 
1271c74ad251Schristos                     ND_PRINT("%s  Subobject Type: %s (%u), AF: %s (%u), length: %u",
1272c74ad251Schristos                            indent,
12730f74e101Schristos                            tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
12740f74e101Schristos                            subobj_type,
12750f74e101Schristos                            tok2str(af_values, "Unknown", af), af,
1276c74ad251Schristos                            subobj_len);
12770f74e101Schristos 
127872c96ff3Schristos                     /* In addition to what is explained above, the same spec does not
127972c96ff3Schristos                      * explicitly say that the same Length field includes the 4-octet
128072c96ff3Schristos                      * sub-object header, but as long as this while loop implements it
128172c96ff3Schristos                      * as it does include, let's keep the check below consistent with
128272c96ff3Schristos                      * the rest of the code.
1283c74ad251Schristos                      *
1284c74ad251Schristos                      * XXX - RFC 3476 Section 3.1 says "The contents of these
1285c74ad251Schristos                      * sub-objects are described in [8]", where [8] is
1286c74ad251Schristos                      * UNI 1.0 Signaling Specification, The Optical
1287c74ad251Schristos                      * Internetworking Forum.  The URL they give for that
1288c74ad251Schristos                      * document is
1289c74ad251Schristos                      *
1290c74ad251Schristos                      *    http://www.oiforum.com/public/UNI_1.0_ia.html
1291c74ad251Schristos                      *
1292c74ad251Schristos                      * but that doesn't work; the new URL appears to be
1293c74ad251Schristos                      *
1294c74ad251Schristos                      *    https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf
1295c74ad251Schristos                      *
1296c74ad251Schristos                      * and *that* document, in section 12.5.2.3
1297c74ad251Schristos                      * "GENERALIZED_UNI Object (Class-Num=11bbbbbb (TBA))",
1298c74ad251Schristos                      * says nothing about the length field in general, but
1299c74ad251Schristos                      * some of the examples it gives in subsections have
1300c74ad251Schristos                      * length field values that clearly includes the length
1301c74ad251Schristos                      * of the sub-object header as well as the length of the
1302c74ad251Schristos                      * value.
130372c96ff3Schristos                      */
1304c74ad251Schristos                     if(subobj_len < 4 || subobj_len > total_subobj_len ||
1305c74ad251Schristos                        obj_tlen < subobj_len)
1306fdccd7e4Schristos                         goto invalid;
1307fdccd7e4Schristos 
13080f74e101Schristos                     switch(subobj_type) {
13090f74e101Schristos                     case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
13100f74e101Schristos                     case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
13110f74e101Schristos 
13120f74e101Schristos                         switch(af) {
13130f74e101Schristos                         case AFNUM_INET:
13140f74e101Schristos                             if (subobj_len < 8)
1315c74ad251Schristos                                 goto subobj_tooshort;
1316c74ad251Schristos                             ND_PRINT("%s    UNI IPv4 TNA address: %s",
1317c74ad251Schristos                                    indent, GET_IPADDR_STRING(obj_tptr + 4));
13180f74e101Schristos                             break;
13190f74e101Schristos                         case AFNUM_INET6:
13200f74e101Schristos                             if (subobj_len < 20)
1321c74ad251Schristos                                 goto subobj_tooshort;
1322c74ad251Schristos                             ND_PRINT("%s    UNI IPv6 TNA address: %s",
1323c74ad251Schristos                                    indent, GET_IP6ADDR_STRING(obj_tptr + 4));
13240f74e101Schristos                             break;
13250f74e101Schristos                         case AFNUM_NSAP:
13260f74e101Schristos                             if (subobj_len) {
13270f74e101Schristos                                 /* unless we have a TLV parser lets just hexdump */
13280f74e101Schristos                                 hexdump=TRUE;
13290f74e101Schristos                             }
13300f74e101Schristos                             break;
13310f74e101Schristos                         }
13320f74e101Schristos                         break;
13330f74e101Schristos 
13340f74e101Schristos                     case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
1335c74ad251Schristos                         if (subobj_len > 4) {
13360f74e101Schristos                             /* unless we have a TLV parser lets just hexdump */
13370f74e101Schristos                             hexdump=TRUE;
13380f74e101Schristos                         }
13390f74e101Schristos                         break;
13400f74e101Schristos 
13410f74e101Schristos                     case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
13420f74e101Schristos                         if (subobj_len < 16) {
1343c74ad251Schristos                             goto subobj_tooshort;
13440f74e101Schristos                         }
13450f74e101Schristos 
1346c74ad251Schristos                         ND_PRINT("%s    U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
1347c74ad251Schristos                                indent,
1348c74ad251Schristos                                ((GET_BE_U_4(obj_tptr + 4))>>31),
1349c74ad251Schristos                                ((GET_BE_U_4(obj_tptr + 4))&0xFF),
1350c74ad251Schristos                                GET_BE_U_4(obj_tptr + 8),
1351c74ad251Schristos                                GET_BE_U_4(obj_tptr + 12));
13520f74e101Schristos                         break;
13530f74e101Schristos 
13540f74e101Schristos                     case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
13550f74e101Schristos                         if (subobj_len < 8) {
1356c74ad251Schristos                             goto subobj_tooshort;
13570f74e101Schristos                         }
13580f74e101Schristos 
1359c74ad251Schristos                         ND_PRINT("%s    Service level: %u",
1360c74ad251Schristos                                indent, (GET_BE_U_4(obj_tptr + 4)) >> 24);
13610f74e101Schristos                         break;
13620f74e101Schristos 
13630f74e101Schristos                     default:
13640f74e101Schristos                         hexdump=TRUE;
13650f74e101Schristos                         break;
13660f74e101Schristos                     }
13670f74e101Schristos                     total_subobj_len-=subobj_len;
13680f74e101Schristos                     obj_tptr+=subobj_len;
13690f74e101Schristos                     obj_tlen+=subobj_len;
13700f74e101Schristos 		}
13710f74e101Schristos                 break;
13720f74e101Schristos 
13730f74e101Schristos             default:
13740f74e101Schristos                 hexdump=TRUE;
13750f74e101Schristos             }
13760f74e101Schristos             break;
13770f74e101Schristos 
13780f74e101Schristos         case RSVP_OBJ_RSVP_HOP:
13790f74e101Schristos             switch(rsvp_obj_ctype) {
13800f74e101Schristos             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
13810f74e101Schristos             case RSVP_CTYPE_IPV4:
13820f74e101Schristos                 if (obj_tlen < 8)
1383c74ad251Schristos                     goto obj_tooshort;
1384c74ad251Schristos                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1385c74ad251Schristos                        indent,
1386c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1387c74ad251Schristos                        GET_BE_U_4(obj_tptr + 4));
13880f74e101Schristos                 obj_tlen-=8;
13890f74e101Schristos                 obj_tptr+=8;
13900f74e101Schristos                 if (obj_tlen)
13910f74e101Schristos                     hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
13920f74e101Schristos                 break;
13930f74e101Schristos             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
13940f74e101Schristos             case RSVP_CTYPE_IPV6:
13950f74e101Schristos                 if (obj_tlen < 20)
1396c74ad251Schristos                     goto obj_tooshort;
1397c74ad251Schristos                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1398c74ad251Schristos                        indent,
1399c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
1400c74ad251Schristos                        GET_BE_U_4(obj_tptr + 16));
14010f74e101Schristos                 obj_tlen-=20;
14020f74e101Schristos                 obj_tptr+=20;
14030f74e101Schristos                 hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
14040f74e101Schristos                 break;
14050f74e101Schristos             default:
14060f74e101Schristos                 hexdump=TRUE;
14070f74e101Schristos             }
14080f74e101Schristos             break;
14090f74e101Schristos 
14100f74e101Schristos         case RSVP_OBJ_TIME_VALUES:
14110f74e101Schristos             switch(rsvp_obj_ctype) {
14120f74e101Schristos             case RSVP_CTYPE_1:
14130f74e101Schristos                 if (obj_tlen < 4)
1414c74ad251Schristos                     goto obj_tooshort;
1415c74ad251Schristos                 ND_PRINT("%s  Refresh Period: %ums",
1416c74ad251Schristos                        indent,
1417c74ad251Schristos                        GET_BE_U_4(obj_tptr));
14180f74e101Schristos                 obj_tlen-=4;
14190f74e101Schristos                 obj_tptr+=4;
14200f74e101Schristos                 break;
14210f74e101Schristos             default:
14220f74e101Schristos                 hexdump=TRUE;
14230f74e101Schristos             }
14240f74e101Schristos             break;
14250f74e101Schristos 
14260f74e101Schristos         /* those three objects do share the same semantics */
14270f74e101Schristos         case RSVP_OBJ_SENDER_TSPEC:
14280f74e101Schristos         case RSVP_OBJ_ADSPEC:
14290f74e101Schristos         case RSVP_OBJ_FLOWSPEC:
14300f74e101Schristos             switch(rsvp_obj_ctype) {
14310f74e101Schristos             case RSVP_CTYPE_2:
14320f74e101Schristos                 if (obj_tlen < 4)
1433c74ad251Schristos                     goto obj_tooshort;
1434c74ad251Schristos                 ND_PRINT("%s  Msg-Version: %u, length: %u",
1435c74ad251Schristos                        indent,
1436c74ad251Schristos                        (GET_U_1(obj_tptr) & 0xf0) >> 4,
1437c74ad251Schristos                        GET_BE_U_2(obj_tptr + 2) << 2);
14380f74e101Schristos                 obj_tptr+=4; /* get to the start of the service header */
14390f74e101Schristos                 obj_tlen-=4;
14400f74e101Schristos 
14410f74e101Schristos                 while (obj_tlen >= 4) {
1442c74ad251Schristos                     intserv_serv_tlen=GET_BE_U_2(obj_tptr + 2)<<2;
1443c74ad251Schristos                     ND_PRINT("%s  Service Type: %s (%u), break bit %sset, Service length: %u",
1444c74ad251Schristos                            indent,
1445c74ad251Schristos                            tok2str(rsvp_intserv_service_type_values,"unknown",GET_U_1((obj_tptr))),
1446c74ad251Schristos                            GET_U_1(obj_tptr),
1447c74ad251Schristos                            (GET_U_1(obj_tptr + 1)&0x80) ? "" : "not ",
1448c74ad251Schristos                            intserv_serv_tlen);
14490f74e101Schristos 
14500f74e101Schristos                     obj_tptr+=4; /* get to the start of the parameter list */
14510f74e101Schristos                     obj_tlen-=4;
14520f74e101Schristos 
14530f74e101Schristos                     while (intserv_serv_tlen>=4) {
1454b3a00663Schristos                         processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
14550f74e101Schristos                         if (processed == 0)
14560f74e101Schristos                             break;
14570f74e101Schristos                         obj_tlen-=processed;
14580f74e101Schristos                         intserv_serv_tlen-=processed;
14590f74e101Schristos                         obj_tptr+=processed;
14600f74e101Schristos                     }
14610f74e101Schristos                 }
14620f74e101Schristos                 break;
14630f74e101Schristos             default:
14640f74e101Schristos                 hexdump=TRUE;
14650f74e101Schristos             }
14660f74e101Schristos             break;
14670f74e101Schristos 
14680f74e101Schristos         case RSVP_OBJ_FILTERSPEC:
14690f74e101Schristos             switch(rsvp_obj_ctype) {
14700f74e101Schristos             case RSVP_CTYPE_IPV4:
14710f74e101Schristos                 if (obj_tlen < 8)
1472c74ad251Schristos                     goto obj_tooshort;
1473c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1474c74ad251Schristos                        indent,
1475c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1476c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6));
14770f74e101Schristos                 obj_tlen-=8;
14780f74e101Schristos                 obj_tptr+=8;
14790f74e101Schristos                 break;
14800f74e101Schristos             case RSVP_CTYPE_IPV6:
14810f74e101Schristos                 if (obj_tlen < 20)
1482c74ad251Schristos                     goto obj_tooshort;
1483c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1484c74ad251Schristos                        indent,
1485c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
1486c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18));
14870f74e101Schristos                 obj_tlen-=20;
14880f74e101Schristos                 obj_tptr+=20;
14890f74e101Schristos                 break;
14900f74e101Schristos             case RSVP_CTYPE_3:
14910f74e101Schristos                 if (obj_tlen < 20)
1492c74ad251Schristos                     goto obj_tooshort;
1493c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, Flow Label: %u",
1494c74ad251Schristos                        indent,
1495c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
1496c74ad251Schristos                        GET_BE_U_3(obj_tptr + 17));
14970f74e101Schristos                 obj_tlen-=20;
14980f74e101Schristos                 obj_tptr+=20;
14990f74e101Schristos                 break;
15000f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV6:
15010f74e101Schristos                 if (obj_tlen < 20)
1502c74ad251Schristos                     goto obj_tooshort;
1503c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1504c74ad251Schristos                        indent,
1505c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1506c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18));
15070f74e101Schristos                 obj_tlen-=20;
15080f74e101Schristos                 obj_tptr+=20;
15090f74e101Schristos                 break;
15100f74e101Schristos             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
15110f74e101Schristos                 if (obj_tlen < 40)
1512c74ad251Schristos                     goto obj_tooshort;
1513c74ad251Schristos                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
15140f74e101Schristos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1515c74ad251Schristos                        indent,
1516c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
1517c74ad251Schristos                        GET_BE_U_2(obj_tptr + 18),
1518c74ad251Schristos                        indent,
1519c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr+20),
1520c74ad251Schristos                        GET_BE_U_2(obj_tptr + 38));
15210f74e101Schristos                 obj_tlen-=40;
15220f74e101Schristos                 obj_tptr+=40;
15230f74e101Schristos                 break;
15240f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4:
15250f74e101Schristos                 if (obj_tlen < 8)
1526c74ad251Schristos                     goto obj_tooshort;
1527c74ad251Schristos                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1528c74ad251Schristos                        indent,
1529c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1530c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6));
15310f74e101Schristos                 obj_tlen-=8;
15320f74e101Schristos                 obj_tptr+=8;
15330f74e101Schristos                 break;
15340f74e101Schristos             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
15350f74e101Schristos                 if (obj_tlen < 16)
1536c74ad251Schristos                     goto obj_tooshort;
1537c74ad251Schristos                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
15380f74e101Schristos                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1539c74ad251Schristos                        indent,
1540c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1541c74ad251Schristos                        GET_BE_U_2(obj_tptr + 6),
1542c74ad251Schristos                        indent,
1543c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr+8),
1544c74ad251Schristos                        GET_BE_U_2(obj_tptr + 12));
15450f74e101Schristos                 obj_tlen-=16;
15460f74e101Schristos                 obj_tptr+=16;
15470f74e101Schristos                 break;
15480f74e101Schristos             default:
15490f74e101Schristos                 hexdump=TRUE;
15500f74e101Schristos             }
15510f74e101Schristos             break;
15520f74e101Schristos 
15530f74e101Schristos         case RSVP_OBJ_FASTREROUTE:
15540f74e101Schristos             /* the differences between c-type 1 and 7 are minor */
15550f74e101Schristos             obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
15560f74e101Schristos 
15570f74e101Schristos             switch(rsvp_obj_ctype) {
15580f74e101Schristos             case RSVP_CTYPE_1: /* new style */
15590f74e101Schristos                 if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
1560c74ad251Schristos                     goto obj_tooshort;
1561c74ad251Schristos                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1562c74ad251Schristos                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1563c74ad251Schristos                        indent,
1564c74ad251Schristos                        obj_ptr.rsvp_obj_frr->setup_prio,
1565c74ad251Schristos                        obj_ptr.rsvp_obj_frr->hold_prio,
1566c74ad251Schristos                        obj_ptr.rsvp_obj_frr->hop_limit,
1567c74ad251Schristos                        bw.f * 8 / 1000000);
1568c74ad251Schristos                 ND_PRINT("%s  Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
1569c74ad251Schristos                        indent,
1570c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1571c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any),
1572c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all));
15730f74e101Schristos                 obj_tlen-=sizeof(struct rsvp_obj_frr_t);
15740f74e101Schristos                 obj_tptr+=sizeof(struct rsvp_obj_frr_t);
15750f74e101Schristos                 break;
15760f74e101Schristos 
15770f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
15780f74e101Schristos                 if (obj_tlen < 16)
1579c74ad251Schristos                     goto obj_tooshort;
1580c74ad251Schristos                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1581c74ad251Schristos                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1582c74ad251Schristos                        indent,
1583c74ad251Schristos                        obj_ptr.rsvp_obj_frr->setup_prio,
1584c74ad251Schristos                        obj_ptr.rsvp_obj_frr->hold_prio,
1585c74ad251Schristos                        obj_ptr.rsvp_obj_frr->hop_limit,
1586c74ad251Schristos                        bw.f * 8 / 1000000);
1587c74ad251Schristos                 ND_PRINT("%s  Include Colors: 0x%08x, Exclude Colors: 0x%08x",
1588c74ad251Schristos                        indent,
1589c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1590c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any));
15910f74e101Schristos                 obj_tlen-=16;
15920f74e101Schristos                 obj_tptr+=16;
15930f74e101Schristos                 break;
15940f74e101Schristos 
15950f74e101Schristos             default:
15960f74e101Schristos                 hexdump=TRUE;
15970f74e101Schristos             }
15980f74e101Schristos             break;
15990f74e101Schristos 
16000f74e101Schristos         case RSVP_OBJ_DETOUR:
16010f74e101Schristos             switch(rsvp_obj_ctype) {
16020f74e101Schristos             case RSVP_CTYPE_TUNNEL_IPV4:
16030f74e101Schristos                 while(obj_tlen >= 8) {
1604c74ad251Schristos                     ND_PRINT("%s  PLR-ID: %s, Avoid-Node-ID: %s",
1605c74ad251Schristos                            indent,
1606c74ad251Schristos                            GET_IPADDR_STRING(obj_tptr),
1607c74ad251Schristos                            GET_IPADDR_STRING(obj_tptr + 4));
16080f74e101Schristos                     obj_tlen-=8;
16090f74e101Schristos                     obj_tptr+=8;
16100f74e101Schristos                 }
16110f74e101Schristos                 break;
16120f74e101Schristos             default:
16130f74e101Schristos                 hexdump=TRUE;
16140f74e101Schristos             }
16150f74e101Schristos             break;
16160f74e101Schristos 
16170f74e101Schristos         case RSVP_OBJ_CLASSTYPE:
16180f74e101Schristos         case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
16190f74e101Schristos             switch(rsvp_obj_ctype) {
16200f74e101Schristos             case RSVP_CTYPE_1:
1621c74ad251Schristos                 if (obj_tlen < 4)
1622c74ad251Schristos                     goto obj_tooshort;
1623c74ad251Schristos                 ND_PRINT("%s  CT: %u",
1624c74ad251Schristos                        indent,
1625c74ad251Schristos                        GET_BE_U_4(obj_tptr) & 0x7);
16260f74e101Schristos                 obj_tlen-=4;
16270f74e101Schristos                 obj_tptr+=4;
16280f74e101Schristos                 break;
16290f74e101Schristos             default:
16300f74e101Schristos                 hexdump=TRUE;
16310f74e101Schristos             }
16320f74e101Schristos             break;
16330f74e101Schristos 
16340f74e101Schristos         case RSVP_OBJ_ERROR_SPEC:
16350f74e101Schristos             switch(rsvp_obj_ctype) {
16360f74e101Schristos             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
16370f74e101Schristos             case RSVP_CTYPE_IPV4:
16380f74e101Schristos                 if (obj_tlen < 8)
1639c74ad251Schristos                     goto obj_tooshort;
1640c74ad251Schristos                 error_code=GET_U_1(obj_tptr + 5);
1641c74ad251Schristos                 error_value=GET_BE_U_2(obj_tptr + 6);
1642c74ad251Schristos                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1643c74ad251Schristos                        indent,
1644c74ad251Schristos                        GET_IPADDR_STRING(obj_tptr),
1645c74ad251Schristos                        GET_U_1(obj_tptr + 4),
1646c74ad251Schristos                        indent,
16470f74e101Schristos                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1648c74ad251Schristos                        error_code);
16490f74e101Schristos                 switch (error_code) {
16500f74e101Schristos                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1651c74ad251Schristos                     ND_PRINT(", Error Value: %s (%u)",
16520f74e101Schristos                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1653c74ad251Schristos                            error_value);
16540f74e101Schristos                     break;
16550f74e101Schristos                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
16560f74e101Schristos                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
1657c74ad251Schristos                     ND_PRINT(", Error Value: %s (%u)",
16580f74e101Schristos                            tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
1659c74ad251Schristos                            error_value);
16600f74e101Schristos                     break;
16610f74e101Schristos                 default:
1662c74ad251Schristos                     ND_PRINT(", Unknown Error Value (%u)", error_value);
16630f74e101Schristos                     break;
16640f74e101Schristos                 }
16650f74e101Schristos                 obj_tlen-=8;
16660f74e101Schristos                 obj_tptr+=8;
16670f74e101Schristos                 break;
16680f74e101Schristos             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
16690f74e101Schristos             case RSVP_CTYPE_IPV6:
16700f74e101Schristos                 if (obj_tlen < 20)
1671c74ad251Schristos                     goto obj_tooshort;
1672c74ad251Schristos                 error_code=GET_U_1(obj_tptr + 17);
1673c74ad251Schristos                 error_value=GET_BE_U_2(obj_tptr + 18);
1674c74ad251Schristos                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1675c74ad251Schristos                        indent,
1676c74ad251Schristos                        GET_IP6ADDR_STRING(obj_tptr),
1677c74ad251Schristos                        GET_U_1(obj_tptr + 16),
1678c74ad251Schristos                        indent,
16790f74e101Schristos                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1680c74ad251Schristos                        error_code);
16810f74e101Schristos 
16820f74e101Schristos                 switch (error_code) {
16830f74e101Schristos                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1684c74ad251Schristos                     ND_PRINT(", Error Value: %s (%u)",
16850f74e101Schristos                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1686c74ad251Schristos 			   error_value);
16870f74e101Schristos                     break;
16880f74e101Schristos                 default:
16890f74e101Schristos                     break;
16900f74e101Schristos                 }
16910f74e101Schristos                 obj_tlen-=20;
16920f74e101Schristos                 obj_tptr+=20;
16930f74e101Schristos                 break;
16940f74e101Schristos             default:
16950f74e101Schristos                 hexdump=TRUE;
16960f74e101Schristos             }
16970f74e101Schristos             break;
16980f74e101Schristos 
16990f74e101Schristos         case RSVP_OBJ_PROPERTIES:
17000f74e101Schristos             switch(rsvp_obj_ctype) {
17010f74e101Schristos             case RSVP_CTYPE_1:
17020f74e101Schristos                 if (obj_tlen < 4)
1703c74ad251Schristos                     goto obj_tooshort;
1704c74ad251Schristos                 padbytes = GET_BE_U_2(obj_tptr + 2);
1705c74ad251Schristos                 ND_PRINT("%s  TLV count: %u, padding bytes: %u",
1706c74ad251Schristos                        indent,
1707c74ad251Schristos                        GET_BE_U_2(obj_tptr),
1708c74ad251Schristos                        padbytes);
17090f74e101Schristos                 obj_tlen-=4;
17100f74e101Schristos                 obj_tptr+=4;
17110f74e101Schristos                 /* loop through as long there is anything longer than the TLV header (2) */
17120f74e101Schristos                 while(obj_tlen >= 2 + padbytes) {
1713c74ad251Schristos                     ND_PRINT("%s    %s TLV (0x%02x), length: %u", /* length includes header */
1714c74ad251Schristos                            indent,
1715c74ad251Schristos                            tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)),
1716c74ad251Schristos                            GET_U_1(obj_tptr),
1717c74ad251Schristos                            GET_U_1(obj_tptr + 1));
1718c74ad251Schristos                     if (obj_tlen < GET_U_1(obj_tptr + 1))
1719c74ad251Schristos                         goto obj_tooshort;
1720c74ad251Schristos                     if (GET_U_1(obj_tptr + 1) < 2) {
1721c74ad251Schristos                         ND_PRINT("%sERROR: property TLV is too short", indent);
17220f74e101Schristos                         return -1;
1723c74ad251Schristos                     }
1724c74ad251Schristos                     print_unknown_data(ndo, obj_tptr + 2, "\n\t\t",
1725c74ad251Schristos                                        GET_U_1(obj_tptr + 1) - 2);
1726c74ad251Schristos                     obj_tlen-=GET_U_1(obj_tptr + 1);
1727c74ad251Schristos                     obj_tptr+=GET_U_1(obj_tptr + 1);
17280f74e101Schristos                 }
17290f74e101Schristos                 break;
17300f74e101Schristos             default:
17310f74e101Schristos                 hexdump=TRUE;
17320f74e101Schristos             }
17330f74e101Schristos             break;
17340f74e101Schristos 
17350f74e101Schristos         case RSVP_OBJ_MESSAGE_ID:     /* fall through */
17360f74e101Schristos         case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
17370f74e101Schristos         case RSVP_OBJ_MESSAGE_ID_LIST:
17380f74e101Schristos             switch(rsvp_obj_ctype) {
17390f74e101Schristos             case RSVP_CTYPE_1:
17400f74e101Schristos             case RSVP_CTYPE_2:
1741c74ad251Schristos                 if (obj_tlen < 4)
1742c74ad251Schristos                     goto obj_tooshort;
1743c74ad251Schristos                 ND_PRINT("%s  Flags [0x%02x], epoch: %u",
1744c74ad251Schristos                        indent,
1745c74ad251Schristos                        GET_U_1(obj_tptr),
1746c74ad251Schristos                        GET_BE_U_3(obj_tptr + 1));
17470f74e101Schristos                 obj_tlen-=4;
17480f74e101Schristos                 obj_tptr+=4;
17490f74e101Schristos                 /* loop through as long there are no messages left */
17500f74e101Schristos                 while(obj_tlen >= 4) {
1751c74ad251Schristos                     ND_PRINT("%s    Message-ID 0x%08x (%u)",
1752c74ad251Schristos                            indent,
1753c74ad251Schristos                            GET_BE_U_4(obj_tptr),
1754c74ad251Schristos                            GET_BE_U_4(obj_tptr));
17550f74e101Schristos                     obj_tlen-=4;
17560f74e101Schristos                     obj_tptr+=4;
17570f74e101Schristos                 }
17580f74e101Schristos                 break;
17590f74e101Schristos             default:
17600f74e101Schristos                 hexdump=TRUE;
17610f74e101Schristos             }
17620f74e101Schristos             break;
17630f74e101Schristos 
17640f74e101Schristos         case RSVP_OBJ_INTEGRITY:
17650f74e101Schristos             switch(rsvp_obj_ctype) {
17660f74e101Schristos             case RSVP_CTYPE_1:
17670f74e101Schristos                 if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
1768c74ad251Schristos                     goto obj_tooshort;
17690f74e101Schristos                 obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
1770c74ad251Schristos                 ND_PRINT("%s  Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
1771c74ad251Schristos                        indent,
1772c74ad251Schristos                        GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id),
1773c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2),
1774c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence),
1775c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4),
17760f74e101Schristos                        bittok2str(rsvp_obj_integrity_flag_values,
17770f74e101Schristos                                   "none",
1778c74ad251Schristos                                   obj_ptr.rsvp_obj_integrity->flags));
1779c74ad251Schristos                 ND_PRINT("%s  MD5-sum 0x%08x%08x%08x%08x ",
1780c74ad251Schristos                        indent,
1781c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest),
1782c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4),
1783c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8),
1784c74ad251Schristos                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12));
17850f74e101Schristos 
1786fdccd7e4Schristos                 sigcheck = signature_verify(ndo, pptr, plen,
1787fdccd7e4Schristos                                             obj_ptr.rsvp_obj_integrity->digest,
1788fdccd7e4Schristos                                             rsvp_clear_checksum,
1789fdccd7e4Schristos                                             rsvp_com_header);
1790c74ad251Schristos                 ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
17910f74e101Schristos 
17920f74e101Schristos                 obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
17930f74e101Schristos                 obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
17940f74e101Schristos                 break;
17950f74e101Schristos             default:
17960f74e101Schristos                 hexdump=TRUE;
17970f74e101Schristos             }
17980f74e101Schristos             break;
17990f74e101Schristos 
18000f74e101Schristos         case RSVP_OBJ_ADMIN_STATUS:
18010f74e101Schristos             switch(rsvp_obj_ctype) {
18020f74e101Schristos             case RSVP_CTYPE_1:
18030f74e101Schristos                 if (obj_tlen < 4)
1804c74ad251Schristos                     goto obj_tooshort;
1805c74ad251Schristos                 ND_PRINT("%s  Flags [%s]", indent,
18060f74e101Schristos                        bittok2str(rsvp_obj_admin_status_flag_values, "none",
1807c74ad251Schristos                                   GET_BE_U_4(obj_tptr)));
18080f74e101Schristos                 obj_tlen-=4;
18090f74e101Schristos                 obj_tptr+=4;
18100f74e101Schristos                 break;
18110f74e101Schristos             default:
18120f74e101Schristos                 hexdump=TRUE;
18130f74e101Schristos             }
18140f74e101Schristos             break;
18150f74e101Schristos 
18160f74e101Schristos         case RSVP_OBJ_LABEL_SET:
18170f74e101Schristos             switch(rsvp_obj_ctype) {
18180f74e101Schristos             case RSVP_CTYPE_1:
18190f74e101Schristos                 if (obj_tlen < 4)
1820c74ad251Schristos                     goto obj_tooshort;
1821c74ad251Schristos                 action = (GET_BE_U_2(obj_tptr)>>8);
18220f74e101Schristos 
1823c74ad251Schristos                 ND_PRINT("%s  Action: %s (%u), Label type: %u", indent,
18240f74e101Schristos                        tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
1825c74ad251Schristos                        action, (GET_BE_U_4(obj_tptr) & 0x7F));
18260f74e101Schristos 
18270f74e101Schristos                 switch (action) {
18280f74e101Schristos                 case LABEL_SET_INCLUSIVE_RANGE:
18290f74e101Schristos                 case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
18300f74e101Schristos 
18310f74e101Schristos 		    /* only a couple of subchannels are expected */
18320f74e101Schristos 		    if (obj_tlen < 12)
1833c74ad251Schristos 			goto obj_tooshort;
1834c74ad251Schristos 		    ND_PRINT("%s  Start range: %u, End range: %u", indent,
1835c74ad251Schristos                            GET_BE_U_4(obj_tptr + 4),
1836c74ad251Schristos                            GET_BE_U_4(obj_tptr + 8));
18370f74e101Schristos 		    obj_tlen-=12;
18380f74e101Schristos 		    obj_tptr+=12;
18390f74e101Schristos                     break;
18400f74e101Schristos 
18410f74e101Schristos                 default:
18420f74e101Schristos                     obj_tlen-=4;
18430f74e101Schristos                     obj_tptr+=4;
18440f74e101Schristos                     subchannel = 1;
18450f74e101Schristos                     while(obj_tlen >= 4 ) {
1846c74ad251Schristos                         ND_PRINT("%s  Subchannel #%u: %u", indent, subchannel,
1847c74ad251Schristos                                GET_BE_U_4(obj_tptr));
18480f74e101Schristos                         obj_tptr+=4;
18490f74e101Schristos                         obj_tlen-=4;
18500f74e101Schristos                         subchannel++;
18510f74e101Schristos                     }
18520f74e101Schristos                     break;
18530f74e101Schristos                 }
18540f74e101Schristos                 break;
18550f74e101Schristos             default:
18560f74e101Schristos                 hexdump=TRUE;
18570f74e101Schristos             }
1858c74ad251Schristos             break;
18590f74e101Schristos 
18600f74e101Schristos         case RSVP_OBJ_S2L:
18610f74e101Schristos             switch (rsvp_obj_ctype) {
18620f74e101Schristos             case RSVP_CTYPE_IPV4:
18630f74e101Schristos                 if (obj_tlen < 4)
1864c74ad251Schristos                     goto obj_tooshort;
1865c74ad251Schristos                 ND_PRINT("%s  Sub-LSP destination address: %s",
1866c74ad251Schristos                        indent, GET_IPADDR_STRING(obj_tptr));
18670f74e101Schristos 
18680f74e101Schristos                 obj_tlen-=4;
18690f74e101Schristos                 obj_tptr+=4;
18700f74e101Schristos                 break;
18710f74e101Schristos             case RSVP_CTYPE_IPV6:
18720f74e101Schristos                 if (obj_tlen < 16)
1873c74ad251Schristos                     goto obj_tooshort;
1874c74ad251Schristos                 ND_PRINT("%s  Sub-LSP destination address: %s",
1875c74ad251Schristos                        indent, GET_IP6ADDR_STRING(obj_tptr));
18760f74e101Schristos 
18770f74e101Schristos                 obj_tlen-=16;
18780f74e101Schristos                 obj_tptr+=16;
18790f74e101Schristos                 break;
18800f74e101Schristos             default:
18810f74e101Schristos                 hexdump=TRUE;
18820f74e101Schristos             }
1883c74ad251Schristos             break;
18840f74e101Schristos 
18850f74e101Schristos         /*
18860f74e101Schristos          *  FIXME those are the defined objects that lack a decoder
18870f74e101Schristos          *  you are welcome to contribute code ;-)
18880f74e101Schristos          */
18890f74e101Schristos 
18900f74e101Schristos         case RSVP_OBJ_SCOPE:
18910f74e101Schristos         case RSVP_OBJ_POLICY_DATA:
18920f74e101Schristos         case RSVP_OBJ_ACCEPT_LABEL_SET:
18930f74e101Schristos         case RSVP_OBJ_PROTECTION:
18940f74e101Schristos         default:
1895b3a00663Schristos             if (ndo->ndo_vflag <= 1)
1896b3a00663Schristos                 print_unknown_data(ndo, obj_tptr, "\n\t    ", obj_tlen); /* FIXME indentation */
18970f74e101Schristos             break;
18980f74e101Schristos         }
18990f74e101Schristos         /* do we also want to see a hex dump ? */
1900b3a00663Schristos         if (ndo->ndo_vflag > 1 || hexdump == TRUE)
1901b3a00663Schristos             print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t    ", /* FIXME indentation */
19020f74e101Schristos                                rsvp_obj_len - sizeof(struct rsvp_object_header));
19030f74e101Schristos 
19040f74e101Schristos         tptr+=rsvp_obj_len;
19050f74e101Schristos         tlen-=rsvp_obj_len;
19060f74e101Schristos     }
19070f74e101Schristos     return 0;
1908c74ad251Schristos subobj_tooshort:
1909c74ad251Schristos     ND_PRINT("%sERROR: sub-object is too short", indent);
1910c74ad251Schristos     return -1;
1911c74ad251Schristos obj_tooshort:
1912c74ad251Schristos     ND_PRINT("%sERROR: object is too short", indent);
1913c74ad251Schristos     return -1;
1914fdccd7e4Schristos invalid:
1915c74ad251Schristos     nd_print_invalid(ndo);
1916fdccd7e4Schristos     return -1;
19170f74e101Schristos trunc:
1918c74ad251Schristos     nd_print_trunc(ndo);
19190f74e101Schristos     return -1;
19200f74e101Schristos }
19210f74e101Schristos 
19220f74e101Schristos void
1923b3a00663Schristos rsvp_print(netdissect_options *ndo,
1924c74ad251Schristos            const u_char *pptr, u_int len)
1925ba2ff121Schristos {
1926fdccd7e4Schristos     const struct rsvp_common_header *rsvp_com_header;
1927c74ad251Schristos     uint8_t version_flags, msg_type;
1928fdccd7e4Schristos     const u_char *tptr;
1929fdccd7e4Schristos     u_short plen, tlen;
19300f74e101Schristos 
1931c74ad251Schristos     ndo->ndo_protocol = "rsvp";
19320f74e101Schristos     tptr=pptr;
19330f74e101Schristos 
1934fdccd7e4Schristos     rsvp_com_header = (const struct rsvp_common_header *)pptr;
1935c74ad251Schristos     ND_TCHECK_SIZE(rsvp_com_header);
1936c74ad251Schristos     version_flags = GET_U_1(rsvp_com_header->version_flags);
19370f74e101Schristos 
19380f74e101Schristos     /*
19390f74e101Schristos      * Sanity checking of the header.
19400f74e101Schristos      */
1941c74ad251Schristos     if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1942c74ad251Schristos 	ND_PRINT("ERROR: RSVP version %u packet not supported",
1943c74ad251Schristos                RSVP_EXTRACT_VERSION(version_flags));
19440f74e101Schristos 	return;
19450f74e101Schristos     }
19460f74e101Schristos 
1947c74ad251Schristos     msg_type = GET_U_1(rsvp_com_header->msg_type);
1948c74ad251Schristos 
19490f74e101Schristos     /* in non-verbose mode just lets print the basic Message Type*/
1950b3a00663Schristos     if (ndo->ndo_vflag < 1) {
1951c74ad251Schristos         ND_PRINT("RSVPv%u %s Message, length: %u",
1952c74ad251Schristos                RSVP_EXTRACT_VERSION(version_flags),
1953c74ad251Schristos                tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type),
1954c74ad251Schristos                len);
19550f74e101Schristos         return;
19560f74e101Schristos     }
19570f74e101Schristos 
19580f74e101Schristos     /* ok they seem to want to know everything - lets fully decode it */
19590f74e101Schristos 
1960c74ad251Schristos     plen = tlen = GET_BE_U_2(rsvp_com_header->length);
19610f74e101Schristos 
1962c74ad251Schristos     ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
1963c74ad251Schristos            RSVP_EXTRACT_VERSION(version_flags),
1964c74ad251Schristos            tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
1965c74ad251Schristos            msg_type,
1966c74ad251Schristos            bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
19670f74e101Schristos            tlen,
1968c74ad251Schristos            GET_U_1(rsvp_com_header->ttl),
1969c74ad251Schristos            GET_BE_U_2(rsvp_com_header->checksum));
19700f74e101Schristos 
1971c74ad251Schristos     if (tlen < sizeof(struct rsvp_common_header)) {
1972c74ad251Schristos         ND_PRINT("ERROR: common header too short %u < %zu", tlen,
1973c74ad251Schristos                sizeof(struct rsvp_common_header));
19740f74e101Schristos         return;
19750f74e101Schristos     }
19760f74e101Schristos 
1977c74ad251Schristos     tptr+=sizeof(struct rsvp_common_header);
1978c74ad251Schristos     tlen-=sizeof(struct rsvp_common_header);
19790f74e101Schristos 
1980c74ad251Schristos     switch(msg_type) {
19810f74e101Schristos 
1982fdccd7e4Schristos     case RSVP_MSGTYPE_BUNDLE:
1983fdccd7e4Schristos         /*
1984fdccd7e4Schristos          * Process each submessage in the bundle message.
1985fdccd7e4Schristos          * Bundle messages may not contain bundle submessages, so we don't
1986fdccd7e4Schristos          * need to handle bundle submessages specially.
1987fdccd7e4Schristos          */
19880f74e101Schristos         while(tlen > 0) {
1989fdccd7e4Schristos             const u_char *subpptr=tptr, *subtptr;
1990fdccd7e4Schristos             u_short subplen, subtlen;
1991fdccd7e4Schristos 
1992fdccd7e4Schristos             subtptr=subpptr;
1993fdccd7e4Schristos 
1994fdccd7e4Schristos             rsvp_com_header = (const struct rsvp_common_header *)subpptr;
1995c74ad251Schristos             ND_TCHECK_SIZE(rsvp_com_header);
1996c74ad251Schristos             version_flags = GET_U_1(rsvp_com_header->version_flags);
19970f74e101Schristos 
19980f74e101Schristos             /*
19990f74e101Schristos              * Sanity checking of the header.
20000f74e101Schristos              */
2001c74ad251Schristos             if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
2002c74ad251Schristos                 ND_PRINT("ERROR: RSVP version %u packet not supported",
2003c74ad251Schristos                        RSVP_EXTRACT_VERSION(version_flags));
20040f74e101Schristos                 return;
20050f74e101Schristos             }
2006fdccd7e4Schristos 
2007c74ad251Schristos             subplen = subtlen = GET_BE_U_2(rsvp_com_header->length);
20080f74e101Schristos 
2009c74ad251Schristos             msg_type = GET_U_1(rsvp_com_header->msg_type);
2010c74ad251Schristos             ND_PRINT("\n\t  RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
2011c74ad251Schristos                    RSVP_EXTRACT_VERSION(version_flags),
2012c74ad251Schristos                    tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
2013c74ad251Schristos                    msg_type,
2014c74ad251Schristos                    bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
20150f74e101Schristos                    subtlen,
2016c74ad251Schristos                    GET_U_1(rsvp_com_header->ttl),
2017c74ad251Schristos                    GET_BE_U_2(rsvp_com_header->checksum));
20180f74e101Schristos 
2019c74ad251Schristos             if (subtlen < sizeof(struct rsvp_common_header)) {
2020c74ad251Schristos                 ND_PRINT("ERROR: common header too short %u < %zu", subtlen,
2021c74ad251Schristos                        sizeof(struct rsvp_common_header));
20220f74e101Schristos                 return;
20230f74e101Schristos             }
20240f74e101Schristos 
20250f74e101Schristos             if (tlen < subtlen) {
2026c74ad251Schristos                 ND_PRINT("ERROR: common header too large %u > %u", subtlen,
2027c74ad251Schristos                        tlen);
20280f74e101Schristos                 return;
20290f74e101Schristos             }
20300f74e101Schristos 
2031c74ad251Schristos             subtptr+=sizeof(struct rsvp_common_header);
2032c74ad251Schristos             subtlen-=sizeof(struct rsvp_common_header);
20330f74e101Schristos 
2034fdccd7e4Schristos             /*
2035fdccd7e4Schristos              * Print all objects in the submessage.
2036fdccd7e4Schristos              */
2037fdccd7e4Schristos             if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t    ", subtlen, rsvp_com_header) == -1)
20380f74e101Schristos                 return;
20390f74e101Schristos 
2040c74ad251Schristos             tptr+=subtlen+sizeof(struct rsvp_common_header);
2041c74ad251Schristos             tlen-=subtlen+sizeof(struct rsvp_common_header);
20420f74e101Schristos         }
20430f74e101Schristos 
20440f74e101Schristos         break;
20450f74e101Schristos 
20460f74e101Schristos     case RSVP_MSGTYPE_PATH:
20470f74e101Schristos     case RSVP_MSGTYPE_RESV:
20480f74e101Schristos     case RSVP_MSGTYPE_PATHERR:
20490f74e101Schristos     case RSVP_MSGTYPE_RESVERR:
20500f74e101Schristos     case RSVP_MSGTYPE_PATHTEAR:
20510f74e101Schristos     case RSVP_MSGTYPE_RESVTEAR:
20520f74e101Schristos     case RSVP_MSGTYPE_RESVCONF:
20530f74e101Schristos     case RSVP_MSGTYPE_HELLO_OLD:
20540f74e101Schristos     case RSVP_MSGTYPE_HELLO:
20550f74e101Schristos     case RSVP_MSGTYPE_ACK:
20560f74e101Schristos     case RSVP_MSGTYPE_SREFRESH:
2057fdccd7e4Schristos         /*
2058fdccd7e4Schristos          * Print all objects in the message.
2059fdccd7e4Schristos          */
2060fdccd7e4Schristos         if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t  ", tlen, rsvp_com_header) == -1)
20610f74e101Schristos             return;
20620f74e101Schristos         break;
20630f74e101Schristos 
20640f74e101Schristos     default:
2065b3a00663Schristos         print_unknown_data(ndo, tptr, "\n\t    ", tlen);
20660f74e101Schristos         break;
20670f74e101Schristos     }
20680f74e101Schristos 
20690f74e101Schristos     return;
20700f74e101Schristos trunc:
2071c74ad251Schristos     nd_print_trunc(ndo);
20720f74e101Schristos }
2073