xref: /minix3/external/bsd/tcpdump/dist/print-rsvp.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
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