xref: /aosp_15_r20/external/tcpdump/print-rsvp.c (revision 05b00f6010a2396e3db2409989fc67270046269f)
1*05b00f60SXin Li /*
2*05b00f60SXin Li  * Copyright (c) 1998-2007 The TCPDUMP project
3*05b00f60SXin Li  *
4*05b00f60SXin Li  * Redistribution and use in source and binary forms, with or without
5*05b00f60SXin Li  * modification, are permitted provided that: (1) source code
6*05b00f60SXin Li  * distributions retain the above copyright notice and this paragraph
7*05b00f60SXin Li  * in its entirety, and (2) distributions including binary code include
8*05b00f60SXin Li  * the above copyright notice and this paragraph in its entirety in
9*05b00f60SXin Li  * the documentation or other materials provided with the distribution.
10*05b00f60SXin Li  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
11*05b00f60SXin Li  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
12*05b00f60SXin Li  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13*05b00f60SXin Li  * FOR A PARTICULAR PURPOSE.
14*05b00f60SXin Li  *
15*05b00f60SXin Li  * Original code by Hannes Gredler ([email protected])
16*05b00f60SXin Li  */
17*05b00f60SXin Li 
18*05b00f60SXin Li /* \summary: Resource ReSerVation Protocol (RSVP) printer */
19*05b00f60SXin Li 
20*05b00f60SXin Li /* specification: RFC 2205 */
21*05b00f60SXin Li 
22*05b00f60SXin Li #ifdef HAVE_CONFIG_H
23*05b00f60SXin Li #include <config.h>
24*05b00f60SXin Li #endif
25*05b00f60SXin Li 
26*05b00f60SXin Li #include "netdissect-stdinc.h"
27*05b00f60SXin Li 
28*05b00f60SXin Li #include "netdissect.h"
29*05b00f60SXin Li #include "extract.h"
30*05b00f60SXin Li #include "addrtoname.h"
31*05b00f60SXin Li #include "ethertype.h"
32*05b00f60SXin Li #include "gmpls.h"
33*05b00f60SXin Li #include "af.h"
34*05b00f60SXin Li #include "signature.h"
35*05b00f60SXin Li 
36*05b00f60SXin Li 
37*05b00f60SXin Li /*
38*05b00f60SXin Li  * RFC 2205 common header
39*05b00f60SXin Li  *
40*05b00f60SXin Li  *               0             1              2             3
41*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
42*05b00f60SXin Li  *        | Vers | Flags|  Msg Type   |       RSVP Checksum       |
43*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
44*05b00f60SXin Li  *        |  Send_TTL   | (Reserved)  |        RSVP Length        |
45*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
46*05b00f60SXin Li  *
47*05b00f60SXin Li  */
48*05b00f60SXin Li 
49*05b00f60SXin Li struct rsvp_common_header {
50*05b00f60SXin Li     nd_uint8_t  version_flags;
51*05b00f60SXin Li     nd_uint8_t  msg_type;
52*05b00f60SXin Li     nd_uint16_t checksum;
53*05b00f60SXin Li     nd_uint8_t  ttl;
54*05b00f60SXin Li     nd_byte     reserved[1];
55*05b00f60SXin Li     nd_uint16_t length;
56*05b00f60SXin Li };
57*05b00f60SXin Li 
58*05b00f60SXin Li /*
59*05b00f60SXin Li  * RFC2205 object header
60*05b00f60SXin Li  *
61*05b00f60SXin Li  *
62*05b00f60SXin Li  *               0             1              2             3
63*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
64*05b00f60SXin Li  *        |       Length (bytes)      |  Class-Num  |   C-Type    |
65*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
66*05b00f60SXin Li  *        |                                                       |
67*05b00f60SXin Li  *        //                  (Object contents)                   //
68*05b00f60SXin Li  *        |                                                       |
69*05b00f60SXin Li  *        +-------------+-------------+-------------+-------------+
70*05b00f60SXin Li  */
71*05b00f60SXin Li 
72*05b00f60SXin Li struct rsvp_object_header {
73*05b00f60SXin Li     nd_uint16_t length;
74*05b00f60SXin Li     nd_uint8_t  class_num;
75*05b00f60SXin Li     nd_uint8_t  ctype;
76*05b00f60SXin Li };
77*05b00f60SXin Li 
78*05b00f60SXin Li #define RSVP_VERSION            1
79*05b00f60SXin Li #define	RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
80*05b00f60SXin Li #define	RSVP_EXTRACT_FLAGS(x)   ((x)&0x0f)
81*05b00f60SXin Li 
82*05b00f60SXin Li #define	RSVP_MSGTYPE_PATH       1
83*05b00f60SXin Li #define	RSVP_MSGTYPE_RESV       2
84*05b00f60SXin Li #define	RSVP_MSGTYPE_PATHERR    3
85*05b00f60SXin Li #define	RSVP_MSGTYPE_RESVERR    4
86*05b00f60SXin Li #define	RSVP_MSGTYPE_PATHTEAR   5
87*05b00f60SXin Li #define	RSVP_MSGTYPE_RESVTEAR   6
88*05b00f60SXin Li #define	RSVP_MSGTYPE_RESVCONF   7
89*05b00f60SXin Li #define RSVP_MSGTYPE_BUNDLE     12
90*05b00f60SXin Li #define RSVP_MSGTYPE_ACK        13
91*05b00f60SXin Li #define RSVP_MSGTYPE_HELLO_OLD  14      /* ancient Hellos */
92*05b00f60SXin Li #define RSVP_MSGTYPE_SREFRESH   15
93*05b00f60SXin Li #define	RSVP_MSGTYPE_HELLO      20
94*05b00f60SXin Li 
95*05b00f60SXin Li static const struct tok rsvp_msg_type_values[] = {
96*05b00f60SXin Li     { RSVP_MSGTYPE_PATH,	"Path" },
97*05b00f60SXin Li     { RSVP_MSGTYPE_RESV,	"Resv" },
98*05b00f60SXin Li     { RSVP_MSGTYPE_PATHERR,	"PathErr" },
99*05b00f60SXin Li     { RSVP_MSGTYPE_RESVERR,	"ResvErr" },
100*05b00f60SXin Li     { RSVP_MSGTYPE_PATHTEAR,	"PathTear" },
101*05b00f60SXin Li     { RSVP_MSGTYPE_RESVTEAR,	"ResvTear" },
102*05b00f60SXin Li     { RSVP_MSGTYPE_RESVCONF,	"ResvConf" },
103*05b00f60SXin Li     { RSVP_MSGTYPE_BUNDLE,	"Bundle" },
104*05b00f60SXin Li     { RSVP_MSGTYPE_ACK,	        "Acknowledgement" },
105*05b00f60SXin Li     { RSVP_MSGTYPE_HELLO_OLD,	"Hello (Old)" },
106*05b00f60SXin Li     { RSVP_MSGTYPE_SREFRESH,	"Refresh" },
107*05b00f60SXin Li     { RSVP_MSGTYPE_HELLO,	"Hello" },
108*05b00f60SXin Li     { 0, NULL}
109*05b00f60SXin Li };
110*05b00f60SXin Li 
111*05b00f60SXin Li static const struct tok rsvp_header_flag_values[] = {
112*05b00f60SXin Li     { 0x01,	              "Refresh reduction capable" }, /* rfc2961 */
113*05b00f60SXin Li     { 0, NULL}
114*05b00f60SXin Li };
115*05b00f60SXin Li 
116*05b00f60SXin Li static const struct tok rsvp_obj_capability_flag_values[] = {
117*05b00f60SXin Li     { 0x0004,                "RecoveryPath Transmit Enabled" },
118*05b00f60SXin Li     { 0x0002,                "RecoveryPath Desired" },
119*05b00f60SXin Li     { 0x0001,                "RecoveryPath Srefresh Capable" },
120*05b00f60SXin Li     { 0, NULL}
121*05b00f60SXin Li };
122*05b00f60SXin Li 
123*05b00f60SXin Li #define	RSVP_OBJ_SESSION            1   /* rfc2205 */
124*05b00f60SXin Li #define	RSVP_OBJ_RSVP_HOP           3   /* rfc2205, rfc3473 */
125*05b00f60SXin Li #define	RSVP_OBJ_INTEGRITY          4   /* rfc2747 */
126*05b00f60SXin Li #define	RSVP_OBJ_TIME_VALUES        5   /* rfc2205 */
127*05b00f60SXin Li #define	RSVP_OBJ_ERROR_SPEC         6
128*05b00f60SXin Li #define	RSVP_OBJ_SCOPE              7
129*05b00f60SXin Li #define	RSVP_OBJ_STYLE              8   /* rfc2205 */
130*05b00f60SXin Li #define	RSVP_OBJ_FLOWSPEC           9   /* rfc2215 */
131*05b00f60SXin Li #define	RSVP_OBJ_FILTERSPEC         10  /* rfc2215 */
132*05b00f60SXin Li #define	RSVP_OBJ_SENDER_TEMPLATE    11
133*05b00f60SXin Li #define	RSVP_OBJ_SENDER_TSPEC       12  /* rfc2215 */
134*05b00f60SXin Li #define	RSVP_OBJ_ADSPEC             13  /* rfc2215 */
135*05b00f60SXin Li #define	RSVP_OBJ_POLICY_DATA        14
136*05b00f60SXin Li #define	RSVP_OBJ_CONFIRM            15  /* rfc2205 */
137*05b00f60SXin Li #define	RSVP_OBJ_LABEL              16  /* rfc3209 */
138*05b00f60SXin Li #define	RSVP_OBJ_LABEL_REQ          19  /* rfc3209 */
139*05b00f60SXin Li #define	RSVP_OBJ_ERO                20  /* rfc3209 */
140*05b00f60SXin Li #define	RSVP_OBJ_RRO                21  /* rfc3209 */
141*05b00f60SXin Li #define	RSVP_OBJ_HELLO              22  /* rfc3209 */
142*05b00f60SXin Li #define	RSVP_OBJ_MESSAGE_ID         23  /* rfc2961 */
143*05b00f60SXin Li #define	RSVP_OBJ_MESSAGE_ID_ACK     24  /* rfc2961 */
144*05b00f60SXin Li #define	RSVP_OBJ_MESSAGE_ID_LIST    25  /* rfc2961 */
145*05b00f60SXin Li #define	RSVP_OBJ_RECOVERY_LABEL     34  /* rfc3473 */
146*05b00f60SXin Li #define	RSVP_OBJ_UPSTREAM_LABEL     35  /* rfc3473 */
147*05b00f60SXin Li #define	RSVP_OBJ_LABEL_SET          36  /* rfc3473 */
148*05b00f60SXin Li #define	RSVP_OBJ_PROTECTION         37  /* rfc3473 */
149*05b00f60SXin Li #define RSVP_OBJ_S2L                50  /* rfc4875 */
150*05b00f60SXin Li #define	RSVP_OBJ_DETOUR             63  /* rfc4090 */
151*05b00f60SXin Li #define	RSVP_OBJ_CLASSTYPE          66  /* rfc4124 */
152*05b00f60SXin Li #define RSVP_OBJ_CLASSTYPE_OLD      125 /* draft-ietf-tewg-diff-te-proto-07 */
153*05b00f60SXin Li #define	RSVP_OBJ_SUGGESTED_LABEL    129 /* rfc3473 */
154*05b00f60SXin Li #define	RSVP_OBJ_ACCEPT_LABEL_SET   130 /* rfc3473 */
155*05b00f60SXin Li #define	RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
156*05b00f60SXin Li #define RSVP_OBJ_CAPABILITY         134 /* rfc5063 */
157*05b00f60SXin Li #define	RSVP_OBJ_NOTIFY_REQ         195 /* rfc3473 */
158*05b00f60SXin Li #define	RSVP_OBJ_ADMIN_STATUS       196 /* rfc3473 */
159*05b00f60SXin Li #define	RSVP_OBJ_PROPERTIES         204 /* juniper proprietary */
160*05b00f60SXin Li #define	RSVP_OBJ_FASTREROUTE        205 /* rfc4090 */
161*05b00f60SXin Li #define	RSVP_OBJ_SESSION_ATTRIBUTE  207 /* rfc3209 */
162*05b00f60SXin Li #define RSVP_OBJ_GENERALIZED_UNI    229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
163*05b00f60SXin Li #define RSVP_OBJ_CALL_ID            230 /* rfc3474 */
164*05b00f60SXin Li #define RSVP_OBJ_CALL_OPS           236 /* rfc3474 */
165*05b00f60SXin Li 
166*05b00f60SXin Li static const struct tok rsvp_obj_values[] = {
167*05b00f60SXin Li     { RSVP_OBJ_SESSION,            "Session" },
168*05b00f60SXin Li     { RSVP_OBJ_RSVP_HOP,           "RSVP Hop" },
169*05b00f60SXin Li     { RSVP_OBJ_INTEGRITY,          "Integrity" },
170*05b00f60SXin Li     { RSVP_OBJ_TIME_VALUES,        "Time Values" },
171*05b00f60SXin Li     { RSVP_OBJ_ERROR_SPEC,         "Error Spec" },
172*05b00f60SXin Li     { RSVP_OBJ_SCOPE,              "Scope" },
173*05b00f60SXin Li     { RSVP_OBJ_STYLE,              "Style" },
174*05b00f60SXin Li     { RSVP_OBJ_FLOWSPEC,           "Flowspec" },
175*05b00f60SXin Li     { RSVP_OBJ_FILTERSPEC,         "FilterSpec" },
176*05b00f60SXin Li     { RSVP_OBJ_SENDER_TEMPLATE,    "Sender Template" },
177*05b00f60SXin Li     { RSVP_OBJ_SENDER_TSPEC,       "Sender TSpec" },
178*05b00f60SXin Li     { RSVP_OBJ_ADSPEC,             "Adspec" },
179*05b00f60SXin Li     { RSVP_OBJ_POLICY_DATA,        "Policy Data" },
180*05b00f60SXin Li     { RSVP_OBJ_CONFIRM,            "Confirm" },
181*05b00f60SXin Li     { RSVP_OBJ_LABEL,              "Label" },
182*05b00f60SXin Li     { RSVP_OBJ_LABEL_REQ,          "Label Request" },
183*05b00f60SXin Li     { RSVP_OBJ_ERO,                "ERO" },
184*05b00f60SXin Li     { RSVP_OBJ_RRO,                "RRO" },
185*05b00f60SXin Li     { RSVP_OBJ_HELLO,              "Hello" },
186*05b00f60SXin Li     { RSVP_OBJ_MESSAGE_ID,         "Message ID" },
187*05b00f60SXin Li     { RSVP_OBJ_MESSAGE_ID_ACK,     "Message ID Ack" },
188*05b00f60SXin Li     { RSVP_OBJ_MESSAGE_ID_LIST,    "Message ID List" },
189*05b00f60SXin Li     { RSVP_OBJ_RECOVERY_LABEL,     "Recovery Label" },
190*05b00f60SXin Li     { RSVP_OBJ_UPSTREAM_LABEL,     "Upstream Label" },
191*05b00f60SXin Li     { RSVP_OBJ_LABEL_SET,          "Label Set" },
192*05b00f60SXin Li     { RSVP_OBJ_ACCEPT_LABEL_SET,   "Acceptable Label Set" },
193*05b00f60SXin Li     { RSVP_OBJ_DETOUR,             "Detour" },
194*05b00f60SXin Li     { RSVP_OBJ_CLASSTYPE,          "Class Type" },
195*05b00f60SXin Li     { RSVP_OBJ_CLASSTYPE_OLD,      "Class Type (old)" },
196*05b00f60SXin Li     { RSVP_OBJ_SUGGESTED_LABEL,    "Suggested Label" },
197*05b00f60SXin Li     { RSVP_OBJ_PROPERTIES,         "Properties" },
198*05b00f60SXin Li     { RSVP_OBJ_FASTREROUTE,        "Fast Re-Route" },
199*05b00f60SXin Li     { RSVP_OBJ_SESSION_ATTRIBUTE,  "Session Attribute" },
200*05b00f60SXin Li     { RSVP_OBJ_GENERALIZED_UNI,    "Generalized UNI" },
201*05b00f60SXin Li     { RSVP_OBJ_CALL_ID,            "Call-ID" },
202*05b00f60SXin Li     { RSVP_OBJ_CALL_OPS,           "Call Capability" },
203*05b00f60SXin Li     { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
204*05b00f60SXin Li     { RSVP_OBJ_CAPABILITY,         "Capability" },
205*05b00f60SXin Li     { RSVP_OBJ_NOTIFY_REQ,         "Notify Request" },
206*05b00f60SXin Li     { RSVP_OBJ_PROTECTION,         "Protection" },
207*05b00f60SXin Li     { RSVP_OBJ_ADMIN_STATUS,       "Administrative Status" },
208*05b00f60SXin Li     { RSVP_OBJ_S2L,                "Sub-LSP to LSP" },
209*05b00f60SXin Li     { 0, NULL}
210*05b00f60SXin Li };
211*05b00f60SXin Li 
212*05b00f60SXin Li #define	RSVP_CTYPE_IPV4        1
213*05b00f60SXin Li #define	RSVP_CTYPE_IPV6        2
214*05b00f60SXin Li #define	RSVP_CTYPE_TUNNEL_IPV4 7
215*05b00f60SXin Li #define	RSVP_CTYPE_TUNNEL_IPV6 8
216*05b00f60SXin Li #define	RSVP_CTYPE_UNI_IPV4    11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
217*05b00f60SXin Li #define RSVP_CTYPE_1           1
218*05b00f60SXin Li #define RSVP_CTYPE_2           2
219*05b00f60SXin Li #define RSVP_CTYPE_3           3
220*05b00f60SXin Li #define RSVP_CTYPE_4           4
221*05b00f60SXin Li #define RSVP_CTYPE_12         12
222*05b00f60SXin Li #define RSVP_CTYPE_13         13
223*05b00f60SXin Li #define RSVP_CTYPE_14         14
224*05b00f60SXin Li 
225*05b00f60SXin Li /*
226*05b00f60SXin Li  * the ctypes are not globally unique so for
227*05b00f60SXin Li  * translating it to strings we build a table based
228*05b00f60SXin Li  * on objects offsetted by the ctype
229*05b00f60SXin Li  */
230*05b00f60SXin Li 
231*05b00f60SXin Li static const struct tok rsvp_ctype_values[] = {
232*05b00f60SXin Li     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4,	             "IPv4" },
233*05b00f60SXin Li     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6,	             "IPv6" },
234*05b00f60SXin Li     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3,	             "IPv4 plus opt. TLVs" },
235*05b00f60SXin Li     { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4,	             "IPv6 plus opt. TLVs" },
236*05b00f60SXin Li     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4,	             "IPv4" },
237*05b00f60SXin Li     { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6,	             "IPv6" },
238*05b00f60SXin Li     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4,	             "IPv4" },
239*05b00f60SXin Li     { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6,	             "IPv6" },
240*05b00f60SXin Li     { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1,	             "1" },
241*05b00f60SXin Li     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1,	             "obsolete" },
242*05b00f60SXin Li     { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2,	             "IntServ" },
243*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2,	             "IntServ" },
244*05b00f60SXin Li     { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2,	                     "IntServ" },
245*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4,	             "IPv4" },
246*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6,	             "IPv6" },
247*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3,	             "IPv6 Flow-label" },
248*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4,	     "Tunnel IPv4" },
249*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12,                 "IPv4 P2MP LSP Tunnel" },
250*05b00f60SXin Li     { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13,                 "IPv6 P2MP LSP Tunnel" },
251*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4,	             "IPv4" },
252*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6,	             "IPv6" },
253*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4,           "Tunnel IPv4" },
254*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4,              "UNI IPv4" },
255*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13,                    "IPv4 P2MP LSP Tunnel" },
256*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14,                    "IPv6 P2MP LSP Tunnel" },
257*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4,          "IPv4" },
258*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6,          "IPv6" },
259*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4,   "Tunnel IPv4" },
260*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12,            "IPv4 P2MP LSP Tunnel" },
261*05b00f60SXin Li     { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13,            "IPv6 P2MP LSP Tunnel" },
262*05b00f60SXin Li     { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1,                  "1" },
263*05b00f60SXin Li     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1,              "Message id ack" },
264*05b00f60SXin Li     { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2,              "Message id nack" },
265*05b00f60SXin Li     { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1,             "1" },
266*05b00f60SXin Li     { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1,                       "1" },
267*05b00f60SXin Li     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1,                       "Hello Request" },
268*05b00f60SXin Li     { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2,                       "Hello Ack" },
269*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1,	             "without label range" },
270*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2,	             "with ATM label range" },
271*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3,                   "with FR label range" },
272*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4,                   "Generalized Label" },
273*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1,                       "Label" },
274*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2,                       "Generalized Label" },
275*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3,                       "Waveband Switching" },
276*05b00f60SXin Li     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1,             "Label" },
277*05b00f60SXin Li     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2,             "Generalized Label" },
278*05b00f60SXin Li     { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3,             "Waveband Switching" },
279*05b00f60SXin Li     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1,              "Label" },
280*05b00f60SXin Li     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
281*05b00f60SXin Li     { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
282*05b00f60SXin Li     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1,              "Label" },
283*05b00f60SXin Li     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2,              "Generalized Label" },
284*05b00f60SXin Li     { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3,              "Waveband Switching" },
285*05b00f60SXin Li     { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4,                      "IPv4" },
286*05b00f60SXin Li     { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4,                      "IPv4" },
287*05b00f60SXin Li     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4,               "IPv4" },
288*05b00f60SXin Li     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6,               "IPv6" },
289*05b00f60SXin Li     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3,                  "IPv4 plus opt. TLVs" },
290*05b00f60SXin Li     { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4,                  "IPv6 plus opt. TLVs" },
291*05b00f60SXin Li     { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1,          "IPv4" },
292*05b00f60SXin Li     { 256*RSVP_OBJ_CAPABILITY+RSVP_CTYPE_1,                  "1" },
293*05b00f60SXin Li     { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
294*05b00f60SXin Li     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4,       "Tunnel IPv4" }, /* old style*/
295*05b00f60SXin Li     { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1,                 "1" }, /* new style */
296*05b00f60SXin Li     { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4,            "Tunnel IPv4" },
297*05b00f60SXin Li     { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1,                  "1" },
298*05b00f60SXin Li     { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1,                "1" },
299*05b00f60SXin Li     { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1,                   "1" },
300*05b00f60SXin Li     { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1,               "1" },
301*05b00f60SXin Li     { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1,                   "1" },
302*05b00f60SXin Li     { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1,             "1" },
303*05b00f60SXin Li     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4,                      "IPv4 sub-LSP" },
304*05b00f60SXin Li     { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6,                      "IPv6 sub-LSP" },
305*05b00f60SXin Li     { 0, NULL}
306*05b00f60SXin Li };
307*05b00f60SXin Li 
308*05b00f60SXin Li /*
309*05b00f60SXin Li  * XXX - this assumes a 16-byte digest, which is true for HMAC-MD5, but
310*05b00f60SXin Li  * isn't necessarily the case for other hash algorithms.
311*05b00f60SXin Li  *
312*05b00f60SXin Li  * Unless I've missed something, there's nothing in RFC 2747 to indicate
313*05b00f60SXin Li  * the hash algorithm being used, so it's presumably something set up
314*05b00f60SXin Li  * out-of-band, or negotiated by other RSVP objects.
315*05b00f60SXin Li  */
316*05b00f60SXin Li struct rsvp_obj_integrity_t {
317*05b00f60SXin Li     uint8_t flags;
318*05b00f60SXin Li     uint8_t res;
319*05b00f60SXin Li     uint8_t key_id[6];
320*05b00f60SXin Li     uint8_t sequence[8];
321*05b00f60SXin Li     uint8_t digest[16];
322*05b00f60SXin Li };
323*05b00f60SXin Li 
324*05b00f60SXin Li static const struct tok rsvp_obj_integrity_flag_values[] = {
325*05b00f60SXin Li     { 0x80, "Handshake" },
326*05b00f60SXin Li     { 0, NULL}
327*05b00f60SXin Li };
328*05b00f60SXin Li 
329*05b00f60SXin Li struct rsvp_obj_frr_t {
330*05b00f60SXin Li     uint8_t setup_prio;
331*05b00f60SXin Li     uint8_t hold_prio;
332*05b00f60SXin Li     uint8_t hop_limit;
333*05b00f60SXin Li     uint8_t flags;
334*05b00f60SXin Li     uint8_t bandwidth[4];
335*05b00f60SXin Li     uint8_t include_any[4];
336*05b00f60SXin Li     uint8_t exclude_any[4];
337*05b00f60SXin Li     uint8_t include_all[4];
338*05b00f60SXin Li };
339*05b00f60SXin Li 
340*05b00f60SXin Li 
341*05b00f60SXin Li #define RSVP_OBJ_XRO_MASK_SUBOBJ(x)   ((x)&0x7f)
342*05b00f60SXin Li #define RSVP_OBJ_XRO_MASK_LOOSE(x)    ((x)&0x80)
343*05b00f60SXin Li 
344*05b00f60SXin Li #define RSVP_OBJ_CAPABILITY_FLAGS_MASK  0x7U
345*05b00f60SXin Li 
346*05b00f60SXin Li #define	RSVP_OBJ_XRO_RES       0
347*05b00f60SXin Li #define	RSVP_OBJ_XRO_IPV4      1
348*05b00f60SXin Li #define	RSVP_OBJ_XRO_IPV6      2
349*05b00f60SXin Li #define	RSVP_OBJ_XRO_LABEL     3
350*05b00f60SXin Li #define	RSVP_OBJ_XRO_ASN       32
351*05b00f60SXin Li #define	RSVP_OBJ_XRO_MPLS      64
352*05b00f60SXin Li 
353*05b00f60SXin Li static const struct tok rsvp_obj_xro_values[] = {
354*05b00f60SXin Li     { RSVP_OBJ_XRO_RES,	      "Reserved" },
355*05b00f60SXin Li     { RSVP_OBJ_XRO_IPV4,      "IPv4 prefix" },
356*05b00f60SXin Li     { RSVP_OBJ_XRO_IPV6,      "IPv6 prefix" },
357*05b00f60SXin Li     { RSVP_OBJ_XRO_LABEL,     "Label" },
358*05b00f60SXin Li     { RSVP_OBJ_XRO_ASN,       "Autonomous system number" },
359*05b00f60SXin Li     { RSVP_OBJ_XRO_MPLS,      "MPLS label switched path termination" },
360*05b00f60SXin Li     { 0, NULL}
361*05b00f60SXin Li };
362*05b00f60SXin Li 
363*05b00f60SXin Li /* RFC4090 */
364*05b00f60SXin Li static const struct tok rsvp_obj_rro_flag_values[] = {
365*05b00f60SXin Li     { 0x01,	              "Local protection available" },
366*05b00f60SXin Li     { 0x02,                   "Local protection in use" },
367*05b00f60SXin Li     { 0x04,                   "Bandwidth protection" },
368*05b00f60SXin Li     { 0x08,                   "Node protection" },
369*05b00f60SXin Li     { 0, NULL}
370*05b00f60SXin Li };
371*05b00f60SXin Li 
372*05b00f60SXin Li /* RFC3209 */
373*05b00f60SXin Li static const struct tok rsvp_obj_rro_label_flag_values[] = {
374*05b00f60SXin Li     { 0x01,                   "Global" },
375*05b00f60SXin Li     { 0, NULL}
376*05b00f60SXin Li };
377*05b00f60SXin Li 
378*05b00f60SXin Li static const struct tok rsvp_resstyle_values[] = {
379*05b00f60SXin Li     { 17,	              "Wildcard Filter" },
380*05b00f60SXin Li     { 10,                     "Fixed Filter" },
381*05b00f60SXin Li     { 18,                     "Shared Explicit" },
382*05b00f60SXin Li     { 0, NULL}
383*05b00f60SXin Li };
384*05b00f60SXin Li 
385*05b00f60SXin Li #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
386*05b00f60SXin Li #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
387*05b00f60SXin Li 
388*05b00f60SXin Li static const struct tok rsvp_intserv_service_type_values[] = {
389*05b00f60SXin Li     { 1,                                "Default/Global Information" },
390*05b00f60SXin Li     { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
391*05b00f60SXin Li     { RSVP_OBJ_INTSERV_CONTROLLED_LOAD,	"Controlled Load" },
392*05b00f60SXin Li     { 0, NULL}
393*05b00f60SXin Li };
394*05b00f60SXin Li 
395*05b00f60SXin Li static const struct tok rsvp_intserv_parameter_id_values[] = {
396*05b00f60SXin Li     { 4,                     "IS hop cnt" },
397*05b00f60SXin Li     { 6,                     "Path b/w estimate" },
398*05b00f60SXin Li     { 8,                     "Minimum path latency" },
399*05b00f60SXin Li     { 10,                    "Composed MTU" },
400*05b00f60SXin Li     { 127,                   "Token Bucket TSpec" },
401*05b00f60SXin Li     { 130,                   "Guaranteed Service RSpec" },
402*05b00f60SXin Li     { 133,                   "End-to-end composed value for C" },
403*05b00f60SXin Li     { 134,                   "End-to-end composed value for D" },
404*05b00f60SXin Li     { 135,                   "Since-last-reshaping point composed C" },
405*05b00f60SXin Li     { 136,                   "Since-last-reshaping point composed D" },
406*05b00f60SXin Li     { 0, NULL}
407*05b00f60SXin Li };
408*05b00f60SXin Li 
409*05b00f60SXin Li static const struct tok rsvp_session_attribute_flag_values[] = {
410*05b00f60SXin Li     { 0x01,	              "Local Protection" },
411*05b00f60SXin Li     { 0x02,                   "Label Recording" },
412*05b00f60SXin Li     { 0x04,                   "SE Style" },
413*05b00f60SXin Li     { 0x08,                   "Bandwidth protection" }, /* RFC4090 */
414*05b00f60SXin Li     { 0x10,                   "Node protection" },      /* RFC4090 */
415*05b00f60SXin Li     { 0, NULL}
416*05b00f60SXin Li };
417*05b00f60SXin Li 
418*05b00f60SXin Li static const struct tok rsvp_obj_prop_tlv_values[] = {
419*05b00f60SXin Li     { 0x01,                   "Cos" },
420*05b00f60SXin Li     { 0x02,                   "Metric 1" },
421*05b00f60SXin Li     { 0x04,                   "Metric 2" },
422*05b00f60SXin Li     { 0x08,                   "CCC Status" },
423*05b00f60SXin Li     { 0x10,                   "Path Type" },
424*05b00f60SXin Li     { 0, NULL}
425*05b00f60SXin Li };
426*05b00f60SXin Li 
427*05b00f60SXin Li #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
428*05b00f60SXin Li #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY  25
429*05b00f60SXin Li #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
430*05b00f60SXin Li #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
431*05b00f60SXin Li 
432*05b00f60SXin Li static const struct tok rsvp_obj_error_code_values[] = {
433*05b00f60SXin Li     { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
434*05b00f60SXin Li     { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY,  "Notify Error" },
435*05b00f60SXin Li     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
436*05b00f60SXin Li     { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
437*05b00f60SXin Li     { 0, NULL}
438*05b00f60SXin Li };
439*05b00f60SXin Li 
440*05b00f60SXin Li static const struct tok rsvp_obj_error_code_routing_values[] = {
441*05b00f60SXin Li     { 1,                      "Bad EXPLICIT_ROUTE object" },
442*05b00f60SXin Li     { 2,                      "Bad strict node" },
443*05b00f60SXin Li     { 3,                      "Bad loose node" },
444*05b00f60SXin Li     { 4,                      "Bad initial subobject" },
445*05b00f60SXin Li     { 5,                      "No route available toward destination" },
446*05b00f60SXin Li     { 6,                      "Unacceptable label value" },
447*05b00f60SXin Li     { 7,                      "RRO indicated routing loops" },
448*05b00f60SXin Li     { 8,                      "non-RSVP-capable router in the path" },
449*05b00f60SXin Li     { 9,                      "MPLS label allocation failure" },
450*05b00f60SXin Li     { 10,                     "Unsupported L3PID" },
451*05b00f60SXin Li     { 0, NULL}
452*05b00f60SXin Li };
453*05b00f60SXin Li 
454*05b00f60SXin Li static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
455*05b00f60SXin Li     { 1,                      "Unexpected CT object" },
456*05b00f60SXin Li     { 2,                      "Unsupported CT" },
457*05b00f60SXin Li     { 3,                      "Invalid CT value" },
458*05b00f60SXin Li     { 4,                      "CT/setup priority do not form a configured TE-Class" },
459*05b00f60SXin Li     { 5,                      "CT/holding priority do not form a configured TE-Class" },
460*05b00f60SXin Li     { 6,                      "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
461*05b00f60SXin Li     { 7,                      "Inconsistency between signaled PSC and signaled CT" },
462*05b00f60SXin Li     { 8,                      "Inconsistency between signaled PHBs and signaled CT" },
463*05b00f60SXin Li    { 0, NULL}
464*05b00f60SXin Li };
465*05b00f60SXin Li 
466*05b00f60SXin Li /* rfc3473 / rfc 3471 */
467*05b00f60SXin Li static const struct tok rsvp_obj_admin_status_flag_values[] = {
468*05b00f60SXin Li     { 0x80000000, "Reflect" },
469*05b00f60SXin Li     { 0x00000004, "Testing" },
470*05b00f60SXin Li     { 0x00000002, "Admin-down" },
471*05b00f60SXin Li     { 0x00000001, "Delete-in-progress" },
472*05b00f60SXin Li     { 0, NULL}
473*05b00f60SXin Li };
474*05b00f60SXin Li 
475*05b00f60SXin Li /* label set actions - rfc3471 */
476*05b00f60SXin Li #define LABEL_SET_INCLUSIVE_LIST  0
477*05b00f60SXin Li #define LABEL_SET_EXCLUSIVE_LIST  1
478*05b00f60SXin Li #define LABEL_SET_INCLUSIVE_RANGE 2
479*05b00f60SXin Li #define LABEL_SET_EXCLUSIVE_RANGE 3
480*05b00f60SXin Li 
481*05b00f60SXin Li static const struct tok rsvp_obj_label_set_action_values[] = {
482*05b00f60SXin Li     { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
483*05b00f60SXin Li     { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
484*05b00f60SXin Li     { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
485*05b00f60SXin Li     { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
486*05b00f60SXin Li     { 0, NULL}
487*05b00f60SXin Li };
488*05b00f60SXin Li 
489*05b00f60SXin Li /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
490*05b00f60SXin Li #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS	    1
491*05b00f60SXin Li #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
492*05b00f60SXin Li #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY		    3
493*05b00f60SXin Li #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL            4
494*05b00f60SXin Li #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL           5
495*05b00f60SXin Li 
496*05b00f60SXin Li static const struct tok rsvp_obj_generalized_uni_values[] = {
497*05b00f60SXin Li     { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
498*05b00f60SXin Li     { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
499*05b00f60SXin Li     { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
500*05b00f60SXin Li     { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
501*05b00f60SXin Li     { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
502*05b00f60SXin Li     { 0, NULL}
503*05b00f60SXin Li };
504*05b00f60SXin Li 
505*05b00f60SXin Li /*
506*05b00f60SXin Li  * this is a dissector for all the intserv defined
507*05b00f60SXin Li  * specs as defined per rfc2215
508*05b00f60SXin Li  * it is called from various rsvp objects;
509*05b00f60SXin Li  * returns the amount of bytes being processed
510*05b00f60SXin Li  */
511*05b00f60SXin Li static u_int
rsvp_intserv_print(netdissect_options * ndo,const u_char * tptr,u_int obj_tlen)512*05b00f60SXin Li rsvp_intserv_print(netdissect_options *ndo,
513*05b00f60SXin Li                    const u_char *tptr, u_int obj_tlen)
514*05b00f60SXin Li {
515*05b00f60SXin Li     u_int parameter_id,parameter_length;
516*05b00f60SXin Li     union {
517*05b00f60SXin Li 	float f;
518*05b00f60SXin Li 	uint32_t i;
519*05b00f60SXin Li     } bw;
520*05b00f60SXin Li 
521*05b00f60SXin Li     if (obj_tlen < 4)
522*05b00f60SXin Li         return 0;
523*05b00f60SXin Li     parameter_id = GET_U_1(tptr);
524*05b00f60SXin Li     parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */
525*05b00f60SXin Li 
526*05b00f60SXin Li     ND_PRINT("\n\t      Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
527*05b00f60SXin Li            tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
528*05b00f60SXin Li            parameter_id,
529*05b00f60SXin Li            parameter_length,
530*05b00f60SXin Li            GET_U_1(tptr + 1));
531*05b00f60SXin Li 
532*05b00f60SXin Li     if (obj_tlen < parameter_length+4)
533*05b00f60SXin Li         return 0;
534*05b00f60SXin Li     switch(parameter_id) { /* parameter_id */
535*05b00f60SXin Li 
536*05b00f60SXin Li     case 4:
537*05b00f60SXin Li        /*
538*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
539*05b00f60SXin Li         * |    4 (e)      |    (f)        |           1 (g)               |
540*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
541*05b00f60SXin Li         * |        IS hop cnt (32-bit unsigned integer)                   |
542*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
543*05b00f60SXin Li         */
544*05b00f60SXin Li         if (parameter_length == 4) {
545*05b00f60SXin Li             ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4));
546*05b00f60SXin Li         }
547*05b00f60SXin Li         break;
548*05b00f60SXin Li 
549*05b00f60SXin Li     case 6:
550*05b00f60SXin Li        /*
551*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
552*05b00f60SXin Li         * |    6 (h)      |    (i)        |           1 (j)               |
553*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
554*05b00f60SXin Li         * |  Path b/w estimate  (32-bit IEEE floating point number)       |
555*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
556*05b00f60SXin Li         */
557*05b00f60SXin Li         if (parameter_length == 4) {
558*05b00f60SXin Li             bw.i = GET_BE_U_4(tptr + 4);
559*05b00f60SXin Li             ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000);
560*05b00f60SXin Li         }
561*05b00f60SXin Li         break;
562*05b00f60SXin Li 
563*05b00f60SXin Li     case 8:
564*05b00f60SXin Li        /*
565*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
566*05b00f60SXin Li         * |     8 (k)     |    (l)        |           1 (m)               |
567*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
568*05b00f60SXin Li         * |        Minimum path latency (32-bit integer)                  |
569*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
570*05b00f60SXin Li         */
571*05b00f60SXin Li         if (parameter_length == 4) {
572*05b00f60SXin Li             ND_PRINT("\n\t\tMinimum path latency: ");
573*05b00f60SXin Li             if (GET_BE_U_4(tptr + 4) == 0xffffffff)
574*05b00f60SXin Li                 ND_PRINT("don't care");
575*05b00f60SXin Li             else
576*05b00f60SXin Li                 ND_PRINT("%u", GET_BE_U_4(tptr + 4));
577*05b00f60SXin Li         }
578*05b00f60SXin Li         break;
579*05b00f60SXin Li 
580*05b00f60SXin Li     case 10:
581*05b00f60SXin Li 
582*05b00f60SXin Li        /*
583*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
584*05b00f60SXin Li         * |     10 (n)    |      (o)      |           1 (p)               |
585*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
586*05b00f60SXin Li         * |      Composed MTU (32-bit unsigned integer)                   |
587*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
588*05b00f60SXin Li         */
589*05b00f60SXin Li         if (parameter_length == 4) {
590*05b00f60SXin Li             ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4));
591*05b00f60SXin Li         }
592*05b00f60SXin Li         break;
593*05b00f60SXin Li     case 127:
594*05b00f60SXin Li        /*
595*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
596*05b00f60SXin Li         * |   127 (e)     |    0 (f)      |             5 (g)             |
597*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
598*05b00f60SXin Li         * |  Token Bucket Rate [r] (32-bit IEEE floating point number)    |
599*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
600*05b00f60SXin Li         * |  Token Bucket Size [b] (32-bit IEEE floating point number)    |
601*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
602*05b00f60SXin Li         * |  Peak Data Rate [p] (32-bit IEEE floating point number)       |
603*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
604*05b00f60SXin Li         * |  Minimum Policed Unit [m] (32-bit integer)                    |
605*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
606*05b00f60SXin Li         * |  Maximum Packet Size [M]  (32-bit integer)                    |
607*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
608*05b00f60SXin Li         */
609*05b00f60SXin Li 
610*05b00f60SXin Li         if (parameter_length == 20) {
611*05b00f60SXin Li 	    ND_TCHECK_LEN(tptr + 4, 20);
612*05b00f60SXin Li             bw.i = GET_BE_U_4(tptr + 4);
613*05b00f60SXin Li             ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000);
614*05b00f60SXin Li             bw.i = GET_BE_U_4(tptr + 8);
615*05b00f60SXin Li             ND_PRINT("\n\t\tToken Bucket Size: %.10g bytes", bw.f);
616*05b00f60SXin Li             bw.i = GET_BE_U_4(tptr + 12);
617*05b00f60SXin Li             ND_PRINT("\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000);
618*05b00f60SXin Li             ND_PRINT("\n\t\tMinimum Policed Unit: %u bytes",
619*05b00f60SXin Li                      GET_BE_U_4(tptr + 16));
620*05b00f60SXin Li             ND_PRINT("\n\t\tMaximum Packet Size: %u bytes",
621*05b00f60SXin Li                      GET_BE_U_4(tptr + 20));
622*05b00f60SXin Li         }
623*05b00f60SXin Li         break;
624*05b00f60SXin Li 
625*05b00f60SXin Li     case 130:
626*05b00f60SXin Li        /*
627*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
628*05b00f60SXin Li         * |     130 (h)   |    0 (i)      |            2 (j)              |
629*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
630*05b00f60SXin Li         * |  Rate [R]  (32-bit IEEE floating point number)                |
631*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
632*05b00f60SXin Li         * |  Slack Term [S]  (32-bit integer)                             |
633*05b00f60SXin Li         * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
634*05b00f60SXin Li         */
635*05b00f60SXin Li 
636*05b00f60SXin Li         if (parameter_length == 8) {
637*05b00f60SXin Li 	    ND_TCHECK_8(tptr + 4);
638*05b00f60SXin Li             bw.i = GET_BE_U_4(tptr + 4);
639*05b00f60SXin Li             ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000);
640*05b00f60SXin Li             ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8));
641*05b00f60SXin Li         }
642*05b00f60SXin Li         break;
643*05b00f60SXin Li 
644*05b00f60SXin Li     case 133:
645*05b00f60SXin Li     case 134:
646*05b00f60SXin Li     case 135:
647*05b00f60SXin Li     case 136:
648*05b00f60SXin Li         if (parameter_length == 4) {
649*05b00f60SXin Li             ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4));
650*05b00f60SXin Li         }
651*05b00f60SXin Li         break;
652*05b00f60SXin Li 
653*05b00f60SXin Li     default:
654*05b00f60SXin Li         if (ndo->ndo_vflag <= 1)
655*05b00f60SXin Li             print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
656*05b00f60SXin Li     }
657*05b00f60SXin Li     return (parameter_length+4); /* header length 4 bytes */
658*05b00f60SXin Li 
659*05b00f60SXin Li trunc:
660*05b00f60SXin Li     nd_print_trunc(ndo);
661*05b00f60SXin Li     return 0;
662*05b00f60SXin Li }
663*05b00f60SXin Li 
664*05b00f60SXin Li /*
665*05b00f60SXin Li  * Clear checksum prior to signature verification.
666*05b00f60SXin Li  */
667*05b00f60SXin Li static void
rsvp_clear_checksum(void * header)668*05b00f60SXin Li rsvp_clear_checksum(void *header)
669*05b00f60SXin Li {
670*05b00f60SXin Li     struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header;
671*05b00f60SXin Li 
672*05b00f60SXin Li     rsvp_com_header->checksum[0] = 0;
673*05b00f60SXin Li     rsvp_com_header->checksum[1] = 0;
674*05b00f60SXin Li }
675*05b00f60SXin Li 
676*05b00f60SXin Li static int
rsvp_obj_print(netdissect_options * ndo,const u_char * pptr,u_int plen,const u_char * tptr,const char * indent,u_int tlen,const struct rsvp_common_header * rsvp_com_header)677*05b00f60SXin Li rsvp_obj_print(netdissect_options *ndo,
678*05b00f60SXin Li                const u_char *pptr, u_int plen, const u_char *tptr,
679*05b00f60SXin Li                const char *indent, u_int tlen,
680*05b00f60SXin Li                const struct rsvp_common_header *rsvp_com_header)
681*05b00f60SXin Li {
682*05b00f60SXin Li     const struct rsvp_object_header *rsvp_obj_header;
683*05b00f60SXin Li     const u_char *obj_tptr;
684*05b00f60SXin Li     union {
685*05b00f60SXin Li         const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
686*05b00f60SXin Li         const struct rsvp_obj_frr_t *rsvp_obj_frr;
687*05b00f60SXin Li     } obj_ptr;
688*05b00f60SXin Li 
689*05b00f60SXin Li     u_short rsvp_obj_len,rsvp_obj_ctype,rsvp_obj_class_num;
690*05b00f60SXin Li     u_int obj_tlen,intserv_serv_tlen;
691*05b00f60SXin Li     int hexdump;
692*05b00f60SXin Li     u_int processed,padbytes,error_code,error_value,i,sigcheck;
693*05b00f60SXin Li     union {
694*05b00f60SXin Li 	float f;
695*05b00f60SXin Li 	uint32_t i;
696*05b00f60SXin Li     } bw;
697*05b00f60SXin Li     u_int namelen;
698*05b00f60SXin Li 
699*05b00f60SXin Li     u_int action, subchannel;
700*05b00f60SXin Li 
701*05b00f60SXin Li     while(tlen>=sizeof(struct rsvp_object_header)) {
702*05b00f60SXin Li         /* did we capture enough for fully decoding the object header ? */
703*05b00f60SXin Li         ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header));
704*05b00f60SXin Li 
705*05b00f60SXin Li         rsvp_obj_header = (const struct rsvp_object_header *)tptr;
706*05b00f60SXin Li         rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length);
707*05b00f60SXin Li         rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype);
708*05b00f60SXin Li 
709*05b00f60SXin Li         if(rsvp_obj_len % 4) {
710*05b00f60SXin Li             ND_PRINT("%sERROR: object header size %u not a multiple of 4", indent, rsvp_obj_len);
711*05b00f60SXin Li             return -1;
712*05b00f60SXin Li         }
713*05b00f60SXin Li         if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
714*05b00f60SXin Li             ND_PRINT("%sERROR: object header too short %u < %zu", indent, rsvp_obj_len,
715*05b00f60SXin Li                    sizeof(struct rsvp_object_header));
716*05b00f60SXin Li             return -1;
717*05b00f60SXin Li         }
718*05b00f60SXin Li 
719*05b00f60SXin Li         rsvp_obj_class_num = GET_U_1(rsvp_obj_header->class_num);
720*05b00f60SXin Li         ND_PRINT("%s%s Object (%u) Flags: [%s",
721*05b00f60SXin Li                indent,
722*05b00f60SXin Li                tok2str(rsvp_obj_values,
723*05b00f60SXin Li                        "Unknown",
724*05b00f60SXin Li                        rsvp_obj_class_num),
725*05b00f60SXin Li                rsvp_obj_class_num,
726*05b00f60SXin Li                (rsvp_obj_class_num & 0x80) ?
727*05b00f60SXin Li                    ((rsvp_obj_class_num & 0x40) ? "ignore and forward" :
728*05b00f60SXin Li                                          "ignore silently") :
729*05b00f60SXin Li                    "reject");
730*05b00f60SXin Li 
731*05b00f60SXin Li         ND_PRINT(" if unknown], Class-Type: %s (%u), length: %u",
732*05b00f60SXin Li                tok2str(rsvp_ctype_values,
733*05b00f60SXin Li                        "Unknown",
734*05b00f60SXin Li                        (rsvp_obj_class_num<<8)+rsvp_obj_ctype),
735*05b00f60SXin Li                rsvp_obj_ctype,
736*05b00f60SXin Li                rsvp_obj_len);
737*05b00f60SXin Li 
738*05b00f60SXin Li         if(tlen < rsvp_obj_len) {
739*05b00f60SXin Li             ND_PRINT("%sERROR: object goes past end of objects TLV", indent);
740*05b00f60SXin Li             return -1;
741*05b00f60SXin Li         }
742*05b00f60SXin Li 
743*05b00f60SXin Li         obj_tptr=tptr+sizeof(struct rsvp_object_header);
744*05b00f60SXin Li         obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
745*05b00f60SXin Li 
746*05b00f60SXin Li         /* did we capture enough for fully decoding the object ? */
747*05b00f60SXin Li         ND_TCHECK_LEN(tptr, rsvp_obj_len);
748*05b00f60SXin Li         hexdump=FALSE;
749*05b00f60SXin Li 
750*05b00f60SXin Li         switch(rsvp_obj_class_num) {
751*05b00f60SXin Li         case RSVP_OBJ_SESSION:
752*05b00f60SXin Li             switch(rsvp_obj_ctype) {
753*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
754*05b00f60SXin Li                 if (obj_tlen < 8)
755*05b00f60SXin Li                     goto obj_tooshort;
756*05b00f60SXin Li                 ND_PRINT("%s  IPv4 DestAddress: %s, Protocol ID: 0x%02x",
757*05b00f60SXin Li                        indent,
758*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
759*05b00f60SXin Li                        GET_U_1(obj_tptr + sizeof(nd_ipv4)));
760*05b00f60SXin Li                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
761*05b00f60SXin Li                        indent,
762*05b00f60SXin Li                        GET_U_1((obj_tptr + 5)),
763*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6));
764*05b00f60SXin Li                 obj_tlen-=8;
765*05b00f60SXin Li                 obj_tptr+=8;
766*05b00f60SXin Li                 break;
767*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
768*05b00f60SXin Li                 if (obj_tlen < 20)
769*05b00f60SXin Li                     goto obj_tooshort;
770*05b00f60SXin Li                 ND_PRINT("%s  IPv6 DestAddress: %s, Protocol ID: 0x%02x",
771*05b00f60SXin Li                        indent,
772*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
773*05b00f60SXin Li                        GET_U_1(obj_tptr + sizeof(nd_ipv6)));
774*05b00f60SXin Li                 ND_PRINT("%s  Flags: [0x%02x], DestPort %u",
775*05b00f60SXin Li                        indent,
776*05b00f60SXin Li                        GET_U_1((obj_tptr + sizeof(nd_ipv6) + 1)),
777*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + sizeof(nd_ipv6) + 2));
778*05b00f60SXin Li                 obj_tlen-=20;
779*05b00f60SXin Li                 obj_tptr+=20;
780*05b00f60SXin Li                 break;
781*05b00f60SXin Li 
782*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV6:
783*05b00f60SXin Li                 if (obj_tlen < 36)
784*05b00f60SXin Li                     goto obj_tooshort;
785*05b00f60SXin Li                 ND_PRINT("%s  IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
786*05b00f60SXin Li                        indent,
787*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
788*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18),
789*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr + 20));
790*05b00f60SXin Li                 obj_tlen-=36;
791*05b00f60SXin Li                 obj_tptr+=36;
792*05b00f60SXin Li                 break;
793*05b00f60SXin Li 
794*05b00f60SXin Li             case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
795*05b00f60SXin Li                 if (obj_tlen < 26)
796*05b00f60SXin Li                     goto obj_tooshort;
797*05b00f60SXin Li                 ND_PRINT("%s  IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
798*05b00f60SXin Li                        indent,
799*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
800*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6),
801*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr + 8));
802*05b00f60SXin Li                 obj_tlen-=26;
803*05b00f60SXin Li                 obj_tptr+=26;
804*05b00f60SXin Li                 break;
805*05b00f60SXin Li             case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
806*05b00f60SXin Li                 if (obj_tlen < 12)
807*05b00f60SXin Li                     goto obj_tooshort;
808*05b00f60SXin Li                 ND_PRINT("%s  IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
809*05b00f60SXin Li                        indent,
810*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
811*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6),
812*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr + 8));
813*05b00f60SXin Li                 obj_tlen-=12;
814*05b00f60SXin Li                 obj_tptr+=12;
815*05b00f60SXin Li                 break;
816*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4:
817*05b00f60SXin Li             case RSVP_CTYPE_UNI_IPV4:
818*05b00f60SXin Li                 if (obj_tlen < 12)
819*05b00f60SXin Li                     goto obj_tooshort;
820*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
821*05b00f60SXin Li                        indent,
822*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
823*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6),
824*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr + 8));
825*05b00f60SXin Li                 obj_tlen-=12;
826*05b00f60SXin Li                 obj_tptr+=12;
827*05b00f60SXin Li                 break;
828*05b00f60SXin Li             default:
829*05b00f60SXin Li                 hexdump=TRUE;
830*05b00f60SXin Li             }
831*05b00f60SXin Li             break;
832*05b00f60SXin Li 
833*05b00f60SXin Li         case RSVP_OBJ_CONFIRM:
834*05b00f60SXin Li             switch(rsvp_obj_ctype) {
835*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
836*05b00f60SXin Li                 if (obj_tlen < sizeof(nd_ipv4))
837*05b00f60SXin Li                     goto obj_tooshort;
838*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Receiver Address: %s",
839*05b00f60SXin Li                        indent,
840*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr));
841*05b00f60SXin Li                 obj_tlen-=sizeof(nd_ipv4);
842*05b00f60SXin Li                 obj_tptr+=sizeof(nd_ipv4);
843*05b00f60SXin Li                 break;
844*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
845*05b00f60SXin Li                 if (obj_tlen < sizeof(nd_ipv6))
846*05b00f60SXin Li                     goto obj_tooshort;
847*05b00f60SXin Li                 ND_PRINT("%s  IPv6 Receiver Address: %s",
848*05b00f60SXin Li                        indent,
849*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr));
850*05b00f60SXin Li                 obj_tlen-=sizeof(nd_ipv6);
851*05b00f60SXin Li                 obj_tptr+=sizeof(nd_ipv6);
852*05b00f60SXin Li                 break;
853*05b00f60SXin Li             default:
854*05b00f60SXin Li                 hexdump=TRUE;
855*05b00f60SXin Li             }
856*05b00f60SXin Li             break;
857*05b00f60SXin Li 
858*05b00f60SXin Li         case RSVP_OBJ_NOTIFY_REQ:
859*05b00f60SXin Li             switch(rsvp_obj_ctype) {
860*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
861*05b00f60SXin Li                 if (obj_tlen < sizeof(nd_ipv4))
862*05b00f60SXin Li                     goto obj_tooshort;
863*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Notify Node Address: %s",
864*05b00f60SXin Li                        indent,
865*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr));
866*05b00f60SXin Li                 obj_tlen-=sizeof(nd_ipv4);
867*05b00f60SXin Li                 obj_tptr+=sizeof(nd_ipv4);
868*05b00f60SXin Li                 break;
869*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
870*05b00f60SXin Li                 if (obj_tlen < sizeof(nd_ipv6))
871*05b00f60SXin Li                     goto obj_tooshort;
872*05b00f60SXin Li                 ND_PRINT("%s  IPv6 Notify Node Address: %s",
873*05b00f60SXin Li                        indent,
874*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr));
875*05b00f60SXin Li                 obj_tlen-=sizeof(nd_ipv6);
876*05b00f60SXin Li                 obj_tptr+=sizeof(nd_ipv6);
877*05b00f60SXin Li                 break;
878*05b00f60SXin Li             default:
879*05b00f60SXin Li                 hexdump=TRUE;
880*05b00f60SXin Li             }
881*05b00f60SXin Li             break;
882*05b00f60SXin Li 
883*05b00f60SXin Li         case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
884*05b00f60SXin Li         case RSVP_OBJ_UPSTREAM_LABEL:  /* fall through */
885*05b00f60SXin Li         case RSVP_OBJ_RECOVERY_LABEL:  /* fall through */
886*05b00f60SXin Li         case RSVP_OBJ_LABEL:
887*05b00f60SXin Li             switch(rsvp_obj_ctype) {
888*05b00f60SXin Li             case RSVP_CTYPE_1:
889*05b00f60SXin Li                 while(obj_tlen >= 4 ) {
890*05b00f60SXin Li                     ND_PRINT("%s  Label: %u", indent, GET_BE_U_4(obj_tptr));
891*05b00f60SXin Li                     obj_tlen-=4;
892*05b00f60SXin Li                     obj_tptr+=4;
893*05b00f60SXin Li                 }
894*05b00f60SXin Li                 break;
895*05b00f60SXin Li             case RSVP_CTYPE_2:
896*05b00f60SXin Li                 if (obj_tlen < 4)
897*05b00f60SXin Li                     goto obj_tooshort;
898*05b00f60SXin Li                 ND_PRINT("%s  Generalized Label: %u",
899*05b00f60SXin Li                        indent,
900*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
901*05b00f60SXin Li                 obj_tlen-=4;
902*05b00f60SXin Li                 obj_tptr+=4;
903*05b00f60SXin Li                 break;
904*05b00f60SXin Li             case RSVP_CTYPE_3:
905*05b00f60SXin Li                 if (obj_tlen < 12)
906*05b00f60SXin Li                     goto obj_tooshort;
907*05b00f60SXin Li                 ND_PRINT("%s  Waveband ID: %u%s  Start Label: %u, Stop Label: %u",
908*05b00f60SXin Li                        indent,
909*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
910*05b00f60SXin Li                        indent,
911*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4),
912*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 8));
913*05b00f60SXin Li                 obj_tlen-=12;
914*05b00f60SXin Li                 obj_tptr+=12;
915*05b00f60SXin Li                 break;
916*05b00f60SXin Li             default:
917*05b00f60SXin Li                 hexdump=TRUE;
918*05b00f60SXin Li             }
919*05b00f60SXin Li             break;
920*05b00f60SXin Li 
921*05b00f60SXin Li         case RSVP_OBJ_STYLE:
922*05b00f60SXin Li             switch(rsvp_obj_ctype) {
923*05b00f60SXin Li             case RSVP_CTYPE_1:
924*05b00f60SXin Li                 if (obj_tlen < 4)
925*05b00f60SXin Li                     goto obj_tooshort;
926*05b00f60SXin Li                 ND_PRINT("%s  Reservation Style: %s, Flags: [0x%02x]",
927*05b00f60SXin Li                        indent,
928*05b00f60SXin Li                        tok2str(rsvp_resstyle_values,
929*05b00f60SXin Li                                "Unknown",
930*05b00f60SXin Li                                GET_BE_U_3(obj_tptr + 1)),
931*05b00f60SXin Li                        GET_U_1(obj_tptr));
932*05b00f60SXin Li                 obj_tlen-=4;
933*05b00f60SXin Li                 obj_tptr+=4;
934*05b00f60SXin Li                 break;
935*05b00f60SXin Li             default:
936*05b00f60SXin Li                 hexdump=TRUE;
937*05b00f60SXin Li             }
938*05b00f60SXin Li             break;
939*05b00f60SXin Li 
940*05b00f60SXin Li         case RSVP_OBJ_SENDER_TEMPLATE:
941*05b00f60SXin Li             switch(rsvp_obj_ctype) {
942*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
943*05b00f60SXin Li                 if (obj_tlen < 8)
944*05b00f60SXin Li                     goto obj_tooshort;
945*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
946*05b00f60SXin Li                        indent,
947*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
948*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6));
949*05b00f60SXin Li                 obj_tlen-=8;
950*05b00f60SXin Li                 obj_tptr+=8;
951*05b00f60SXin Li                 break;
952*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
953*05b00f60SXin Li                 if (obj_tlen < 20)
954*05b00f60SXin Li                     goto obj_tooshort;
955*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
956*05b00f60SXin Li                        indent,
957*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
958*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18));
959*05b00f60SXin Li                 obj_tlen-=20;
960*05b00f60SXin Li                 obj_tptr+=20;
961*05b00f60SXin Li                 break;
962*05b00f60SXin Li             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
963*05b00f60SXin Li                 if (obj_tlen < 40)
964*05b00f60SXin Li                     goto obj_tooshort;
965*05b00f60SXin Li                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
966*05b00f60SXin Li                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
967*05b00f60SXin Li                        indent,
968*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
969*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18),
970*05b00f60SXin Li                        indent,
971*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+20),
972*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 38));
973*05b00f60SXin Li                 obj_tlen-=40;
974*05b00f60SXin Li                 obj_tptr+=40;
975*05b00f60SXin Li                 break;
976*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4:
977*05b00f60SXin Li                 if (obj_tlen < 8)
978*05b00f60SXin Li                     goto obj_tooshort;
979*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
980*05b00f60SXin Li                        indent,
981*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
982*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6));
983*05b00f60SXin Li                 obj_tlen-=8;
984*05b00f60SXin Li                 obj_tptr+=8;
985*05b00f60SXin Li                 break;
986*05b00f60SXin Li             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
987*05b00f60SXin Li                 if (obj_tlen < 16)
988*05b00f60SXin Li                     goto obj_tooshort;
989*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
990*05b00f60SXin Li                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
991*05b00f60SXin Li                        indent,
992*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
993*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6),
994*05b00f60SXin Li                        indent,
995*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+8),
996*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 12));
997*05b00f60SXin Li                 obj_tlen-=16;
998*05b00f60SXin Li                 obj_tptr+=16;
999*05b00f60SXin Li                 break;
1000*05b00f60SXin Li             default:
1001*05b00f60SXin Li                 hexdump=TRUE;
1002*05b00f60SXin Li             }
1003*05b00f60SXin Li             break;
1004*05b00f60SXin Li 
1005*05b00f60SXin Li         case RSVP_OBJ_LABEL_REQ:
1006*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1007*05b00f60SXin Li             case RSVP_CTYPE_1:
1008*05b00f60SXin Li                 while(obj_tlen >= 4 ) {
1009*05b00f60SXin Li                     ND_PRINT("%s  L3 Protocol ID: %s",
1010*05b00f60SXin Li                            indent,
1011*05b00f60SXin Li                            tok2str(ethertype_values,
1012*05b00f60SXin Li                                    "Unknown Protocol (0x%04x)",
1013*05b00f60SXin Li                                    GET_BE_U_2(obj_tptr + 2)));
1014*05b00f60SXin Li                     obj_tlen-=4;
1015*05b00f60SXin Li                     obj_tptr+=4;
1016*05b00f60SXin Li                 }
1017*05b00f60SXin Li                 break;
1018*05b00f60SXin Li             case RSVP_CTYPE_2:
1019*05b00f60SXin Li                 if (obj_tlen < 12)
1020*05b00f60SXin Li                     goto obj_tooshort;
1021*05b00f60SXin Li                 ND_PRINT("%s  L3 Protocol ID: %s",
1022*05b00f60SXin Li                        indent,
1023*05b00f60SXin Li                        tok2str(ethertype_values,
1024*05b00f60SXin Li                                "Unknown Protocol (0x%04x)",
1025*05b00f60SXin Li                                GET_BE_U_2(obj_tptr + 2)));
1026*05b00f60SXin Li                 ND_PRINT(",%s merge capability",
1027*05b00f60SXin Li                          ((GET_U_1(obj_tptr + 4)) & 0x80) ? "no" : "" );
1028*05b00f60SXin Li                 ND_PRINT("%s  Minimum VPI/VCI: %u/%u",
1029*05b00f60SXin Li                        indent,
1030*05b00f60SXin Li                        (GET_BE_U_2(obj_tptr + 4))&0xfff,
1031*05b00f60SXin Li                        (GET_BE_U_2(obj_tptr + 6)) & 0xfff);
1032*05b00f60SXin Li                 ND_PRINT("%s  Maximum VPI/VCI: %u/%u",
1033*05b00f60SXin Li                        indent,
1034*05b00f60SXin Li                        (GET_BE_U_2(obj_tptr + 8))&0xfff,
1035*05b00f60SXin Li                        (GET_BE_U_2(obj_tptr + 10)) & 0xfff);
1036*05b00f60SXin Li                 obj_tlen-=12;
1037*05b00f60SXin Li                 obj_tptr+=12;
1038*05b00f60SXin Li                 break;
1039*05b00f60SXin Li             case RSVP_CTYPE_3:
1040*05b00f60SXin Li                 if (obj_tlen < 12)
1041*05b00f60SXin Li                     goto obj_tooshort;
1042*05b00f60SXin Li                 ND_PRINT("%s  L3 Protocol ID: %s",
1043*05b00f60SXin Li                        indent,
1044*05b00f60SXin Li                        tok2str(ethertype_values,
1045*05b00f60SXin Li                                "Unknown Protocol (0x%04x)",
1046*05b00f60SXin Li                                GET_BE_U_2(obj_tptr + 2)));
1047*05b00f60SXin Li                 ND_PRINT("%s  Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
1048*05b00f60SXin Li                        indent,
1049*05b00f60SXin Li                        (GET_BE_U_4(obj_tptr + 4))&0x7fffff,
1050*05b00f60SXin Li                        (GET_BE_U_4(obj_tptr + 8))&0x7fffff,
1051*05b00f60SXin Li                        (((GET_BE_U_2(obj_tptr + 4)>>7)&3) == 0 ) ? "10" : "",
1052*05b00f60SXin Li                        (((GET_BE_U_2(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : "");
1053*05b00f60SXin Li                 obj_tlen-=12;
1054*05b00f60SXin Li                 obj_tptr+=12;
1055*05b00f60SXin Li                 break;
1056*05b00f60SXin Li             case RSVP_CTYPE_4:
1057*05b00f60SXin Li                 if (obj_tlen < 4)
1058*05b00f60SXin Li                     goto obj_tooshort;
1059*05b00f60SXin Li                 ND_PRINT("%s  LSP Encoding Type: %s (%u)",
1060*05b00f60SXin Li                        indent,
1061*05b00f60SXin Li                        tok2str(gmpls_encoding_values,
1062*05b00f60SXin Li                                "Unknown",
1063*05b00f60SXin Li                                GET_U_1(obj_tptr)),
1064*05b00f60SXin Li                        GET_U_1(obj_tptr));
1065*05b00f60SXin Li                 ND_PRINT("%s  Switching Type: %s (%u), Payload ID: %s (0x%04x)",
1066*05b00f60SXin Li                        indent,
1067*05b00f60SXin Li                        tok2str(gmpls_switch_cap_values,
1068*05b00f60SXin Li                                "Unknown",
1069*05b00f60SXin Li                                GET_U_1((obj_tptr + 1))),
1070*05b00f60SXin Li                        GET_U_1(obj_tptr + 1),
1071*05b00f60SXin Li                        tok2str(gmpls_payload_values,
1072*05b00f60SXin Li                                "Unknown",
1073*05b00f60SXin Li                                GET_BE_U_2(obj_tptr + 2)),
1074*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 2));
1075*05b00f60SXin Li                 obj_tlen-=4;
1076*05b00f60SXin Li                 obj_tptr+=4;
1077*05b00f60SXin Li                 break;
1078*05b00f60SXin Li             default:
1079*05b00f60SXin Li                 hexdump=TRUE;
1080*05b00f60SXin Li             }
1081*05b00f60SXin Li             break;
1082*05b00f60SXin Li 
1083*05b00f60SXin Li         case RSVP_OBJ_RRO:
1084*05b00f60SXin Li         case RSVP_OBJ_ERO:
1085*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1086*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
1087*05b00f60SXin Li                 while(obj_tlen >= 4 ) {
1088*05b00f60SXin Li 		    u_char length;
1089*05b00f60SXin Li 
1090*05b00f60SXin Li 		    ND_TCHECK_4(obj_tptr);
1091*05b00f60SXin Li 		    length = GET_U_1(obj_tptr + 1);
1092*05b00f60SXin Li                     ND_PRINT("%s  Subobject Type: %s, length %u",
1093*05b00f60SXin Li                            indent,
1094*05b00f60SXin Li                            tok2str(rsvp_obj_xro_values,
1095*05b00f60SXin Li                                    "Unknown %u",
1096*05b00f60SXin Li                                    RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))),
1097*05b00f60SXin Li                            length);
1098*05b00f60SXin Li                     if (obj_tlen < length) {
1099*05b00f60SXin Li                         ND_PRINT("%s  ERROR: ERO subobject length > object length", indent);
1100*05b00f60SXin Li                         break;
1101*05b00f60SXin Li                     }
1102*05b00f60SXin Li 
1103*05b00f60SXin Li                     if (length == 0) { /* prevent infinite loops */
1104*05b00f60SXin Li                         ND_PRINT("%s  ERROR: zero length ERO subtype", indent);
1105*05b00f60SXin Li                         break;
1106*05b00f60SXin Li                     }
1107*05b00f60SXin Li 
1108*05b00f60SXin Li                     switch(RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))) {
1109*05b00f60SXin Li 		    u_char prefix_length;
1110*05b00f60SXin Li 
1111*05b00f60SXin Li                     case RSVP_OBJ_XRO_IPV4:
1112*05b00f60SXin Li 			if (length != 8) {
1113*05b00f60SXin Li 				ND_PRINT(" ERROR: length != 8");
1114*05b00f60SXin Li 				goto invalid;
1115*05b00f60SXin Li 			}
1116*05b00f60SXin Li 			ND_TCHECK_8(obj_tptr);
1117*05b00f60SXin Li 			prefix_length = GET_U_1(obj_tptr + 6);
1118*05b00f60SXin Li 			if (prefix_length != 32) {
1119*05b00f60SXin Li 				ND_PRINT(" ERROR: Prefix length %u != 32",
1120*05b00f60SXin Li 					  prefix_length);
1121*05b00f60SXin Li 				goto invalid;
1122*05b00f60SXin Li 			}
1123*05b00f60SXin Li                         ND_PRINT(", %s, %s/%u, Flags: [%s]",
1124*05b00f60SXin Li                                RSVP_OBJ_XRO_MASK_LOOSE(GET_U_1(obj_tptr)) ? "Loose" : "Strict",
1125*05b00f60SXin Li                                GET_IPADDR_STRING(obj_tptr+2),
1126*05b00f60SXin Li                                GET_U_1((obj_tptr + 6)),
1127*05b00f60SXin Li                                bittok2str(rsvp_obj_rro_flag_values,
1128*05b00f60SXin Li                                    "none",
1129*05b00f60SXin Li                                    GET_U_1((obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
1130*05b00f60SXin Li                     break;
1131*05b00f60SXin Li                     case RSVP_OBJ_XRO_LABEL:
1132*05b00f60SXin Li 			if (length != 8) {
1133*05b00f60SXin Li 				ND_PRINT(" ERROR: length != 8");
1134*05b00f60SXin Li 				goto invalid;
1135*05b00f60SXin Li 			}
1136*05b00f60SXin Li 			ND_TCHECK_8(obj_tptr);
1137*05b00f60SXin Li                         ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
1138*05b00f60SXin Li                                bittok2str(rsvp_obj_rro_label_flag_values,
1139*05b00f60SXin Li                                    "none",
1140*05b00f60SXin Li                                    GET_U_1((obj_tptr + 2))),
1141*05b00f60SXin Li                                GET_U_1(obj_tptr + 2),
1142*05b00f60SXin Li                                tok2str(rsvp_ctype_values,
1143*05b00f60SXin Li                                        "Unknown",
1144*05b00f60SXin Li                                        GET_U_1((obj_tptr + 3)) + (256 * RSVP_OBJ_RRO)),
1145*05b00f60SXin Li                                GET_U_1((obj_tptr + 3)),
1146*05b00f60SXin Li                                GET_BE_U_4(obj_tptr + 4));
1147*05b00f60SXin Li                     }
1148*05b00f60SXin Li                     obj_tlen-=length;
1149*05b00f60SXin Li                     obj_tptr+=length;
1150*05b00f60SXin Li                 }
1151*05b00f60SXin Li                 break;
1152*05b00f60SXin Li             default:
1153*05b00f60SXin Li                 hexdump=TRUE;
1154*05b00f60SXin Li             }
1155*05b00f60SXin Li             break;
1156*05b00f60SXin Li 
1157*05b00f60SXin Li         case RSVP_OBJ_HELLO:
1158*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1159*05b00f60SXin Li             case RSVP_CTYPE_1:
1160*05b00f60SXin Li             case RSVP_CTYPE_2:
1161*05b00f60SXin Li                 if (obj_tlen < 8)
1162*05b00f60SXin Li                     goto obj_tooshort;
1163*05b00f60SXin Li                 ND_PRINT("%s  Source Instance: 0x%08x, Destination Instance: 0x%08x",
1164*05b00f60SXin Li                        indent,
1165*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
1166*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4));
1167*05b00f60SXin Li                 obj_tlen-=8;
1168*05b00f60SXin Li                 obj_tptr+=8;
1169*05b00f60SXin Li                 break;
1170*05b00f60SXin Li             default:
1171*05b00f60SXin Li                 hexdump=TRUE;
1172*05b00f60SXin Li             }
1173*05b00f60SXin Li             break;
1174*05b00f60SXin Li 
1175*05b00f60SXin Li         case RSVP_OBJ_RESTART_CAPABILITY:
1176*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1177*05b00f60SXin Li             case RSVP_CTYPE_1:
1178*05b00f60SXin Li                 if (obj_tlen < 8)
1179*05b00f60SXin Li                     goto obj_tooshort;
1180*05b00f60SXin Li                 ND_PRINT("%s  Restart  Time: %ums, Recovery Time: %ums",
1181*05b00f60SXin Li                        indent,
1182*05b00f60SXin Li                        GET_BE_U_4(obj_tptr),
1183*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4));
1184*05b00f60SXin Li                 obj_tlen-=8;
1185*05b00f60SXin Li                 obj_tptr+=8;
1186*05b00f60SXin Li                 break;
1187*05b00f60SXin Li             default:
1188*05b00f60SXin Li                 hexdump=TRUE;
1189*05b00f60SXin Li             }
1190*05b00f60SXin Li             break;
1191*05b00f60SXin Li 
1192*05b00f60SXin Li         case RSVP_OBJ_CAPABILITY:
1193*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1194*05b00f60SXin Li             case RSVP_CTYPE_1:
1195*05b00f60SXin Li                 if (obj_tlen < 4)
1196*05b00f60SXin Li                     goto obj_tooshort;
1197*05b00f60SXin Li                 uint32_t unused_and_flags = GET_BE_U_4(obj_tptr);
1198*05b00f60SXin Li                 if (unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK)
1199*05b00f60SXin Li                     ND_PRINT("%s  [reserved=0x%08x must be zero]", indent,
1200*05b00f60SXin Li                         unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK);
1201*05b00f60SXin Li                 ND_PRINT("%s  Flags: [%s]",
1202*05b00f60SXin Li                        indent,
1203*05b00f60SXin Li                        bittok2str(rsvp_obj_capability_flag_values,
1204*05b00f60SXin Li                                   "none",
1205*05b00f60SXin Li                                   (unused_and_flags & RSVP_OBJ_CAPABILITY_FLAGS_MASK)));
1206*05b00f60SXin Li                 obj_tlen-=4;
1207*05b00f60SXin Li                 obj_tptr+=4;
1208*05b00f60SXin Li                 break;
1209*05b00f60SXin Li             default:
1210*05b00f60SXin Li                 hexdump=TRUE;
1211*05b00f60SXin Li             }
1212*05b00f60SXin Li             break;
1213*05b00f60SXin Li 
1214*05b00f60SXin Li         case RSVP_OBJ_SESSION_ATTRIBUTE:
1215*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1216*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4:
1217*05b00f60SXin Li                 if (obj_tlen < 4)
1218*05b00f60SXin Li                     goto obj_tooshort;
1219*05b00f60SXin Li                 namelen = GET_U_1(obj_tptr + 3);
1220*05b00f60SXin Li                 if (obj_tlen < 4+namelen)
1221*05b00f60SXin Li                     goto obj_tooshort;
1222*05b00f60SXin Li                 ND_PRINT("%s  Session Name: ", indent);
1223*05b00f60SXin Li                 for (i = 0; i < namelen; i++)
1224*05b00f60SXin Li                     fn_print_char(ndo, GET_U_1(obj_tptr + 4 + i));
1225*05b00f60SXin Li                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
1226*05b00f60SXin Li                        indent,
1227*05b00f60SXin Li                        GET_U_1(obj_tptr),
1228*05b00f60SXin Li                        GET_U_1(obj_tptr + 1),
1229*05b00f60SXin Li                        bittok2str(rsvp_session_attribute_flag_values,
1230*05b00f60SXin Li                                   "none",
1231*05b00f60SXin Li                                   GET_U_1((obj_tptr + 2))),
1232*05b00f60SXin Li                        GET_U_1(obj_tptr + 2));
1233*05b00f60SXin Li                 obj_tlen-=4+namelen;
1234*05b00f60SXin Li                 obj_tptr+=4+namelen;
1235*05b00f60SXin Li                 break;
1236*05b00f60SXin Li             default:
1237*05b00f60SXin Li                 hexdump=TRUE;
1238*05b00f60SXin Li             }
1239*05b00f60SXin Li             break;
1240*05b00f60SXin Li 
1241*05b00f60SXin Li 	case RSVP_OBJ_GENERALIZED_UNI:
1242*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1243*05b00f60SXin Li 		u_int subobj_type,af,subobj_len,total_subobj_len;
1244*05b00f60SXin Li 
1245*05b00f60SXin Li             case RSVP_CTYPE_1:
1246*05b00f60SXin Li 
1247*05b00f60SXin Li                 if (obj_tlen < 4)
1248*05b00f60SXin Li                     goto obj_tooshort;
1249*05b00f60SXin Li 
1250*05b00f60SXin Li 		/* read variable length subobjects */
1251*05b00f60SXin Li 		total_subobj_len = obj_tlen;
1252*05b00f60SXin Li                 while(total_subobj_len > 0) {
1253*05b00f60SXin Li                     /* If RFC 3476 Section 3.1 defined that a sub-object of the
1254*05b00f60SXin Li                      * GENERALIZED_UNI RSVP object must have the Length field as
1255*05b00f60SXin Li                      * a multiple of 4, instead of the check below it would be
1256*05b00f60SXin Li                      * better to test total_subobj_len only once before the loop.
1257*05b00f60SXin Li                      * So long as it does not define it and this while loop does
1258*05b00f60SXin Li                      * not implement such a requirement, let's accept that within
1259*05b00f60SXin Li                      * each iteration subobj_len may happen to be a multiple of 1
1260*05b00f60SXin Li                      * and test it and total_subobj_len respectively.
1261*05b00f60SXin Li                      */
1262*05b00f60SXin Li                     if (total_subobj_len < 4)
1263*05b00f60SXin Li                         goto invalid;
1264*05b00f60SXin Li                     subobj_len  = GET_BE_U_2(obj_tptr);
1265*05b00f60SXin Li                     subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8;
1266*05b00f60SXin Li                     af = (GET_BE_U_2(obj_tptr + 2))&0x00FF;
1267*05b00f60SXin Li 
1268*05b00f60SXin Li                     ND_PRINT("%s  Subobject Type: %s (%u), AF: %s (%u), length: %u",
1269*05b00f60SXin Li                            indent,
1270*05b00f60SXin Li                            tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
1271*05b00f60SXin Li                            subobj_type,
1272*05b00f60SXin Li                            tok2str(af_values, "Unknown", af), af,
1273*05b00f60SXin Li                            subobj_len);
1274*05b00f60SXin Li 
1275*05b00f60SXin Li                     /* In addition to what is explained above, the same spec does not
1276*05b00f60SXin Li                      * explicitly say that the same Length field includes the 4-octet
1277*05b00f60SXin Li                      * sub-object header, but as long as this while loop implements it
1278*05b00f60SXin Li                      * as it does include, let's keep the check below consistent with
1279*05b00f60SXin Li                      * the rest of the code.
1280*05b00f60SXin Li                      *
1281*05b00f60SXin Li                      * XXX - RFC 3476 Section 3.1 says "The contents of these
1282*05b00f60SXin Li                      * sub-objects are described in [8]", where [8] is
1283*05b00f60SXin Li                      * UNI 1.0 Signaling Specification, The Optical
1284*05b00f60SXin Li                      * Internetworking Forum.  The URL they give for that
1285*05b00f60SXin Li                      * document is
1286*05b00f60SXin Li                      *
1287*05b00f60SXin Li                      *    http://www.oiforum.com/public/UNI_1.0_ia.html
1288*05b00f60SXin Li                      *
1289*05b00f60SXin Li                      * but that doesn't work; the new URL appears to be
1290*05b00f60SXin Li                      *
1291*05b00f60SXin Li                      *    https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf
1292*05b00f60SXin Li                      *
1293*05b00f60SXin Li                      * and *that* document, in section 12.5.2.3
1294*05b00f60SXin Li                      * "GENERALIZED_UNI Object (Class-Num=11bbbbbb (TBA))",
1295*05b00f60SXin Li                      * says nothing about the length field in general, but
1296*05b00f60SXin Li                      * some of the examples it gives in subsections have
1297*05b00f60SXin Li                      * length field values that clearly includes the length
1298*05b00f60SXin Li                      * of the sub-object header as well as the length of the
1299*05b00f60SXin Li                      * value.
1300*05b00f60SXin Li                      */
1301*05b00f60SXin Li                     if(subobj_len < 4 || subobj_len > total_subobj_len ||
1302*05b00f60SXin Li                        obj_tlen < subobj_len)
1303*05b00f60SXin Li                         goto invalid;
1304*05b00f60SXin Li 
1305*05b00f60SXin Li                     switch(subobj_type) {
1306*05b00f60SXin Li                     case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
1307*05b00f60SXin Li                     case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
1308*05b00f60SXin Li 
1309*05b00f60SXin Li                         switch(af) {
1310*05b00f60SXin Li                         case AFNUM_INET:
1311*05b00f60SXin Li                             if (subobj_len < 8)
1312*05b00f60SXin Li                                 goto subobj_tooshort;
1313*05b00f60SXin Li                             ND_PRINT("%s    UNI IPv4 TNA address: %s",
1314*05b00f60SXin Li                                    indent, GET_IPADDR_STRING(obj_tptr + 4));
1315*05b00f60SXin Li                             break;
1316*05b00f60SXin Li                         case AFNUM_INET6:
1317*05b00f60SXin Li                             if (subobj_len < 20)
1318*05b00f60SXin Li                                 goto subobj_tooshort;
1319*05b00f60SXin Li                             ND_PRINT("%s    UNI IPv6 TNA address: %s",
1320*05b00f60SXin Li                                    indent, GET_IP6ADDR_STRING(obj_tptr + 4));
1321*05b00f60SXin Li                             break;
1322*05b00f60SXin Li                         case AFNUM_NSAP:
1323*05b00f60SXin Li                             if (subobj_len) {
1324*05b00f60SXin Li                                 /* unless we have a TLV parser lets just hexdump */
1325*05b00f60SXin Li                                 hexdump=TRUE;
1326*05b00f60SXin Li                             }
1327*05b00f60SXin Li                             break;
1328*05b00f60SXin Li                         }
1329*05b00f60SXin Li                         break;
1330*05b00f60SXin Li 
1331*05b00f60SXin Li                     case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
1332*05b00f60SXin Li                         if (subobj_len > 4) {
1333*05b00f60SXin Li                             /* unless we have a TLV parser lets just hexdump */
1334*05b00f60SXin Li                             hexdump=TRUE;
1335*05b00f60SXin Li                         }
1336*05b00f60SXin Li                         break;
1337*05b00f60SXin Li 
1338*05b00f60SXin Li                     case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
1339*05b00f60SXin Li                         if (subobj_len < 16) {
1340*05b00f60SXin Li                             goto subobj_tooshort;
1341*05b00f60SXin Li                         }
1342*05b00f60SXin Li 
1343*05b00f60SXin Li                         ND_PRINT("%s    U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
1344*05b00f60SXin Li                                indent,
1345*05b00f60SXin Li                                ((GET_BE_U_4(obj_tptr + 4))>>31),
1346*05b00f60SXin Li                                ((GET_BE_U_4(obj_tptr + 4))&0xFF),
1347*05b00f60SXin Li                                GET_BE_U_4(obj_tptr + 8),
1348*05b00f60SXin Li                                GET_BE_U_4(obj_tptr + 12));
1349*05b00f60SXin Li                         break;
1350*05b00f60SXin Li 
1351*05b00f60SXin Li                     case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
1352*05b00f60SXin Li                         if (subobj_len < 8) {
1353*05b00f60SXin Li                             goto subobj_tooshort;
1354*05b00f60SXin Li                         }
1355*05b00f60SXin Li 
1356*05b00f60SXin Li                         ND_PRINT("%s    Service level: %u",
1357*05b00f60SXin Li                                indent, (GET_BE_U_4(obj_tptr + 4)) >> 24);
1358*05b00f60SXin Li                         break;
1359*05b00f60SXin Li 
1360*05b00f60SXin Li                     default:
1361*05b00f60SXin Li                         hexdump=TRUE;
1362*05b00f60SXin Li                         break;
1363*05b00f60SXin Li                     }
1364*05b00f60SXin Li                     total_subobj_len-=subobj_len;
1365*05b00f60SXin Li                     obj_tptr+=subobj_len;
1366*05b00f60SXin Li                     obj_tlen+=subobj_len;
1367*05b00f60SXin Li 		}
1368*05b00f60SXin Li                 break;
1369*05b00f60SXin Li 
1370*05b00f60SXin Li             default:
1371*05b00f60SXin Li                 hexdump=TRUE;
1372*05b00f60SXin Li             }
1373*05b00f60SXin Li             break;
1374*05b00f60SXin Li 
1375*05b00f60SXin Li         case RSVP_OBJ_RSVP_HOP:
1376*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1377*05b00f60SXin Li             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
1378*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
1379*05b00f60SXin Li                 if (obj_tlen < 8)
1380*05b00f60SXin Li                     goto obj_tooshort;
1381*05b00f60SXin Li                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1382*05b00f60SXin Li                        indent,
1383*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1384*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 4));
1385*05b00f60SXin Li                 obj_tlen-=8;
1386*05b00f60SXin Li                 obj_tptr+=8;
1387*05b00f60SXin Li                 if (obj_tlen)
1388*05b00f60SXin Li                     hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
1389*05b00f60SXin Li                 break;
1390*05b00f60SXin Li             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
1391*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
1392*05b00f60SXin Li                 if (obj_tlen < 20)
1393*05b00f60SXin Li                     goto obj_tooshort;
1394*05b00f60SXin Li                 ND_PRINT("%s  Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1395*05b00f60SXin Li                        indent,
1396*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
1397*05b00f60SXin Li                        GET_BE_U_4(obj_tptr + 16));
1398*05b00f60SXin Li                 obj_tlen-=20;
1399*05b00f60SXin Li                 obj_tptr+=20;
1400*05b00f60SXin Li                 hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
1401*05b00f60SXin Li                 break;
1402*05b00f60SXin Li             default:
1403*05b00f60SXin Li                 hexdump=TRUE;
1404*05b00f60SXin Li             }
1405*05b00f60SXin Li             break;
1406*05b00f60SXin Li 
1407*05b00f60SXin Li         case RSVP_OBJ_TIME_VALUES:
1408*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1409*05b00f60SXin Li             case RSVP_CTYPE_1:
1410*05b00f60SXin Li                 if (obj_tlen < 4)
1411*05b00f60SXin Li                     goto obj_tooshort;
1412*05b00f60SXin Li                 ND_PRINT("%s  Refresh Period: %ums",
1413*05b00f60SXin Li                        indent,
1414*05b00f60SXin Li                        GET_BE_U_4(obj_tptr));
1415*05b00f60SXin Li                 obj_tlen-=4;
1416*05b00f60SXin Li                 obj_tptr+=4;
1417*05b00f60SXin Li                 break;
1418*05b00f60SXin Li             default:
1419*05b00f60SXin Li                 hexdump=TRUE;
1420*05b00f60SXin Li             }
1421*05b00f60SXin Li             break;
1422*05b00f60SXin Li 
1423*05b00f60SXin Li         /* those three objects do share the same semantics */
1424*05b00f60SXin Li         case RSVP_OBJ_SENDER_TSPEC:
1425*05b00f60SXin Li         case RSVP_OBJ_ADSPEC:
1426*05b00f60SXin Li         case RSVP_OBJ_FLOWSPEC:
1427*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1428*05b00f60SXin Li             case RSVP_CTYPE_2:
1429*05b00f60SXin Li                 if (obj_tlen < 4)
1430*05b00f60SXin Li                     goto obj_tooshort;
1431*05b00f60SXin Li                 ND_PRINT("%s  Msg-Version: %u, length: %u",
1432*05b00f60SXin Li                        indent,
1433*05b00f60SXin Li                        (GET_U_1(obj_tptr) & 0xf0) >> 4,
1434*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 2) << 2);
1435*05b00f60SXin Li                 obj_tptr+=4; /* get to the start of the service header */
1436*05b00f60SXin Li                 obj_tlen-=4;
1437*05b00f60SXin Li 
1438*05b00f60SXin Li                 while (obj_tlen >= 4) {
1439*05b00f60SXin Li                     intserv_serv_tlen=GET_BE_U_2(obj_tptr + 2)<<2;
1440*05b00f60SXin Li                     ND_PRINT("%s  Service Type: %s (%u), break bit %sset, Service length: %u",
1441*05b00f60SXin Li                            indent,
1442*05b00f60SXin Li                            tok2str(rsvp_intserv_service_type_values,"unknown",GET_U_1((obj_tptr))),
1443*05b00f60SXin Li                            GET_U_1(obj_tptr),
1444*05b00f60SXin Li                            (GET_U_1(obj_tptr + 1)&0x80) ? "" : "not ",
1445*05b00f60SXin Li                            intserv_serv_tlen);
1446*05b00f60SXin Li 
1447*05b00f60SXin Li                     obj_tptr+=4; /* get to the start of the parameter list */
1448*05b00f60SXin Li                     obj_tlen-=4;
1449*05b00f60SXin Li 
1450*05b00f60SXin Li                     while (intserv_serv_tlen>=4) {
1451*05b00f60SXin Li                         processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
1452*05b00f60SXin Li                         if (processed == 0)
1453*05b00f60SXin Li                             break;
1454*05b00f60SXin Li                         obj_tlen-=processed;
1455*05b00f60SXin Li                         intserv_serv_tlen-=processed;
1456*05b00f60SXin Li                         obj_tptr+=processed;
1457*05b00f60SXin Li                     }
1458*05b00f60SXin Li                 }
1459*05b00f60SXin Li                 break;
1460*05b00f60SXin Li             default:
1461*05b00f60SXin Li                 hexdump=TRUE;
1462*05b00f60SXin Li             }
1463*05b00f60SXin Li             break;
1464*05b00f60SXin Li 
1465*05b00f60SXin Li         case RSVP_OBJ_FILTERSPEC:
1466*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1467*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
1468*05b00f60SXin Li                 if (obj_tlen < 8)
1469*05b00f60SXin Li                     goto obj_tooshort;
1470*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1471*05b00f60SXin Li                        indent,
1472*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1473*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6));
1474*05b00f60SXin Li                 obj_tlen-=8;
1475*05b00f60SXin Li                 obj_tptr+=8;
1476*05b00f60SXin Li                 break;
1477*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
1478*05b00f60SXin Li                 if (obj_tlen < 20)
1479*05b00f60SXin Li                     goto obj_tooshort;
1480*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, Source Port: %u",
1481*05b00f60SXin Li                        indent,
1482*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
1483*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18));
1484*05b00f60SXin Li                 obj_tlen-=20;
1485*05b00f60SXin Li                 obj_tptr+=20;
1486*05b00f60SXin Li                 break;
1487*05b00f60SXin Li             case RSVP_CTYPE_3:
1488*05b00f60SXin Li                 if (obj_tlen < 20)
1489*05b00f60SXin Li                     goto obj_tooshort;
1490*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, Flow Label: %u",
1491*05b00f60SXin Li                        indent,
1492*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
1493*05b00f60SXin Li                        GET_BE_U_3(obj_tptr + 17));
1494*05b00f60SXin Li                 obj_tlen-=20;
1495*05b00f60SXin Li                 obj_tptr+=20;
1496*05b00f60SXin Li                 break;
1497*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV6:
1498*05b00f60SXin Li                 if (obj_tlen < 20)
1499*05b00f60SXin Li                     goto obj_tooshort;
1500*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1501*05b00f60SXin Li                        indent,
1502*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1503*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18));
1504*05b00f60SXin Li                 obj_tlen-=20;
1505*05b00f60SXin Li                 obj_tptr+=20;
1506*05b00f60SXin Li                 break;
1507*05b00f60SXin Li             case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
1508*05b00f60SXin Li                 if (obj_tlen < 40)
1509*05b00f60SXin Li                     goto obj_tooshort;
1510*05b00f60SXin Li                 ND_PRINT("%s  IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
1511*05b00f60SXin Li                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1512*05b00f60SXin Li                        indent,
1513*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
1514*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 18),
1515*05b00f60SXin Li                        indent,
1516*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr+20),
1517*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 38));
1518*05b00f60SXin Li                 obj_tlen-=40;
1519*05b00f60SXin Li                 obj_tptr+=40;
1520*05b00f60SXin Li                 break;
1521*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4:
1522*05b00f60SXin Li                 if (obj_tlen < 8)
1523*05b00f60SXin Li                     goto obj_tooshort;
1524*05b00f60SXin Li                 ND_PRINT("%s  Source Address: %s, LSP-ID: 0x%04x",
1525*05b00f60SXin Li                        indent,
1526*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1527*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6));
1528*05b00f60SXin Li                 obj_tlen-=8;
1529*05b00f60SXin Li                 obj_tptr+=8;
1530*05b00f60SXin Li                 break;
1531*05b00f60SXin Li             case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
1532*05b00f60SXin Li                 if (obj_tlen < 16)
1533*05b00f60SXin Li                     goto obj_tooshort;
1534*05b00f60SXin Li                 ND_PRINT("%s  IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
1535*05b00f60SXin Li                        "%s  Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1536*05b00f60SXin Li                        indent,
1537*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1538*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 6),
1539*05b00f60SXin Li                        indent,
1540*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr+8),
1541*05b00f60SXin Li                        GET_BE_U_2(obj_tptr + 12));
1542*05b00f60SXin Li                 obj_tlen-=16;
1543*05b00f60SXin Li                 obj_tptr+=16;
1544*05b00f60SXin Li                 break;
1545*05b00f60SXin Li             default:
1546*05b00f60SXin Li                 hexdump=TRUE;
1547*05b00f60SXin Li             }
1548*05b00f60SXin Li             break;
1549*05b00f60SXin Li 
1550*05b00f60SXin Li         case RSVP_OBJ_FASTREROUTE:
1551*05b00f60SXin Li             /* the differences between c-type 1 and 7 are minor */
1552*05b00f60SXin Li             obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
1553*05b00f60SXin Li 
1554*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1555*05b00f60SXin Li             case RSVP_CTYPE_1: /* new style */
1556*05b00f60SXin Li                 if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
1557*05b00f60SXin Li                     goto obj_tooshort;
1558*05b00f60SXin Li                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1559*05b00f60SXin Li                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1560*05b00f60SXin Li                        indent,
1561*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->setup_prio,
1562*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->hold_prio,
1563*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->hop_limit,
1564*05b00f60SXin Li                        bw.f * 8 / 1000000);
1565*05b00f60SXin Li                 ND_PRINT("%s  Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
1566*05b00f60SXin Li                        indent,
1567*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1568*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any),
1569*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all));
1570*05b00f60SXin Li                 obj_tlen-=sizeof(struct rsvp_obj_frr_t);
1571*05b00f60SXin Li                 obj_tptr+=sizeof(struct rsvp_obj_frr_t);
1572*05b00f60SXin Li                 break;
1573*05b00f60SXin Li 
1574*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
1575*05b00f60SXin Li                 if (obj_tlen < 16)
1576*05b00f60SXin Li                     goto obj_tooshort;
1577*05b00f60SXin Li                 bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1578*05b00f60SXin Li                 ND_PRINT("%s  Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1579*05b00f60SXin Li                        indent,
1580*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->setup_prio,
1581*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->hold_prio,
1582*05b00f60SXin Li                        obj_ptr.rsvp_obj_frr->hop_limit,
1583*05b00f60SXin Li                        bw.f * 8 / 1000000);
1584*05b00f60SXin Li                 ND_PRINT("%s  Include Colors: 0x%08x, Exclude Colors: 0x%08x",
1585*05b00f60SXin Li                        indent,
1586*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1587*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any));
1588*05b00f60SXin Li                 obj_tlen-=16;
1589*05b00f60SXin Li                 obj_tptr+=16;
1590*05b00f60SXin Li                 break;
1591*05b00f60SXin Li 
1592*05b00f60SXin Li             default:
1593*05b00f60SXin Li                 hexdump=TRUE;
1594*05b00f60SXin Li             }
1595*05b00f60SXin Li             break;
1596*05b00f60SXin Li 
1597*05b00f60SXin Li         case RSVP_OBJ_DETOUR:
1598*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1599*05b00f60SXin Li             case RSVP_CTYPE_TUNNEL_IPV4:
1600*05b00f60SXin Li                 while(obj_tlen >= 8) {
1601*05b00f60SXin Li                     ND_PRINT("%s  PLR-ID: %s, Avoid-Node-ID: %s",
1602*05b00f60SXin Li                            indent,
1603*05b00f60SXin Li                            GET_IPADDR_STRING(obj_tptr),
1604*05b00f60SXin Li                            GET_IPADDR_STRING(obj_tptr + 4));
1605*05b00f60SXin Li                     obj_tlen-=8;
1606*05b00f60SXin Li                     obj_tptr+=8;
1607*05b00f60SXin Li                 }
1608*05b00f60SXin Li                 break;
1609*05b00f60SXin Li             default:
1610*05b00f60SXin Li                 hexdump=TRUE;
1611*05b00f60SXin Li             }
1612*05b00f60SXin Li             break;
1613*05b00f60SXin Li 
1614*05b00f60SXin Li         case RSVP_OBJ_CLASSTYPE:
1615*05b00f60SXin Li         case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
1616*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1617*05b00f60SXin Li             case RSVP_CTYPE_1:
1618*05b00f60SXin Li                 if (obj_tlen < 4)
1619*05b00f60SXin Li                     goto obj_tooshort;
1620*05b00f60SXin Li                 ND_PRINT("%s  CT: %u",
1621*05b00f60SXin Li                        indent,
1622*05b00f60SXin Li                        GET_BE_U_4(obj_tptr) & 0x7);
1623*05b00f60SXin Li                 obj_tlen-=4;
1624*05b00f60SXin Li                 obj_tptr+=4;
1625*05b00f60SXin Li                 break;
1626*05b00f60SXin Li             default:
1627*05b00f60SXin Li                 hexdump=TRUE;
1628*05b00f60SXin Li             }
1629*05b00f60SXin Li             break;
1630*05b00f60SXin Li 
1631*05b00f60SXin Li         case RSVP_OBJ_ERROR_SPEC:
1632*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1633*05b00f60SXin Li             case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
1634*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
1635*05b00f60SXin Li                 if (obj_tlen < 8)
1636*05b00f60SXin Li                     goto obj_tooshort;
1637*05b00f60SXin Li                 error_code=GET_U_1(obj_tptr + 5);
1638*05b00f60SXin Li                 error_value=GET_BE_U_2(obj_tptr + 6);
1639*05b00f60SXin Li                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1640*05b00f60SXin Li                        indent,
1641*05b00f60SXin Li                        GET_IPADDR_STRING(obj_tptr),
1642*05b00f60SXin Li                        GET_U_1(obj_tptr + 4),
1643*05b00f60SXin Li                        indent,
1644*05b00f60SXin Li                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1645*05b00f60SXin Li                        error_code);
1646*05b00f60SXin Li                 switch (error_code) {
1647*05b00f60SXin Li                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1648*05b00f60SXin Li                     ND_PRINT(", Error Value: %s (%u)",
1649*05b00f60SXin Li                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1650*05b00f60SXin Li                            error_value);
1651*05b00f60SXin Li                     break;
1652*05b00f60SXin Li                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
1653*05b00f60SXin Li                 case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
1654*05b00f60SXin Li                     ND_PRINT(", Error Value: %s (%u)",
1655*05b00f60SXin Li                            tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
1656*05b00f60SXin Li                            error_value);
1657*05b00f60SXin Li                     break;
1658*05b00f60SXin Li                 default:
1659*05b00f60SXin Li                     ND_PRINT(", Unknown Error Value (%u)", error_value);
1660*05b00f60SXin Li                     break;
1661*05b00f60SXin Li                 }
1662*05b00f60SXin Li                 obj_tlen-=8;
1663*05b00f60SXin Li                 obj_tptr+=8;
1664*05b00f60SXin Li                 break;
1665*05b00f60SXin Li             case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
1666*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
1667*05b00f60SXin Li                 if (obj_tlen < 20)
1668*05b00f60SXin Li                     goto obj_tooshort;
1669*05b00f60SXin Li                 error_code=GET_U_1(obj_tptr + 17);
1670*05b00f60SXin Li                 error_value=GET_BE_U_2(obj_tptr + 18);
1671*05b00f60SXin Li                 ND_PRINT("%s  Error Node Address: %s, Flags: [0x%02x]%s  Error Code: %s (%u)",
1672*05b00f60SXin Li                        indent,
1673*05b00f60SXin Li                        GET_IP6ADDR_STRING(obj_tptr),
1674*05b00f60SXin Li                        GET_U_1(obj_tptr + 16),
1675*05b00f60SXin Li                        indent,
1676*05b00f60SXin Li                        tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1677*05b00f60SXin Li                        error_code);
1678*05b00f60SXin Li 
1679*05b00f60SXin Li                 switch (error_code) {
1680*05b00f60SXin Li                 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1681*05b00f60SXin Li                     ND_PRINT(", Error Value: %s (%u)",
1682*05b00f60SXin Li                            tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1683*05b00f60SXin Li 			   error_value);
1684*05b00f60SXin Li                     break;
1685*05b00f60SXin Li                 default:
1686*05b00f60SXin Li                     break;
1687*05b00f60SXin Li                 }
1688*05b00f60SXin Li                 obj_tlen-=20;
1689*05b00f60SXin Li                 obj_tptr+=20;
1690*05b00f60SXin Li                 break;
1691*05b00f60SXin Li             default:
1692*05b00f60SXin Li                 hexdump=TRUE;
1693*05b00f60SXin Li             }
1694*05b00f60SXin Li             break;
1695*05b00f60SXin Li 
1696*05b00f60SXin Li         case RSVP_OBJ_PROPERTIES:
1697*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1698*05b00f60SXin Li             case RSVP_CTYPE_1:
1699*05b00f60SXin Li                 if (obj_tlen < 4)
1700*05b00f60SXin Li                     goto obj_tooshort;
1701*05b00f60SXin Li                 padbytes = GET_BE_U_2(obj_tptr + 2);
1702*05b00f60SXin Li                 ND_PRINT("%s  TLV count: %u, padding bytes: %u",
1703*05b00f60SXin Li                        indent,
1704*05b00f60SXin Li                        GET_BE_U_2(obj_tptr),
1705*05b00f60SXin Li                        padbytes);
1706*05b00f60SXin Li                 obj_tlen-=4;
1707*05b00f60SXin Li                 obj_tptr+=4;
1708*05b00f60SXin Li                 /* loop through as long there is anything longer than the TLV header (2) */
1709*05b00f60SXin Li                 while(obj_tlen >= 2 + padbytes) {
1710*05b00f60SXin Li                     ND_PRINT("%s    %s TLV (0x%02x), length: %u", /* length includes header */
1711*05b00f60SXin Li                            indent,
1712*05b00f60SXin Li                            tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)),
1713*05b00f60SXin Li                            GET_U_1(obj_tptr),
1714*05b00f60SXin Li                            GET_U_1(obj_tptr + 1));
1715*05b00f60SXin Li                     if (obj_tlen < GET_U_1(obj_tptr + 1))
1716*05b00f60SXin Li                         goto obj_tooshort;
1717*05b00f60SXin Li                     if (GET_U_1(obj_tptr + 1) < 2) {
1718*05b00f60SXin Li                         ND_PRINT("%sERROR: property TLV is too short", indent);
1719*05b00f60SXin Li                         return -1;
1720*05b00f60SXin Li                     }
1721*05b00f60SXin Li                     print_unknown_data(ndo, obj_tptr + 2, "\n\t\t",
1722*05b00f60SXin Li                                        GET_U_1(obj_tptr + 1) - 2);
1723*05b00f60SXin Li                     obj_tlen-=GET_U_1(obj_tptr + 1);
1724*05b00f60SXin Li                     obj_tptr+=GET_U_1(obj_tptr + 1);
1725*05b00f60SXin Li                 }
1726*05b00f60SXin Li                 break;
1727*05b00f60SXin Li             default:
1728*05b00f60SXin Li                 hexdump=TRUE;
1729*05b00f60SXin Li             }
1730*05b00f60SXin Li             break;
1731*05b00f60SXin Li 
1732*05b00f60SXin Li         case RSVP_OBJ_MESSAGE_ID:     /* fall through */
1733*05b00f60SXin Li         case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
1734*05b00f60SXin Li         case RSVP_OBJ_MESSAGE_ID_LIST:
1735*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1736*05b00f60SXin Li             case RSVP_CTYPE_1:
1737*05b00f60SXin Li             case RSVP_CTYPE_2:
1738*05b00f60SXin Li                 if (obj_tlen < 4)
1739*05b00f60SXin Li                     goto obj_tooshort;
1740*05b00f60SXin Li                 ND_PRINT("%s  Flags [0x%02x], epoch: %u",
1741*05b00f60SXin Li                        indent,
1742*05b00f60SXin Li                        GET_U_1(obj_tptr),
1743*05b00f60SXin Li                        GET_BE_U_3(obj_tptr + 1));
1744*05b00f60SXin Li                 obj_tlen-=4;
1745*05b00f60SXin Li                 obj_tptr+=4;
1746*05b00f60SXin Li                 /* loop through as long there are no messages left */
1747*05b00f60SXin Li                 while(obj_tlen >= 4) {
1748*05b00f60SXin Li                     ND_PRINT("%s    Message-ID 0x%08x (%u)",
1749*05b00f60SXin Li                            indent,
1750*05b00f60SXin Li                            GET_BE_U_4(obj_tptr),
1751*05b00f60SXin Li                            GET_BE_U_4(obj_tptr));
1752*05b00f60SXin Li                     obj_tlen-=4;
1753*05b00f60SXin Li                     obj_tptr+=4;
1754*05b00f60SXin Li                 }
1755*05b00f60SXin Li                 break;
1756*05b00f60SXin Li             default:
1757*05b00f60SXin Li                 hexdump=TRUE;
1758*05b00f60SXin Li             }
1759*05b00f60SXin Li             break;
1760*05b00f60SXin Li 
1761*05b00f60SXin Li         case RSVP_OBJ_INTEGRITY:
1762*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1763*05b00f60SXin Li             case RSVP_CTYPE_1:
1764*05b00f60SXin Li                 if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
1765*05b00f60SXin Li                     goto obj_tooshort;
1766*05b00f60SXin Li                 obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
1767*05b00f60SXin Li                 ND_PRINT("%s  Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
1768*05b00f60SXin Li                        indent,
1769*05b00f60SXin Li                        GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id),
1770*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2),
1771*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence),
1772*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4),
1773*05b00f60SXin Li                        bittok2str(rsvp_obj_integrity_flag_values,
1774*05b00f60SXin Li                                   "none",
1775*05b00f60SXin Li                                   obj_ptr.rsvp_obj_integrity->flags));
1776*05b00f60SXin Li                 ND_PRINT("%s  MD5-sum 0x%08x%08x%08x%08x ",
1777*05b00f60SXin Li                        indent,
1778*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest),
1779*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4),
1780*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8),
1781*05b00f60SXin Li                        GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12));
1782*05b00f60SXin Li 
1783*05b00f60SXin Li                 sigcheck = signature_verify(ndo, pptr, plen,
1784*05b00f60SXin Li                                             obj_ptr.rsvp_obj_integrity->digest,
1785*05b00f60SXin Li                                             rsvp_clear_checksum,
1786*05b00f60SXin Li                                             rsvp_com_header);
1787*05b00f60SXin Li                 ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
1788*05b00f60SXin Li 
1789*05b00f60SXin Li                 obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
1790*05b00f60SXin Li                 obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
1791*05b00f60SXin Li                 break;
1792*05b00f60SXin Li             default:
1793*05b00f60SXin Li                 hexdump=TRUE;
1794*05b00f60SXin Li             }
1795*05b00f60SXin Li             break;
1796*05b00f60SXin Li 
1797*05b00f60SXin Li         case RSVP_OBJ_ADMIN_STATUS:
1798*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1799*05b00f60SXin Li             case RSVP_CTYPE_1:
1800*05b00f60SXin Li                 if (obj_tlen < 4)
1801*05b00f60SXin Li                     goto obj_tooshort;
1802*05b00f60SXin Li                 ND_PRINT("%s  Flags [%s]", indent,
1803*05b00f60SXin Li                        bittok2str(rsvp_obj_admin_status_flag_values, "none",
1804*05b00f60SXin Li                                   GET_BE_U_4(obj_tptr)));
1805*05b00f60SXin Li                 obj_tlen-=4;
1806*05b00f60SXin Li                 obj_tptr+=4;
1807*05b00f60SXin Li                 break;
1808*05b00f60SXin Li             default:
1809*05b00f60SXin Li                 hexdump=TRUE;
1810*05b00f60SXin Li             }
1811*05b00f60SXin Li             break;
1812*05b00f60SXin Li 
1813*05b00f60SXin Li         case RSVP_OBJ_LABEL_SET:
1814*05b00f60SXin Li             switch(rsvp_obj_ctype) {
1815*05b00f60SXin Li             case RSVP_CTYPE_1:
1816*05b00f60SXin Li                 if (obj_tlen < 4)
1817*05b00f60SXin Li                     goto obj_tooshort;
1818*05b00f60SXin Li                 action = (GET_BE_U_2(obj_tptr)>>8);
1819*05b00f60SXin Li 
1820*05b00f60SXin Li                 ND_PRINT("%s  Action: %s (%u), Label type: %u", indent,
1821*05b00f60SXin Li                        tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
1822*05b00f60SXin Li                        action, (GET_BE_U_4(obj_tptr) & 0x7F));
1823*05b00f60SXin Li 
1824*05b00f60SXin Li                 switch (action) {
1825*05b00f60SXin Li                 case LABEL_SET_INCLUSIVE_RANGE:
1826*05b00f60SXin Li                 case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
1827*05b00f60SXin Li 
1828*05b00f60SXin Li 		    /* only a couple of subchannels are expected */
1829*05b00f60SXin Li 		    if (obj_tlen < 12)
1830*05b00f60SXin Li 			goto obj_tooshort;
1831*05b00f60SXin Li 		    ND_PRINT("%s  Start range: %u, End range: %u", indent,
1832*05b00f60SXin Li                            GET_BE_U_4(obj_tptr + 4),
1833*05b00f60SXin Li                            GET_BE_U_4(obj_tptr + 8));
1834*05b00f60SXin Li 		    obj_tlen-=12;
1835*05b00f60SXin Li 		    obj_tptr+=12;
1836*05b00f60SXin Li                     break;
1837*05b00f60SXin Li 
1838*05b00f60SXin Li                 default:
1839*05b00f60SXin Li                     obj_tlen-=4;
1840*05b00f60SXin Li                     obj_tptr+=4;
1841*05b00f60SXin Li                     subchannel = 1;
1842*05b00f60SXin Li                     while(obj_tlen >= 4 ) {
1843*05b00f60SXin Li                         ND_PRINT("%s  Subchannel #%u: %u", indent, subchannel,
1844*05b00f60SXin Li                                GET_BE_U_4(obj_tptr));
1845*05b00f60SXin Li                         obj_tptr+=4;
1846*05b00f60SXin Li                         obj_tlen-=4;
1847*05b00f60SXin Li                         subchannel++;
1848*05b00f60SXin Li                     }
1849*05b00f60SXin Li                     break;
1850*05b00f60SXin Li                 }
1851*05b00f60SXin Li                 break;
1852*05b00f60SXin Li             default:
1853*05b00f60SXin Li                 hexdump=TRUE;
1854*05b00f60SXin Li             }
1855*05b00f60SXin Li             break;
1856*05b00f60SXin Li 
1857*05b00f60SXin Li         case RSVP_OBJ_S2L:
1858*05b00f60SXin Li             switch (rsvp_obj_ctype) {
1859*05b00f60SXin Li             case RSVP_CTYPE_IPV4:
1860*05b00f60SXin Li                 if (obj_tlen < 4)
1861*05b00f60SXin Li                     goto obj_tooshort;
1862*05b00f60SXin Li                 ND_PRINT("%s  Sub-LSP destination address: %s",
1863*05b00f60SXin Li                        indent, GET_IPADDR_STRING(obj_tptr));
1864*05b00f60SXin Li 
1865*05b00f60SXin Li                 obj_tlen-=4;
1866*05b00f60SXin Li                 obj_tptr+=4;
1867*05b00f60SXin Li                 break;
1868*05b00f60SXin Li             case RSVP_CTYPE_IPV6:
1869*05b00f60SXin Li                 if (obj_tlen < 16)
1870*05b00f60SXin Li                     goto obj_tooshort;
1871*05b00f60SXin Li                 ND_PRINT("%s  Sub-LSP destination address: %s",
1872*05b00f60SXin Li                        indent, GET_IP6ADDR_STRING(obj_tptr));
1873*05b00f60SXin Li 
1874*05b00f60SXin Li                 obj_tlen-=16;
1875*05b00f60SXin Li                 obj_tptr+=16;
1876*05b00f60SXin Li                 break;
1877*05b00f60SXin Li             default:
1878*05b00f60SXin Li                 hexdump=TRUE;
1879*05b00f60SXin Li             }
1880*05b00f60SXin Li             break;
1881*05b00f60SXin Li 
1882*05b00f60SXin Li         /*
1883*05b00f60SXin Li          *  FIXME those are the defined objects that lack a decoder
1884*05b00f60SXin Li          *  you are welcome to contribute code ;-)
1885*05b00f60SXin Li          */
1886*05b00f60SXin Li 
1887*05b00f60SXin Li         case RSVP_OBJ_SCOPE:
1888*05b00f60SXin Li         case RSVP_OBJ_POLICY_DATA:
1889*05b00f60SXin Li         case RSVP_OBJ_ACCEPT_LABEL_SET:
1890*05b00f60SXin Li         case RSVP_OBJ_PROTECTION:
1891*05b00f60SXin Li         default:
1892*05b00f60SXin Li             if (ndo->ndo_vflag <= 1)
1893*05b00f60SXin Li                 print_unknown_data(ndo, obj_tptr, "\n\t    ", obj_tlen); /* FIXME indentation */
1894*05b00f60SXin Li             break;
1895*05b00f60SXin Li         }
1896*05b00f60SXin Li         /* do we also want to see a hex dump ? */
1897*05b00f60SXin Li         if (ndo->ndo_vflag > 1 || hexdump == TRUE)
1898*05b00f60SXin Li             print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t    ", /* FIXME indentation */
1899*05b00f60SXin Li                                rsvp_obj_len - sizeof(struct rsvp_object_header));
1900*05b00f60SXin Li 
1901*05b00f60SXin Li         tptr+=rsvp_obj_len;
1902*05b00f60SXin Li         tlen-=rsvp_obj_len;
1903*05b00f60SXin Li     }
1904*05b00f60SXin Li     return 0;
1905*05b00f60SXin Li subobj_tooshort:
1906*05b00f60SXin Li     ND_PRINT("%sERROR: sub-object is too short", indent);
1907*05b00f60SXin Li     return -1;
1908*05b00f60SXin Li obj_tooshort:
1909*05b00f60SXin Li     ND_PRINT("%sERROR: object is too short", indent);
1910*05b00f60SXin Li     return -1;
1911*05b00f60SXin Li invalid:
1912*05b00f60SXin Li     nd_print_invalid(ndo);
1913*05b00f60SXin Li     return -1;
1914*05b00f60SXin Li trunc:
1915*05b00f60SXin Li     nd_print_trunc(ndo);
1916*05b00f60SXin Li     return -1;
1917*05b00f60SXin Li }
1918*05b00f60SXin Li 
1919*05b00f60SXin Li void
rsvp_print(netdissect_options * ndo,const u_char * pptr,u_int len)1920*05b00f60SXin Li rsvp_print(netdissect_options *ndo,
1921*05b00f60SXin Li            const u_char *pptr, u_int len)
1922*05b00f60SXin Li {
1923*05b00f60SXin Li     const struct rsvp_common_header *rsvp_com_header;
1924*05b00f60SXin Li     uint8_t version_flags, msg_type;
1925*05b00f60SXin Li     const u_char *tptr;
1926*05b00f60SXin Li     u_short plen, tlen;
1927*05b00f60SXin Li 
1928*05b00f60SXin Li     ndo->ndo_protocol = "rsvp";
1929*05b00f60SXin Li     tptr=pptr;
1930*05b00f60SXin Li 
1931*05b00f60SXin Li     rsvp_com_header = (const struct rsvp_common_header *)pptr;
1932*05b00f60SXin Li     ND_TCHECK_SIZE(rsvp_com_header);
1933*05b00f60SXin Li     version_flags = GET_U_1(rsvp_com_header->version_flags);
1934*05b00f60SXin Li 
1935*05b00f60SXin Li     /*
1936*05b00f60SXin Li      * Sanity checking of the header.
1937*05b00f60SXin Li      */
1938*05b00f60SXin Li     if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1939*05b00f60SXin Li 	ND_PRINT("ERROR: RSVP version %u packet not supported",
1940*05b00f60SXin Li                RSVP_EXTRACT_VERSION(version_flags));
1941*05b00f60SXin Li 	return;
1942*05b00f60SXin Li     }
1943*05b00f60SXin Li 
1944*05b00f60SXin Li     msg_type = GET_U_1(rsvp_com_header->msg_type);
1945*05b00f60SXin Li 
1946*05b00f60SXin Li     /* in non-verbose mode just lets print the basic Message Type*/
1947*05b00f60SXin Li     if (ndo->ndo_vflag < 1) {
1948*05b00f60SXin Li         ND_PRINT("RSVPv%u %s Message, length: %u",
1949*05b00f60SXin Li                RSVP_EXTRACT_VERSION(version_flags),
1950*05b00f60SXin Li                tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type),
1951*05b00f60SXin Li                len);
1952*05b00f60SXin Li         return;
1953*05b00f60SXin Li     }
1954*05b00f60SXin Li 
1955*05b00f60SXin Li     /* ok they seem to want to know everything - lets fully decode it */
1956*05b00f60SXin Li 
1957*05b00f60SXin Li     plen = tlen = GET_BE_U_2(rsvp_com_header->length);
1958*05b00f60SXin Li 
1959*05b00f60SXin Li     ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
1960*05b00f60SXin Li            RSVP_EXTRACT_VERSION(version_flags),
1961*05b00f60SXin Li            tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
1962*05b00f60SXin Li            msg_type,
1963*05b00f60SXin Li            bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
1964*05b00f60SXin Li            tlen,
1965*05b00f60SXin Li            GET_U_1(rsvp_com_header->ttl),
1966*05b00f60SXin Li            GET_BE_U_2(rsvp_com_header->checksum));
1967*05b00f60SXin Li 
1968*05b00f60SXin Li     if (tlen < sizeof(struct rsvp_common_header)) {
1969*05b00f60SXin Li         ND_PRINT("ERROR: common header too short %u < %zu", tlen,
1970*05b00f60SXin Li                sizeof(struct rsvp_common_header));
1971*05b00f60SXin Li         return;
1972*05b00f60SXin Li     }
1973*05b00f60SXin Li 
1974*05b00f60SXin Li     tptr+=sizeof(struct rsvp_common_header);
1975*05b00f60SXin Li     tlen-=sizeof(struct rsvp_common_header);
1976*05b00f60SXin Li 
1977*05b00f60SXin Li     switch(msg_type) {
1978*05b00f60SXin Li 
1979*05b00f60SXin Li     case RSVP_MSGTYPE_BUNDLE:
1980*05b00f60SXin Li         /*
1981*05b00f60SXin Li          * Process each submessage in the bundle message.
1982*05b00f60SXin Li          * Bundle messages may not contain bundle submessages, so we don't
1983*05b00f60SXin Li          * need to handle bundle submessages specially.
1984*05b00f60SXin Li          */
1985*05b00f60SXin Li         while(tlen > 0) {
1986*05b00f60SXin Li             const u_char *subpptr=tptr, *subtptr;
1987*05b00f60SXin Li             u_short subplen, subtlen;
1988*05b00f60SXin Li 
1989*05b00f60SXin Li             subtptr=subpptr;
1990*05b00f60SXin Li 
1991*05b00f60SXin Li             rsvp_com_header = (const struct rsvp_common_header *)subpptr;
1992*05b00f60SXin Li             ND_TCHECK_SIZE(rsvp_com_header);
1993*05b00f60SXin Li             version_flags = GET_U_1(rsvp_com_header->version_flags);
1994*05b00f60SXin Li 
1995*05b00f60SXin Li             /*
1996*05b00f60SXin Li              * Sanity checking of the header.
1997*05b00f60SXin Li              */
1998*05b00f60SXin Li             if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1999*05b00f60SXin Li                 ND_PRINT("ERROR: RSVP version %u packet not supported",
2000*05b00f60SXin Li                        RSVP_EXTRACT_VERSION(version_flags));
2001*05b00f60SXin Li                 return;
2002*05b00f60SXin Li             }
2003*05b00f60SXin Li 
2004*05b00f60SXin Li             subplen = subtlen = GET_BE_U_2(rsvp_com_header->length);
2005*05b00f60SXin Li 
2006*05b00f60SXin Li             msg_type = GET_U_1(rsvp_com_header->msg_type);
2007*05b00f60SXin Li             ND_PRINT("\n\t  RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
2008*05b00f60SXin Li                    RSVP_EXTRACT_VERSION(version_flags),
2009*05b00f60SXin Li                    tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
2010*05b00f60SXin Li                    msg_type,
2011*05b00f60SXin Li                    bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
2012*05b00f60SXin Li                    subtlen,
2013*05b00f60SXin Li                    GET_U_1(rsvp_com_header->ttl),
2014*05b00f60SXin Li                    GET_BE_U_2(rsvp_com_header->checksum));
2015*05b00f60SXin Li 
2016*05b00f60SXin Li             if (subtlen < sizeof(struct rsvp_common_header)) {
2017*05b00f60SXin Li                 ND_PRINT("ERROR: common header too short %u < %zu", subtlen,
2018*05b00f60SXin Li                        sizeof(struct rsvp_common_header));
2019*05b00f60SXin Li                 return;
2020*05b00f60SXin Li             }
2021*05b00f60SXin Li 
2022*05b00f60SXin Li             if (tlen < subtlen) {
2023*05b00f60SXin Li                 ND_PRINT("ERROR: common header too large %u > %u", subtlen,
2024*05b00f60SXin Li                        tlen);
2025*05b00f60SXin Li                 return;
2026*05b00f60SXin Li             }
2027*05b00f60SXin Li 
2028*05b00f60SXin Li             subtptr+=sizeof(struct rsvp_common_header);
2029*05b00f60SXin Li             subtlen-=sizeof(struct rsvp_common_header);
2030*05b00f60SXin Li 
2031*05b00f60SXin Li             /*
2032*05b00f60SXin Li              * Print all objects in the submessage.
2033*05b00f60SXin Li              */
2034*05b00f60SXin Li             if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t    ", subtlen, rsvp_com_header) == -1)
2035*05b00f60SXin Li                 return;
2036*05b00f60SXin Li 
2037*05b00f60SXin Li             tptr+=subtlen+sizeof(struct rsvp_common_header);
2038*05b00f60SXin Li             tlen-=subtlen+sizeof(struct rsvp_common_header);
2039*05b00f60SXin Li         }
2040*05b00f60SXin Li 
2041*05b00f60SXin Li         break;
2042*05b00f60SXin Li 
2043*05b00f60SXin Li     case RSVP_MSGTYPE_PATH:
2044*05b00f60SXin Li     case RSVP_MSGTYPE_RESV:
2045*05b00f60SXin Li     case RSVP_MSGTYPE_PATHERR:
2046*05b00f60SXin Li     case RSVP_MSGTYPE_RESVERR:
2047*05b00f60SXin Li     case RSVP_MSGTYPE_PATHTEAR:
2048*05b00f60SXin Li     case RSVP_MSGTYPE_RESVTEAR:
2049*05b00f60SXin Li     case RSVP_MSGTYPE_RESVCONF:
2050*05b00f60SXin Li     case RSVP_MSGTYPE_HELLO_OLD:
2051*05b00f60SXin Li     case RSVP_MSGTYPE_HELLO:
2052*05b00f60SXin Li     case RSVP_MSGTYPE_ACK:
2053*05b00f60SXin Li     case RSVP_MSGTYPE_SREFRESH:
2054*05b00f60SXin Li         /*
2055*05b00f60SXin Li          * Print all objects in the message.
2056*05b00f60SXin Li          */
2057*05b00f60SXin Li         if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t  ", tlen, rsvp_com_header) == -1)
2058*05b00f60SXin Li             return;
2059*05b00f60SXin Li         break;
2060*05b00f60SXin Li 
2061*05b00f60SXin Li     default:
2062*05b00f60SXin Li         print_unknown_data(ndo, tptr, "\n\t    ", tlen);
2063*05b00f60SXin Li         break;
2064*05b00f60SXin Li     }
2065*05b00f60SXin Li 
2066*05b00f60SXin Li     return;
2067*05b00f60SXin Li trunc:
2068*05b00f60SXin Li     nd_print_trunc(ndo);
2069*05b00f60SXin Li }
2070