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[] _U_ = 18 "@(#) $Header: /tcpdump/master/tcpdump/print-rsvp.c,v 1.24.2.3 2004/03/24 04:01:08 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 #include "gmpls.h" 36 37 /* 38 * RFC 2205 common header 39 * 40 * 0 1 2 3 41 * +-------------+-------------+-------------+-------------+ 42 * | Vers | Flags| Msg Type | RSVP Checksum | 43 * +-------------+-------------+-------------+-------------+ 44 * | Send_TTL | (Reserved) | RSVP Length | 45 * +-------------+-------------+-------------+-------------+ 46 * 47 */ 48 49 struct rsvp_common_header { 50 u_int8_t version_flags; 51 u_int8_t msg_type; 52 u_int8_t checksum[2]; 53 u_int8_t ttl; 54 u_int8_t reserved; 55 u_int8_t length[2]; 56 }; 57 58 /* 59 * RFC2205 object header 60 * 61 * 62 * 0 1 2 3 63 * +-------------+-------------+-------------+-------------+ 64 * | Length (bytes) | Class-Num | C-Type | 65 * +-------------+-------------+-------------+-------------+ 66 * | | 67 * // (Object contents) // 68 * | | 69 * +-------------+-------------+-------------+-------------+ 70 */ 71 72 struct rsvp_object_header { 73 u_int8_t length[2]; 74 u_int8_t class_num; 75 u_int8_t ctype; 76 }; 77 78 #define RSVP_VERSION 1 79 #define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 80 #define RSVP_EXTRACT_FLAGS(x) ((x)&0x0f) 81 82 #define RSVP_MSGTYPE_PATH 1 83 #define RSVP_MSGTYPE_RESV 2 84 #define RSVP_MSGTYPE_PATHERR 3 85 #define RSVP_MSGTYPE_RESVERR 4 86 #define RSVP_MSGTYPE_PATHTEAR 5 87 #define RSVP_MSGTYPE_RESVTEAR 6 88 #define RSVP_MSGTYPE_RESVCONF 7 89 #define RSVP_MSGTYPE_AGGREGATE 12 90 #define RSVP_MSGTYPE_ACK 13 91 #define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */ 92 #define RSVP_MSGTYPE_SREFRESH 15 93 #define RSVP_MSGTYPE_HELLO 20 94 95 static const struct tok rsvp_msg_type_values[] = { 96 { RSVP_MSGTYPE_PATH, "Path" }, 97 { RSVP_MSGTYPE_RESV, "Resv" }, 98 { RSVP_MSGTYPE_PATHERR, "PathErr" }, 99 { RSVP_MSGTYPE_RESVERR, "ResvErr" }, 100 { RSVP_MSGTYPE_PATHTEAR, "PathTear" }, 101 { RSVP_MSGTYPE_RESVTEAR, "ResvTear" }, 102 { RSVP_MSGTYPE_RESVCONF, "ResvConf" }, 103 { RSVP_MSGTYPE_AGGREGATE, "Aggregate" }, 104 { RSVP_MSGTYPE_ACK, "Acknowledgement" }, 105 { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" }, 106 { RSVP_MSGTYPE_SREFRESH, "Refresh" }, 107 { RSVP_MSGTYPE_HELLO, "Hello" }, 108 { 0, NULL} 109 }; 110 111 static const struct tok rsvp_header_flag_values[] = { 112 { 0x01, "Refresh reduction capable" }, /* rfc2961 */ 113 { 0, NULL} 114 }; 115 116 #define RSVP_OBJ_SESSION 1 /* rfc2205 */ 117 #define RSVP_OBJ_RSVP_HOP 3 /* rfc2205, rfc3473 */ 118 #define RSVP_OBJ_INTEGRITY 4 119 #define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */ 120 #define RSVP_OBJ_ERROR_SPEC 6 121 #define RSVP_OBJ_SCOPE 7 122 #define RSVP_OBJ_STYLE 8 /* rfc2205 */ 123 #define RSVP_OBJ_FLOWSPEC 9 /* rfc2215 */ 124 #define RSVP_OBJ_FILTERSPEC 10 /* rfc2215 */ 125 #define RSVP_OBJ_SENDER_TEMPLATE 11 126 #define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2215 */ 127 #define RSVP_OBJ_ADSPEC 13 /* rfc2215 */ 128 #define RSVP_OBJ_POLICY_DATA 14 129 #define RSVP_OBJ_CONFIRM 15 /* rfc2205 */ 130 #define RSVP_OBJ_LABEL 16 /* rfc3209 */ 131 #define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */ 132 #define RSVP_OBJ_ERO 20 /* rfc3209 */ 133 #define RSVP_OBJ_RRO 21 /* rfc3209 */ 134 #define RSVP_OBJ_HELLO 22 /* rfc3209 */ 135 #define RSVP_OBJ_MESSAGE_ID 23 136 #define RSVP_OBJ_MESSAGE_ID_ACK 24 137 #define RSVP_OBJ_MESSAGE_ID_LIST 25 138 #define RSVP_OBJ_RECOVERY_LABEL 34 /* rfc3473 */ 139 #define RSVP_OBJ_UPSTREAM_LABEL 35 /* rfc3473 */ 140 #define RSVP_OBJ_LABEL_SET 36 /* rfc3473 */ 141 #define RSVP_OBJ_PROTECTION 37 /* rfc3473 */ 142 #define RSVP_OBJ_DETOUR 63 /* draft-ietf-mpls-rsvp-lsp-fastreroute-01 */ 143 #define RSVP_OBJ_SUGGESTED_LABEL 129 /* rfc3473 */ 144 #define RSVP_OBJ_ACCEPT_LABEL_SET 130 /* rfc3473 */ 145 #define RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */ 146 #define RSVP_OBJ_NOTIFY_REQ 195 /* rfc3473 */ 147 #define RSVP_OBJ_ADMIN_STATUS 196 /* rfc3473 */ 148 #define RSVP_OBJ_PROPERTIES 204 /* juniper proprietary */ 149 #define RSVP_OBJ_FASTREROUTE 205 /* draft-ietf-mpls-rsvp-lsp-fastreroute-01 */ 150 #define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */ 151 #define RSVP_OBJ_CALL_ID 230 /* rfc3474 */ 152 #define RSVP_OBJ_CALL_OPS 236 /* rfc3474 */ 153 154 static const struct tok rsvp_obj_values[] = { 155 { RSVP_OBJ_SESSION, "Session" }, 156 { RSVP_OBJ_RSVP_HOP, "RSVP Hop" }, 157 { RSVP_OBJ_INTEGRITY, "Integrity" }, 158 { RSVP_OBJ_TIME_VALUES, "Time Values" }, 159 { RSVP_OBJ_ERROR_SPEC, "Error Spec" }, 160 { RSVP_OBJ_SCOPE, "Scope" }, 161 { RSVP_OBJ_STYLE, "Style" }, 162 { RSVP_OBJ_FLOWSPEC, "Flowspec" }, 163 { RSVP_OBJ_FILTERSPEC, "FilterSpec" }, 164 { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" }, 165 { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" }, 166 { RSVP_OBJ_ADSPEC, "Adspec" }, 167 { RSVP_OBJ_POLICY_DATA, "Policy Data" }, 168 { RSVP_OBJ_CONFIRM, "Confirm" }, 169 { RSVP_OBJ_LABEL, "Label" }, 170 { RSVP_OBJ_LABEL_REQ, "Label Request" }, 171 { RSVP_OBJ_ERO, "ERO" }, 172 { RSVP_OBJ_RRO, "RRO" }, 173 { RSVP_OBJ_HELLO, "Hello" }, 174 { RSVP_OBJ_MESSAGE_ID, "Message ID" }, 175 { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" }, 176 { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" }, 177 { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" }, 178 { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" }, 179 { RSVP_OBJ_LABEL_SET, "Label Set" }, 180 { RSVP_OBJ_ACCEPT_LABEL_SET, "Acceptable Label Set" }, 181 { RSVP_OBJ_DETOUR, "Detour" }, 182 { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" }, 183 { RSVP_OBJ_PROPERTIES, "Properties" }, 184 { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" }, 185 { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" }, 186 { RSVP_OBJ_CALL_ID, "Call-ID" }, 187 { RSVP_OBJ_CALL_OPS, "Call Capability" }, 188 { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" }, 189 { RSVP_OBJ_NOTIFY_REQ, "Notify Request" }, 190 { RSVP_OBJ_PROTECTION, "Protection" }, 191 { RSVP_OBJ_ADMIN_STATUS, "Administrative Status" }, 192 { 0, NULL} 193 }; 194 195 #define RSVP_CTYPE_IPV4 1 196 #define RSVP_CTYPE_IPV6 2 197 #define RSVP_CTYPE_TUNNEL_IPV4 7 198 #define RSVP_CTYPE_TUNNEL_IPV6 8 199 #define RSVP_CTYPE_1 1 200 #define RSVP_CTYPE_2 2 201 #define RSVP_CTYPE_3 3 202 #define RSVP_CTYPE_4 4 203 204 /* 205 * the ctypes are not globally unique so for 206 * translating it to strings we build a table based 207 * on objects offsetted by the ctype 208 */ 209 210 static const struct tok rsvp_ctype_values[] = { 211 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" }, 212 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" }, 213 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" }, 214 { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" }, 215 { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4, "IPv4" }, 216 { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6, "IPv6" }, 217 { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4, "IPv4" }, 218 { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6, "IPv6" }, 219 { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" }, 220 { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" }, 221 { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" }, 222 { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2, "IntServ" }, 223 { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2, "IntServ" }, 224 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" }, 225 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" }, 226 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" }, 227 { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 228 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" }, 229 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" }, 230 { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 231 { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4, "IPv4" }, 232 { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6, "IPv6" }, 233 { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 234 { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" }, 235 { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" }, 236 { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" }, 237 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" }, 238 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" }, 239 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" }, 240 { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4, "Generalized Label" }, 241 { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "Label" }, 242 { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 243 { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 244 { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1, "Label" }, 245 { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 246 { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 247 { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1, "Label" }, 248 { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 249 { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 250 { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1, "Label" }, 251 { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 252 { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 253 { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" }, 254 { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" }, 255 { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4, "IPv4" }, 256 { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6, "IPv6" }, 257 { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" }, 258 { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" }, 259 { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" }, 260 { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 261 { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 262 { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 263 { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1, "1" }, 264 { 0, NULL} 265 }; 266 267 #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f) 268 #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80) 269 270 #define RSVP_OBJ_XRO_RES 0 271 #define RSVP_OBJ_XRO_IPV4 1 272 #define RSVP_OBJ_XRO_IPV6 2 273 #define RSVP_OBJ_XRO_ASN 32 274 #define RSVP_OBJ_XRO_MPLS 64 275 276 static const struct tok rsvp_obj_xro_values[] = { 277 { RSVP_OBJ_XRO_RES, "Reserved" }, 278 { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" }, 279 { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" }, 280 { RSVP_OBJ_XRO_ASN, "Autonomous system number" }, 281 { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" }, 282 { 0, NULL} 283 }; 284 285 /* draft-ietf-mpls-rsvp-lsp-fastreroute-02.txt */ 286 static const struct tok rsvp_obj_rro_flag_values[] = { 287 { 0x01, "Local protection available" }, 288 { 0x02, "Local protection in use" }, 289 { 0x04, "Bandwidth protection" }, 290 { 0x08, "Node protection" }, 291 { 0, NULL} 292 }; 293 294 static const struct tok rsvp_resstyle_values[] = { 295 { 17, "Wildcard Filter" }, 296 { 10, "Fixed Filter" }, 297 { 18, "Shared Explicit" }, 298 { 0, NULL} 299 }; 300 301 #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2 302 #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5 303 304 static const struct tok rsvp_intserv_service_type_values[] = { 305 { 1, "Default/Global Information" }, 306 { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" }, 307 { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" }, 308 { 0, NULL} 309 }; 310 311 static const struct tok rsvp_intserv_parameter_id_values[] = { 312 { 4, "IS hop cnt" }, 313 { 6, "Path b/w estimate" }, 314 { 8, "Minimum path latency" }, 315 { 10, "Composed MTU" }, 316 { 127, "Token Bucket TSpec" }, 317 { 130, "Guaranteed Service RSpec" }, 318 { 133, "End-to-end composed value for C" }, 319 { 134, "End-to-end composed value for D" }, 320 { 135, "Since-last-reshaping point composed C" }, 321 { 136, "Since-last-reshaping point composed D" }, 322 { 0, NULL} 323 }; 324 325 static struct tok rsvp_session_attribute_flag_values[] = { 326 { 0x01, "Local Protection desired" }, 327 { 0x02, "Label Recording desired" }, 328 { 0x04, "SE Style desired" }, 329 { 0x08, "Bandwidth protection desired" }, /* draft-ietf-mpls-rsvp-lsp-fastreroute-02.txt */ 330 { 0x10, "Node protection desired" }, /* draft-ietf-mpls-rsvp-lsp-fastreroute-02.txt */ 331 { 0, NULL} 332 }; 333 334 static struct tok rsvp_obj_prop_tlv_values[] = { 335 { 0x01, "Cos" }, 336 { 0x02, "Metric 1" }, 337 { 0x04, "Metric 2" }, 338 { 0x08, "CCC Status" }, 339 { 0x10, "Path Type" }, 340 { 0, NULL} 341 }; 342 343 #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24 344 #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY 25 345 346 static struct tok rsvp_obj_error_code_values[] = { 347 { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" }, 348 { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY, "Notify Error" }, 349 { 0, NULL} 350 }; 351 352 static struct tok rsvp_obj_error_code_routing_values[] = { 353 { 1, "Bad EXPLICIT_ROUTE object" }, 354 { 2, "Bad strict node" }, 355 { 3, "Bad loose node" }, 356 { 4, "Bad initial subobject" }, 357 { 5, "No route available toward destination" }, 358 { 6, "Unacceptable label value" }, 359 { 7, "RRO indicated routing loops" }, 360 { 8, "non-RSVP-capable router in the path" }, 361 { 9, "MPLS label allocation failure" }, 362 { 10, "Unsupported L3PID" }, 363 { 0, NULL} 364 }; 365 366 #define FALSE 0 367 #define TRUE 1 368 369 370 static int rsvp_intserv_print(const u_char *, u_short); 371 372 /* 373 * this is a dissector for all the intserv defined 374 * specs as defined per rfc2215 375 * it is called from various rsvp objects; 376 * returns the amount of bytes being processed 377 */ 378 static int 379 rsvp_intserv_print(const u_char *tptr, u_short obj_tlen) { 380 381 int parameter_id,parameter_length; 382 union { 383 float f; 384 u_int32_t i; 385 } bw; 386 387 if (obj_tlen < 4) 388 return 0; 389 parameter_id = *(tptr); 390 parameter_length = EXTRACT_16BITS(tptr+2)<<2; /* convert wordcount to bytecount */ 391 392 printf("\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]", 393 tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id), 394 parameter_id, 395 parameter_length, 396 *(tptr+1)); 397 398 if (obj_tlen < parameter_length+4) 399 return 0; 400 switch(parameter_id) { /* parameter_id */ 401 402 case 4: 403 /* 404 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 405 * | 4 (e) | (f) | 1 (g) | 406 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 407 * | IS hop cnt (32-bit unsigned integer) | 408 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 409 */ 410 if (parameter_length == 4) 411 printf("\n\t\tIS hop count: %u", EXTRACT_32BITS(tptr+4)); 412 break; 413 414 case 6: 415 /* 416 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 417 * | 6 (h) | (i) | 1 (j) | 418 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 419 * | Path b/w estimate (32-bit IEEE floating point number) | 420 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 421 */ 422 if (parameter_length == 4) { 423 bw.i = EXTRACT_32BITS(tptr+4); 424 printf("\n\t\tPath b/w estimate: %.10g Mbps", bw.f/125000); 425 } 426 break; 427 428 case 8: 429 /* 430 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 431 * | 8 (k) | (l) | 1 (m) | 432 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 433 * | Minimum path latency (32-bit integer) | 434 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 435 */ 436 if (parameter_length == 4) { 437 printf("\n\t\tMinimum path latency: "); 438 if (EXTRACT_32BITS(tptr+4) == 0xffffffff) 439 printf("don't care"); 440 else 441 printf("%u", EXTRACT_32BITS(tptr+4)); 442 } 443 break; 444 445 case 10: 446 447 /* 448 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 449 * | 10 (n) | (o) | 1 (p) | 450 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 451 * | Composed MTU (32-bit unsigned integer) | 452 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 453 */ 454 if (parameter_length == 4) 455 printf("\n\t\tComposed MTU: %u bytes", EXTRACT_32BITS(tptr+4)); 456 break; 457 case 127: 458 /* 459 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 460 * | 127 (e) | 0 (f) | 5 (g) | 461 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 462 * | Token Bucket Rate [r] (32-bit IEEE floating point number) | 463 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 464 * | Token Bucket Size [b] (32-bit IEEE floating point number) | 465 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 466 * | Peak Data Rate [p] (32-bit IEEE floating point number) | 467 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 468 * | Minimum Policed Unit [m] (32-bit integer) | 469 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 470 * | Maximum Packet Size [M] (32-bit integer) | 471 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 472 */ 473 474 if (parameter_length == 20) { 475 bw.i = EXTRACT_32BITS(tptr+4); 476 printf("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f/125000); 477 bw.i = EXTRACT_32BITS(tptr+8); 478 printf("\n\t\tToken Bucket Size: %.10g bytes", bw.f); 479 bw.i = EXTRACT_32BITS(tptr+12); 480 printf("\n\t\tPeak Data Rate: %.10g Mbps", bw.f/125000); 481 printf("\n\t\tMinimum Policed Unit: %u bytes", EXTRACT_32BITS(tptr+16)); 482 printf("\n\t\tMaximum Packet Size: %u bytes", EXTRACT_32BITS(tptr+20)); 483 } 484 break; 485 486 case 130: 487 /* 488 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 489 * | 130 (h) | 0 (i) | 2 (j) | 490 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 491 * | Rate [R] (32-bit IEEE floating point number) | 492 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 493 * | Slack Term [S] (32-bit integer) | 494 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 495 */ 496 497 if (parameter_length == 8) { 498 bw.i = EXTRACT_32BITS(tptr+4); 499 printf("\n\t\tRate: %.10g Mbps", bw.f/125000); 500 printf("\n\t\tSlack Term: %u", EXTRACT_32BITS(tptr+8)); 501 } 502 break; 503 504 case 133: 505 case 134: 506 case 135: 507 case 136: 508 if (parameter_length == 4) 509 printf("\n\t\tValue: %u", EXTRACT_32BITS(tptr+4)); 510 break; 511 512 default: 513 if (vflag <= 1) 514 print_unknown_data(tptr+4,"\n\t\t",parameter_length); 515 } 516 return (parameter_length+4); /* header length 4 bytes */ 517 } 518 519 void 520 rsvp_print(register const u_char *pptr, register u_int len) { 521 522 const struct rsvp_common_header *rsvp_com_header; 523 const struct rsvp_object_header *rsvp_obj_header; 524 const u_char *tptr,*obj_tptr; 525 u_short tlen,rsvp_obj_len,rsvp_obj_ctype,obj_tlen,intserv_serv_tlen; 526 int hexdump,processed,padbytes,error_code,error_value; 527 union { 528 float f; 529 u_int32_t i; 530 } bw; 531 u_int8_t namelen; 532 u_int i; 533 534 tptr=pptr; 535 rsvp_com_header = (const struct rsvp_common_header *)pptr; 536 TCHECK(*rsvp_com_header); 537 538 /* 539 * Sanity checking of the header. 540 */ 541 if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) { 542 printf("RSVP version %u packet not supported", 543 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags)); 544 return; 545 } 546 547 /* in non-verbose mode just lets print the basic Message Type*/ 548 if (vflag < 1) { 549 printf("RSVP %s Message, length: %u", 550 tok2str(rsvp_msg_type_values, "unknown (%u)",rsvp_com_header->msg_type), 551 len); 552 return; 553 } 554 555 /* ok they seem to want to know everything - lets fully decode it */ 556 557 tlen=EXTRACT_16BITS(rsvp_com_header->length); 558 559 printf("RSVP\n\tv: %u, msg-type: %s, Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x", 560 RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags), 561 tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type), 562 bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(rsvp_com_header->version_flags)), 563 tlen, 564 rsvp_com_header->ttl, 565 EXTRACT_16BITS(rsvp_com_header->checksum)); 566 567 if (tlen < sizeof(const struct rsvp_common_header)) 568 return; 569 tptr+=sizeof(const struct rsvp_common_header); 570 tlen-=sizeof(const struct rsvp_common_header); 571 572 while(tlen>0) { 573 /* did we capture enough for fully decoding the object header ? */ 574 if (!TTEST2(*tptr, sizeof(struct rsvp_object_header))) 575 goto trunc; 576 577 rsvp_obj_header = (const struct rsvp_object_header *)tptr; 578 rsvp_obj_len=EXTRACT_16BITS(rsvp_obj_header->length); 579 rsvp_obj_ctype=rsvp_obj_header->ctype; 580 581 if(rsvp_obj_len % 4 || rsvp_obj_len < sizeof(struct rsvp_object_header)) 582 return; 583 584 printf("\n\t %s Object (%u) Flags: [%s", 585 tok2str(rsvp_obj_values, 586 "Unknown", 587 rsvp_obj_header->class_num), 588 rsvp_obj_header->class_num, 589 ((rsvp_obj_header->class_num)&0x80) ? "ignore" : "reject"); 590 591 if (rsvp_obj_header->class_num > 128) 592 printf(" %s", 593 ((rsvp_obj_header->class_num)&0x40) ? "and forward" : "silently"); 594 595 printf(" if unknown], Class-Type: %s (%u), length: %u", 596 tok2str(rsvp_ctype_values, 597 "Unknown", 598 ((rsvp_obj_header->class_num)<<8)+rsvp_obj_ctype), 599 rsvp_obj_ctype, 600 rsvp_obj_len); 601 602 obj_tptr=tptr+sizeof(struct rsvp_object_header); 603 obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header); 604 605 /* did we capture enough for fully decoding the object ? */ 606 if (!TTEST2(*tptr, rsvp_obj_len)) 607 goto trunc; 608 hexdump=FALSE; 609 610 switch(rsvp_obj_header->class_num) { 611 case RSVP_OBJ_SESSION: 612 switch(rsvp_obj_ctype) { 613 case RSVP_CTYPE_IPV4: 614 if (obj_tlen < 8) 615 return; 616 printf("\n\t IPv4 DestAddress: %s, Protocol ID: 0x%02x", 617 ipaddr_string(obj_tptr), 618 *(obj_tptr+4)); 619 printf("\n\t Flags: [0x%02x], DestPort %u", 620 *(obj_tptr+5), 621 EXTRACT_16BITS(obj_tptr+6)); 622 obj_tlen-=8; 623 obj_tptr+=8; 624 break; 625 #ifdef INET6 626 case RSVP_CTYPE_IPV6: 627 if (obj_tlen < 20) 628 return; 629 printf("\n\t IPv6 DestAddress: %s, Protocol ID: 0x%02x", 630 ip6addr_string(obj_tptr), 631 *(obj_tptr+16)); 632 printf("\n\t Flags: [0x%02x], DestPort %u", 633 *(obj_tptr+17), 634 EXTRACT_16BITS(obj_tptr+18)); 635 obj_tlen-=20; 636 obj_tptr+=20; 637 break; 638 639 case RSVP_CTYPE_TUNNEL_IPV6: 640 if (obj_tlen < 36) 641 return; 642 printf("\n\t IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 643 ip6addr_string(obj_tptr), 644 EXTRACT_16BITS(obj_tptr+18), 645 ip6addr_string(obj_tptr+20)); 646 obj_tlen-=36; 647 obj_tptr+=36; 648 break; 649 #endif 650 case RSVP_CTYPE_TUNNEL_IPV4: 651 if (obj_tlen < 12) 652 return; 653 printf("\n\t IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 654 ipaddr_string(obj_tptr), 655 EXTRACT_16BITS(obj_tptr+6), 656 ipaddr_string(obj_tptr+8)); 657 obj_tlen-=12; 658 obj_tptr+=12; 659 break; 660 default: 661 hexdump=TRUE; 662 } 663 break; 664 665 case RSVP_OBJ_CONFIRM: 666 switch(rsvp_obj_ctype) { 667 case RSVP_CTYPE_IPV4: 668 if (obj_tlen < 4) 669 return; 670 printf("\n\t IPv4 Receiver Address: %s", 671 ipaddr_string(obj_tptr)); 672 obj_tlen-=4; 673 obj_tptr+=4; 674 break; 675 #ifdef INET6 676 case RSVP_CTYPE_IPV6: 677 if (obj_tlen < 16) 678 return; 679 printf("\n\t IPv6 Receiver Address: %s", 680 ip6addr_string(obj_tptr)); 681 obj_tlen-=16; 682 obj_tptr+=16; 683 break; 684 #endif 685 default: 686 hexdump=TRUE; 687 } 688 break; 689 690 case RSVP_OBJ_NOTIFY_REQ: 691 switch(rsvp_obj_ctype) { 692 case RSVP_CTYPE_IPV4: 693 if (obj_tlen < 4) 694 return; 695 printf("\n\t IPv4 Notify Node Address: %s", 696 ipaddr_string(obj_tptr)); 697 obj_tlen-=4; 698 obj_tptr+=4; 699 break; 700 #ifdef INET6 701 case RSVP_CTYPE_IPV6: 702 if (obj_tlen < 16) 703 return; 704 printf("\n\t IPv6 Notify Node Address: %s", 705 ip6addr_string(obj_tptr)); 706 obj_tlen-=16; 707 obj_tptr+=16; 708 break; 709 #endif 710 default: 711 hexdump=TRUE; 712 } 713 break; 714 715 case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */ 716 case RSVP_OBJ_UPSTREAM_LABEL: /* fall through */ 717 case RSVP_OBJ_RECOVERY_LABEL: /* fall through */ 718 case RSVP_OBJ_LABEL: 719 switch(rsvp_obj_ctype) { 720 case RSVP_CTYPE_1: 721 while(obj_tlen >= 4 ) { 722 printf("\n\t Label: %u", EXTRACT_32BITS(obj_tptr)); 723 obj_tlen-=4; 724 obj_tptr+=4; 725 } 726 break; 727 case RSVP_CTYPE_2: 728 if (obj_tlen < 4) 729 return; 730 printf("\n\t Generalized Label: %u", 731 EXTRACT_32BITS(obj_tptr)); 732 obj_tlen-=4; 733 obj_tptr+=4; 734 break; 735 case RSVP_CTYPE_3: 736 if (obj_tlen < 12) 737 return; 738 printf("\n\t Waveband ID: %u\n\t Start Label: %u, Stop Label: %u", 739 EXTRACT_32BITS(obj_tptr), 740 EXTRACT_32BITS(obj_tptr+4), 741 EXTRACT_32BITS(obj_tptr+8)); 742 obj_tlen-=12; 743 obj_tptr+=12; 744 break; 745 default: 746 hexdump=TRUE; 747 } 748 break; 749 750 case RSVP_OBJ_STYLE: 751 switch(rsvp_obj_ctype) { 752 case RSVP_CTYPE_1: 753 if (obj_tlen < 4) 754 return; 755 printf("\n\t Reservation Style: %s, Flags: [0x%02x]", 756 tok2str(rsvp_resstyle_values, 757 "Unknown", 758 EXTRACT_24BITS(obj_tptr+1)), 759 *(obj_tptr)); 760 obj_tlen-=4; 761 obj_tptr+=4; 762 break; 763 default: 764 hexdump=TRUE; 765 } 766 break; 767 768 case RSVP_OBJ_SENDER_TEMPLATE: 769 switch(rsvp_obj_ctype) { 770 case RSVP_CTYPE_IPV4: 771 if (obj_tlen < 8) 772 return; 773 printf("\n\t Source Address: %s, Source Port: %u", 774 ipaddr_string(obj_tptr), 775 EXTRACT_16BITS(obj_tptr+6)); 776 obj_tlen-=8; 777 obj_tptr+=8; 778 break; 779 #ifdef INET6 780 case RSVP_CTYPE_IPV6: 781 if (obj_tlen < 20) 782 return; 783 printf("\n\t Source Address: %s, Source Port: %u", 784 ip6addr_string(obj_tptr), 785 EXTRACT_16BITS(obj_tptr+18)); 786 obj_tlen-=20; 787 obj_tptr+=20; 788 break; 789 #endif 790 case RSVP_CTYPE_TUNNEL_IPV4: 791 if (obj_tlen < 8) 792 return; 793 printf("\n\t IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x", 794 ipaddr_string(obj_tptr), 795 EXTRACT_16BITS(obj_tptr+6)); 796 obj_tlen-=8; 797 obj_tptr+=8; 798 break; 799 default: 800 hexdump=TRUE; 801 } 802 break; 803 804 case RSVP_OBJ_LABEL_REQ: 805 switch(rsvp_obj_ctype) { 806 case RSVP_CTYPE_1: 807 while(obj_tlen >= 4 ) { 808 printf("\n\t L3 Protocol ID: %s", 809 tok2str(ethertype_values, 810 "Unknown Protocol (0x%04x)", 811 EXTRACT_16BITS(obj_tptr+2))); 812 obj_tlen-=4; 813 obj_tptr+=4; 814 } 815 break; 816 case RSVP_CTYPE_2: 817 if (obj_tlen < 12) 818 return; 819 printf("\n\t L3 Protocol ID: %s", 820 tok2str(ethertype_values, 821 "Unknown Protocol (0x%04x)", 822 EXTRACT_16BITS(obj_tptr+2))); 823 printf(",%s merge capability",((*(obj_tptr+4))&0x80) ? "no" : "" ); 824 printf("\n\t Minimum VPI/VCI: %u/%u", 825 (EXTRACT_16BITS(obj_tptr+4))&0xfff, 826 (EXTRACT_16BITS(obj_tptr+6))&0xfff); 827 printf("\n\t Maximum VPI/VCI: %u/%u", 828 (EXTRACT_16BITS(obj_tptr+8))&0xfff, 829 (EXTRACT_16BITS(obj_tptr+10))&0xfff); 830 obj_tlen-=12; 831 obj_tptr+=12; 832 break; 833 case RSVP_CTYPE_3: 834 if (obj_tlen < 12) 835 return; 836 printf("\n\t L3 Protocol ID: %s", 837 tok2str(ethertype_values, 838 "Unknown Protocol (0x%04x)", 839 EXTRACT_16BITS(obj_tptr+2))); 840 printf("\n\t Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI", 841 (EXTRACT_32BITS(obj_tptr+4))&0x7fffff, 842 (EXTRACT_32BITS(obj_tptr+8))&0x7fffff, 843 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 0 ) ? "10" : "", 844 (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 2 ) ? "23" : ""); 845 obj_tlen-=12; 846 obj_tptr+=12; 847 break; 848 case RSVP_CTYPE_4: 849 if (obj_tlen < 8) 850 return; 851 printf("\n\t LSP Encoding Type: %s (%u)", 852 tok2str(gmpls_encoding_values, 853 "Unknown", 854 *obj_tptr), 855 *obj_tptr); 856 printf("\n\t Switching Type: %s (%u), Payload ID: %s (0x%04x)", 857 tok2str(gmpls_switch_cap_values, 858 "Unknown", 859 *(obj_tptr+1)), 860 *(obj_tptr+1), 861 tok2str(gmpls_payload_values, 862 "Unknown", 863 EXTRACT_16BITS(obj_tptr+2)), 864 EXTRACT_16BITS(obj_tptr+2)); 865 obj_tlen-=8; 866 obj_tptr+=8; 867 break; 868 default: 869 hexdump=TRUE; 870 } 871 break; 872 873 case RSVP_OBJ_RRO: 874 case RSVP_OBJ_ERO: 875 switch(rsvp_obj_ctype) { 876 case RSVP_CTYPE_IPV4: 877 while(obj_tlen >= 4 ) { 878 printf("\n\t Subobject Type: %s", 879 tok2str(rsvp_obj_xro_values, 880 "Unknown %u", 881 RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr))); 882 switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) { 883 case RSVP_OBJ_XRO_IPV4: 884 printf(", %s, %s/%u, Flags: [%s]", 885 RSVP_OBJ_XRO_MASK_LOOSE(*obj_tptr) ? "Loose" : "Strict", 886 ipaddr_string(obj_tptr+2), 887 *(obj_tptr+6), 888 bittok2str(rsvp_obj_rro_flag_values, 889 "none", 890 *(obj_tptr+7))); /* rfc3209 says that this field is rsvd. */ 891 } 892 obj_tlen-=*(obj_tptr+1); 893 obj_tptr+=*(obj_tptr+1); 894 } 895 break; 896 default: 897 hexdump=TRUE; 898 } 899 break; 900 901 case RSVP_OBJ_HELLO: 902 switch(rsvp_obj_ctype) { 903 case RSVP_CTYPE_1: 904 case RSVP_CTYPE_2: 905 if (obj_tlen < 8) 906 return; 907 printf("\n\t Source Instance: 0x%08x, Destination Instance: 0x%08x", 908 EXTRACT_32BITS(obj_tptr), 909 EXTRACT_32BITS(obj_tptr+4)); 910 obj_tlen-=8; 911 obj_tptr+=8; 912 break; 913 default: 914 hexdump=TRUE; 915 } 916 break; 917 918 case RSVP_OBJ_RESTART_CAPABILITY: 919 switch(rsvp_obj_ctype) { 920 case RSVP_CTYPE_1: 921 if (obj_tlen < 8) 922 return; 923 printf("\n\t Restart Time: %ums, Recovery Time: %ums", 924 EXTRACT_16BITS(obj_tptr), 925 EXTRACT_16BITS(obj_tptr+4)); 926 obj_tlen-=8; 927 obj_tptr+=8; 928 break; 929 default: 930 hexdump=TRUE; 931 } 932 break; 933 934 case RSVP_OBJ_SESSION_ATTRIBUTE: 935 switch(rsvp_obj_ctype) { 936 case RSVP_CTYPE_TUNNEL_IPV4: 937 if (obj_tlen < 4) 938 return; 939 namelen = *(obj_tptr+3); 940 if (obj_tlen < 4+namelen) 941 return; 942 printf("\n\t Session Name: "); 943 for (i = 0; i < namelen; i++) 944 safeputchar(*(obj_tptr+4+i)); 945 printf("\n\t Setup Priority: %u, Holding Priority: %u, Flags: [%s]", 946 (int)*obj_tptr, 947 (int)*(obj_tptr+1), 948 tok2str(rsvp_session_attribute_flag_values, 949 "none", 950 *(obj_tptr+2))); 951 952 obj_tlen-=4+*(obj_tptr+3); 953 obj_tptr+=4+*(obj_tptr+3); 954 break; 955 default: 956 hexdump=TRUE; 957 } 958 break; 959 960 case RSVP_OBJ_RSVP_HOP: 961 switch(rsvp_obj_ctype) { 962 case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */ 963 case RSVP_CTYPE_IPV4: 964 if (obj_tlen < 8) 965 return; 966 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x", 967 ipaddr_string(obj_tptr), 968 EXTRACT_32BITS(obj_tptr+4)); 969 obj_tlen-=8; 970 obj_tptr+=8; 971 hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */ 972 break; 973 #ifdef INET6 974 case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */ 975 case RSVP_CTYPE_IPV6: 976 if (obj_tlen < 20) 977 return; 978 printf("\n\t Previous/Next Interface: %s, Logical Interface Handle: 0x%08x", 979 ip6addr_string(obj_tptr), 980 EXTRACT_32BITS(obj_tptr+16)); 981 obj_tlen-=20; 982 obj_tptr+=20; 983 hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */ 984 break; 985 #endif 986 default: 987 hexdump=TRUE; 988 } 989 break; 990 991 case RSVP_OBJ_TIME_VALUES: 992 switch(rsvp_obj_ctype) { 993 case RSVP_CTYPE_1: 994 if (obj_tlen < 4) 995 return; 996 printf("\n\t Refresh Period: %ums", 997 EXTRACT_32BITS(obj_tptr)); 998 obj_tlen-=4; 999 obj_tptr+=4; 1000 break; 1001 default: 1002 hexdump=TRUE; 1003 } 1004 break; 1005 1006 /* those three objects do share the same semantics */ 1007 case RSVP_OBJ_SENDER_TSPEC: 1008 case RSVP_OBJ_ADSPEC: 1009 case RSVP_OBJ_FLOWSPEC: 1010 switch(rsvp_obj_ctype) { 1011 case RSVP_CTYPE_2: 1012 if (obj_tlen < 4) 1013 return; 1014 printf("\n\t Msg-Version: %u, length: %u", 1015 (*obj_tptr & 0xf0) >> 4, 1016 EXTRACT_16BITS(obj_tptr+2)<<2); 1017 obj_tptr+=4; /* get to the start of the service header */ 1018 obj_tlen-=4; 1019 1020 while (obj_tlen >= 4) { 1021 intserv_serv_tlen=EXTRACT_16BITS(obj_tptr+2)<<2; 1022 printf("\n\t Service Type: %s (%u), break bit %s set, Service length: %u", 1023 tok2str(rsvp_intserv_service_type_values,"unknown",*(obj_tptr)), 1024 *(obj_tptr), 1025 (*(obj_tptr+1)&0x80) ? "" : "not", 1026 intserv_serv_tlen); 1027 1028 obj_tptr+=4; /* get to the start of the parameter list */ 1029 obj_tlen-=4; 1030 1031 while (intserv_serv_tlen>=4) { 1032 processed = rsvp_intserv_print(obj_tptr, obj_tlen); 1033 if (processed == 0) 1034 break; 1035 obj_tlen-=processed; 1036 intserv_serv_tlen-=processed; 1037 obj_tptr+=processed; 1038 } 1039 } 1040 break; 1041 default: 1042 hexdump=TRUE; 1043 } 1044 break; 1045 1046 case RSVP_OBJ_FILTERSPEC: 1047 switch(rsvp_obj_ctype) { 1048 case RSVP_CTYPE_IPV4: 1049 if (obj_tlen < 8) 1050 return; 1051 printf("\n\t Source Address: %s, Source Port: %u", 1052 ipaddr_string(obj_tptr), 1053 EXTRACT_16BITS(obj_tptr+6)); 1054 obj_tlen-=8; 1055 obj_tptr+=8; 1056 break; 1057 #ifdef INET6 1058 case RSVP_CTYPE_IPV6: 1059 if (obj_tlen < 20) 1060 return; 1061 printf("\n\t Source Address: %s, Source Port: %u", 1062 ip6addr_string(obj_tptr), 1063 EXTRACT_16BITS(obj_tptr+18)); 1064 obj_tlen-=20; 1065 obj_tptr+=20; 1066 break; 1067 case RSVP_CTYPE_3: 1068 if (obj_tlen < 20) 1069 return; 1070 printf("\n\t Source Address: %s, Flow Label: %u", 1071 ip6addr_string(obj_tptr), 1072 EXTRACT_24BITS(obj_tptr+17)); 1073 obj_tlen-=20; 1074 obj_tptr+=20; 1075 break; 1076 case RSVP_CTYPE_TUNNEL_IPV6: 1077 if (obj_tlen < 20) 1078 return; 1079 printf("\n\t Source Address: %s, LSP-ID: 0x%04x", 1080 ipaddr_string(obj_tptr), 1081 EXTRACT_16BITS(obj_tptr+18)); 1082 obj_tlen-=20; 1083 obj_tptr+=20; 1084 break; 1085 #endif 1086 case RSVP_CTYPE_TUNNEL_IPV4: 1087 if (obj_tlen < 8) 1088 return; 1089 printf("\n\t Source Address: %s, LSP-ID: 0x%04x", 1090 ipaddr_string(obj_tptr), 1091 EXTRACT_16BITS(obj_tptr+6)); 1092 obj_tlen-=8; 1093 obj_tptr+=8; 1094 break; 1095 default: 1096 hexdump=TRUE; 1097 } 1098 break; 1099 1100 case RSVP_OBJ_FASTREROUTE: 1101 switch(rsvp_obj_ctype) { 1102 case RSVP_CTYPE_TUNNEL_IPV4: 1103 if (obj_tlen < 16) 1104 return; 1105 bw.i = EXTRACT_32BITS(obj_tptr+4); 1106 printf("\n\t Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps", 1107 (int)*obj_tptr, 1108 (int)*(obj_tptr+1), 1109 (int)*(obj_tptr+2), 1110 bw.f*8/1000000); 1111 printf("\n\t Include Colors: 0x%08x, Exclude Colors: 0x%08x", 1112 EXTRACT_32BITS(obj_tptr+8), 1113 EXTRACT_32BITS(obj_tptr+12)); 1114 obj_tlen-=16; 1115 obj_tptr+=16; 1116 break; 1117 default: 1118 hexdump=TRUE; 1119 } 1120 break; 1121 1122 case RSVP_OBJ_DETOUR: 1123 switch(rsvp_obj_ctype) { 1124 case RSVP_CTYPE_TUNNEL_IPV4: 1125 while(obj_tlen >= 8) { 1126 printf("\n\t PLR-ID: %s, Avoid-Node-ID: %s", 1127 ipaddr_string(obj_tptr), 1128 ipaddr_string(obj_tptr+4)); 1129 obj_tlen-=8; 1130 obj_tptr+=8; 1131 } 1132 break; 1133 default: 1134 hexdump=TRUE; 1135 } 1136 break; 1137 1138 case RSVP_OBJ_ERROR_SPEC: 1139 switch(rsvp_obj_ctype) { 1140 case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */ 1141 case RSVP_CTYPE_IPV4: 1142 if (obj_tlen < 8) 1143 return; 1144 error_code=*(obj_tptr+5); 1145 error_value=EXTRACT_16BITS(obj_tptr+6); 1146 printf("\n\t Error Node Adress: %s, Flags: [0x%02x]\n\t Error Code: %s (%u)", 1147 ipaddr_string(obj_tptr), 1148 *(obj_tptr+4), 1149 tok2str(rsvp_obj_error_code_values,"unknown",error_code), 1150 error_code); 1151 switch (error_code) { 1152 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING: 1153 printf(", Error Value: %s (%u)", 1154 tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value), 1155 error_value); 1156 break; 1157 default: 1158 printf(", Unknown Error Value (%u)", error_value); 1159 break; 1160 } 1161 obj_tlen-=8; 1162 obj_tptr+=8; 1163 break; 1164 #ifdef INET6 1165 case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */ 1166 case RSVP_CTYPE_IPV6: 1167 if (obj_tlen < 20) 1168 return; 1169 error_code=*(obj_tptr+17); 1170 error_value=EXTRACT_16BITS(obj_tptr+18); 1171 printf("\n\t Error Node Adress: %s, Flags: [0x%02x]\n\t Error Code: %s (%u)", 1172 ip6addr_string(obj_tptr), 1173 *(obj_tptr+16), 1174 tok2str(rsvp_obj_error_code_values,"unknown",error_code), 1175 error_code); 1176 1177 switch (error_code) { 1178 case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING: 1179 printf(", Error Value: %s (%u)", 1180 tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value), 1181 error_value); 1182 break; 1183 default: 1184 break; 1185 } 1186 obj_tlen-=20; 1187 obj_tptr+=20; 1188 break; 1189 #endif 1190 default: 1191 hexdump=TRUE; 1192 } 1193 break; 1194 1195 case RSVP_OBJ_PROPERTIES: 1196 switch(rsvp_obj_ctype) { 1197 case RSVP_CTYPE_1: 1198 if (obj_tlen < 4) 1199 return; 1200 padbytes = EXTRACT_16BITS(obj_tptr+2); 1201 printf("\n\t TLV count: %u, padding bytes: %u", 1202 EXTRACT_16BITS(obj_tptr), 1203 padbytes); 1204 obj_tlen-=4; 1205 obj_tptr+=4; 1206 /* loop through as long there is anything longer than the TLV header (2) */ 1207 while(obj_tlen >= 2 + padbytes) { 1208 printf("\n\t %s TLV (0x%02x), length: %u", /* length includes header */ 1209 tok2str(rsvp_obj_prop_tlv_values,"unknown",*obj_tptr), 1210 *obj_tptr, 1211 *(obj_tptr+1)); 1212 if (obj_tlen < *(obj_tptr+1)) 1213 return; 1214 print_unknown_data(obj_tptr+2,"\n\t\t",*(obj_tptr+1)-2); 1215 obj_tlen-=*(obj_tptr+1); 1216 obj_tptr+=*(obj_tptr+1); 1217 } 1218 break; 1219 default: 1220 hexdump=TRUE; 1221 } 1222 break; 1223 1224 /* 1225 * FIXME those are the defined objects that lack a decoder 1226 * you are welcome to contribute code ;-) 1227 */ 1228 1229 case RSVP_OBJ_INTEGRITY: 1230 case RSVP_OBJ_SCOPE: 1231 case RSVP_OBJ_POLICY_DATA: 1232 case RSVP_OBJ_MESSAGE_ID: 1233 case RSVP_OBJ_MESSAGE_ID_ACK: 1234 case RSVP_OBJ_MESSAGE_ID_LIST: 1235 case RSVP_OBJ_LABEL_SET: 1236 case RSVP_OBJ_ACCEPT_LABEL_SET: 1237 case RSVP_OBJ_PROTECTION: 1238 default: 1239 if (vflag <= 1) 1240 print_unknown_data(obj_tptr,"\n\t ",obj_tlen); 1241 break; 1242 } 1243 /* do we want to see an additionally hexdump ? */ 1244 if (vflag > 1 || hexdump==TRUE) 1245 print_unknown_data(tptr+sizeof(sizeof(struct rsvp_object_header)),"\n\t ", 1246 rsvp_obj_len-sizeof(struct rsvp_object_header)); 1247 1248 tptr+=rsvp_obj_len; 1249 tlen-=rsvp_obj_len; 1250 } 1251 return; 1252 trunc: 1253 printf("\n\t\t packet exceeded snapshot"); 1254 } 1255