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