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