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