]> The Tcpdump Group git mirrors - tcpdump/blob - print-rsvp.c
"%.f" is not a valid format string; you need a number after the ".".
[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.7 2002-12-10 08:16:22 guy 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 } __attribute__((packed));
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 } __attribute__((packed));
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
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
126 #define RSVP_OBJ_RRO 21
127 #define RSVP_OBJ_HELLO 22
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
134 #define RSVP_OBJ_SUGGESTED_LABEL 129
135 #define RSVP_OBJ_PROPERTIES 204
136 #define RSVP_OBJ_FASTREROUTE 205
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 { 0, NULL}
214 };
215
216 #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
217 #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
218
219 #define RSVP_OBJ_XRO_RES 0
220 #define RSVP_OBJ_XRO_IPV4 1
221 #define RSVP_OBJ_XRO_IPV6 2
222 #define RSVP_OBJ_XRO_ASN 32
223 #define RSVP_OBJ_XRO_MPLS 64
224
225 static const struct tok rsvp_obj_xro_values[] = {
226 { RSVP_OBJ_XRO_RES, "Reserved" },
227 { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" },
228 { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" },
229 { RSVP_OBJ_XRO_ASN, "Autonomous system number" },
230 { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" },
231 { 0, NULL}
232 };
233
234 static const struct tok rsvp_resstyle_values[] = {
235 { 17, "Wildcard Filter" },
236 { 10, "Fixed Filter" },
237 { 18, "Shared Explicit" },
238 { 0, NULL}
239 };
240
241 #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
242 #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
243
244 static const struct tok rsvp_intserv_service_type_values[] = {
245 { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" },
246 { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
247 { 0, NULL}
248 };
249
250 static const struct tok rsvp_intserv_parameter_id_values[] = {
251 { 127, "Token Bucket TSpec" },
252 { 130, "Guaranteed Service RSpec" },
253 { 0, NULL}
254 };
255
256 static struct tok rsvp_session_attribute_flag_values[] = {
257 { 1, "Local Protection desired" },
258 { 2, "Label Recording desired" },
259 { 4, "SE Style desired" },
260 { 0, NULL}
261 };
262
263 #define FALSE 0
264 #define TRUE 1
265
266 void
267 rsvp_print(register const u_char *pptr, register u_int len) {
268
269 const struct rsvp_common_header *rsvp_com_header;
270 const struct rsvp_object_header *rsvp_obj_header;
271 const u_char *tptr,*obj_tptr;
272 u_short tlen,rsvp_obj_len,rsvp_obj_ctype,obj_tlen;
273 int hexdump;
274 union {
275 float f;
276 u_int32_t i;
277 } bw;
278
279 tptr=pptr;
280 rsvp_com_header = (const struct rsvp_common_header *)pptr;
281 TCHECK(*rsvp_com_header);
282
283 /*
284 * Sanity checking of the header.
285 */
286 if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
287 printf("RSVP version %u packet not supported",
288 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags));
289 return;
290 }
291
292 /* in non-verbose mode just lets print the basic Message Type*/
293 if (vflag < 1) {
294 printf("RSVP %s Message, length: %u",
295 tok2str(rsvp_msg_type_values, "unknown (%u)",rsvp_com_header->msg_type),
296 len);
297 return;
298 }
299
300 /* ok they seem to want to know everything - lets fully decode it */
301
302 tlen=EXTRACT_16BITS(rsvp_com_header->length);
303
304 printf("RSVP\n\tv: %u, msg-type: %s, length: %u, ttl: %u, checksum: 0x%04x",
305 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
306 tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
307 tlen,
308 rsvp_com_header->ttl,
309 EXTRACT_16BITS(rsvp_com_header->checksum));
310
311 tptr+=sizeof(const struct rsvp_common_header);
312 tlen-=sizeof(const struct rsvp_common_header);
313
314 while(tlen>0) {
315 /* did we capture enough for fully decoding the object header ? */
316 if (!TTEST2(*tptr, sizeof(struct rsvp_object_header)))
317 goto trunc;
318
319 rsvp_obj_header = (const struct rsvp_object_header *)tptr;
320 rsvp_obj_len=EXTRACT_16BITS(rsvp_obj_header->length);
321 rsvp_obj_ctype=rsvp_obj_header->ctype;
322
323 if(rsvp_obj_len % 4 || rsvp_obj_len < 4)
324 return;
325
326 printf("\n\t %s Object (%u) Flags: [%s",
327 tok2str(rsvp_obj_values,
328 "Unknown",
329 rsvp_obj_header->class_num),
330 rsvp_obj_header->class_num,
331 ((rsvp_obj_header->class_num)&0x80) ? "ignore" : "reject");
332
333 if (rsvp_obj_header->class_num > 128)
334 printf(" %s",
335 ((rsvp_obj_header->class_num)&0x40) ? "and forward" : "silently");
336
337 printf(" if unknown], Class-Type: %s (%u), length: %u",
338 tok2str(rsvp_ctype_values,
339 "Unknown",
340 ((rsvp_obj_header->class_num)<<8)+rsvp_obj_ctype),
341 rsvp_obj_ctype,
342 rsvp_obj_len);
343
344 obj_tptr=tptr+sizeof(struct rsvp_object_header);
345 obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
346
347 /* did we capture enough for fully decoding the object ? */
348 if (!TTEST2(*tptr, rsvp_obj_len))
349 goto trunc;
350 hexdump=FALSE;
351
352 switch(rsvp_obj_header->class_num) {
353 case RSVP_OBJ_SESSION:
354 switch(rsvp_obj_ctype) {
355 case RSVP_CTYPE_IPV4:
356 printf("\n\t IPv4 DestAddress: %s, Protocol ID: 0x%02x",
357 ipaddr_string(obj_tptr),
358 *(obj_tptr+4));
359 printf("\n\t Flags: [0x%02x], DestPort %u",
360 *(obj_tptr+5),
361 EXTRACT_16BITS(obj_tptr+6));
362 obj_tlen-=8;
363 obj_tptr+=8;
364 break;
365 #ifdef INET6
366 case RSVP_CTYPE_IPV6:
367 printf("\n\t IPv6 DestAddress: %s, Protocol ID: 0x%02x",
368 ip6addr_string(obj_tptr),
369 *(obj_tptr+16));
370 printf("\n\t Flags: [0x%02x], DestPort %u",
371 *(obj_tptr+17),
372 EXTRACT_16BITS(obj_tptr+18));
373 obj_tlen-=20;
374 obj_tptr+=20;
375 break;
376 case RSVP_CTYPE_TUNNEL_IPV6:
377 printf("\n\t IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
378 ip6addr_string(obj_tptr),
379 EXTRACT_16BITS(obj_tptr+18),
380 ip6addr_string(obj_tptr+20));
381 obj_tlen-=36;
382 obj_tptr+=36;
383 break;
384 #endif
385 case RSVP_CTYPE_TUNNEL_IPV4:
386 printf("\n\t IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
387 ipaddr_string(obj_tptr),
388 EXTRACT_16BITS(obj_tptr+6),
389 ipaddr_string(obj_tptr+8));
390 obj_tlen-=12;
391 obj_tptr+=12;
392 break;
393 default:
394 hexdump=TRUE;
395 }
396 break;
397 case RSVP_OBJ_LABEL:
398 switch(rsvp_obj_ctype) {
399 case RSVP_CTYPE_1:
400 while(obj_tlen >= 4 ) {
401 printf("\n\t Label: %u", EXTRACT_32BITS(obj_tptr));
402 obj_tlen-=4;
403 obj_tptr+=4;
404 }
405 break;
406 default:
407 hexdump=TRUE;
408 }
409 break;
410 case RSVP_OBJ_STYLE:
411 switch(rsvp_obj_ctype) {
412 case RSVP_CTYPE_1:
413 printf("\n\t Reservation Style: %s, Flags: [0x%02x]",
414 tok2str(rsvp_resstyle_values,
415 "Unknown",
416 EXTRACT_24BITS(obj_tptr+1)),
417 *(obj_tptr));
418 obj_tlen-=4;
419 obj_tptr+=4;
420 break;
421 default:
422 hexdump=TRUE;
423 }
424 break;
425 case RSVP_OBJ_SENDER_TEMPLATE:
426 switch(rsvp_obj_ctype) {
427 case RSVP_CTYPE_TUNNEL_IPV4:
428 printf("\n\t IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
429 ipaddr_string(obj_tptr),
430 EXTRACT_16BITS(obj_tptr+6));
431 obj_tlen-=8;
432 obj_tptr+=8;
433 break;
434 default:
435 hexdump=TRUE;
436 }
437 break;
438 case RSVP_OBJ_LABEL_REQ:
439 switch(rsvp_obj_ctype) {
440 case RSVP_CTYPE_1:
441 while(obj_tlen >= 4 ) {
442 printf("\n\t L3 Protocol ID: %s",
443 tok2str(ethertype_values,
444 "Unknown Protocol 0x%04x",
445 EXTRACT_16BITS(obj_tptr+2)));
446 obj_tlen-=4;
447 obj_tptr+=4;
448 }
449 break;
450 case RSVP_CTYPE_2:
451 printf("\n\t L3 Protocol ID: %s",
452 tok2str(ethertype_values,
453 "Unknown Protocol 0x%04x",
454 EXTRACT_16BITS(obj_tptr+2)));
455 printf(",%s merge capability",((*(obj_tptr+4))&0x80) ? "no" : "" );
456 printf("\n\t Minimum VPI/VCI %u/%u",
457 (EXTRACT_16BITS(obj_tptr+4))&0xfff,
458 (EXTRACT_16BITS(obj_tptr+6))&0xfff);
459 printf("\n\t Maximum VPI/VCI %u/%u",
460 (EXTRACT_16BITS(obj_tptr+8))&0xfff,
461 (EXTRACT_16BITS(obj_tptr+10))&0xfff);
462 obj_tlen-=12;
463 obj_tptr+=12;
464 break;
465 case RSVP_CTYPE_3:
466 printf("\n\t L3 Protocol ID: %s",
467 tok2str(ethertype_values,
468 "Unknown Protocol 0x%04x",
469 EXTRACT_16BITS(obj_tptr+2)));
470 printf("\n\t Minimum/Maximum DLCI %u/%u, %s%s bit DLCI",
471 (EXTRACT_32BITS(obj_tptr+4))&0x7fffff,
472 (EXTRACT_32BITS(obj_tptr+8))&0x7fffff,
473 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 0 ) ? "10" : "",
474 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 2 ) ? "23" : "");
475 obj_tlen-=12;
476 obj_tptr+=12;
477 break;
478 default:
479 hexdump=TRUE;
480 }
481 break;
482 case RSVP_OBJ_RRO:
483 case RSVP_OBJ_ERO:
484 switch(rsvp_obj_ctype) {
485 case RSVP_CTYPE_IPV4:
486 while(obj_tlen >= 4 ) {
487 printf("\n\t Subobject Type: %s",
488 tok2str(rsvp_obj_xro_values,
489 "Unknown %u",
490 RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)));
491 switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) {
492 case RSVP_OBJ_XRO_IPV4:
493 printf(", %s, %s/%u",
494 RSVP_OBJ_XRO_MASK_LOOSE(*obj_tptr) ? "Loose" : "Strict",
495 ipaddr_string(obj_tptr+2),
496 *(obj_tptr+6));
497 }
498 obj_tlen-=*(obj_tptr+1);
499 obj_tptr+=*(obj_tptr+1);
500 }
501 break;
502 default:
503 hexdump=TRUE;
504 }
505 break;
506 case RSVP_OBJ_HELLO:
507 switch(rsvp_obj_ctype) {
508 case RSVP_CTYPE_1:
509 case RSVP_CTYPE_2:
510 printf("\n\t Source Instance 0x%08x, Destination Instance 0x%08x",
511 EXTRACT_32BITS(obj_tptr),
512 EXTRACT_32BITS(obj_tptr+4));
513 obj_tlen-=8;
514 obj_tptr+=8;
515 break;
516 default:
517 hexdump=TRUE;
518 }
519 break;
520 case RSVP_OBJ_RESTART_CAPABILITY:
521 switch(rsvp_obj_ctype) {
522 case RSVP_CTYPE_1:
523 printf("\n\t Restart Time: %ums\n\t Recovery Time: %ums",
524 EXTRACT_16BITS(obj_tptr),
525 EXTRACT_16BITS(obj_tptr+4));
526 break;
527 default:
528 hexdump=TRUE;
529 }
530 break;
531 case RSVP_OBJ_SESSION_ATTRIBUTE:
532 switch(rsvp_obj_ctype) {
533 case RSVP_CTYPE_TUNNEL_IPV4:
534 printf("\n\t Session Name: %s",(obj_tptr+3));
535 printf("\n\t Setup Priority: %u, Holding Priority: %u, Flags: [%s]",
536 (int)*obj_tptr,
537 (int)*(obj_tptr+1),
538 tok2str(rsvp_session_attribute_flag_values,
539 "none",
540 *(obj_tptr+2)));
541
542 obj_tlen-=4+*(obj_tptr+3);
543 obj_tptr+=4+*(obj_tptr+3);
544 break;
545 default:
546 hexdump=TRUE;
547 }
548 break;
549 case RSVP_OBJ_RSVP_HOP:
550 switch(rsvp_obj_ctype) {
551 case RSVP_CTYPE_IPV4:
552 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
553 ipaddr_string(obj_tptr),
554 EXTRACT_32BITS(obj_tptr+4));
555 obj_tlen-=8;
556 obj_tptr+=8;
557 break;
558 #ifdef INET6
559 case RSVP_CTYPE_IPV6:
560 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
561 ip6addr_string(obj_tptr),
562 EXTRACT_32BITS(obj_tptr+16));
563 obj_tlen-=20;
564 obj_tptr+=20;
565 break;
566 #endif
567 default:
568 hexdump=TRUE;
569 }
570 break;
571 case RSVP_OBJ_TIME_VALUES:
572 switch(rsvp_obj_ctype) {
573 case RSVP_CTYPE_1:
574 printf("\n\t Refresh Period: %ums",
575 EXTRACT_32BITS(obj_tptr));
576 obj_tlen-=4;
577 obj_tptr+=4;
578 break;
579 default:
580 hexdump=TRUE;
581 }
582 break;
583 case RSVP_OBJ_FLOWSPEC:
584 switch(rsvp_obj_ctype) {
585 case RSVP_CTYPE_2:
586 printf("\n\t Msg-Version: %u, length: %u words (32-bit), Service Type: %s (%u)",
587 (*obj_tptr & 0xf0) >> 4,
588 EXTRACT_16BITS(obj_tptr+2),
589 tok2str(rsvp_intserv_service_type_values,"unknown",*(obj_tptr+4)),
590 *(obj_tptr+4));
591
592 switch (*(obj_tptr+4)) {
593
594 case RSVP_OBJ_INTSERV_CONTROLLED_LOAD:
595
596 /* controlled load service
597 * 31 24 23 16 15 8 7 0
598 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
599 * 1 | 0 (a) | reserved | 7 (b) |
600 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
601 * 2 | 5 (c) |0| reserved | 6 (d) |
602 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
603 * 3 | 127 (e) | 0 (f) | 5 (g) |
604 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
605 * 4 | Token Bucket Rate [r] (32-bit IEEE floating point number) |
606 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
607 * 5 | Token Bucket Size [b] (32-bit IEEE floating point number) |
608 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
609 * 6 | Peak Data Rate [p] (32-bit IEEE floating point number) |
610 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
611 * 7 | Minimum Policed Unit [m] (32-bit integer) |
612 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
613 * 8 | Maximum Packet Size [M] (32-bit integer) |
614 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
615 *
616 * (a) - Message format version number (0)
617 * (b) - Overall length (7 words not including header)
618 * (c) - Service header, service number 5 (Controlled-Load)
619 * (d) - Length of controlled-load data, 6 words not including
620 * per-service header
621 * (e) - Parameter ID, parameter 127 (Token Bucket TSpec)
622 * (f) - Parameter 127 flags (none set)
623 * (g) - Parameter 127 length, 5 words not including per-service
624 * header
625 */
626
627 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
628 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+8)),
629 *(obj_tptr+8),
630 EXTRACT_16BITS(obj_tptr+10),
631 *(obj_tptr+9));
632 bw.i = EXTRACT_32BITS(obj_tptr+12);
633 printf("\n\t Token Bucket Rate: %.3f Mbps", bw.f*8/1000000);
634 bw.i = EXTRACT_32BITS(obj_tptr+16);
635 printf("\n\t Token Bucket Size: %.3f bytes", bw.f);
636 bw.i = EXTRACT_32BITS(obj_tptr+20);
637 printf("\n\t Peak Data Rate: %.3f Mbps", bw.f*8/1000000);
638 printf("\n\t Minimum Policed Unit: %u bytes", EXTRACT_32BITS(obj_tptr+24));
639 printf("\n\t Maximum Packet Size: %u bytes", EXTRACT_32BITS(obj_tptr+28));
640
641 obj_tlen-=32;
642 obj_tptr+=32;
643 break;
644
645 case RSVP_OBJ_INTSERV_GUARANTEED_SERV:
646
647 /* guaranteed service
648 * 31 24 23 16 15 8 7 0
649 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
650 * 1 | 0 (a) | Unused | 10 (b) |
651 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
652 * 2 | 2 (c) |0| reserved | 9 (d) |
653 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
654 * 3 | 127 (e) | 0 (f) | 5 (g) |
655 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
656 * 4 | Token Bucket Rate [r] (32-bit IEEE floating point number) |
657 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
658 * 5 | Token Bucket Size [b] (32-bit IEEE floating point number) |
659 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
660 * 6 | Peak Data Rate [p] (32-bit IEEE floating point number) |
661 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
662 * 7 | Minimum Policed Unit [m] (32-bit integer) |
663 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
664 * 8 | Maximum Packet Size [M] (32-bit integer) |
665 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
666 * 9 | 130 (h) | 0 (i) | 2 (j) |
667 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
668 * 10 | Rate [R] (32-bit IEEE floating point number) |
669 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
670 * 11 | Slack Term [S] (32-bit integer) |
671 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
672 * (a) - Message format version number (0)
673 * (b) - Overall length (9 words not including header)
674 * (c) - Service header, service number 2 (Guaranteed)
675 * (d) - Length of per-service data, 9 words not including per-service
676 * header
677 * (e) - Parameter ID, parameter 127 (Token Bucket TSpec)
678 * (f) - Parameter 127 flags (none set)
679 * (g) - Parameter 127 length, 5 words not including parameter header
680 * (h) - Parameter ID, parameter 130 (Guaranteed Service RSpec)
681 * (i) - Parameter 130 flags (none set)
682 * (j) - Parameter 130 length, 2 words not including parameter header
683 */
684
685 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
686 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+8)),
687 *(obj_tptr+8),
688 EXTRACT_16BITS(obj_tptr+10),
689 *(obj_tptr+9));
690 bw.i = EXTRACT_32BITS(obj_tptr+12);
691 printf("\n\t Token Bucket Rate: %.3f Mbps", bw.f*8/1000000);
692 bw.i = EXTRACT_32BITS(obj_tptr+16);
693 printf("\n\t Token Bucket Size: %.3f bytes", bw.f);
694 bw.i = EXTRACT_32BITS(obj_tptr+20);
695 printf("\n\t Peak Data Rate: %.3f Mbps", bw.f*8/1000000);
696 printf("\n\t Minimum Policed Unit: %u bytes", EXTRACT_32BITS(obj_tptr+24));
697 printf("\n\t Maximum Packet Size: %u bytes", EXTRACT_32BITS(obj_tptr+28));
698
699 printf("\n\t Parameter ID: %s (%u), length: %u words (32-bit), Flags: [0x%02x]",
700 tok2str(rsvp_intserv_parameter_id_values,"unknown",*(obj_tptr+32)),
701 *(obj_tptr+32),
702 EXTRACT_16BITS(obj_tptr+34),
703 *(obj_tptr+33));
704 bw.i = EXTRACT_32BITS(obj_tptr+36);
705 printf("\n\t Rate: %.3f Mbps", bw.f*8/1000000);
706 printf("\n\t Slack Term: %u", EXTRACT_32BITS(obj_tptr+40));
707
708 obj_tlen-=44;
709 obj_tptr+=44;
710 break;
711 default:
712 hexdump=TRUE;
713 }
714
715 break;
716 default:
717 hexdump=TRUE;
718 }
719 break;
720
721 case RSVP_OBJ_FILTERSPEC:
722 switch(rsvp_obj_ctype) {
723 case RSVP_CTYPE_IPV4:
724 printf("\n\t Source Address: %s, Source Port: %u",
725 ipaddr_string(obj_tptr),
726 EXTRACT_16BITS(obj_tptr+6));
727 obj_tlen-=8;
728 obj_tptr+=8;
729 break;
730 #ifdef INET6
731 case RSVP_CTYPE_IPV6:
732 printf("\n\t Source Address: %s, Source Port: %u",
733 ip6addr_string(obj_tptr),
734 EXTRACT_16BITS(obj_tptr+18));
735 obj_tlen-=20;
736 obj_tptr+=20;
737 break;
738 case RSVP_CTYPE_3:
739 printf("\n\t Source Address: %s, Flow Label: %u",
740 ip6addr_string(obj_tptr),
741 EXTRACT_24BITS(obj_tptr+17));
742 obj_tlen-=20;
743 obj_tptr+=20;
744 break;
745 case RSVP_CTYPE_TUNNEL_IPV6:
746 printf("\n\t Source Address: %s, LSP-ID: 0x%04x",
747 ipaddr_string(obj_tptr),
748 EXTRACT_16BITS(obj_tptr+18));
749 obj_tlen-=20;
750 obj_tptr+=20;
751 break;
752 #endif
753 case RSVP_CTYPE_TUNNEL_IPV4:
754 printf("\n\t Source Address: %s, LSP-ID: 0x%04x",
755 ipaddr_string(obj_tptr),
756 EXTRACT_16BITS(obj_tptr+6));
757 obj_tlen-=8;
758 obj_tptr+=8;
759 break;
760 default:
761 hexdump=TRUE;
762 }
763 break;
764
765 /*
766 * FIXME those are the defined objects that lack a decoder
767 * you are welcome to contribute code ;-)
768 */
769
770 case RSVP_OBJ_INTEGRITY:
771 case RSVP_OBJ_ERROR_SPEC:
772 case RSVP_OBJ_SCOPE:
773 case RSVP_OBJ_SENDER_TSPEC:
774 case RSVP_OBJ_ADSPEC:
775 case RSVP_OBJ_POLICY_DATA:
776 case RSVP_OBJ_CONFIRM:
777 case RSVP_OBJ_MESSAGE_ID:
778 case RSVP_OBJ_MESSAGE_ID_ACK:
779 case RSVP_OBJ_MESSAGE_ID_LIST:
780 case RSVP_OBJ_RECOVERY_LABEL:
781 case RSVP_OBJ_UPSTREAM_LABEL:
782 case RSVP_OBJ_DETOUR:
783 case RSVP_OBJ_SUGGESTED_LABEL:
784 case RSVP_OBJ_PROPERTIES:
785 case RSVP_OBJ_FASTREROUTE:
786 default:
787 if (vflag <= 1)
788 print_unknown_data(obj_tptr,"\n\t ",obj_tlen);
789 break;
790 }
791 /* do we want to see an additionally hexdump ? */
792 if (vflag > 1 || hexdump==TRUE)
793 print_unknown_data(tptr+sizeof(sizeof(struct rsvp_object_header)),"\n\t ",
794 rsvp_obj_len-sizeof(struct rsvp_object_header));
795
796 tptr+=rsvp_obj_len;
797 tlen-=rsvp_obj_len;
798 }
799 return;
800 trunc:
801 printf("\n\t\t packet exceeded snapshot");
802 }
803
804