10f74e101Schristos /* 20f74e101Schristos * Copyright (c) 1998-2007 The TCPDUMP project 30f74e101Schristos * 40f74e101Schristos * Redistribution and use in source and binary forms, with or without 50f74e101Schristos * modification, are permitted provided that: (1) source code 60f74e101Schristos * distributions retain the above copyright notice and this paragraph 70f74e101Schristos * in its entirety, and (2) distributions including binary code include 80f74e101Schristos * the above copyright notice and this paragraph in its entirety in 90f74e101Schristos * the documentation or other materials provided with the distribution. 100f74e101Schristos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 110f74e101Schristos * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 120f74e101Schristos * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 130f74e101Schristos * FOR A PARTICULAR PURPOSE. 140f74e101Schristos * 1572c96ff3Schristos * Original code by Hannes Gredler (hannes@gredler.at) 160f74e101Schristos */ 170f74e101Schristos 1811b3aaa1Schristos #include <sys/cdefs.h> 190f74e101Schristos #ifndef lint 20*26ba0b50Schristos __RCSID("$NetBSD: print-rsvp.c,v 1.13 2024/09/02 16:15:32 christos Exp $"); 210f74e101Schristos #endif 220f74e101Schristos 23dc860a36Sspz /* \summary: Resource ReSerVation Protocol (RSVP) printer */ 24dc860a36Sspz 25c74ad251Schristos /* specification: RFC 2205 */ 26c74ad251Schristos 27c74ad251Schristos #include <config.h> 280f74e101Schristos 29c74ad251Schristos #include "netdissect-stdinc.h" 300f74e101Schristos 31fdccd7e4Schristos #include "netdissect.h" 320f74e101Schristos #include "extract.h" 330f74e101Schristos #include "addrtoname.h" 340f74e101Schristos #include "ethertype.h" 350f74e101Schristos #include "gmpls.h" 360f74e101Schristos #include "af.h" 370f74e101Schristos #include "signature.h" 380f74e101Schristos 39fdccd7e4Schristos 400f74e101Schristos /* 410f74e101Schristos * RFC 2205 common header 420f74e101Schristos * 430f74e101Schristos * 0 1 2 3 440f74e101Schristos * +-------------+-------------+-------------+-------------+ 450f74e101Schristos * | Vers | Flags| Msg Type | RSVP Checksum | 460f74e101Schristos * +-------------+-------------+-------------+-------------+ 470f74e101Schristos * | Send_TTL | (Reserved) | RSVP Length | 480f74e101Schristos * +-------------+-------------+-------------+-------------+ 490f74e101Schristos * 500f74e101Schristos */ 510f74e101Schristos 520f74e101Schristos struct rsvp_common_header { 53c74ad251Schristos nd_uint8_t version_flags; 54c74ad251Schristos nd_uint8_t msg_type; 55c74ad251Schristos nd_uint16_t checksum; 56c74ad251Schristos nd_uint8_t ttl; 57c74ad251Schristos nd_byte reserved[1]; 58c74ad251Schristos nd_uint16_t length; 590f74e101Schristos }; 600f74e101Schristos 610f74e101Schristos /* 620f74e101Schristos * RFC2205 object header 630f74e101Schristos * 640f74e101Schristos * 650f74e101Schristos * 0 1 2 3 660f74e101Schristos * +-------------+-------------+-------------+-------------+ 670f74e101Schristos * | Length (bytes) | Class-Num | C-Type | 680f74e101Schristos * +-------------+-------------+-------------+-------------+ 690f74e101Schristos * | | 700f74e101Schristos * // (Object contents) // 710f74e101Schristos * | | 720f74e101Schristos * +-------------+-------------+-------------+-------------+ 730f74e101Schristos */ 740f74e101Schristos 750f74e101Schristos struct rsvp_object_header { 76c74ad251Schristos nd_uint16_t length; 77c74ad251Schristos nd_uint8_t class_num; 78c74ad251Schristos nd_uint8_t ctype; 790f74e101Schristos }; 800f74e101Schristos 810f74e101Schristos #define RSVP_VERSION 1 820f74e101Schristos #define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4) 830f74e101Schristos #define RSVP_EXTRACT_FLAGS(x) ((x)&0x0f) 840f74e101Schristos 850f74e101Schristos #define RSVP_MSGTYPE_PATH 1 860f74e101Schristos #define RSVP_MSGTYPE_RESV 2 870f74e101Schristos #define RSVP_MSGTYPE_PATHERR 3 880f74e101Schristos #define RSVP_MSGTYPE_RESVERR 4 890f74e101Schristos #define RSVP_MSGTYPE_PATHTEAR 5 900f74e101Schristos #define RSVP_MSGTYPE_RESVTEAR 6 910f74e101Schristos #define RSVP_MSGTYPE_RESVCONF 7 92fdccd7e4Schristos #define RSVP_MSGTYPE_BUNDLE 12 930f74e101Schristos #define RSVP_MSGTYPE_ACK 13 940f74e101Schristos #define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */ 950f74e101Schristos #define RSVP_MSGTYPE_SREFRESH 15 960f74e101Schristos #define RSVP_MSGTYPE_HELLO 20 970f74e101Schristos 980f74e101Schristos static const struct tok rsvp_msg_type_values[] = { 990f74e101Schristos { RSVP_MSGTYPE_PATH, "Path" }, 1000f74e101Schristos { RSVP_MSGTYPE_RESV, "Resv" }, 1010f74e101Schristos { RSVP_MSGTYPE_PATHERR, "PathErr" }, 1020f74e101Schristos { RSVP_MSGTYPE_RESVERR, "ResvErr" }, 1030f74e101Schristos { RSVP_MSGTYPE_PATHTEAR, "PathTear" }, 1040f74e101Schristos { RSVP_MSGTYPE_RESVTEAR, "ResvTear" }, 1050f74e101Schristos { RSVP_MSGTYPE_RESVCONF, "ResvConf" }, 106fdccd7e4Schristos { RSVP_MSGTYPE_BUNDLE, "Bundle" }, 1070f74e101Schristos { RSVP_MSGTYPE_ACK, "Acknowledgement" }, 1080f74e101Schristos { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" }, 1090f74e101Schristos { RSVP_MSGTYPE_SREFRESH, "Refresh" }, 1100f74e101Schristos { RSVP_MSGTYPE_HELLO, "Hello" }, 1110f74e101Schristos { 0, NULL} 1120f74e101Schristos }; 1130f74e101Schristos 1140f74e101Schristos static const struct tok rsvp_header_flag_values[] = { 1150f74e101Schristos { 0x01, "Refresh reduction capable" }, /* rfc2961 */ 1160f74e101Schristos { 0, NULL} 1170f74e101Schristos }; 1180f74e101Schristos 119c74ad251Schristos static const struct tok rsvp_obj_capability_flag_values[] = { 120c74ad251Schristos { 0x0004, "RecoveryPath Transmit Enabled" }, 121c74ad251Schristos { 0x0002, "RecoveryPath Desired" }, 122c74ad251Schristos { 0x0001, "RecoveryPath Srefresh Capable" }, 123c74ad251Schristos { 0, NULL} 124c74ad251Schristos }; 125c74ad251Schristos 1260f74e101Schristos #define RSVP_OBJ_SESSION 1 /* rfc2205 */ 1270f74e101Schristos #define RSVP_OBJ_RSVP_HOP 3 /* rfc2205, rfc3473 */ 1280f74e101Schristos #define RSVP_OBJ_INTEGRITY 4 /* rfc2747 */ 1290f74e101Schristos #define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */ 1300f74e101Schristos #define RSVP_OBJ_ERROR_SPEC 6 1310f74e101Schristos #define RSVP_OBJ_SCOPE 7 1320f74e101Schristos #define RSVP_OBJ_STYLE 8 /* rfc2205 */ 1330f74e101Schristos #define RSVP_OBJ_FLOWSPEC 9 /* rfc2215 */ 1340f74e101Schristos #define RSVP_OBJ_FILTERSPEC 10 /* rfc2215 */ 1350f74e101Schristos #define RSVP_OBJ_SENDER_TEMPLATE 11 1360f74e101Schristos #define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2215 */ 1370f74e101Schristos #define RSVP_OBJ_ADSPEC 13 /* rfc2215 */ 1380f74e101Schristos #define RSVP_OBJ_POLICY_DATA 14 1390f74e101Schristos #define RSVP_OBJ_CONFIRM 15 /* rfc2205 */ 1400f74e101Schristos #define RSVP_OBJ_LABEL 16 /* rfc3209 */ 1410f74e101Schristos #define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */ 1420f74e101Schristos #define RSVP_OBJ_ERO 20 /* rfc3209 */ 1430f74e101Schristos #define RSVP_OBJ_RRO 21 /* rfc3209 */ 1440f74e101Schristos #define RSVP_OBJ_HELLO 22 /* rfc3209 */ 1450f74e101Schristos #define RSVP_OBJ_MESSAGE_ID 23 /* rfc2961 */ 1460f74e101Schristos #define RSVP_OBJ_MESSAGE_ID_ACK 24 /* rfc2961 */ 1470f74e101Schristos #define RSVP_OBJ_MESSAGE_ID_LIST 25 /* rfc2961 */ 1480f74e101Schristos #define RSVP_OBJ_RECOVERY_LABEL 34 /* rfc3473 */ 1490f74e101Schristos #define RSVP_OBJ_UPSTREAM_LABEL 35 /* rfc3473 */ 1500f74e101Schristos #define RSVP_OBJ_LABEL_SET 36 /* rfc3473 */ 1510f74e101Schristos #define RSVP_OBJ_PROTECTION 37 /* rfc3473 */ 1520f74e101Schristos #define RSVP_OBJ_S2L 50 /* rfc4875 */ 153c74ad251Schristos #define RSVP_OBJ_DETOUR 63 /* rfc4090 */ 1540f74e101Schristos #define RSVP_OBJ_CLASSTYPE 66 /* rfc4124 */ 1550f74e101Schristos #define RSVP_OBJ_CLASSTYPE_OLD 125 /* draft-ietf-tewg-diff-te-proto-07 */ 1560f74e101Schristos #define RSVP_OBJ_SUGGESTED_LABEL 129 /* rfc3473 */ 1570f74e101Schristos #define RSVP_OBJ_ACCEPT_LABEL_SET 130 /* rfc3473 */ 1580f74e101Schristos #define RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */ 159c74ad251Schristos #define RSVP_OBJ_CAPABILITY 134 /* rfc5063 */ 1600f74e101Schristos #define RSVP_OBJ_NOTIFY_REQ 195 /* rfc3473 */ 1610f74e101Schristos #define RSVP_OBJ_ADMIN_STATUS 196 /* rfc3473 */ 1620f74e101Schristos #define RSVP_OBJ_PROPERTIES 204 /* juniper proprietary */ 163c74ad251Schristos #define RSVP_OBJ_FASTREROUTE 205 /* rfc4090 */ 1640f74e101Schristos #define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */ 1650f74e101Schristos #define RSVP_OBJ_GENERALIZED_UNI 229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */ 1660f74e101Schristos #define RSVP_OBJ_CALL_ID 230 /* rfc3474 */ 1670f74e101Schristos #define RSVP_OBJ_CALL_OPS 236 /* rfc3474 */ 1680f74e101Schristos 1690f74e101Schristos static const struct tok rsvp_obj_values[] = { 1700f74e101Schristos { RSVP_OBJ_SESSION, "Session" }, 1710f74e101Schristos { RSVP_OBJ_RSVP_HOP, "RSVP Hop" }, 1720f74e101Schristos { RSVP_OBJ_INTEGRITY, "Integrity" }, 1730f74e101Schristos { RSVP_OBJ_TIME_VALUES, "Time Values" }, 1740f74e101Schristos { RSVP_OBJ_ERROR_SPEC, "Error Spec" }, 1750f74e101Schristos { RSVP_OBJ_SCOPE, "Scope" }, 1760f74e101Schristos { RSVP_OBJ_STYLE, "Style" }, 1770f74e101Schristos { RSVP_OBJ_FLOWSPEC, "Flowspec" }, 1780f74e101Schristos { RSVP_OBJ_FILTERSPEC, "FilterSpec" }, 1790f74e101Schristos { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" }, 1800f74e101Schristos { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" }, 1810f74e101Schristos { RSVP_OBJ_ADSPEC, "Adspec" }, 1820f74e101Schristos { RSVP_OBJ_POLICY_DATA, "Policy Data" }, 1830f74e101Schristos { RSVP_OBJ_CONFIRM, "Confirm" }, 1840f74e101Schristos { RSVP_OBJ_LABEL, "Label" }, 1850f74e101Schristos { RSVP_OBJ_LABEL_REQ, "Label Request" }, 1860f74e101Schristos { RSVP_OBJ_ERO, "ERO" }, 1870f74e101Schristos { RSVP_OBJ_RRO, "RRO" }, 1880f74e101Schristos { RSVP_OBJ_HELLO, "Hello" }, 1890f74e101Schristos { RSVP_OBJ_MESSAGE_ID, "Message ID" }, 1900f74e101Schristos { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" }, 1910f74e101Schristos { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" }, 1920f74e101Schristos { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" }, 1930f74e101Schristos { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" }, 1940f74e101Schristos { RSVP_OBJ_LABEL_SET, "Label Set" }, 1950f74e101Schristos { RSVP_OBJ_ACCEPT_LABEL_SET, "Acceptable Label Set" }, 1960f74e101Schristos { RSVP_OBJ_DETOUR, "Detour" }, 1970f74e101Schristos { RSVP_OBJ_CLASSTYPE, "Class Type" }, 1980f74e101Schristos { RSVP_OBJ_CLASSTYPE_OLD, "Class Type (old)" }, 1990f74e101Schristos { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" }, 2000f74e101Schristos { RSVP_OBJ_PROPERTIES, "Properties" }, 2010f74e101Schristos { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" }, 2020f74e101Schristos { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" }, 2030f74e101Schristos { RSVP_OBJ_GENERALIZED_UNI, "Generalized UNI" }, 2040f74e101Schristos { RSVP_OBJ_CALL_ID, "Call-ID" }, 2050f74e101Schristos { RSVP_OBJ_CALL_OPS, "Call Capability" }, 2060f74e101Schristos { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" }, 207c74ad251Schristos { RSVP_OBJ_CAPABILITY, "Capability" }, 2080f74e101Schristos { RSVP_OBJ_NOTIFY_REQ, "Notify Request" }, 2090f74e101Schristos { RSVP_OBJ_PROTECTION, "Protection" }, 2100f74e101Schristos { RSVP_OBJ_ADMIN_STATUS, "Administrative Status" }, 2110f74e101Schristos { RSVP_OBJ_S2L, "Sub-LSP to LSP" }, 2120f74e101Schristos { 0, NULL} 2130f74e101Schristos }; 2140f74e101Schristos 2150f74e101Schristos #define RSVP_CTYPE_IPV4 1 2160f74e101Schristos #define RSVP_CTYPE_IPV6 2 2170f74e101Schristos #define RSVP_CTYPE_TUNNEL_IPV4 7 2180f74e101Schristos #define RSVP_CTYPE_TUNNEL_IPV6 8 2190f74e101Schristos #define RSVP_CTYPE_UNI_IPV4 11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */ 2200f74e101Schristos #define RSVP_CTYPE_1 1 2210f74e101Schristos #define RSVP_CTYPE_2 2 2220f74e101Schristos #define RSVP_CTYPE_3 3 2230f74e101Schristos #define RSVP_CTYPE_4 4 2240f74e101Schristos #define RSVP_CTYPE_12 12 2250f74e101Schristos #define RSVP_CTYPE_13 13 2260f74e101Schristos #define RSVP_CTYPE_14 14 2270f74e101Schristos 2280f74e101Schristos /* 2290f74e101Schristos * the ctypes are not globally unique so for 2300f74e101Schristos * translating it to strings we build a table based 2310f74e101Schristos * on objects offsetted by the ctype 2320f74e101Schristos */ 2330f74e101Schristos 2340f74e101Schristos static const struct tok rsvp_ctype_values[] = { 2350f74e101Schristos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" }, 2360f74e101Schristos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" }, 2370f74e101Schristos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" }, 2380f74e101Schristos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" }, 2390f74e101Schristos { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4, "IPv4" }, 2400f74e101Schristos { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6, "IPv6" }, 2410f74e101Schristos { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4, "IPv4" }, 2420f74e101Schristos { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6, "IPv6" }, 2430f74e101Schristos { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" }, 2440f74e101Schristos { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" }, 2450f74e101Schristos { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" }, 2460f74e101Schristos { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2, "IntServ" }, 2470f74e101Schristos { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2, "IntServ" }, 2480f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" }, 2490f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" }, 2500f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" }, 2510f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 2520f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" }, 2530f74e101Schristos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" }, 2540f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" }, 2550f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" }, 2560f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 2570f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4, "UNI IPv4" }, 2580f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13, "IPv4 P2MP LSP Tunnel" }, 2590f74e101Schristos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14, "IPv6 P2MP LSP Tunnel" }, 2600f74e101Schristos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4, "IPv4" }, 2610f74e101Schristos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6, "IPv6" }, 2620f74e101Schristos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 2630f74e101Schristos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" }, 2640f74e101Schristos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" }, 2650f74e101Schristos { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1, "1" }, 2660f74e101Schristos { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1, "Message id ack" }, 2670f74e101Schristos { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2, "Message id nack" }, 2680f74e101Schristos { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1, "1" }, 2690f74e101Schristos { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" }, 2700f74e101Schristos { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" }, 2710f74e101Schristos { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" }, 2720f74e101Schristos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" }, 2730f74e101Schristos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" }, 2740f74e101Schristos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" }, 2750f74e101Schristos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4, "Generalized Label" }, 2760f74e101Schristos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "Label" }, 2770f74e101Schristos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 2780f74e101Schristos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 2790f74e101Schristos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1, "Label" }, 2800f74e101Schristos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 2810f74e101Schristos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 2820f74e101Schristos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1, "Label" }, 2830f74e101Schristos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 2840f74e101Schristos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 2850f74e101Schristos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1, "Label" }, 2860f74e101Schristos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2, "Generalized Label" }, 2870f74e101Schristos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3, "Waveband Switching" }, 2880f74e101Schristos { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" }, 2890f74e101Schristos { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" }, 2900f74e101Schristos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4, "IPv4" }, 2910f74e101Schristos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6, "IPv6" }, 2920f74e101Schristos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" }, 2930f74e101Schristos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" }, 2940f74e101Schristos { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" }, 295c74ad251Schristos { 256*RSVP_OBJ_CAPABILITY+RSVP_CTYPE_1, "1" }, 2960f74e101Schristos { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 2970f74e101Schristos { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, /* old style*/ 2980f74e101Schristos { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1, "1" }, /* new style */ 2990f74e101Schristos { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, 3000f74e101Schristos { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1, "1" }, 3010f74e101Schristos { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1, "1" }, 3020f74e101Schristos { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1, "1" }, 3030f74e101Schristos { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1, "1" }, 3040f74e101Schristos { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1, "1" }, 3050f74e101Schristos { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1, "1" }, 3060f74e101Schristos { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4, "IPv4 sub-LSP" }, 3070f74e101Schristos { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6, "IPv6 sub-LSP" }, 3080f74e101Schristos { 0, NULL} 3090f74e101Schristos }; 3100f74e101Schristos 311c74ad251Schristos /* 312c74ad251Schristos * XXX - this assumes a 16-byte digest, which is true for HMAC-MD5, but 313c74ad251Schristos * isn't necessarily the case for other hash algorithms. 314c74ad251Schristos * 315c74ad251Schristos * Unless I've missed something, there's nothing in RFC 2747 to indicate 316c74ad251Schristos * the hash algorithm being used, so it's presumably something set up 317c74ad251Schristos * out-of-band, or negotiated by other RSVP objects. 318c74ad251Schristos */ 3190f74e101Schristos struct rsvp_obj_integrity_t { 320b3a00663Schristos uint8_t flags; 321b3a00663Schristos uint8_t res; 322b3a00663Schristos uint8_t key_id[6]; 323b3a00663Schristos uint8_t sequence[8]; 324b3a00663Schristos uint8_t digest[16]; 3250f74e101Schristos }; 3260f74e101Schristos 3270f74e101Schristos static const struct tok rsvp_obj_integrity_flag_values[] = { 3280f74e101Schristos { 0x80, "Handshake" }, 3290f74e101Schristos { 0, NULL} 3300f74e101Schristos }; 3310f74e101Schristos 3320f74e101Schristos struct rsvp_obj_frr_t { 333b3a00663Schristos uint8_t setup_prio; 334b3a00663Schristos uint8_t hold_prio; 335b3a00663Schristos uint8_t hop_limit; 336b3a00663Schristos uint8_t flags; 337b3a00663Schristos uint8_t bandwidth[4]; 338b3a00663Schristos uint8_t include_any[4]; 339b3a00663Schristos uint8_t exclude_any[4]; 340b3a00663Schristos uint8_t include_all[4]; 3410f74e101Schristos }; 3420f74e101Schristos 3430f74e101Schristos 3440f74e101Schristos #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f) 3450f74e101Schristos #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80) 3460f74e101Schristos 347c74ad251Schristos #define RSVP_OBJ_CAPABILITY_FLAGS_MASK 0x7U 348c74ad251Schristos 3490f74e101Schristos #define RSVP_OBJ_XRO_RES 0 3500f74e101Schristos #define RSVP_OBJ_XRO_IPV4 1 3510f74e101Schristos #define RSVP_OBJ_XRO_IPV6 2 3520f74e101Schristos #define RSVP_OBJ_XRO_LABEL 3 3530f74e101Schristos #define RSVP_OBJ_XRO_ASN 32 3540f74e101Schristos #define RSVP_OBJ_XRO_MPLS 64 3550f74e101Schristos 3560f74e101Schristos static const struct tok rsvp_obj_xro_values[] = { 3570f74e101Schristos { RSVP_OBJ_XRO_RES, "Reserved" }, 3580f74e101Schristos { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" }, 3590f74e101Schristos { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" }, 3600f74e101Schristos { RSVP_OBJ_XRO_LABEL, "Label" }, 3610f74e101Schristos { RSVP_OBJ_XRO_ASN, "Autonomous system number" }, 3620f74e101Schristos { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" }, 3630f74e101Schristos { 0, NULL} 3640f74e101Schristos }; 3650f74e101Schristos 366c74ad251Schristos /* RFC4090 */ 3670f74e101Schristos static const struct tok rsvp_obj_rro_flag_values[] = { 3680f74e101Schristos { 0x01, "Local protection available" }, 3690f74e101Schristos { 0x02, "Local protection in use" }, 3700f74e101Schristos { 0x04, "Bandwidth protection" }, 3710f74e101Schristos { 0x08, "Node protection" }, 3720f74e101Schristos { 0, NULL} 3730f74e101Schristos }; 3740f74e101Schristos 3750f74e101Schristos /* RFC3209 */ 3760f74e101Schristos static const struct tok rsvp_obj_rro_label_flag_values[] = { 3770f74e101Schristos { 0x01, "Global" }, 3780f74e101Schristos { 0, NULL} 3790f74e101Schristos }; 3800f74e101Schristos 3810f74e101Schristos static const struct tok rsvp_resstyle_values[] = { 3820f74e101Schristos { 17, "Wildcard Filter" }, 3830f74e101Schristos { 10, "Fixed Filter" }, 3840f74e101Schristos { 18, "Shared Explicit" }, 3850f74e101Schristos { 0, NULL} 3860f74e101Schristos }; 3870f74e101Schristos 3880f74e101Schristos #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2 3890f74e101Schristos #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5 3900f74e101Schristos 3910f74e101Schristos static const struct tok rsvp_intserv_service_type_values[] = { 3920f74e101Schristos { 1, "Default/Global Information" }, 3930f74e101Schristos { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" }, 3940f74e101Schristos { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" }, 3950f74e101Schristos { 0, NULL} 3960f74e101Schristos }; 3970f74e101Schristos 3980f74e101Schristos static const struct tok rsvp_intserv_parameter_id_values[] = { 3990f74e101Schristos { 4, "IS hop cnt" }, 4000f74e101Schristos { 6, "Path b/w estimate" }, 4010f74e101Schristos { 8, "Minimum path latency" }, 4020f74e101Schristos { 10, "Composed MTU" }, 4030f74e101Schristos { 127, "Token Bucket TSpec" }, 4040f74e101Schristos { 130, "Guaranteed Service RSpec" }, 4050f74e101Schristos { 133, "End-to-end composed value for C" }, 4060f74e101Schristos { 134, "End-to-end composed value for D" }, 4070f74e101Schristos { 135, "Since-last-reshaping point composed C" }, 4080f74e101Schristos { 136, "Since-last-reshaping point composed D" }, 4090f74e101Schristos { 0, NULL} 4100f74e101Schristos }; 4110f74e101Schristos 412870189d2Schristos static const struct tok rsvp_session_attribute_flag_values[] = { 4130f74e101Schristos { 0x01, "Local Protection" }, 4140f74e101Schristos { 0x02, "Label Recording" }, 4150f74e101Schristos { 0x04, "SE Style" }, 4160f74e101Schristos { 0x08, "Bandwidth protection" }, /* RFC4090 */ 4170f74e101Schristos { 0x10, "Node protection" }, /* RFC4090 */ 4180f74e101Schristos { 0, NULL} 4190f74e101Schristos }; 4200f74e101Schristos 421870189d2Schristos static const struct tok rsvp_obj_prop_tlv_values[] = { 4220f74e101Schristos { 0x01, "Cos" }, 4230f74e101Schristos { 0x02, "Metric 1" }, 4240f74e101Schristos { 0x04, "Metric 2" }, 4250f74e101Schristos { 0x08, "CCC Status" }, 4260f74e101Schristos { 0x10, "Path Type" }, 4270f74e101Schristos { 0, NULL} 4280f74e101Schristos }; 4290f74e101Schristos 4300f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24 4310f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY 25 4320f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28 4330f74e101Schristos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125 4340f74e101Schristos 435870189d2Schristos static const struct tok rsvp_obj_error_code_values[] = { 4360f74e101Schristos { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" }, 4370f74e101Schristos { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY, "Notify Error" }, 4380f74e101Schristos { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" }, 4390f74e101Schristos { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" }, 4400f74e101Schristos { 0, NULL} 4410f74e101Schristos }; 4420f74e101Schristos 443870189d2Schristos static const struct tok rsvp_obj_error_code_routing_values[] = { 4440f74e101Schristos { 1, "Bad EXPLICIT_ROUTE object" }, 4450f74e101Schristos { 2, "Bad strict node" }, 4460f74e101Schristos { 3, "Bad loose node" }, 4470f74e101Schristos { 4, "Bad initial subobject" }, 4480f74e101Schristos { 5, "No route available toward destination" }, 4490f74e101Schristos { 6, "Unacceptable label value" }, 4500f74e101Schristos { 7, "RRO indicated routing loops" }, 4510f74e101Schristos { 8, "non-RSVP-capable router in the path" }, 4520f74e101Schristos { 9, "MPLS label allocation failure" }, 4530f74e101Schristos { 10, "Unsupported L3PID" }, 4540f74e101Schristos { 0, NULL} 4550f74e101Schristos }; 4560f74e101Schristos 457870189d2Schristos static const struct tok rsvp_obj_error_code_diffserv_te_values[] = { 4580f74e101Schristos { 1, "Unexpected CT object" }, 4590f74e101Schristos { 2, "Unsupported CT" }, 4600f74e101Schristos { 3, "Invalid CT value" }, 4610f74e101Schristos { 4, "CT/setup priority do not form a configured TE-Class" }, 4620f74e101Schristos { 5, "CT/holding priority do not form a configured TE-Class" }, 4630f74e101Schristos { 6, "CT/setup priority and CT/holding priority do not form a configured TE-Class" }, 4640f74e101Schristos { 7, "Inconsistency between signaled PSC and signaled CT" }, 4650f74e101Schristos { 8, "Inconsistency between signaled PHBs and signaled CT" }, 4660f74e101Schristos { 0, NULL} 4670f74e101Schristos }; 4680f74e101Schristos 4690f74e101Schristos /* rfc3473 / rfc 3471 */ 4700f74e101Schristos static const struct tok rsvp_obj_admin_status_flag_values[] = { 4710f74e101Schristos { 0x80000000, "Reflect" }, 4720f74e101Schristos { 0x00000004, "Testing" }, 4730f74e101Schristos { 0x00000002, "Admin-down" }, 4740f74e101Schristos { 0x00000001, "Delete-in-progress" }, 4750f74e101Schristos { 0, NULL} 4760f74e101Schristos }; 4770f74e101Schristos 4780f74e101Schristos /* label set actions - rfc3471 */ 4790f74e101Schristos #define LABEL_SET_INCLUSIVE_LIST 0 4800f74e101Schristos #define LABEL_SET_EXCLUSIVE_LIST 1 4810f74e101Schristos #define LABEL_SET_INCLUSIVE_RANGE 2 4820f74e101Schristos #define LABEL_SET_EXCLUSIVE_RANGE 3 4830f74e101Schristos 4840f74e101Schristos static const struct tok rsvp_obj_label_set_action_values[] = { 4850f74e101Schristos { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" }, 4860f74e101Schristos { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" }, 4870f74e101Schristos { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" }, 4880f74e101Schristos { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" }, 4890f74e101Schristos { 0, NULL} 4900f74e101Schristos }; 4910f74e101Schristos 4920f74e101Schristos /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */ 4930f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS 1 4940f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2 4950f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY 3 4960f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL 4 4970f74e101Schristos #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL 5 4980f74e101Schristos 4990f74e101Schristos static const struct tok rsvp_obj_generalized_uni_values[] = { 5000f74e101Schristos { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" }, 5010f74e101Schristos { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" }, 5020f74e101Schristos { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" }, 5030f74e101Schristos { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" }, 5040f74e101Schristos { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" }, 5050f74e101Schristos { 0, NULL} 5060f74e101Schristos }; 5070f74e101Schristos 5080f74e101Schristos /* 5090f74e101Schristos * this is a dissector for all the intserv defined 5100f74e101Schristos * specs as defined per rfc2215 5110f74e101Schristos * it is called from various rsvp objects; 5120f74e101Schristos * returns the amount of bytes being processed 5130f74e101Schristos */ 514c74ad251Schristos static u_int 515b3a00663Schristos rsvp_intserv_print(netdissect_options *ndo, 516c74ad251Schristos const u_char *tptr, u_int obj_tlen) 517ba2ff121Schristos { 518c74ad251Schristos u_int parameter_id,parameter_length; 5190f74e101Schristos union { 5200f74e101Schristos float f; 521b3a00663Schristos uint32_t i; 5220f74e101Schristos } bw; 5230f74e101Schristos 5240f74e101Schristos if (obj_tlen < 4) 5250f74e101Schristos return 0; 526c74ad251Schristos parameter_id = GET_U_1(tptr); 527c74ad251Schristos parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */ 5280f74e101Schristos 529c74ad251Schristos ND_PRINT("\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]", 5300f74e101Schristos tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id), 5310f74e101Schristos parameter_id, 5320f74e101Schristos parameter_length, 533c74ad251Schristos GET_U_1(tptr + 1)); 5340f74e101Schristos 5350f74e101Schristos if (obj_tlen < parameter_length+4) 5360f74e101Schristos return 0; 5370f74e101Schristos switch(parameter_id) { /* parameter_id */ 5380f74e101Schristos 5390f74e101Schristos case 4: 5400f74e101Schristos /* 5410f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5420f74e101Schristos * | 4 (e) | (f) | 1 (g) | 5430f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5440f74e101Schristos * | IS hop cnt (32-bit unsigned integer) | 5450f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5460f74e101Schristos */ 547dc860a36Sspz if (parameter_length == 4) { 548c74ad251Schristos ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4)); 549dc860a36Sspz } 5500f74e101Schristos break; 5510f74e101Schristos 5520f74e101Schristos case 6: 5530f74e101Schristos /* 5540f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5550f74e101Schristos * | 6 (h) | (i) | 1 (j) | 5560f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5570f74e101Schristos * | Path b/w estimate (32-bit IEEE floating point number) | 5580f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5590f74e101Schristos */ 5600f74e101Schristos if (parameter_length == 4) { 561c74ad251Schristos bw.i = GET_BE_U_4(tptr + 4); 562c74ad251Schristos ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000); 5630f74e101Schristos } 5640f74e101Schristos break; 5650f74e101Schristos 5660f74e101Schristos case 8: 5670f74e101Schristos /* 5680f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5690f74e101Schristos * | 8 (k) | (l) | 1 (m) | 5700f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5710f74e101Schristos * | Minimum path latency (32-bit integer) | 5720f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5730f74e101Schristos */ 5740f74e101Schristos if (parameter_length == 4) { 575c74ad251Schristos ND_PRINT("\n\t\tMinimum path latency: "); 576c74ad251Schristos if (GET_BE_U_4(tptr + 4) == 0xffffffff) 577c74ad251Schristos ND_PRINT("don't care"); 5780f74e101Schristos else 579c74ad251Schristos ND_PRINT("%u", GET_BE_U_4(tptr + 4)); 5800f74e101Schristos } 5810f74e101Schristos break; 5820f74e101Schristos 5830f74e101Schristos case 10: 5840f74e101Schristos 5850f74e101Schristos /* 5860f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5870f74e101Schristos * | 10 (n) | (o) | 1 (p) | 5880f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5890f74e101Schristos * | Composed MTU (32-bit unsigned integer) | 5900f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5910f74e101Schristos */ 592dc860a36Sspz if (parameter_length == 4) { 593c74ad251Schristos ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4)); 594dc860a36Sspz } 5950f74e101Schristos break; 5960f74e101Schristos case 127: 5970f74e101Schristos /* 5980f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 5990f74e101Schristos * | 127 (e) | 0 (f) | 5 (g) | 6000f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6010f74e101Schristos * | Token Bucket Rate [r] (32-bit IEEE floating point number) | 6020f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6030f74e101Schristos * | Token Bucket Size [b] (32-bit IEEE floating point number) | 6040f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6050f74e101Schristos * | Peak Data Rate [p] (32-bit IEEE floating point number) | 6060f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6070f74e101Schristos * | Minimum Policed Unit [m] (32-bit integer) | 6080f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6090f74e101Schristos * | Maximum Packet Size [M] (32-bit integer) | 6100f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6110f74e101Schristos */ 6120f74e101Schristos 6130f74e101Schristos if (parameter_length == 20) { 614c74ad251Schristos ND_TCHECK_LEN(tptr + 4, 20); 615c74ad251Schristos bw.i = GET_BE_U_4(tptr + 4); 616c74ad251Schristos ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000); 617c74ad251Schristos bw.i = GET_BE_U_4(tptr + 8); 618c74ad251Schristos ND_PRINT("\n\t\tToken Bucket Size: %.10g bytes", bw.f); 619c74ad251Schristos bw.i = GET_BE_U_4(tptr + 12); 620c74ad251Schristos ND_PRINT("\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000); 621c74ad251Schristos ND_PRINT("\n\t\tMinimum Policed Unit: %u bytes", 622c74ad251Schristos GET_BE_U_4(tptr + 16)); 623c74ad251Schristos ND_PRINT("\n\t\tMaximum Packet Size: %u bytes", 624c74ad251Schristos GET_BE_U_4(tptr + 20)); 6250f74e101Schristos } 6260f74e101Schristos break; 6270f74e101Schristos 6280f74e101Schristos case 130: 6290f74e101Schristos /* 6300f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6310f74e101Schristos * | 130 (h) | 0 (i) | 2 (j) | 6320f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6330f74e101Schristos * | Rate [R] (32-bit IEEE floating point number) | 6340f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6350f74e101Schristos * | Slack Term [S] (32-bit integer) | 6360f74e101Schristos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 6370f74e101Schristos */ 6380f74e101Schristos 6390f74e101Schristos if (parameter_length == 8) { 640c74ad251Schristos ND_TCHECK_8(tptr + 4); 641c74ad251Schristos bw.i = GET_BE_U_4(tptr + 4); 642c74ad251Schristos ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000); 643c74ad251Schristos ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8)); 6440f74e101Schristos } 6450f74e101Schristos break; 6460f74e101Schristos 6470f74e101Schristos case 133: 6480f74e101Schristos case 134: 6490f74e101Schristos case 135: 6500f74e101Schristos case 136: 651dc860a36Sspz if (parameter_length == 4) { 652c74ad251Schristos ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4)); 653dc860a36Sspz } 6540f74e101Schristos break; 6550f74e101Schristos 6560f74e101Schristos default: 657b3a00663Schristos if (ndo->ndo_vflag <= 1) 658b3a00663Schristos print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length); 6590f74e101Schristos } 6600f74e101Schristos return (parameter_length+4); /* header length 4 bytes */ 661fdccd7e4Schristos 662fdccd7e4Schristos trunc: 663c74ad251Schristos nd_print_trunc(ndo); 664fdccd7e4Schristos return 0; 665fdccd7e4Schristos } 666fdccd7e4Schristos 667fdccd7e4Schristos /* 668fdccd7e4Schristos * Clear checksum prior to signature verification. 669fdccd7e4Schristos */ 670fdccd7e4Schristos static void 671fdccd7e4Schristos rsvp_clear_checksum(void *header) 672fdccd7e4Schristos { 673fdccd7e4Schristos struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header; 674fdccd7e4Schristos 675fdccd7e4Schristos rsvp_com_header->checksum[0] = 0; 676fdccd7e4Schristos rsvp_com_header->checksum[1] = 0; 6770f74e101Schristos } 6780f74e101Schristos 6790f74e101Schristos static int 680b3a00663Schristos rsvp_obj_print(netdissect_options *ndo, 681fdccd7e4Schristos const u_char *pptr, u_int plen, const u_char *tptr, 682c74ad251Schristos const char *indent, u_int tlen, 683fdccd7e4Schristos const struct rsvp_common_header *rsvp_com_header) 684ba2ff121Schristos { 6850f74e101Schristos const struct rsvp_object_header *rsvp_obj_header; 6860f74e101Schristos const u_char *obj_tptr; 6870f74e101Schristos union { 6880f74e101Schristos const struct rsvp_obj_integrity_t *rsvp_obj_integrity; 6890f74e101Schristos const struct rsvp_obj_frr_t *rsvp_obj_frr; 6900f74e101Schristos } obj_ptr; 6910f74e101Schristos 692c74ad251Schristos u_short rsvp_obj_len,rsvp_obj_ctype,rsvp_obj_class_num; 693c74ad251Schristos u_int obj_tlen,intserv_serv_tlen; 694c74ad251Schristos int hexdump; 695c74ad251Schristos u_int processed,padbytes,error_code,error_value,i,sigcheck; 6960f74e101Schristos union { 6970f74e101Schristos float f; 698b3a00663Schristos uint32_t i; 6990f74e101Schristos } bw; 700c74ad251Schristos u_int namelen; 7010f74e101Schristos 7020f74e101Schristos u_int action, subchannel; 7030f74e101Schristos 7040f74e101Schristos while(tlen>=sizeof(struct rsvp_object_header)) { 7050f74e101Schristos /* did we capture enough for fully decoding the object header ? */ 706c74ad251Schristos ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header)); 7070f74e101Schristos 7080f74e101Schristos rsvp_obj_header = (const struct rsvp_object_header *)tptr; 709c74ad251Schristos rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length); 710c74ad251Schristos rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype); 7110f74e101Schristos 7120f74e101Schristos if(rsvp_obj_len % 4) { 713c74ad251Schristos ND_PRINT("%sERROR: object header size %u not a multiple of 4", indent, rsvp_obj_len); 7140f74e101Schristos return -1; 7150f74e101Schristos } 7160f74e101Schristos if(rsvp_obj_len < sizeof(struct rsvp_object_header)) { 717c74ad251Schristos ND_PRINT("%sERROR: object header too short %u < %zu", indent, rsvp_obj_len, 718c74ad251Schristos sizeof(struct rsvp_object_header)); 7190f74e101Schristos return -1; 7200f74e101Schristos } 7210f74e101Schristos 722c74ad251Schristos rsvp_obj_class_num = GET_U_1(rsvp_obj_header->class_num); 723c74ad251Schristos ND_PRINT("%s%s Object (%u) Flags: [%s", 724c74ad251Schristos indent, 7250f74e101Schristos tok2str(rsvp_obj_values, 7260f74e101Schristos "Unknown", 727c74ad251Schristos rsvp_obj_class_num), 728c74ad251Schristos rsvp_obj_class_num, 729c74ad251Schristos (rsvp_obj_class_num & 0x80) ? 730c74ad251Schristos ((rsvp_obj_class_num & 0x40) ? "ignore and forward" : 731c74ad251Schristos "ignore silently") : 732c74ad251Schristos "reject"); 7330f74e101Schristos 734c74ad251Schristos ND_PRINT(" if unknown], Class-Type: %s (%u), length: %u", 7350f74e101Schristos tok2str(rsvp_ctype_values, 7360f74e101Schristos "Unknown", 737c74ad251Schristos (rsvp_obj_class_num<<8)+rsvp_obj_ctype), 7380f74e101Schristos rsvp_obj_ctype, 739c74ad251Schristos rsvp_obj_len); 7400f74e101Schristos 7410f74e101Schristos if(tlen < rsvp_obj_len) { 742c74ad251Schristos ND_PRINT("%sERROR: object goes past end of objects TLV", indent); 7430f74e101Schristos return -1; 7440f74e101Schristos } 7450f74e101Schristos 7460f74e101Schristos obj_tptr=tptr+sizeof(struct rsvp_object_header); 7470f74e101Schristos obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header); 7480f74e101Schristos 7490f74e101Schristos /* did we capture enough for fully decoding the object ? */ 750c74ad251Schristos ND_TCHECK_LEN(tptr, rsvp_obj_len); 7510f74e101Schristos hexdump=FALSE; 7520f74e101Schristos 753c74ad251Schristos switch(rsvp_obj_class_num) { 7540f74e101Schristos case RSVP_OBJ_SESSION: 7550f74e101Schristos switch(rsvp_obj_ctype) { 7560f74e101Schristos case RSVP_CTYPE_IPV4: 7570f74e101Schristos if (obj_tlen < 8) 758c74ad251Schristos goto obj_tooshort; 759c74ad251Schristos ND_PRINT("%s IPv4 DestAddress: %s, Protocol ID: 0x%02x", 760c74ad251Schristos indent, 761c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 762c74ad251Schristos GET_U_1(obj_tptr + sizeof(nd_ipv4))); 763c74ad251Schristos ND_PRINT("%s Flags: [0x%02x], DestPort %u", 764c74ad251Schristos indent, 765c74ad251Schristos GET_U_1((obj_tptr + 5)), 766c74ad251Schristos GET_BE_U_2(obj_tptr + 6)); 7670f74e101Schristos obj_tlen-=8; 7680f74e101Schristos obj_tptr+=8; 7690f74e101Schristos break; 7700f74e101Schristos case RSVP_CTYPE_IPV6: 7710f74e101Schristos if (obj_tlen < 20) 772c74ad251Schristos goto obj_tooshort; 773c74ad251Schristos ND_PRINT("%s IPv6 DestAddress: %s, Protocol ID: 0x%02x", 774c74ad251Schristos indent, 775c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 776c74ad251Schristos GET_U_1(obj_tptr + sizeof(nd_ipv6))); 777c74ad251Schristos ND_PRINT("%s Flags: [0x%02x], DestPort %u", 778c74ad251Schristos indent, 779c74ad251Schristos GET_U_1((obj_tptr + sizeof(nd_ipv6) + 1)), 780c74ad251Schristos GET_BE_U_2(obj_tptr + sizeof(nd_ipv6) + 2)); 7810f74e101Schristos obj_tlen-=20; 7820f74e101Schristos obj_tptr+=20; 7830f74e101Schristos break; 7840f74e101Schristos 7850f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV6: 7860f74e101Schristos if (obj_tlen < 36) 787c74ad251Schristos goto obj_tooshort; 788c74ad251Schristos ND_PRINT("%s IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 789c74ad251Schristos indent, 790c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 791c74ad251Schristos GET_BE_U_2(obj_tptr + 18), 792c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr + 20)); 7930f74e101Schristos obj_tlen-=36; 7940f74e101Schristos obj_tptr+=36; 7950f74e101Schristos break; 7960f74e101Schristos 7970f74e101Schristos case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */ 7980f74e101Schristos if (obj_tlen < 26) 799c74ad251Schristos goto obj_tooshort; 800c74ad251Schristos ND_PRINT("%s IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 801c74ad251Schristos indent, 802c74ad251Schristos GET_BE_U_4(obj_tptr), 803c74ad251Schristos GET_BE_U_2(obj_tptr + 6), 804c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr + 8)); 8050f74e101Schristos obj_tlen-=26; 8060f74e101Schristos obj_tptr+=26; 8070f74e101Schristos break; 8080f74e101Schristos case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */ 8090f74e101Schristos if (obj_tlen < 12) 810c74ad251Schristos goto obj_tooshort; 811c74ad251Schristos ND_PRINT("%s IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 812c74ad251Schristos indent, 813c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 814c74ad251Schristos GET_BE_U_2(obj_tptr + 6), 815c74ad251Schristos GET_IPADDR_STRING(obj_tptr + 8)); 8160f74e101Schristos obj_tlen-=12; 8170f74e101Schristos obj_tptr+=12; 8180f74e101Schristos break; 8190f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: 8200f74e101Schristos case RSVP_CTYPE_UNI_IPV4: 8210f74e101Schristos if (obj_tlen < 12) 822c74ad251Schristos goto obj_tooshort; 823c74ad251Schristos ND_PRINT("%s IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s", 824c74ad251Schristos indent, 825c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 826c74ad251Schristos GET_BE_U_2(obj_tptr + 6), 827c74ad251Schristos GET_IPADDR_STRING(obj_tptr + 8)); 8280f74e101Schristos obj_tlen-=12; 8290f74e101Schristos obj_tptr+=12; 8300f74e101Schristos break; 8310f74e101Schristos default: 8320f74e101Schristos hexdump=TRUE; 8330f74e101Schristos } 8340f74e101Schristos break; 8350f74e101Schristos 8360f74e101Schristos case RSVP_OBJ_CONFIRM: 8370f74e101Schristos switch(rsvp_obj_ctype) { 8380f74e101Schristos case RSVP_CTYPE_IPV4: 839c74ad251Schristos if (obj_tlen < sizeof(nd_ipv4)) 840c74ad251Schristos goto obj_tooshort; 841c74ad251Schristos ND_PRINT("%s IPv4 Receiver Address: %s", 842c74ad251Schristos indent, 843c74ad251Schristos GET_IPADDR_STRING(obj_tptr)); 844c74ad251Schristos obj_tlen-=sizeof(nd_ipv4); 845c74ad251Schristos obj_tptr+=sizeof(nd_ipv4); 8460f74e101Schristos break; 8470f74e101Schristos case RSVP_CTYPE_IPV6: 848c74ad251Schristos if (obj_tlen < sizeof(nd_ipv6)) 849c74ad251Schristos goto obj_tooshort; 850c74ad251Schristos ND_PRINT("%s IPv6 Receiver Address: %s", 851c74ad251Schristos indent, 852c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr)); 853c74ad251Schristos obj_tlen-=sizeof(nd_ipv6); 854c74ad251Schristos obj_tptr+=sizeof(nd_ipv6); 8550f74e101Schristos break; 8560f74e101Schristos default: 8570f74e101Schristos hexdump=TRUE; 8580f74e101Schristos } 8590f74e101Schristos break; 8600f74e101Schristos 8610f74e101Schristos case RSVP_OBJ_NOTIFY_REQ: 8620f74e101Schristos switch(rsvp_obj_ctype) { 8630f74e101Schristos case RSVP_CTYPE_IPV4: 864c74ad251Schristos if (obj_tlen < sizeof(nd_ipv4)) 865c74ad251Schristos goto obj_tooshort; 866c74ad251Schristos ND_PRINT("%s IPv4 Notify Node Address: %s", 867c74ad251Schristos indent, 868c74ad251Schristos GET_IPADDR_STRING(obj_tptr)); 869c74ad251Schristos obj_tlen-=sizeof(nd_ipv4); 870c74ad251Schristos obj_tptr+=sizeof(nd_ipv4); 8710f74e101Schristos break; 8720f74e101Schristos case RSVP_CTYPE_IPV6: 873c74ad251Schristos if (obj_tlen < sizeof(nd_ipv6)) 874c74ad251Schristos goto obj_tooshort; 875c74ad251Schristos ND_PRINT("%s IPv6 Notify Node Address: %s", 876c74ad251Schristos indent, 877c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr)); 878c74ad251Schristos obj_tlen-=sizeof(nd_ipv6); 879c74ad251Schristos obj_tptr+=sizeof(nd_ipv6); 8800f74e101Schristos break; 8810f74e101Schristos default: 8820f74e101Schristos hexdump=TRUE; 8830f74e101Schristos } 8840f74e101Schristos break; 8850f74e101Schristos 8860f74e101Schristos case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */ 8870f74e101Schristos case RSVP_OBJ_UPSTREAM_LABEL: /* fall through */ 8880f74e101Schristos case RSVP_OBJ_RECOVERY_LABEL: /* fall through */ 8890f74e101Schristos case RSVP_OBJ_LABEL: 8900f74e101Schristos switch(rsvp_obj_ctype) { 8910f74e101Schristos case RSVP_CTYPE_1: 8920f74e101Schristos while(obj_tlen >= 4 ) { 893c74ad251Schristos ND_PRINT("%s Label: %u", indent, GET_BE_U_4(obj_tptr)); 8940f74e101Schristos obj_tlen-=4; 8950f74e101Schristos obj_tptr+=4; 8960f74e101Schristos } 8970f74e101Schristos break; 8980f74e101Schristos case RSVP_CTYPE_2: 8990f74e101Schristos if (obj_tlen < 4) 900c74ad251Schristos goto obj_tooshort; 901c74ad251Schristos ND_PRINT("%s Generalized Label: %u", 902c74ad251Schristos indent, 903c74ad251Schristos GET_BE_U_4(obj_tptr)); 9040f74e101Schristos obj_tlen-=4; 9050f74e101Schristos obj_tptr+=4; 9060f74e101Schristos break; 9070f74e101Schristos case RSVP_CTYPE_3: 9080f74e101Schristos if (obj_tlen < 12) 909c74ad251Schristos goto obj_tooshort; 910c74ad251Schristos ND_PRINT("%s Waveband ID: %u%s Start Label: %u, Stop Label: %u", 911c74ad251Schristos indent, 912c74ad251Schristos GET_BE_U_4(obj_tptr), 913c74ad251Schristos indent, 914c74ad251Schristos GET_BE_U_4(obj_tptr + 4), 915c74ad251Schristos GET_BE_U_4(obj_tptr + 8)); 9160f74e101Schristos obj_tlen-=12; 9170f74e101Schristos obj_tptr+=12; 9180f74e101Schristos break; 9190f74e101Schristos default: 9200f74e101Schristos hexdump=TRUE; 9210f74e101Schristos } 9220f74e101Schristos break; 9230f74e101Schristos 9240f74e101Schristos case RSVP_OBJ_STYLE: 9250f74e101Schristos switch(rsvp_obj_ctype) { 9260f74e101Schristos case RSVP_CTYPE_1: 9270f74e101Schristos if (obj_tlen < 4) 928c74ad251Schristos goto obj_tooshort; 929c74ad251Schristos ND_PRINT("%s Reservation Style: %s, Flags: [0x%02x]", 930c74ad251Schristos indent, 9310f74e101Schristos tok2str(rsvp_resstyle_values, 9320f74e101Schristos "Unknown", 933c74ad251Schristos GET_BE_U_3(obj_tptr + 1)), 934c74ad251Schristos GET_U_1(obj_tptr)); 9350f74e101Schristos obj_tlen-=4; 9360f74e101Schristos obj_tptr+=4; 9370f74e101Schristos break; 9380f74e101Schristos default: 9390f74e101Schristos hexdump=TRUE; 9400f74e101Schristos } 9410f74e101Schristos break; 9420f74e101Schristos 9430f74e101Schristos case RSVP_OBJ_SENDER_TEMPLATE: 9440f74e101Schristos switch(rsvp_obj_ctype) { 9450f74e101Schristos case RSVP_CTYPE_IPV4: 9460f74e101Schristos if (obj_tlen < 8) 947c74ad251Schristos goto obj_tooshort; 948c74ad251Schristos ND_PRINT("%s Source Address: %s, Source Port: %u", 949c74ad251Schristos indent, 950c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 951c74ad251Schristos GET_BE_U_2(obj_tptr + 6)); 9520f74e101Schristos obj_tlen-=8; 9530f74e101Schristos obj_tptr+=8; 9540f74e101Schristos break; 9550f74e101Schristos case RSVP_CTYPE_IPV6: 9560f74e101Schristos if (obj_tlen < 20) 957c74ad251Schristos goto obj_tooshort; 958c74ad251Schristos ND_PRINT("%s Source Address: %s, Source Port: %u", 959c74ad251Schristos indent, 960c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 961c74ad251Schristos GET_BE_U_2(obj_tptr + 18)); 9620f74e101Schristos obj_tlen-=20; 9630f74e101Schristos obj_tptr+=20; 9640f74e101Schristos break; 9650f74e101Schristos case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */ 9660f74e101Schristos if (obj_tlen < 40) 967c74ad251Schristos goto obj_tooshort; 968c74ad251Schristos ND_PRINT("%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x" 9690f74e101Schristos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x", 970c74ad251Schristos indent, 971c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 972c74ad251Schristos GET_BE_U_2(obj_tptr + 18), 973c74ad251Schristos indent, 974c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr+20), 975c74ad251Schristos GET_BE_U_2(obj_tptr + 38)); 9760f74e101Schristos obj_tlen-=40; 9770f74e101Schristos obj_tptr+=40; 9780f74e101Schristos break; 9790f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: 9800f74e101Schristos if (obj_tlen < 8) 981c74ad251Schristos goto obj_tooshort; 982c74ad251Schristos ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x", 983c74ad251Schristos indent, 984c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 985c74ad251Schristos GET_BE_U_2(obj_tptr + 6)); 9860f74e101Schristos obj_tlen-=8; 9870f74e101Schristos obj_tptr+=8; 9880f74e101Schristos break; 9890f74e101Schristos case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */ 9900f74e101Schristos if (obj_tlen < 16) 991c74ad251Schristos goto obj_tooshort; 992c74ad251Schristos ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x" 9930f74e101Schristos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x", 994c74ad251Schristos indent, 995c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 996c74ad251Schristos GET_BE_U_2(obj_tptr + 6), 997c74ad251Schristos indent, 998c74ad251Schristos GET_IPADDR_STRING(obj_tptr+8), 999c74ad251Schristos GET_BE_U_2(obj_tptr + 12)); 10000f74e101Schristos obj_tlen-=16; 10010f74e101Schristos obj_tptr+=16; 10020f74e101Schristos break; 10030f74e101Schristos default: 10040f74e101Schristos hexdump=TRUE; 10050f74e101Schristos } 10060f74e101Schristos break; 10070f74e101Schristos 10080f74e101Schristos case RSVP_OBJ_LABEL_REQ: 10090f74e101Schristos switch(rsvp_obj_ctype) { 10100f74e101Schristos case RSVP_CTYPE_1: 10110f74e101Schristos while(obj_tlen >= 4 ) { 1012c74ad251Schristos ND_PRINT("%s L3 Protocol ID: %s", 1013c74ad251Schristos indent, 10140f74e101Schristos tok2str(ethertype_values, 10150f74e101Schristos "Unknown Protocol (0x%04x)", 1016c74ad251Schristos GET_BE_U_2(obj_tptr + 2))); 10170f74e101Schristos obj_tlen-=4; 10180f74e101Schristos obj_tptr+=4; 10190f74e101Schristos } 10200f74e101Schristos break; 10210f74e101Schristos case RSVP_CTYPE_2: 10220f74e101Schristos if (obj_tlen < 12) 1023c74ad251Schristos goto obj_tooshort; 1024c74ad251Schristos ND_PRINT("%s L3 Protocol ID: %s", 1025c74ad251Schristos indent, 10260f74e101Schristos tok2str(ethertype_values, 10270f74e101Schristos "Unknown Protocol (0x%04x)", 1028c74ad251Schristos GET_BE_U_2(obj_tptr + 2))); 1029c74ad251Schristos ND_PRINT(",%s merge capability", 1030c74ad251Schristos ((GET_U_1(obj_tptr + 4)) & 0x80) ? "no" : "" ); 1031c74ad251Schristos ND_PRINT("%s Minimum VPI/VCI: %u/%u", 1032c74ad251Schristos indent, 1033c74ad251Schristos (GET_BE_U_2(obj_tptr + 4))&0xfff, 1034c74ad251Schristos (GET_BE_U_2(obj_tptr + 6)) & 0xfff); 1035c74ad251Schristos ND_PRINT("%s Maximum VPI/VCI: %u/%u", 1036c74ad251Schristos indent, 1037c74ad251Schristos (GET_BE_U_2(obj_tptr + 8))&0xfff, 1038c74ad251Schristos (GET_BE_U_2(obj_tptr + 10)) & 0xfff); 10390f74e101Schristos obj_tlen-=12; 10400f74e101Schristos obj_tptr+=12; 10410f74e101Schristos break; 10420f74e101Schristos case RSVP_CTYPE_3: 10430f74e101Schristos if (obj_tlen < 12) 1044c74ad251Schristos goto obj_tooshort; 1045c74ad251Schristos ND_PRINT("%s L3 Protocol ID: %s", 1046c74ad251Schristos indent, 10470f74e101Schristos tok2str(ethertype_values, 10480f74e101Schristos "Unknown Protocol (0x%04x)", 1049c74ad251Schristos GET_BE_U_2(obj_tptr + 2))); 1050c74ad251Schristos ND_PRINT("%s Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI", 1051c74ad251Schristos indent, 1052c74ad251Schristos (GET_BE_U_4(obj_tptr + 4))&0x7fffff, 1053c74ad251Schristos (GET_BE_U_4(obj_tptr + 8))&0x7fffff, 1054c74ad251Schristos (((GET_BE_U_2(obj_tptr + 4)>>7)&3) == 0 ) ? "10" : "", 1055c74ad251Schristos (((GET_BE_U_2(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : ""); 10560f74e101Schristos obj_tlen-=12; 10570f74e101Schristos obj_tptr+=12; 10580f74e101Schristos break; 10590f74e101Schristos case RSVP_CTYPE_4: 10600f74e101Schristos if (obj_tlen < 4) 1061c74ad251Schristos goto obj_tooshort; 1062c74ad251Schristos ND_PRINT("%s LSP Encoding Type: %s (%u)", 1063c74ad251Schristos indent, 10640f74e101Schristos tok2str(gmpls_encoding_values, 10650f74e101Schristos "Unknown", 1066c74ad251Schristos GET_U_1(obj_tptr)), 1067c74ad251Schristos GET_U_1(obj_tptr)); 1068c74ad251Schristos ND_PRINT("%s Switching Type: %s (%u), Payload ID: %s (0x%04x)", 1069c74ad251Schristos indent, 10700f74e101Schristos tok2str(gmpls_switch_cap_values, 10710f74e101Schristos "Unknown", 1072c74ad251Schristos GET_U_1((obj_tptr + 1))), 1073c74ad251Schristos GET_U_1(obj_tptr + 1), 10740f74e101Schristos tok2str(gmpls_payload_values, 10750f74e101Schristos "Unknown", 1076c74ad251Schristos GET_BE_U_2(obj_tptr + 2)), 1077c74ad251Schristos GET_BE_U_2(obj_tptr + 2)); 10780f74e101Schristos obj_tlen-=4; 10790f74e101Schristos obj_tptr+=4; 10800f74e101Schristos break; 10810f74e101Schristos default: 10820f74e101Schristos hexdump=TRUE; 10830f74e101Schristos } 10840f74e101Schristos break; 10850f74e101Schristos 10860f74e101Schristos case RSVP_OBJ_RRO: 10870f74e101Schristos case RSVP_OBJ_ERO: 10880f74e101Schristos switch(rsvp_obj_ctype) { 10890f74e101Schristos case RSVP_CTYPE_IPV4: 10900f74e101Schristos while(obj_tlen >= 4 ) { 1091fdccd7e4Schristos u_char length; 1092fdccd7e4Schristos 1093c74ad251Schristos ND_TCHECK_4(obj_tptr); 1094c74ad251Schristos length = GET_U_1(obj_tptr + 1); 1095c74ad251Schristos ND_PRINT("%s Subobject Type: %s, length %u", 1096c74ad251Schristos indent, 10970f74e101Schristos tok2str(rsvp_obj_xro_values, 10980f74e101Schristos "Unknown %u", 1099c74ad251Schristos RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))), 1100c74ad251Schristos length); 1101c74ad251Schristos if (obj_tlen < length) { 1102c74ad251Schristos ND_PRINT("%s ERROR: ERO subobject length > object length", indent); 11030f74e101Schristos break; 11040f74e101Schristos } 11050f74e101Schristos 1106c74ad251Schristos if (length == 0) { /* prevent infinite loops */ 1107c74ad251Schristos ND_PRINT("%s ERROR: zero length ERO subtype", indent); 1108c74ad251Schristos break; 1109c74ad251Schristos } 1110c74ad251Schristos 1111c74ad251Schristos switch(RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))) { 1112fdccd7e4Schristos u_char prefix_length; 1113fdccd7e4Schristos 11140f74e101Schristos case RSVP_OBJ_XRO_IPV4: 1115fdccd7e4Schristos if (length != 8) { 1116c74ad251Schristos ND_PRINT(" ERROR: length != 8"); 1117fdccd7e4Schristos goto invalid; 1118fdccd7e4Schristos } 1119c74ad251Schristos ND_TCHECK_8(obj_tptr); 1120c74ad251Schristos prefix_length = GET_U_1(obj_tptr + 6); 1121fdccd7e4Schristos if (prefix_length != 32) { 1122c74ad251Schristos ND_PRINT(" ERROR: Prefix length %u != 32", 1123c74ad251Schristos prefix_length); 1124fdccd7e4Schristos goto invalid; 1125fdccd7e4Schristos } 1126c74ad251Schristos ND_PRINT(", %s, %s/%u, Flags: [%s]", 1127c74ad251Schristos RSVP_OBJ_XRO_MASK_LOOSE(GET_U_1(obj_tptr)) ? "Loose" : "Strict", 1128c74ad251Schristos GET_IPADDR_STRING(obj_tptr+2), 1129c74ad251Schristos GET_U_1((obj_tptr + 6)), 11300f74e101Schristos bittok2str(rsvp_obj_rro_flag_values, 11310f74e101Schristos "none", 1132c74ad251Schristos GET_U_1((obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */ 11330f74e101Schristos break; 11340f74e101Schristos case RSVP_OBJ_XRO_LABEL: 1135fdccd7e4Schristos if (length != 8) { 1136c74ad251Schristos ND_PRINT(" ERROR: length != 8"); 1137fdccd7e4Schristos goto invalid; 1138fdccd7e4Schristos } 1139c74ad251Schristos ND_TCHECK_8(obj_tptr); 1140c74ad251Schristos ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u", 11410f74e101Schristos bittok2str(rsvp_obj_rro_label_flag_values, 11420f74e101Schristos "none", 1143c74ad251Schristos GET_U_1((obj_tptr + 2))), 1144c74ad251Schristos GET_U_1(obj_tptr + 2), 11450f74e101Schristos tok2str(rsvp_ctype_values, 11460f74e101Schristos "Unknown", 1147c74ad251Schristos GET_U_1((obj_tptr + 3)) + (256 * RSVP_OBJ_RRO)), 1148c74ad251Schristos GET_U_1((obj_tptr + 3)), 1149c74ad251Schristos GET_BE_U_4(obj_tptr + 4)); 11500f74e101Schristos } 1151c74ad251Schristos obj_tlen-=length; 1152c74ad251Schristos obj_tptr+=length; 11530f74e101Schristos } 11540f74e101Schristos break; 11550f74e101Schristos default: 11560f74e101Schristos hexdump=TRUE; 11570f74e101Schristos } 11580f74e101Schristos break; 11590f74e101Schristos 11600f74e101Schristos case RSVP_OBJ_HELLO: 11610f74e101Schristos switch(rsvp_obj_ctype) { 11620f74e101Schristos case RSVP_CTYPE_1: 11630f74e101Schristos case RSVP_CTYPE_2: 11640f74e101Schristos if (obj_tlen < 8) 1165c74ad251Schristos goto obj_tooshort; 1166c74ad251Schristos ND_PRINT("%s Source Instance: 0x%08x, Destination Instance: 0x%08x", 1167c74ad251Schristos indent, 1168c74ad251Schristos GET_BE_U_4(obj_tptr), 1169c74ad251Schristos GET_BE_U_4(obj_tptr + 4)); 11700f74e101Schristos obj_tlen-=8; 11710f74e101Schristos obj_tptr+=8; 11720f74e101Schristos break; 11730f74e101Schristos default: 11740f74e101Schristos hexdump=TRUE; 11750f74e101Schristos } 11760f74e101Schristos break; 11770f74e101Schristos 11780f74e101Schristos case RSVP_OBJ_RESTART_CAPABILITY: 11790f74e101Schristos switch(rsvp_obj_ctype) { 11800f74e101Schristos case RSVP_CTYPE_1: 11810f74e101Schristos if (obj_tlen < 8) 1182c74ad251Schristos goto obj_tooshort; 1183c74ad251Schristos ND_PRINT("%s Restart Time: %ums, Recovery Time: %ums", 1184c74ad251Schristos indent, 1185c74ad251Schristos GET_BE_U_4(obj_tptr), 1186c74ad251Schristos GET_BE_U_4(obj_tptr + 4)); 11870f74e101Schristos obj_tlen-=8; 11880f74e101Schristos obj_tptr+=8; 11890f74e101Schristos break; 11900f74e101Schristos default: 11910f74e101Schristos hexdump=TRUE; 11920f74e101Schristos } 11930f74e101Schristos break; 11940f74e101Schristos 1195c74ad251Schristos case RSVP_OBJ_CAPABILITY: 1196c74ad251Schristos switch(rsvp_obj_ctype) { 1197c74ad251Schristos case RSVP_CTYPE_1: 1198c74ad251Schristos if (obj_tlen < 4) 1199c74ad251Schristos goto obj_tooshort; 1200c74ad251Schristos uint32_t unused_and_flags = GET_BE_U_4(obj_tptr); 1201c74ad251Schristos if (unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK) 1202c74ad251Schristos ND_PRINT("%s [reserved=0x%08x must be zero]", indent, 1203c74ad251Schristos unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK); 1204c74ad251Schristos ND_PRINT("%s Flags: [%s]", 1205c74ad251Schristos indent, 1206c74ad251Schristos bittok2str(rsvp_obj_capability_flag_values, 1207c74ad251Schristos "none", 1208c74ad251Schristos (unused_and_flags & RSVP_OBJ_CAPABILITY_FLAGS_MASK))); 1209c74ad251Schristos obj_tlen-=4; 1210c74ad251Schristos obj_tptr+=4; 1211c74ad251Schristos break; 1212c74ad251Schristos default: 1213c74ad251Schristos hexdump=TRUE; 1214c74ad251Schristos } 1215c74ad251Schristos break; 1216c74ad251Schristos 12170f74e101Schristos case RSVP_OBJ_SESSION_ATTRIBUTE: 12180f74e101Schristos switch(rsvp_obj_ctype) { 12190f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: 12200f74e101Schristos if (obj_tlen < 4) 1221c74ad251Schristos goto obj_tooshort; 1222c74ad251Schristos namelen = GET_U_1(obj_tptr + 3); 12230f74e101Schristos if (obj_tlen < 4+namelen) 1224c74ad251Schristos goto obj_tooshort; 1225c74ad251Schristos ND_PRINT("%s Session Name: ", indent); 12260f74e101Schristos for (i = 0; i < namelen; i++) 1227c74ad251Schristos fn_print_char(ndo, GET_U_1(obj_tptr + 4 + i)); 1228c74ad251Schristos ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)", 1229c74ad251Schristos indent, 1230c74ad251Schristos GET_U_1(obj_tptr), 1231c74ad251Schristos GET_U_1(obj_tptr + 1), 12320f74e101Schristos bittok2str(rsvp_session_attribute_flag_values, 12330f74e101Schristos "none", 1234c74ad251Schristos GET_U_1((obj_tptr + 2))), 1235c74ad251Schristos GET_U_1(obj_tptr + 2)); 1236c74ad251Schristos obj_tlen-=4+namelen; 1237c74ad251Schristos obj_tptr+=4+namelen; 12380f74e101Schristos break; 12390f74e101Schristos default: 12400f74e101Schristos hexdump=TRUE; 12410f74e101Schristos } 12420f74e101Schristos break; 12430f74e101Schristos 12440f74e101Schristos case RSVP_OBJ_GENERALIZED_UNI: 12450f74e101Schristos switch(rsvp_obj_ctype) { 1246c74ad251Schristos u_int subobj_type,af,subobj_len,total_subobj_len; 12470f74e101Schristos 12480f74e101Schristos case RSVP_CTYPE_1: 12490f74e101Schristos 12500f74e101Schristos if (obj_tlen < 4) 1251c74ad251Schristos goto obj_tooshort; 12520f74e101Schristos 12530f74e101Schristos /* read variable length subobjects */ 12540f74e101Schristos total_subobj_len = obj_tlen; 12550f74e101Schristos while(total_subobj_len > 0) { 125672c96ff3Schristos /* If RFC 3476 Section 3.1 defined that a sub-object of the 125772c96ff3Schristos * GENERALIZED_UNI RSVP object must have the Length field as 125872c96ff3Schristos * a multiple of 4, instead of the check below it would be 125972c96ff3Schristos * better to test total_subobj_len only once before the loop. 126072c96ff3Schristos * So long as it does not define it and this while loop does 126172c96ff3Schristos * not implement such a requirement, let's accept that within 126272c96ff3Schristos * each iteration subobj_len may happen to be a multiple of 1 126372c96ff3Schristos * and test it and total_subobj_len respectively. 126472c96ff3Schristos */ 126572c96ff3Schristos if (total_subobj_len < 4) 126672c96ff3Schristos goto invalid; 1267c74ad251Schristos subobj_len = GET_BE_U_2(obj_tptr); 1268c74ad251Schristos subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8; 1269c74ad251Schristos af = (GET_BE_U_2(obj_tptr + 2))&0x00FF; 12700f74e101Schristos 1271c74ad251Schristos ND_PRINT("%s Subobject Type: %s (%u), AF: %s (%u), length: %u", 1272c74ad251Schristos indent, 12730f74e101Schristos tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type), 12740f74e101Schristos subobj_type, 12750f74e101Schristos tok2str(af_values, "Unknown", af), af, 1276c74ad251Schristos subobj_len); 12770f74e101Schristos 127872c96ff3Schristos /* In addition to what is explained above, the same spec does not 127972c96ff3Schristos * explicitly say that the same Length field includes the 4-octet 128072c96ff3Schristos * sub-object header, but as long as this while loop implements it 128172c96ff3Schristos * as it does include, let's keep the check below consistent with 128272c96ff3Schristos * the rest of the code. 1283c74ad251Schristos * 1284c74ad251Schristos * XXX - RFC 3476 Section 3.1 says "The contents of these 1285c74ad251Schristos * sub-objects are described in [8]", where [8] is 1286c74ad251Schristos * UNI 1.0 Signaling Specification, The Optical 1287c74ad251Schristos * Internetworking Forum. The URL they give for that 1288c74ad251Schristos * document is 1289c74ad251Schristos * 1290c74ad251Schristos * http://www.oiforum.com/public/UNI_1.0_ia.html 1291c74ad251Schristos * 1292c74ad251Schristos * but that doesn't work; the new URL appears to be 1293c74ad251Schristos * 1294c74ad251Schristos * https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf 1295c74ad251Schristos * 1296c74ad251Schristos * and *that* document, in section 12.5.2.3 1297c74ad251Schristos * "GENERALIZED_UNI Object (Class-Num=11bbbbbb (TBA))", 1298c74ad251Schristos * says nothing about the length field in general, but 1299c74ad251Schristos * some of the examples it gives in subsections have 1300c74ad251Schristos * length field values that clearly includes the length 1301c74ad251Schristos * of the sub-object header as well as the length of the 1302c74ad251Schristos * value. 130372c96ff3Schristos */ 1304c74ad251Schristos if(subobj_len < 4 || subobj_len > total_subobj_len || 1305c74ad251Schristos obj_tlen < subobj_len) 1306fdccd7e4Schristos goto invalid; 1307fdccd7e4Schristos 13080f74e101Schristos switch(subobj_type) { 13090f74e101Schristos case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS: 13100f74e101Schristos case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS: 13110f74e101Schristos 13120f74e101Schristos switch(af) { 13130f74e101Schristos case AFNUM_INET: 13140f74e101Schristos if (subobj_len < 8) 1315c74ad251Schristos goto subobj_tooshort; 1316c74ad251Schristos ND_PRINT("%s UNI IPv4 TNA address: %s", 1317c74ad251Schristos indent, GET_IPADDR_STRING(obj_tptr + 4)); 13180f74e101Schristos break; 13190f74e101Schristos case AFNUM_INET6: 13200f74e101Schristos if (subobj_len < 20) 1321c74ad251Schristos goto subobj_tooshort; 1322c74ad251Schristos ND_PRINT("%s UNI IPv6 TNA address: %s", 1323c74ad251Schristos indent, GET_IP6ADDR_STRING(obj_tptr + 4)); 13240f74e101Schristos break; 13250f74e101Schristos case AFNUM_NSAP: 13260f74e101Schristos if (subobj_len) { 13270f74e101Schristos /* unless we have a TLV parser lets just hexdump */ 13280f74e101Schristos hexdump=TRUE; 13290f74e101Schristos } 13300f74e101Schristos break; 13310f74e101Schristos } 13320f74e101Schristos break; 13330f74e101Schristos 13340f74e101Schristos case RSVP_GEN_UNI_SUBOBJ_DIVERSITY: 1335c74ad251Schristos if (subobj_len > 4) { 13360f74e101Schristos /* unless we have a TLV parser lets just hexdump */ 13370f74e101Schristos hexdump=TRUE; 13380f74e101Schristos } 13390f74e101Schristos break; 13400f74e101Schristos 13410f74e101Schristos case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL: 13420f74e101Schristos if (subobj_len < 16) { 1343c74ad251Schristos goto subobj_tooshort; 13440f74e101Schristos } 13450f74e101Schristos 1346c74ad251Schristos ND_PRINT("%s U-bit: %x, Label type: %u, Logical port id: %u, Label: %u", 1347c74ad251Schristos indent, 1348c74ad251Schristos ((GET_BE_U_4(obj_tptr + 4))>>31), 1349c74ad251Schristos ((GET_BE_U_4(obj_tptr + 4))&0xFF), 1350c74ad251Schristos GET_BE_U_4(obj_tptr + 8), 1351c74ad251Schristos GET_BE_U_4(obj_tptr + 12)); 13520f74e101Schristos break; 13530f74e101Schristos 13540f74e101Schristos case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL: 13550f74e101Schristos if (subobj_len < 8) { 1356c74ad251Schristos goto subobj_tooshort; 13570f74e101Schristos } 13580f74e101Schristos 1359c74ad251Schristos ND_PRINT("%s Service level: %u", 1360c74ad251Schristos indent, (GET_BE_U_4(obj_tptr + 4)) >> 24); 13610f74e101Schristos break; 13620f74e101Schristos 13630f74e101Schristos default: 13640f74e101Schristos hexdump=TRUE; 13650f74e101Schristos break; 13660f74e101Schristos } 13670f74e101Schristos total_subobj_len-=subobj_len; 13680f74e101Schristos obj_tptr+=subobj_len; 13690f74e101Schristos obj_tlen+=subobj_len; 13700f74e101Schristos } 13710f74e101Schristos break; 13720f74e101Schristos 13730f74e101Schristos default: 13740f74e101Schristos hexdump=TRUE; 13750f74e101Schristos } 13760f74e101Schristos break; 13770f74e101Schristos 13780f74e101Schristos case RSVP_OBJ_RSVP_HOP: 13790f74e101Schristos switch(rsvp_obj_ctype) { 13800f74e101Schristos case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */ 13810f74e101Schristos case RSVP_CTYPE_IPV4: 13820f74e101Schristos if (obj_tlen < 8) 1383c74ad251Schristos goto obj_tooshort; 1384c74ad251Schristos ND_PRINT("%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x", 1385c74ad251Schristos indent, 1386c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1387c74ad251Schristos GET_BE_U_4(obj_tptr + 4)); 13880f74e101Schristos obj_tlen-=8; 13890f74e101Schristos obj_tptr+=8; 13900f74e101Schristos if (obj_tlen) 13910f74e101Schristos hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */ 13920f74e101Schristos break; 13930f74e101Schristos case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */ 13940f74e101Schristos case RSVP_CTYPE_IPV6: 13950f74e101Schristos if (obj_tlen < 20) 1396c74ad251Schristos goto obj_tooshort; 1397c74ad251Schristos ND_PRINT("%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x", 1398c74ad251Schristos indent, 1399c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 1400c74ad251Schristos GET_BE_U_4(obj_tptr + 16)); 14010f74e101Schristos obj_tlen-=20; 14020f74e101Schristos obj_tptr+=20; 14030f74e101Schristos hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */ 14040f74e101Schristos break; 14050f74e101Schristos default: 14060f74e101Schristos hexdump=TRUE; 14070f74e101Schristos } 14080f74e101Schristos break; 14090f74e101Schristos 14100f74e101Schristos case RSVP_OBJ_TIME_VALUES: 14110f74e101Schristos switch(rsvp_obj_ctype) { 14120f74e101Schristos case RSVP_CTYPE_1: 14130f74e101Schristos if (obj_tlen < 4) 1414c74ad251Schristos goto obj_tooshort; 1415c74ad251Schristos ND_PRINT("%s Refresh Period: %ums", 1416c74ad251Schristos indent, 1417c74ad251Schristos GET_BE_U_4(obj_tptr)); 14180f74e101Schristos obj_tlen-=4; 14190f74e101Schristos obj_tptr+=4; 14200f74e101Schristos break; 14210f74e101Schristos default: 14220f74e101Schristos hexdump=TRUE; 14230f74e101Schristos } 14240f74e101Schristos break; 14250f74e101Schristos 14260f74e101Schristos /* those three objects do share the same semantics */ 14270f74e101Schristos case RSVP_OBJ_SENDER_TSPEC: 14280f74e101Schristos case RSVP_OBJ_ADSPEC: 14290f74e101Schristos case RSVP_OBJ_FLOWSPEC: 14300f74e101Schristos switch(rsvp_obj_ctype) { 14310f74e101Schristos case RSVP_CTYPE_2: 14320f74e101Schristos if (obj_tlen < 4) 1433c74ad251Schristos goto obj_tooshort; 1434c74ad251Schristos ND_PRINT("%s Msg-Version: %u, length: %u", 1435c74ad251Schristos indent, 1436c74ad251Schristos (GET_U_1(obj_tptr) & 0xf0) >> 4, 1437c74ad251Schristos GET_BE_U_2(obj_tptr + 2) << 2); 14380f74e101Schristos obj_tptr+=4; /* get to the start of the service header */ 14390f74e101Schristos obj_tlen-=4; 14400f74e101Schristos 14410f74e101Schristos while (obj_tlen >= 4) { 1442c74ad251Schristos intserv_serv_tlen=GET_BE_U_2(obj_tptr + 2)<<2; 1443c74ad251Schristos ND_PRINT("%s Service Type: %s (%u), break bit %sset, Service length: %u", 1444c74ad251Schristos indent, 1445c74ad251Schristos tok2str(rsvp_intserv_service_type_values,"unknown",GET_U_1((obj_tptr))), 1446c74ad251Schristos GET_U_1(obj_tptr), 1447c74ad251Schristos (GET_U_1(obj_tptr + 1)&0x80) ? "" : "not ", 1448c74ad251Schristos intserv_serv_tlen); 14490f74e101Schristos 14500f74e101Schristos obj_tptr+=4; /* get to the start of the parameter list */ 14510f74e101Schristos obj_tlen-=4; 14520f74e101Schristos 14530f74e101Schristos while (intserv_serv_tlen>=4) { 1454b3a00663Schristos processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen); 14550f74e101Schristos if (processed == 0) 14560f74e101Schristos break; 14570f74e101Schristos obj_tlen-=processed; 14580f74e101Schristos intserv_serv_tlen-=processed; 14590f74e101Schristos obj_tptr+=processed; 14600f74e101Schristos } 14610f74e101Schristos } 14620f74e101Schristos break; 14630f74e101Schristos default: 14640f74e101Schristos hexdump=TRUE; 14650f74e101Schristos } 14660f74e101Schristos break; 14670f74e101Schristos 14680f74e101Schristos case RSVP_OBJ_FILTERSPEC: 14690f74e101Schristos switch(rsvp_obj_ctype) { 14700f74e101Schristos case RSVP_CTYPE_IPV4: 14710f74e101Schristos if (obj_tlen < 8) 1472c74ad251Schristos goto obj_tooshort; 1473c74ad251Schristos ND_PRINT("%s Source Address: %s, Source Port: %u", 1474c74ad251Schristos indent, 1475c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1476c74ad251Schristos GET_BE_U_2(obj_tptr + 6)); 14770f74e101Schristos obj_tlen-=8; 14780f74e101Schristos obj_tptr+=8; 14790f74e101Schristos break; 14800f74e101Schristos case RSVP_CTYPE_IPV6: 14810f74e101Schristos if (obj_tlen < 20) 1482c74ad251Schristos goto obj_tooshort; 1483c74ad251Schristos ND_PRINT("%s Source Address: %s, Source Port: %u", 1484c74ad251Schristos indent, 1485c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 1486c74ad251Schristos GET_BE_U_2(obj_tptr + 18)); 14870f74e101Schristos obj_tlen-=20; 14880f74e101Schristos obj_tptr+=20; 14890f74e101Schristos break; 14900f74e101Schristos case RSVP_CTYPE_3: 14910f74e101Schristos if (obj_tlen < 20) 1492c74ad251Schristos goto obj_tooshort; 1493c74ad251Schristos ND_PRINT("%s Source Address: %s, Flow Label: %u", 1494c74ad251Schristos indent, 1495c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 1496c74ad251Schristos GET_BE_U_3(obj_tptr + 17)); 14970f74e101Schristos obj_tlen-=20; 14980f74e101Schristos obj_tptr+=20; 14990f74e101Schristos break; 15000f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV6: 15010f74e101Schristos if (obj_tlen < 20) 1502c74ad251Schristos goto obj_tooshort; 1503c74ad251Schristos ND_PRINT("%s Source Address: %s, LSP-ID: 0x%04x", 1504c74ad251Schristos indent, 1505c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1506c74ad251Schristos GET_BE_U_2(obj_tptr + 18)); 15070f74e101Schristos obj_tlen-=20; 15080f74e101Schristos obj_tptr+=20; 15090f74e101Schristos break; 15100f74e101Schristos case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */ 15110f74e101Schristos if (obj_tlen < 40) 1512c74ad251Schristos goto obj_tooshort; 1513c74ad251Schristos ND_PRINT("%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x" 15140f74e101Schristos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x", 1515c74ad251Schristos indent, 1516c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 1517c74ad251Schristos GET_BE_U_2(obj_tptr + 18), 1518c74ad251Schristos indent, 1519c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr+20), 1520c74ad251Schristos GET_BE_U_2(obj_tptr + 38)); 15210f74e101Schristos obj_tlen-=40; 15220f74e101Schristos obj_tptr+=40; 15230f74e101Schristos break; 15240f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: 15250f74e101Schristos if (obj_tlen < 8) 1526c74ad251Schristos goto obj_tooshort; 1527c74ad251Schristos ND_PRINT("%s Source Address: %s, LSP-ID: 0x%04x", 1528c74ad251Schristos indent, 1529c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1530c74ad251Schristos GET_BE_U_2(obj_tptr + 6)); 15310f74e101Schristos obj_tlen-=8; 15320f74e101Schristos obj_tptr+=8; 15330f74e101Schristos break; 15340f74e101Schristos case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */ 15350f74e101Schristos if (obj_tlen < 16) 1536c74ad251Schristos goto obj_tooshort; 1537c74ad251Schristos ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x" 15380f74e101Schristos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x", 1539c74ad251Schristos indent, 1540c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1541c74ad251Schristos GET_BE_U_2(obj_tptr + 6), 1542c74ad251Schristos indent, 1543c74ad251Schristos GET_IPADDR_STRING(obj_tptr+8), 1544c74ad251Schristos GET_BE_U_2(obj_tptr + 12)); 15450f74e101Schristos obj_tlen-=16; 15460f74e101Schristos obj_tptr+=16; 15470f74e101Schristos break; 15480f74e101Schristos default: 15490f74e101Schristos hexdump=TRUE; 15500f74e101Schristos } 15510f74e101Schristos break; 15520f74e101Schristos 15530f74e101Schristos case RSVP_OBJ_FASTREROUTE: 15540f74e101Schristos /* the differences between c-type 1 and 7 are minor */ 15550f74e101Schristos obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr; 15560f74e101Schristos 15570f74e101Schristos switch(rsvp_obj_ctype) { 15580f74e101Schristos case RSVP_CTYPE_1: /* new style */ 15590f74e101Schristos if (obj_tlen < sizeof(struct rsvp_obj_frr_t)) 1560c74ad251Schristos goto obj_tooshort; 1561c74ad251Schristos bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth); 1562c74ad251Schristos ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps", 1563c74ad251Schristos indent, 1564c74ad251Schristos obj_ptr.rsvp_obj_frr->setup_prio, 1565c74ad251Schristos obj_ptr.rsvp_obj_frr->hold_prio, 1566c74ad251Schristos obj_ptr.rsvp_obj_frr->hop_limit, 1567c74ad251Schristos bw.f * 8 / 1000000); 1568c74ad251Schristos ND_PRINT("%s Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x", 1569c74ad251Schristos indent, 1570c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any), 1571c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any), 1572c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all)); 15730f74e101Schristos obj_tlen-=sizeof(struct rsvp_obj_frr_t); 15740f74e101Schristos obj_tptr+=sizeof(struct rsvp_obj_frr_t); 15750f74e101Schristos break; 15760f74e101Schristos 15770f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: /* old style */ 15780f74e101Schristos if (obj_tlen < 16) 1579c74ad251Schristos goto obj_tooshort; 1580c74ad251Schristos bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth); 1581c74ad251Schristos ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps", 1582c74ad251Schristos indent, 1583c74ad251Schristos obj_ptr.rsvp_obj_frr->setup_prio, 1584c74ad251Schristos obj_ptr.rsvp_obj_frr->hold_prio, 1585c74ad251Schristos obj_ptr.rsvp_obj_frr->hop_limit, 1586c74ad251Schristos bw.f * 8 / 1000000); 1587c74ad251Schristos ND_PRINT("%s Include Colors: 0x%08x, Exclude Colors: 0x%08x", 1588c74ad251Schristos indent, 1589c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any), 1590c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any)); 15910f74e101Schristos obj_tlen-=16; 15920f74e101Schristos obj_tptr+=16; 15930f74e101Schristos break; 15940f74e101Schristos 15950f74e101Schristos default: 15960f74e101Schristos hexdump=TRUE; 15970f74e101Schristos } 15980f74e101Schristos break; 15990f74e101Schristos 16000f74e101Schristos case RSVP_OBJ_DETOUR: 16010f74e101Schristos switch(rsvp_obj_ctype) { 16020f74e101Schristos case RSVP_CTYPE_TUNNEL_IPV4: 16030f74e101Schristos while(obj_tlen >= 8) { 1604c74ad251Schristos ND_PRINT("%s PLR-ID: %s, Avoid-Node-ID: %s", 1605c74ad251Schristos indent, 1606c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1607c74ad251Schristos GET_IPADDR_STRING(obj_tptr + 4)); 16080f74e101Schristos obj_tlen-=8; 16090f74e101Schristos obj_tptr+=8; 16100f74e101Schristos } 16110f74e101Schristos break; 16120f74e101Schristos default: 16130f74e101Schristos hexdump=TRUE; 16140f74e101Schristos } 16150f74e101Schristos break; 16160f74e101Schristos 16170f74e101Schristos case RSVP_OBJ_CLASSTYPE: 16180f74e101Schristos case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */ 16190f74e101Schristos switch(rsvp_obj_ctype) { 16200f74e101Schristos case RSVP_CTYPE_1: 1621c74ad251Schristos if (obj_tlen < 4) 1622c74ad251Schristos goto obj_tooshort; 1623c74ad251Schristos ND_PRINT("%s CT: %u", 1624c74ad251Schristos indent, 1625c74ad251Schristos GET_BE_U_4(obj_tptr) & 0x7); 16260f74e101Schristos obj_tlen-=4; 16270f74e101Schristos obj_tptr+=4; 16280f74e101Schristos break; 16290f74e101Schristos default: 16300f74e101Schristos hexdump=TRUE; 16310f74e101Schristos } 16320f74e101Schristos break; 16330f74e101Schristos 16340f74e101Schristos case RSVP_OBJ_ERROR_SPEC: 16350f74e101Schristos switch(rsvp_obj_ctype) { 16360f74e101Schristos case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */ 16370f74e101Schristos case RSVP_CTYPE_IPV4: 16380f74e101Schristos if (obj_tlen < 8) 1639c74ad251Schristos goto obj_tooshort; 1640c74ad251Schristos error_code=GET_U_1(obj_tptr + 5); 1641c74ad251Schristos error_value=GET_BE_U_2(obj_tptr + 6); 1642c74ad251Schristos ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)", 1643c74ad251Schristos indent, 1644c74ad251Schristos GET_IPADDR_STRING(obj_tptr), 1645c74ad251Schristos GET_U_1(obj_tptr + 4), 1646c74ad251Schristos indent, 16470f74e101Schristos tok2str(rsvp_obj_error_code_values,"unknown",error_code), 1648c74ad251Schristos error_code); 16490f74e101Schristos switch (error_code) { 16500f74e101Schristos case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING: 1651c74ad251Schristos ND_PRINT(", Error Value: %s (%u)", 16520f74e101Schristos tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value), 1653c74ad251Schristos error_value); 16540f74e101Schristos break; 16550f74e101Schristos case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */ 16560f74e101Schristos case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD: 1657c74ad251Schristos ND_PRINT(", Error Value: %s (%u)", 16580f74e101Schristos tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value), 1659c74ad251Schristos error_value); 16600f74e101Schristos break; 16610f74e101Schristos default: 1662c74ad251Schristos ND_PRINT(", Unknown Error Value (%u)", error_value); 16630f74e101Schristos break; 16640f74e101Schristos } 16650f74e101Schristos obj_tlen-=8; 16660f74e101Schristos obj_tptr+=8; 16670f74e101Schristos break; 16680f74e101Schristos case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */ 16690f74e101Schristos case RSVP_CTYPE_IPV6: 16700f74e101Schristos if (obj_tlen < 20) 1671c74ad251Schristos goto obj_tooshort; 1672c74ad251Schristos error_code=GET_U_1(obj_tptr + 17); 1673c74ad251Schristos error_value=GET_BE_U_2(obj_tptr + 18); 1674c74ad251Schristos ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)", 1675c74ad251Schristos indent, 1676c74ad251Schristos GET_IP6ADDR_STRING(obj_tptr), 1677c74ad251Schristos GET_U_1(obj_tptr + 16), 1678c74ad251Schristos indent, 16790f74e101Schristos tok2str(rsvp_obj_error_code_values,"unknown",error_code), 1680c74ad251Schristos error_code); 16810f74e101Schristos 16820f74e101Schristos switch (error_code) { 16830f74e101Schristos case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING: 1684c74ad251Schristos ND_PRINT(", Error Value: %s (%u)", 16850f74e101Schristos tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value), 1686c74ad251Schristos error_value); 16870f74e101Schristos break; 16880f74e101Schristos default: 16890f74e101Schristos break; 16900f74e101Schristos } 16910f74e101Schristos obj_tlen-=20; 16920f74e101Schristos obj_tptr+=20; 16930f74e101Schristos break; 16940f74e101Schristos default: 16950f74e101Schristos hexdump=TRUE; 16960f74e101Schristos } 16970f74e101Schristos break; 16980f74e101Schristos 16990f74e101Schristos case RSVP_OBJ_PROPERTIES: 17000f74e101Schristos switch(rsvp_obj_ctype) { 17010f74e101Schristos case RSVP_CTYPE_1: 17020f74e101Schristos if (obj_tlen < 4) 1703c74ad251Schristos goto obj_tooshort; 1704c74ad251Schristos padbytes = GET_BE_U_2(obj_tptr + 2); 1705c74ad251Schristos ND_PRINT("%s TLV count: %u, padding bytes: %u", 1706c74ad251Schristos indent, 1707c74ad251Schristos GET_BE_U_2(obj_tptr), 1708c74ad251Schristos padbytes); 17090f74e101Schristos obj_tlen-=4; 17100f74e101Schristos obj_tptr+=4; 17110f74e101Schristos /* loop through as long there is anything longer than the TLV header (2) */ 17120f74e101Schristos while(obj_tlen >= 2 + padbytes) { 1713c74ad251Schristos ND_PRINT("%s %s TLV (0x%02x), length: %u", /* length includes header */ 1714c74ad251Schristos indent, 1715c74ad251Schristos tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)), 1716c74ad251Schristos GET_U_1(obj_tptr), 1717c74ad251Schristos GET_U_1(obj_tptr + 1)); 1718c74ad251Schristos if (obj_tlen < GET_U_1(obj_tptr + 1)) 1719c74ad251Schristos goto obj_tooshort; 1720c74ad251Schristos if (GET_U_1(obj_tptr + 1) < 2) { 1721c74ad251Schristos ND_PRINT("%sERROR: property TLV is too short", indent); 17220f74e101Schristos return -1; 1723c74ad251Schristos } 1724c74ad251Schristos print_unknown_data(ndo, obj_tptr + 2, "\n\t\t", 1725c74ad251Schristos GET_U_1(obj_tptr + 1) - 2); 1726c74ad251Schristos obj_tlen-=GET_U_1(obj_tptr + 1); 1727c74ad251Schristos obj_tptr+=GET_U_1(obj_tptr + 1); 17280f74e101Schristos } 17290f74e101Schristos break; 17300f74e101Schristos default: 17310f74e101Schristos hexdump=TRUE; 17320f74e101Schristos } 17330f74e101Schristos break; 17340f74e101Schristos 17350f74e101Schristos case RSVP_OBJ_MESSAGE_ID: /* fall through */ 17360f74e101Schristos case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */ 17370f74e101Schristos case RSVP_OBJ_MESSAGE_ID_LIST: 17380f74e101Schristos switch(rsvp_obj_ctype) { 17390f74e101Schristos case RSVP_CTYPE_1: 17400f74e101Schristos case RSVP_CTYPE_2: 1741c74ad251Schristos if (obj_tlen < 4) 1742c74ad251Schristos goto obj_tooshort; 1743c74ad251Schristos ND_PRINT("%s Flags [0x%02x], epoch: %u", 1744c74ad251Schristos indent, 1745c74ad251Schristos GET_U_1(obj_tptr), 1746c74ad251Schristos GET_BE_U_3(obj_tptr + 1)); 17470f74e101Schristos obj_tlen-=4; 17480f74e101Schristos obj_tptr+=4; 17490f74e101Schristos /* loop through as long there are no messages left */ 17500f74e101Schristos while(obj_tlen >= 4) { 1751c74ad251Schristos ND_PRINT("%s Message-ID 0x%08x (%u)", 1752c74ad251Schristos indent, 1753c74ad251Schristos GET_BE_U_4(obj_tptr), 1754c74ad251Schristos GET_BE_U_4(obj_tptr)); 17550f74e101Schristos obj_tlen-=4; 17560f74e101Schristos obj_tptr+=4; 17570f74e101Schristos } 17580f74e101Schristos break; 17590f74e101Schristos default: 17600f74e101Schristos hexdump=TRUE; 17610f74e101Schristos } 17620f74e101Schristos break; 17630f74e101Schristos 17640f74e101Schristos case RSVP_OBJ_INTEGRITY: 17650f74e101Schristos switch(rsvp_obj_ctype) { 17660f74e101Schristos case RSVP_CTYPE_1: 17670f74e101Schristos if (obj_tlen < sizeof(struct rsvp_obj_integrity_t)) 1768c74ad251Schristos goto obj_tooshort; 17690f74e101Schristos obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr; 1770c74ad251Schristos ND_PRINT("%s Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]", 1771c74ad251Schristos indent, 1772c74ad251Schristos GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id), 1773c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2), 1774c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence), 1775c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4), 17760f74e101Schristos bittok2str(rsvp_obj_integrity_flag_values, 17770f74e101Schristos "none", 1778c74ad251Schristos obj_ptr.rsvp_obj_integrity->flags)); 1779c74ad251Schristos ND_PRINT("%s MD5-sum 0x%08x%08x%08x%08x ", 1780c74ad251Schristos indent, 1781c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest), 1782c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4), 1783c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8), 1784c74ad251Schristos GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12)); 17850f74e101Schristos 1786fdccd7e4Schristos sigcheck = signature_verify(ndo, pptr, plen, 1787fdccd7e4Schristos obj_ptr.rsvp_obj_integrity->digest, 1788fdccd7e4Schristos rsvp_clear_checksum, 1789fdccd7e4Schristos rsvp_com_header); 1790c74ad251Schristos ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck)); 17910f74e101Schristos 17920f74e101Schristos obj_tlen+=sizeof(struct rsvp_obj_integrity_t); 17930f74e101Schristos obj_tptr+=sizeof(struct rsvp_obj_integrity_t); 17940f74e101Schristos break; 17950f74e101Schristos default: 17960f74e101Schristos hexdump=TRUE; 17970f74e101Schristos } 17980f74e101Schristos break; 17990f74e101Schristos 18000f74e101Schristos case RSVP_OBJ_ADMIN_STATUS: 18010f74e101Schristos switch(rsvp_obj_ctype) { 18020f74e101Schristos case RSVP_CTYPE_1: 18030f74e101Schristos if (obj_tlen < 4) 1804c74ad251Schristos goto obj_tooshort; 1805c74ad251Schristos ND_PRINT("%s Flags [%s]", indent, 18060f74e101Schristos bittok2str(rsvp_obj_admin_status_flag_values, "none", 1807c74ad251Schristos GET_BE_U_4(obj_tptr))); 18080f74e101Schristos obj_tlen-=4; 18090f74e101Schristos obj_tptr+=4; 18100f74e101Schristos break; 18110f74e101Schristos default: 18120f74e101Schristos hexdump=TRUE; 18130f74e101Schristos } 18140f74e101Schristos break; 18150f74e101Schristos 18160f74e101Schristos case RSVP_OBJ_LABEL_SET: 18170f74e101Schristos switch(rsvp_obj_ctype) { 18180f74e101Schristos case RSVP_CTYPE_1: 18190f74e101Schristos if (obj_tlen < 4) 1820c74ad251Schristos goto obj_tooshort; 1821c74ad251Schristos action = (GET_BE_U_2(obj_tptr)>>8); 18220f74e101Schristos 1823c74ad251Schristos ND_PRINT("%s Action: %s (%u), Label type: %u", indent, 18240f74e101Schristos tok2str(rsvp_obj_label_set_action_values, "Unknown", action), 1825c74ad251Schristos action, (GET_BE_U_4(obj_tptr) & 0x7F)); 18260f74e101Schristos 18270f74e101Schristos switch (action) { 18280f74e101Schristos case LABEL_SET_INCLUSIVE_RANGE: 18290f74e101Schristos case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */ 18300f74e101Schristos 18310f74e101Schristos /* only a couple of subchannels are expected */ 18320f74e101Schristos if (obj_tlen < 12) 1833c74ad251Schristos goto obj_tooshort; 1834c74ad251Schristos ND_PRINT("%s Start range: %u, End range: %u", indent, 1835c74ad251Schristos GET_BE_U_4(obj_tptr + 4), 1836c74ad251Schristos GET_BE_U_4(obj_tptr + 8)); 18370f74e101Schristos obj_tlen-=12; 18380f74e101Schristos obj_tptr+=12; 18390f74e101Schristos break; 18400f74e101Schristos 18410f74e101Schristos default: 18420f74e101Schristos obj_tlen-=4; 18430f74e101Schristos obj_tptr+=4; 18440f74e101Schristos subchannel = 1; 18450f74e101Schristos while(obj_tlen >= 4 ) { 1846c74ad251Schristos ND_PRINT("%s Subchannel #%u: %u", indent, subchannel, 1847c74ad251Schristos GET_BE_U_4(obj_tptr)); 18480f74e101Schristos obj_tptr+=4; 18490f74e101Schristos obj_tlen-=4; 18500f74e101Schristos subchannel++; 18510f74e101Schristos } 18520f74e101Schristos break; 18530f74e101Schristos } 18540f74e101Schristos break; 18550f74e101Schristos default: 18560f74e101Schristos hexdump=TRUE; 18570f74e101Schristos } 1858c74ad251Schristos break; 18590f74e101Schristos 18600f74e101Schristos case RSVP_OBJ_S2L: 18610f74e101Schristos switch (rsvp_obj_ctype) { 18620f74e101Schristos case RSVP_CTYPE_IPV4: 18630f74e101Schristos if (obj_tlen < 4) 1864c74ad251Schristos goto obj_tooshort; 1865c74ad251Schristos ND_PRINT("%s Sub-LSP destination address: %s", 1866c74ad251Schristos indent, GET_IPADDR_STRING(obj_tptr)); 18670f74e101Schristos 18680f74e101Schristos obj_tlen-=4; 18690f74e101Schristos obj_tptr+=4; 18700f74e101Schristos break; 18710f74e101Schristos case RSVP_CTYPE_IPV6: 18720f74e101Schristos if (obj_tlen < 16) 1873c74ad251Schristos goto obj_tooshort; 1874c74ad251Schristos ND_PRINT("%s Sub-LSP destination address: %s", 1875c74ad251Schristos indent, GET_IP6ADDR_STRING(obj_tptr)); 18760f74e101Schristos 18770f74e101Schristos obj_tlen-=16; 18780f74e101Schristos obj_tptr+=16; 18790f74e101Schristos break; 18800f74e101Schristos default: 18810f74e101Schristos hexdump=TRUE; 18820f74e101Schristos } 1883c74ad251Schristos break; 18840f74e101Schristos 18850f74e101Schristos /* 18860f74e101Schristos * FIXME those are the defined objects that lack a decoder 18870f74e101Schristos * you are welcome to contribute code ;-) 18880f74e101Schristos */ 18890f74e101Schristos 18900f74e101Schristos case RSVP_OBJ_SCOPE: 18910f74e101Schristos case RSVP_OBJ_POLICY_DATA: 18920f74e101Schristos case RSVP_OBJ_ACCEPT_LABEL_SET: 18930f74e101Schristos case RSVP_OBJ_PROTECTION: 18940f74e101Schristos default: 1895b3a00663Schristos if (ndo->ndo_vflag <= 1) 1896b3a00663Schristos print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen); /* FIXME indentation */ 18970f74e101Schristos break; 18980f74e101Schristos } 18990f74e101Schristos /* do we also want to see a hex dump ? */ 1900b3a00663Schristos if (ndo->ndo_vflag > 1 || hexdump == TRUE) 1901b3a00663Schristos print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t ", /* FIXME indentation */ 19020f74e101Schristos rsvp_obj_len - sizeof(struct rsvp_object_header)); 19030f74e101Schristos 19040f74e101Schristos tptr+=rsvp_obj_len; 19050f74e101Schristos tlen-=rsvp_obj_len; 19060f74e101Schristos } 19070f74e101Schristos return 0; 1908c74ad251Schristos subobj_tooshort: 1909c74ad251Schristos ND_PRINT("%sERROR: sub-object is too short", indent); 1910c74ad251Schristos return -1; 1911c74ad251Schristos obj_tooshort: 1912c74ad251Schristos ND_PRINT("%sERROR: object is too short", indent); 1913c74ad251Schristos return -1; 1914fdccd7e4Schristos invalid: 1915c74ad251Schristos nd_print_invalid(ndo); 1916fdccd7e4Schristos return -1; 19170f74e101Schristos trunc: 1918c74ad251Schristos nd_print_trunc(ndo); 19190f74e101Schristos return -1; 19200f74e101Schristos } 19210f74e101Schristos 19220f74e101Schristos void 1923b3a00663Schristos rsvp_print(netdissect_options *ndo, 1924c74ad251Schristos const u_char *pptr, u_int len) 1925ba2ff121Schristos { 1926fdccd7e4Schristos const struct rsvp_common_header *rsvp_com_header; 1927c74ad251Schristos uint8_t version_flags, msg_type; 1928fdccd7e4Schristos const u_char *tptr; 1929fdccd7e4Schristos u_short plen, tlen; 19300f74e101Schristos 1931c74ad251Schristos ndo->ndo_protocol = "rsvp"; 19320f74e101Schristos tptr=pptr; 19330f74e101Schristos 1934fdccd7e4Schristos rsvp_com_header = (const struct rsvp_common_header *)pptr; 1935c74ad251Schristos ND_TCHECK_SIZE(rsvp_com_header); 1936c74ad251Schristos version_flags = GET_U_1(rsvp_com_header->version_flags); 19370f74e101Schristos 19380f74e101Schristos /* 19390f74e101Schristos * Sanity checking of the header. 19400f74e101Schristos */ 1941c74ad251Schristos if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) { 1942c74ad251Schristos ND_PRINT("ERROR: RSVP version %u packet not supported", 1943c74ad251Schristos RSVP_EXTRACT_VERSION(version_flags)); 19440f74e101Schristos return; 19450f74e101Schristos } 19460f74e101Schristos 1947c74ad251Schristos msg_type = GET_U_1(rsvp_com_header->msg_type); 1948c74ad251Schristos 19490f74e101Schristos /* in non-verbose mode just lets print the basic Message Type*/ 1950b3a00663Schristos if (ndo->ndo_vflag < 1) { 1951c74ad251Schristos ND_PRINT("RSVPv%u %s Message, length: %u", 1952c74ad251Schristos RSVP_EXTRACT_VERSION(version_flags), 1953c74ad251Schristos tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type), 1954c74ad251Schristos len); 19550f74e101Schristos return; 19560f74e101Schristos } 19570f74e101Schristos 19580f74e101Schristos /* ok they seem to want to know everything - lets fully decode it */ 19590f74e101Schristos 1960c74ad251Schristos plen = tlen = GET_BE_U_2(rsvp_com_header->length); 19610f74e101Schristos 1962c74ad251Schristos ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x", 1963c74ad251Schristos RSVP_EXTRACT_VERSION(version_flags), 1964c74ad251Schristos tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type), 1965c74ad251Schristos msg_type, 1966c74ad251Schristos bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)), 19670f74e101Schristos tlen, 1968c74ad251Schristos GET_U_1(rsvp_com_header->ttl), 1969c74ad251Schristos GET_BE_U_2(rsvp_com_header->checksum)); 19700f74e101Schristos 1971c74ad251Schristos if (tlen < sizeof(struct rsvp_common_header)) { 1972c74ad251Schristos ND_PRINT("ERROR: common header too short %u < %zu", tlen, 1973c74ad251Schristos sizeof(struct rsvp_common_header)); 19740f74e101Schristos return; 19750f74e101Schristos } 19760f74e101Schristos 1977c74ad251Schristos tptr+=sizeof(struct rsvp_common_header); 1978c74ad251Schristos tlen-=sizeof(struct rsvp_common_header); 19790f74e101Schristos 1980c74ad251Schristos switch(msg_type) { 19810f74e101Schristos 1982fdccd7e4Schristos case RSVP_MSGTYPE_BUNDLE: 1983fdccd7e4Schristos /* 1984fdccd7e4Schristos * Process each submessage in the bundle message. 1985fdccd7e4Schristos * Bundle messages may not contain bundle submessages, so we don't 1986fdccd7e4Schristos * need to handle bundle submessages specially. 1987fdccd7e4Schristos */ 19880f74e101Schristos while(tlen > 0) { 1989fdccd7e4Schristos const u_char *subpptr=tptr, *subtptr; 1990fdccd7e4Schristos u_short subplen, subtlen; 1991fdccd7e4Schristos 1992fdccd7e4Schristos subtptr=subpptr; 1993fdccd7e4Schristos 1994fdccd7e4Schristos rsvp_com_header = (const struct rsvp_common_header *)subpptr; 1995c74ad251Schristos ND_TCHECK_SIZE(rsvp_com_header); 1996c74ad251Schristos version_flags = GET_U_1(rsvp_com_header->version_flags); 19970f74e101Schristos 19980f74e101Schristos /* 19990f74e101Schristos * Sanity checking of the header. 20000f74e101Schristos */ 2001c74ad251Schristos if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) { 2002c74ad251Schristos ND_PRINT("ERROR: RSVP version %u packet not supported", 2003c74ad251Schristos RSVP_EXTRACT_VERSION(version_flags)); 20040f74e101Schristos return; 20050f74e101Schristos } 2006fdccd7e4Schristos 2007c74ad251Schristos subplen = subtlen = GET_BE_U_2(rsvp_com_header->length); 20080f74e101Schristos 2009c74ad251Schristos msg_type = GET_U_1(rsvp_com_header->msg_type); 2010c74ad251Schristos ND_PRINT("\n\t RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x", 2011c74ad251Schristos RSVP_EXTRACT_VERSION(version_flags), 2012c74ad251Schristos tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type), 2013c74ad251Schristos msg_type, 2014c74ad251Schristos bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)), 20150f74e101Schristos subtlen, 2016c74ad251Schristos GET_U_1(rsvp_com_header->ttl), 2017c74ad251Schristos GET_BE_U_2(rsvp_com_header->checksum)); 20180f74e101Schristos 2019c74ad251Schristos if (subtlen < sizeof(struct rsvp_common_header)) { 2020c74ad251Schristos ND_PRINT("ERROR: common header too short %u < %zu", subtlen, 2021c74ad251Schristos sizeof(struct rsvp_common_header)); 20220f74e101Schristos return; 20230f74e101Schristos } 20240f74e101Schristos 20250f74e101Schristos if (tlen < subtlen) { 2026c74ad251Schristos ND_PRINT("ERROR: common header too large %u > %u", subtlen, 2027c74ad251Schristos tlen); 20280f74e101Schristos return; 20290f74e101Schristos } 20300f74e101Schristos 2031c74ad251Schristos subtptr+=sizeof(struct rsvp_common_header); 2032c74ad251Schristos subtlen-=sizeof(struct rsvp_common_header); 20330f74e101Schristos 2034fdccd7e4Schristos /* 2035fdccd7e4Schristos * Print all objects in the submessage. 2036fdccd7e4Schristos */ 2037fdccd7e4Schristos if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t ", subtlen, rsvp_com_header) == -1) 20380f74e101Schristos return; 20390f74e101Schristos 2040c74ad251Schristos tptr+=subtlen+sizeof(struct rsvp_common_header); 2041c74ad251Schristos tlen-=subtlen+sizeof(struct rsvp_common_header); 20420f74e101Schristos } 20430f74e101Schristos 20440f74e101Schristos break; 20450f74e101Schristos 20460f74e101Schristos case RSVP_MSGTYPE_PATH: 20470f74e101Schristos case RSVP_MSGTYPE_RESV: 20480f74e101Schristos case RSVP_MSGTYPE_PATHERR: 20490f74e101Schristos case RSVP_MSGTYPE_RESVERR: 20500f74e101Schristos case RSVP_MSGTYPE_PATHTEAR: 20510f74e101Schristos case RSVP_MSGTYPE_RESVTEAR: 20520f74e101Schristos case RSVP_MSGTYPE_RESVCONF: 20530f74e101Schristos case RSVP_MSGTYPE_HELLO_OLD: 20540f74e101Schristos case RSVP_MSGTYPE_HELLO: 20550f74e101Schristos case RSVP_MSGTYPE_ACK: 20560f74e101Schristos case RSVP_MSGTYPE_SREFRESH: 2057fdccd7e4Schristos /* 2058fdccd7e4Schristos * Print all objects in the message. 2059fdccd7e4Schristos */ 2060fdccd7e4Schristos if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t ", tlen, rsvp_com_header) == -1) 20610f74e101Schristos return; 20620f74e101Schristos break; 20630f74e101Schristos 20640f74e101Schristos default: 2065b3a00663Schristos print_unknown_data(ndo, tptr, "\n\t ", tlen); 20660f74e101Schristos break; 20670f74e101Schristos } 20680f74e101Schristos 20690f74e101Schristos return; 20700f74e101Schristos trunc: 2071c74ad251Schristos nd_print_trunc(ndo); 20720f74e101Schristos } 2073