]> The Tcpdump Group git mirrors - tcpdump/blob - print-rsvp.c
1944f2bcb0dce7baf8e1d984c977c87255031ab0
[tcpdump] / print-rsvp.c
1 /*
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that: (1) source code
4 * distributions retain the above copyright notice and this paragraph
5 * in its entirety, and (2) distributions including binary code include
6 * the above copyright notice and this paragraph in its entirety in
7 * the documentation or other materials provided with the distribution.
8 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11 * FOR A PARTICULAR PURPOSE.
12 *
13 * Original code by Hannes Gredler (hannes@juniper.net)
14 */
15
16 #ifndef lint
17 static const char rcsid[] =
18 "@(#) $Header: /tcpdump/master/tcpdump/print-rsvp.c,v 1.10 2002-12-12 13:29:20 hannes Exp $";
19 #endif
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <tcpdump-stdinc.h>
26
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include "interface.h"
32 #include "extract.h"
33 #include "addrtoname.h"
34 #include "ethertype.h"
35
36 /*
37 * RFC 2205 common header
38 *
39 * 0 1 2 3
40 * +-------------+-------------+-------------+-------------+
41 * | Vers | Flags| Msg Type | RSVP Checksum |
42 * +-------------+-------------+-------------+-------------+
43 * | Send_TTL | (Reserved) | RSVP Length |
44 * +-------------+-------------+-------------+-------------+
45 *
46 */
47
48 struct rsvp_common_header {
49 u_int8_t version_flags;
50 u_int8_t msg_type;
51 u_int8_t checksum[2];
52 u_int8_t ttl;
53 u_int8_t reserved;
54 u_int8_t length[2];
55 };
56
57 /*
58 * RFC2205 object header
59 *
60 *
61 * 0 1 2 3
62 * +-------------+-------------+-------------+-------------+
63 * | Length (bytes) | Class-Num | C-Type |
64 * +-------------+-------------+-------------+-------------+
65 * | |
66 * // (Object contents) //
67 * | |
68 * +-------------+-------------+-------------+-------------+
69 */
70
71 struct rsvp_object_header {
72 u_int8_t length[2];
73 u_int8_t class_num;
74 u_int8_t ctype;
75 };
76
77 #define RSVP_VERSION 1
78 #define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
79
80 #define RSVP_MSGTYPE_PATH 1
81 #define RSVP_MSGTYPE_RESV 2
82 #define RSVP_MSGTYPE_PATHERR 3
83 #define RSVP_MSGTYPE_RESVERR 4
84 #define RSVP_MSGTYPE_PATHTEAR 5
85 #define RSVP_MSGTYPE_RESVTEAR 6
86 #define RSVP_MSGTYPE_RESVCONF 7
87 #define RSVP_MSGTYPE_AGGREGATE 12
88 #define RSVP_MSGTYPE_ACK 13
89 #define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */
90 #define RSVP_MSGTYPE_SREFRESH 15
91 #define RSVP_MSGTYPE_HELLO 20
92
93 static const struct tok rsvp_msg_type_values[] = {
94 { RSVP_MSGTYPE_PATH, "Path" },
95 { RSVP_MSGTYPE_RESV, "Resv" },
96 { RSVP_MSGTYPE_PATHERR, "PathErr" },
97 { RSVP_MSGTYPE_RESVERR, "ResvErr" },
98 { RSVP_MSGTYPE_PATHTEAR, "PathTear" },
99 { RSVP_MSGTYPE_RESVTEAR, "ResvTear" },
100 { RSVP_MSGTYPE_RESVCONF, "ResvConf" },
101 { RSVP_MSGTYPE_AGGREGATE, "Aggregate" },
102 { RSVP_MSGTYPE_ACK, "Acknowledgement" },
103 { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" },
104 { RSVP_MSGTYPE_SREFRESH, "Refresh" },
105 { RSVP_MSGTYPE_HELLO, "Hello" },
106 { 0, NULL}
107 };
108
109 #define RSVP_OBJ_SESSION 1 /* rfc2205 */
110 #define RSVP_OBJ_RSVP_HOP 3 /* rfc2205 */
111 #define RSVP_OBJ_INTEGRITY 4
112 #define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */
113 #define RSVP_OBJ_ERROR_SPEC 6
114 #define RSVP_OBJ_SCOPE 7
115 #define RSVP_OBJ_STYLE 8 /* rfc2205 */
116 #define RSVP_OBJ_FLOWSPEC 9 /* rfc2210 */
117 #define RSVP_OBJ_FILTERSPEC 10 /* rfc2210 */
118 #define RSVP_OBJ_SENDER_TEMPLATE 11
119 #define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2210 */
120 #define RSVP_OBJ_ADSPEC 13 /* rfc2210 */
121 #define RSVP_OBJ_POLICY_DATA 14
122 #define RSVP_OBJ_CONFIRM 15
123 #define RSVP_OBJ_LABEL 16 /* rfc3209 */
124 #define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */
125 #define RSVP_OBJ_ERO 20 /* rfc3209 */
126 #define RSVP_OBJ_RRO 21 /* rfc3209 */
127 #define RSVP_OBJ_HELLO 22 /* rfc3209 */
128 #define RSVP_OBJ_MESSAGE_ID 23
129 #define RSVP_OBJ_MESSAGE_ID_ACK 24
130 #define RSVP_OBJ_MESSAGE_ID_LIST 25
131 #define RSVP_OBJ_RECOVERY_LABEL 34
132 #define RSVP_OBJ_UPSTREAM_LABEL 35
133 #define RSVP_OBJ_DETOUR 63 /* draft-ietf-mpls-rsvp-lsp-fastreroute-01 */
134 #define RSVP_OBJ_SUGGESTED_LABEL 129
135 #define RSVP_OBJ_PROPERTIES 204
136 #define RSVP_OBJ_FASTREROUTE 205 /* draft-ietf-mpls-rsvp-lsp-fastreroute-01 */
137 #define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */
138 #define RSVP_OBJ_RESTART_CAPABILITY 131 /* draft-pan-rsvp-te-restart */
139
140 static const struct tok rsvp_obj_values[] = {
141 { RSVP_OBJ_SESSION, "Session" },
142 { RSVP_OBJ_RSVP_HOP, "RSVP Hop" },
143 { RSVP_OBJ_INTEGRITY, "Integrity" },
144 { RSVP_OBJ_TIME_VALUES, "Time Values" },
145 { RSVP_OBJ_ERROR_SPEC, "Error Spec" },
146 { RSVP_OBJ_SCOPE, "Scope" },
147 { RSVP_OBJ_STYLE, "Style" },
148 { RSVP_OBJ_FLOWSPEC, "Flowspec" },
149 { RSVP_OBJ_FILTERSPEC, "FilterSpec" },
150 { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" },
151 { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" },
152 { RSVP_OBJ_ADSPEC, "Adspec" },
153 { RSVP_OBJ_POLICY_DATA, "Policy Data" },
154 { RSVP_OBJ_CONFIRM, "Confirm" },
155 { RSVP_OBJ_LABEL, "Label" },
156 { RSVP_OBJ_LABEL_REQ, "Label Request" },
157 { RSVP_OBJ_ERO, "ERO" },
158 { RSVP_OBJ_RRO, "RRO" },
159 { RSVP_OBJ_HELLO, "Hello" },
160 { RSVP_OBJ_MESSAGE_ID, "Message ID" },
161 { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" },
162 { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" },
163 { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" },
164 { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" },
165 { RSVP_OBJ_DETOUR, "Detour" },
166 { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" },
167 { RSVP_OBJ_PROPERTIES, "Properties" },
168 { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" },
169 { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" },
170 { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
171 { 0, NULL}
172 };
173
174 #define RSVP_CTYPE_IPV4 1
175 #define RSVP_CTYPE_IPV6 2
176 #define RSVP_CTYPE_TUNNEL_IPV4 7
177 #define RSVP_CTYPE_TUNNEL_IPV6 8
178 #define RSVP_CTYPE_1 1
179 #define RSVP_CTYPE_2 2
180 #define RSVP_CTYPE_3 3
181
182 /*
183 * the ctypes are not globally unique so for
184 * translating it to strings we build a table based
185 * on objects offsetted by the ctype
186 */
187
188 static const struct tok rsvp_ctype_values[] = {
189 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" },
190 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" },
191 { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" },
192 { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" },
193 { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" },
194 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" },
195 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" },
196 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" },
197 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
198 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" },
199 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" },
200 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
201 { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
202 { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" },
203 { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" },
204 { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" },
205 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" },
206 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" },
207 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" },
208 { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "1" },
209 { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" },
210 { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" },
211 { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" },
212 { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
213 { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
214 { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
215 { 0, NULL}
216 };
217
218 #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
219 #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
220
221 #define RSVP_OBJ_XRO_RES 0
222 #define RSVP_OBJ_XRO_IPV4 1
223 #define RSVP_OBJ_XRO_IPV6 2
224 #define RSVP_OBJ_XRO_ASN 32
225 #define RSVP_OBJ_XRO_MPLS 64
226
227 static const struct tok rsvp_obj_xro_values[] = {
228 { RSVP_OBJ_XRO_RES, "Reserved" },
229 { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" },
230 { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" },
231 { RSVP_OBJ_XRO_ASN, "Autonomous system number" },
232 { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" },
233 { 0, NULL}
234 };
235
236 static const struct tok rsvp_resstyle_values[] = {
237 { 17, "Wildcard Filter" },
238 { 10, "Fixed Filter" },
239 { 18, "Shared Explicit" },
240 { 0, NULL}
241 };
242
243 #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
244 #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
245
246 static const struct tok rsvp_intserv_service_type_values[] = {
247 { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" },
248 { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
249 { 0, NULL}
250 };
251
252 static const struct tok rsvp_intserv_parameter_id_values[] = {
253 { 127, "Token Bucket TSpec" },
254 { 130, "Guaranteed Service RSpec" },
255 { 0, NULL}
256 };
257
258 static struct tok rsvp_session_attribute_flag_values[] = {
259 { 1, "Local Protection desired" },
260 { 2, "Label Recording desired" },
261 { 4, "SE Style desired" },
262 { 0, NULL}
263 };
264
265 #define FALSE 0
266 #define TRUE 1
267
268 void
269 rsvp_print(register const u_char *pptr, register u_int len) {
270
271 const struct rsvp_common_header *rsvp_com_header;
272 const struct rsvp_object_header *rsvp_obj_header;
273 const u_char *tptr,*obj_tptr;
274 u_short tlen,rsvp_obj_len,rsvp_obj_ctype,obj_tlen;
275 int hexdump;
276 union {
277 float f;
278 u_int32_t i;
279 } bw;
280
281 tptr=pptr;
282 rsvp_com_header = (const struct rsvp_common_header *)pptr;
283 TCHECK(*rsvp_com_header);
284
285 /*
286 * Sanity checking of the header.
287 */
288 if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
289 printf("RSVP version %u packet not supported",
290 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags));
291 return;
292 }
293
294 /* in non-verbose mode just lets print the basic Message Type*/
295 if (vflag < 1) {
296 printf("RSVP %s Message, length: %u",
297 tok2str(rsvp_msg_type_values, "unknown (%u)",rsvp_com_header->msg_type),
298 len);
299 return;
300 }
301
302 /* ok they seem to want to know everything - lets fully decode it */
303
304 tlen=EXTRACT_16BITS(rsvp_com_header->length);
305
306 printf("RSVP\n\tv: %u, msg-type: %s, length: %u, ttl: %u, checksum: 0x%04x",
307 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
308 tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
309 tlen,
310 rsvp_com_header->ttl,
311 EXTRACT_16BITS(rsvp_com_header->checksum));
312
313 tptr+=sizeof(const struct rsvp_common_header);
314 tlen-=sizeof(const struct rsvp_common_header);
315
316 while(tlen>0) {
317 /* did we capture enough for fully decoding the object header ? */
318 if (!TTEST2(*tptr, sizeof(struct rsvp_object_header)))
319 goto trunc;
320
321 rsvp_obj_header = (const struct rsvp_object_header *)tptr;
322 rsvp_obj_len=EXTRACT_16BITS(rsvp_obj_header->length);
323 rsvp_obj_ctype=rsvp_obj_header->ctype;
324
325 if(rsvp_obj_len % 4 || rsvp_obj_len < 4)
326 return;
327
328 printf("\n\t %s Object (%u) Flags: [%s",
329 tok2str(rsvp_obj_values,
330 "Unknown",
331 rsvp_obj_header->class_num),
332 rsvp_obj_header->class_num,
333 ((rsvp_obj_header->class_num)&0x80) ? "ignore" : "reject");
334
335 if (rsvp_obj_header->class_num > 128)
336 printf(" %s",
337 ((rsvp_obj_header->class_num)&0x40) ? "and forward" : "silently");
338
339 printf(" if unknown], Class-Type: %s (%u), length: %u",
340 tok2str(rsvp_ctype_values,
341 "Unknown",
342 ((rsvp_obj_header->class_num)<<8)+rsvp_obj_ctype),
343 rsvp_obj_ctype,
344 rsvp_obj_len);
345
346 obj_tptr=tptr+sizeof(struct rsvp_object_header);
347 obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
348
349 /* did we capture enough for fully decoding the object ? */
350 if (!TTEST2(*tptr, rsvp_obj_len))
351 goto trunc;
352 hexdump=FALSE;
353
354 switch(rsvp_obj_header->class_num) {
355 case RSVP_OBJ_SESSION:
356 switch(rsvp_obj_ctype) {
357 case RSVP_CTYPE_IPV4:
358 printf("\n\t IPv4 DestAddress: %s, Protocol ID: 0x%02x",
359 ipaddr_string(obj_tptr),
360 *(obj_tptr+4));
361 printf("\n\t Flags: [0x%02x], DestPort %u",
362 *(obj_tptr+5),
363 EXTRACT_16BITS(obj_tptr+6));
364 obj_tlen-=8;
365 obj_tptr+=8;
366 break;
367 #ifdef INET6
368 case RSVP_CTYPE_IPV6:
369 printf("\n\t IPv6 DestAddress: %s, Protocol ID: 0x%02x",
370 ip6addr_string(obj_tptr),
371 *(obj_tptr+16));
372 printf("\n\t Flags: [0x%02x], DestPort %u",
373 *(obj_tptr+17),
374 EXTRACT_16BITS(obj_tptr+18));
375 obj_tlen-=20;
376 obj_tptr+=20;
377 break;
378 case RSVP_CTYPE_TUNNEL_IPV6:
379 printf("\n\t IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
380 ip6addr_string(obj_tptr),
381 EXTRACT_16BITS(obj_tptr+18),
382 ip6addr_string(obj_tptr+20));
383 obj_tlen-=36;
384 obj_tptr+=36;
385 break;
386 #endif
387 case RSVP_CTYPE_TUNNEL_IPV4:
388 printf("\n\t IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
389 ipaddr_string(obj_tptr),
390 EXTRACT_16BITS(obj_tptr+6),
391 ipaddr_string(obj_tptr+8));
392 obj_tlen-=12;
393 obj_tptr+=12;
394 break;
395 default:
396 hexdump=TRUE;
397 }
398 break;
399 case RSVP_OBJ_LABEL:
400 switch(rsvp_obj_ctype) {
401 case RSVP_CTYPE_1:
402 while(obj_tlen >= 4 ) {
403 printf("\n\t Label: %u", EXTRACT_32BITS(obj_tptr));
404 obj_tlen-=4;
405 obj_tptr+=4;
406 }
407 break;
408 default:
409 hexdump=TRUE;
410 }
411 break;
412 case RSVP_OBJ_STYLE:
413 switch(rsvp_obj_ctype) {
414 case RSVP_CTYPE_1:
415 printf("\n\t Reservation Style: %s, Flags: [0x%02x]",
416 tok2str(rsvp_resstyle_values,
417 "Unknown",
418 EXTRACT_24BITS(obj_tptr+1)),
419 *(obj_tptr));
420 obj_tlen-=4;
421 obj_tptr+=4;
422 break;
423 default:
424 hexdump=TRUE;
425 }
426 break;
427 case RSVP_OBJ_SENDER_TEMPLATE:
428 switch(rsvp_obj_ctype) {
429 case RSVP_CTYPE_TUNNEL_IPV4:
430 printf("\n\t IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
431 ipaddr_string(obj_tptr),
432 EXTRACT_16BITS(obj_tptr+6));
433 obj_tlen-=8;
434 obj_tptr+=8;
435 break;
436 default:
437 hexdump=TRUE;
438 }
439 break;
440 case RSVP_OBJ_LABEL_REQ:
441 switch(rsvp_obj_ctype) {
442 case RSVP_CTYPE_1:
443 while(obj_tlen >= 4 ) {
444 printf("\n\t L3 Protocol ID: %s",
445 tok2str(ethertype_values,
446 "Unknown Protocol 0x%04x",
447 EXTRACT_16BITS(obj_tptr+2)));
448 obj_tlen-=4;
449 obj_tptr+=4;
450 }
451 break;
452 case RSVP_CTYPE_2:
453 printf("\n\t L3 Protocol ID: %s",
454 tok2str(ethertype_values,
455 "Unknown Protocol 0x%04x",
456 EXTRACT_16BITS(obj_tptr+2)));
457 printf(",%s merge capability",((*(obj_tptr+4))&0x80) ? "no" : "" );
458 printf("\n\t Minimum VPI/VCI %u/%u",
459 (EXTRACT_16BITS(obj_tptr+4))&0xfff,
460 (EXTRACT_16BITS(obj_tptr+6))&0xfff);
461 printf("\n\t Maximum VPI/VCI %u/%u",
462 (EXTRACT_16BITS(obj_tptr+8))&0xfff,
463 (EXTRACT_16BITS(obj_tptr+10))&0xfff);
464 obj_tlen-=12;
465 obj_tptr+=12;
466 break;
467 case RSVP_CTYPE_3:
468 printf("\n\t L3 Protocol ID: %s",
469 tok2str(ethertype_values,
470 "Unknown Protocol 0x%04x",
471 EXTRACT_16BITS(obj_tptr+2)));
472 printf("\n\t Minimum/Maximum DLCI %u/%u, %s%s bit DLCI",
473 (EXTRACT_32BITS(obj_tptr+4))&0x7fffff,
474 (EXTRACT_32BITS(obj_tptr+8))&0x7fffff,
475 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 0 ) ? "10" : "",
476 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 2 ) ? "23" : "");
477 obj_tlen-=12;
478 obj_tptr+=12;
479 break;
480 default:
481 hexdump=TRUE;
482 }
483 break;
484 case RSVP_OBJ_RRO:
485 case RSVP_OBJ_ERO:
486 switch(rsvp_obj_ctype) {
487 case RSVP_CTYPE_IPV4:
488 while(obj_tlen >= 4 ) {
489 printf("\n\t Subobject Type: %s",
490 tok2str(rsvp_obj_xro_values,
491 "Unknown %u",
492 RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)));
493 switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) {
494 case RSVP_OBJ_XRO_IPV4:
495 printf(", %s, %s/%u",
496 RSVP_OBJ_XRO_MASK_LOOSE(*obj_tptr) ? "Loose" : "Strict",
497 ipaddr_string(obj_tptr+2),
498 *(obj_tptr+6));
499 }
500 obj_tlen-=*(obj_tptr+1);
501 obj_tptr+=*(obj_tptr+1);
502 }
503 break;
504 default:
505 hexdump=TRUE;
506 }
507 break;
508 case RSVP_OBJ_HELLO:
509 switch(rsvp_obj_ctype) {
510 case RSVP_CTYPE_1:
511 case RSVP_CTYPE_2:
512 printf("\n\t Source Instance 0x%08x, Destination Instance 0x%08x",
513 EXTRACT_32BITS(obj_tptr),
514 EXTRACT_32BITS(obj_tptr+4));
515 obj_tlen-=8;
516 obj_tptr+=8;
517 break;
518 default:
519 hexdump=TRUE;
520 }
521 break;
522 case RSVP_OBJ_RESTART_CAPABILITY:
523 switch(rsvp_obj_ctype) {
524 case RSVP_CTYPE_1:
525 printf("\n\t Restart Time: %ums\n\t Recovery Time: %ums",
526 EXTRACT_16BITS(obj_tptr),
527 EXTRACT_16BITS(obj_tptr+4));
528 break;
529 default:
530 hexdump=TRUE;
531 }
532 break;
533 case RSVP_OBJ_SESSION_ATTRIBUTE:
534 switch(rsvp_obj_ctype) {
535 case RSVP_CTYPE_TUNNEL_IPV4:
536 printf("\n\t Session Name: %s",(obj_tptr+3));
537 printf("\n\t Setup Priority: %u, Holding Priority: %u, Flags: [%s]",
538 (int)*obj_tptr,
539 (int)*(obj_tptr+1),
540 tok2str(rsvp_session_attribute_flag_values,
541 "none",
542 *(obj_tptr+2)));
543
544 obj_tlen-=4+*(obj_tptr+3);
545 obj_tptr+=4+*(obj_tptr+3);
546 break;
547 default:
548 hexdump=TRUE;
549 }
550 break;
551 case RSVP_OBJ_RSVP_HOP:
552 switch(rsvp_obj_ctype) {
553 case RSVP_CTYPE_IPV4:
554 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
555 ipaddr_string(obj_tptr),
556 EXTRACT_32BITS(obj_tptr+4));
557 obj_tlen-=8;
558 obj_tptr+=8;
559 break;
560 #ifdef INET6
561 case RSVP_CTYPE_IPV6:
562 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
563 ip6addr_string(obj_tptr),
564 EXTRACT_32BITS(obj_tptr+16));
565 obj_tlen-=20;
566 obj_tptr+=20;
567 break;
568 #endif
569 default:
570 hexdump=TRUE;
571 }
572 break;
573 case RSVP_OBJ_TIME_VALUES:
574 switch(rsvp_obj_ctype) {
575 case RSVP_CTYPE_1:
576 printf("\n\t Refresh Period: %ums",
577 EXTRACT_32BITS(obj_tptr));
578 obj_tlen-=4;
579 obj_tptr+=4;
580 break;
581 default:
582 hexdump=TRUE;
583 }
584 break;
585 case RSVP_OBJ_FLOWSPEC:
586 switch(rsvp_obj_ctype) {
587 case RSVP_CTYPE_2:
588 printf("\n\t Msg-Version: %u, length: %u words (32-bit), Service Type: %s (%u)",
589 (*obj_tptr & 0xf0) >> 4,
590 EXTRACT_16BITS(obj_tptr+2),
591 tok2str(rsvp_intserv_service_type_values,"unknown",*(obj_tptr+4)),
592 *(obj_tptr+4));
593
594 switch (*(obj_tptr+4)) {
595
596 case RSVP_OBJ_INTSERV_CONTROLLED_LOAD:
597
598 /* controlled load service
599 * 31 24 23 16 15 8 7 0
600 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
601 * 1 | 0 (a) | reserved | 7 (b) |
602 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
603 * 2 | 5 (c) |0| reserved | 6 (d) |
604 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
605 * 3 | 127 (e) | 0 (f) | 5 (g) |
606 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
607 * 4 | Token Bucket Rate [r] (32-bit IEEE floating point number) |
608 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
609 * 5 | Token Bucket Size [b] (32-bit IEEE floating point number) |
610 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
611 * 6 | Peak Data Rate [p] (32-bit IEEE floating point number) |
612 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
613 * 7 | Minimum Policed Unit [m] (32-bit integer) |
614 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
615 * 8 | Maximum Packet Size [M] (32-bit integer) |
616 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
617 *
618 * (a) - Message format version number (0)
619 * (b) - Overall length (7 words not including header)
620 * (c) - Service header, service number 5 (Controlled-Load)
621 * (d) - Length of controlled-load data, 6 words not including
622 * per-service header
623 * (e) - Parameter ID, parameter 127 (Token Bucket TSpec)
624 * (f) - Parameter 127 flags (none set)
625 * (g) - Parameter 127 length, 5 words not including per-service
626 * header
627 */
628
629 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
630 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+8)),
631 *(obj_tptr+8),
632 EXTRACT_16BITS(obj_tptr+10),
633 *(obj_tptr+9));
634 bw.i = EXTRACT_32BITS(obj_tptr+12);
635 printf("\n\t Token Bucket Rate: %.10g Mbps", bw.f*8/1000000);
636 bw.i = EXTRACT_32BITS(obj_tptr+16);
637 printf("\n\t Token Bucket Size: %.10g bytes", bw.f);
638 bw.i = EXTRACT_32BITS(obj_tptr+20);
639 printf("\n\t Peak Data Rate: %.10g Mbps", bw.f*8/1000000);
640 printf("\n\t Minimum Policed Unit: %u bytes", EXTRACT_32BITS(obj_tptr+24));
641 printf("\n\t Maximum Packet Size: %u bytes", EXTRACT_32BITS(obj_tptr+28));
642
643 obj_tlen-=32;
644 obj_tptr+=32;
645 break;
646
647 case RSVP_OBJ_INTSERV_GUARANTEED_SERV:
648
649 /* guaranteed service
650 * 31 24 23 16 15 8 7 0
651 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
652 * 1 | 0 (a) | Unused | 10 (b) |
653 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
654 * 2 | 2 (c) |0| reserved | 9 (d) |
655 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
656 * 3 | 127 (e) | 0 (f) | 5 (g) |
657 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
658 * 4 | Token Bucket Rate [r] (32-bit IEEE floating point number) |
659 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
660 * 5 | Token Bucket Size [b] (32-bit IEEE floating point number) |
661 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
662 * 6 | Peak Data Rate [p] (32-bit IEEE floating point number) |
663 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
664 * 7 | Minimum Policed Unit [m] (32-bit integer) |
665 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
666 * 8 | Maximum Packet Size [M] (32-bit integer) |
667 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
668 * 9 | 130 (h) | 0 (i) | 2 (j) |
669 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
670 * 10 | Rate [R] (32-bit IEEE floating point number) |
671 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
672 * 11 | Slack Term [S] (32-bit integer) |
673 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
674 * (a) - Message format version number (0)
675 * (b) - Overall length (9 words not including header)
676 * (c) - Service header, service number 2 (Guaranteed)
677 * (d) - Length of per-service data, 9 words not including per-service
678 * header
679 * (e) - Parameter ID, parameter 127 (Token Bucket TSpec)
680 * (f) - Parameter 127 flags (none set)
681 * (g) - Parameter 127 length, 5 words not including parameter header
682 * (h) - Parameter ID, parameter 130 (Guaranteed Service RSpec)
683 * (i) - Parameter 130 flags (none set)
684 * (j) - Parameter 130 length, 2 words not including parameter header
685 */
686
687 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
688 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+8)),
689 *(obj_tptr+8),
690 EXTRACT_16BITS(obj_tptr+10),
691 *(obj_tptr+9));
692 bw.i = EXTRACT_32BITS(obj_tptr+12);
693 printf("\n\t Token Bucket Rate: %.10g Mbps", bw.f*8/1000000);
694 bw.i = EXTRACT_32BITS(obj_tptr+16);
695 printf("\n\t Token Bucket Size: %.10g bytes", bw.f);
696 bw.i = EXTRACT_32BITS(obj_tptr+20);
697 printf("\n\t Peak Data Rate: %.10g Mbps", bw.f*8/1000000);
698 printf("\n\t Minimum Policed Unit: %u bytes", EXTRACT_32BITS(obj_tptr+24));
699 printf("\n\t Maximum Packet Size: %u bytes", EXTRACT_32BITS(obj_tptr+28));
700
701 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
702 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+32)),
703 *(obj_tptr+32),
704 EXTRACT_16BITS(obj_tptr+34),
705 *(obj_tptr+33));
706 bw.i = EXTRACT_32BITS(obj_tptr+36);
707 printf("\n\t Rate: %.10g Mbps", bw.f*8/1000000);
708 printf("\n\t Slack Term: %u", EXTRACT_32BITS(obj_tptr+40));
709
710 obj_tlen-=44;
711 obj_tptr+=44;
712 break;
713 default:
714 hexdump=TRUE;
715 }
716
717 break;
718 default:
719 hexdump=TRUE;
720 }
721 break;
722
723 case RSVP_OBJ_FILTERSPEC:
724 switch(rsvp_obj_ctype) {
725 case RSVP_CTYPE_IPV4:
726 printf("\n\t Source Address: %s, Source Port: %u",
727 ipaddr_string(obj_tptr),
728 EXTRACT_16BITS(obj_tptr+6));
729 obj_tlen-=8;
730 obj_tptr+=8;
731 break;
732 #ifdef INET6
733 case RSVP_CTYPE_IPV6:
734 printf("\n\t Source Address: %s, Source Port: %u",
735 ip6addr_string(obj_tptr),
736 EXTRACT_16BITS(obj_tptr+18));
737 obj_tlen-=20;
738 obj_tptr+=20;
739 break;
740 case RSVP_CTYPE_3:
741 printf("\n\t Source Address: %s, Flow Label: %u",
742 ip6addr_string(obj_tptr),
743 EXTRACT_24BITS(obj_tptr+17));
744 obj_tlen-=20;
745 obj_tptr+=20;
746 break;
747 case RSVP_CTYPE_TUNNEL_IPV6:
748 printf("\n\t Source Address: %s, LSP-ID: 0x%04x",
749 ipaddr_string(obj_tptr),
750 EXTRACT_16BITS(obj_tptr+18));
751 obj_tlen-=20;
752 obj_tptr+=20;
753 break;
754 #endif
755 case RSVP_CTYPE_TUNNEL_IPV4:
756 printf("\n\t Source Address: %s, LSP-ID: 0x%04x",
757 ipaddr_string(obj_tptr),
758 EXTRACT_16BITS(obj_tptr+6));
759 obj_tlen-=8;
760 obj_tptr+=8;
761 break;
762 default:
763 hexdump=TRUE;
764 }
765 break;
766
767 case RSVP_OBJ_FASTREROUTE:
768 switch(rsvp_obj_ctype) {
769 case RSVP_CTYPE_TUNNEL_IPV4:
770 bw.i = EXTRACT_32BITS(obj_tptr+4);
771 printf("\n\t Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
772 (int)*obj_tptr,
773 (int)*(obj_tptr+1),
774 (int)*(obj_tptr+2),
775 bw.f*8/1000000);
776 printf("\n\t Include Colors: 0x%08x, Exclude Colors: 0x%08x",
777 EXTRACT_32BITS(obj_tptr+8),
778 EXTRACT_32BITS(obj_tptr+12));
779 obj_tlen-=16;
780 obj_tptr+=16;
781 break;
782 default:
783 hexdump=TRUE;
784 }
785 break;
786
787 case RSVP_OBJ_DETOUR:
788 switch(rsvp_obj_ctype) {
789 case RSVP_CTYPE_TUNNEL_IPV4:
790 while(obj_tlen >= 8) {
791 printf("\n\t PLR-ID: %s, Avoid-Node-ID: %s",
792 ipaddr_string(obj_tptr),
793 ipaddr_string(obj_tptr+4));
794 obj_tlen-=8;
795 obj_tptr+=8;
796 }
797 break;
798 default:
799 hexdump=TRUE;
800 }
801 break;
802
803 break;
804
805 /*
806 * FIXME those are the defined objects that lack a decoder
807 * you are welcome to contribute code ;-)
808 */
809
810 case RSVP_OBJ_INTEGRITY:
811 case RSVP_OBJ_ERROR_SPEC:
812 case RSVP_OBJ_SCOPE:
813 case RSVP_OBJ_SENDER_TSPEC:
814 case RSVP_OBJ_ADSPEC:
815 case RSVP_OBJ_POLICY_DATA:
816 case RSVP_OBJ_CONFIRM:
817 case RSVP_OBJ_MESSAGE_ID:
818 case RSVP_OBJ_MESSAGE_ID_ACK:
819 case RSVP_OBJ_MESSAGE_ID_LIST:
820 case RSVP_OBJ_RECOVERY_LABEL:
821 case RSVP_OBJ_UPSTREAM_LABEL:
822 case RSVP_OBJ_SUGGESTED_LABEL:
823 case RSVP_OBJ_PROPERTIES:
824 default:
825 if (vflag <= 1)
826 print_unknown_data(obj_tptr,"\n\t ",obj_tlen);
827 break;
828 }
829 /* do we want to see an additionally hexdump ? */
830 if (vflag > 1 || hexdump==TRUE)
831 print_unknown_data(tptr+sizeof(sizeof(struct rsvp_object_header)),"\n\t ",
832 rsvp_obj_len-sizeof(struct rsvp_object_header));
833
834 tptr+=rsvp_obj_len;
835 tlen-=rsvp_obj_len;
836 }
837 return;
838 trunc:
839 printf("\n\t\t packet exceeded snapshot");
840 }
841
842