141c99275SPeter Avalos /*
241c99275SPeter Avalos * Copyright (c) 1998-2007 The TCPDUMP project
341c99275SPeter Avalos *
441c99275SPeter Avalos * Redistribution and use in source and binary forms, with or without
541c99275SPeter Avalos * modification, are permitted provided that: (1) source code
641c99275SPeter Avalos * distributions retain the above copyright notice and this paragraph
741c99275SPeter Avalos * in its entirety, and (2) distributions including binary code include
841c99275SPeter Avalos * the above copyright notice and this paragraph in its entirety in
941c99275SPeter Avalos * the documentation or other materials provided with the distribution.
1041c99275SPeter Avalos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1141c99275SPeter Avalos * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1241c99275SPeter Avalos * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1341c99275SPeter Avalos * FOR A PARTICULAR PURPOSE.
1441c99275SPeter Avalos *
15411677aeSAaron LI * Original code by Hannes Gredler (hannes@gredler.at)
1641c99275SPeter Avalos */
1741c99275SPeter Avalos
18411677aeSAaron LI /* \summary: Resource ReSerVation Protocol (RSVP) printer */
1941c99275SPeter Avalos
20*ed775ee7SAntonio Huete Jimenez /* specification: RFC 2205 */
21*ed775ee7SAntonio Huete Jimenez
2241c99275SPeter Avalos #ifdef HAVE_CONFIG_H
23*ed775ee7SAntonio Huete Jimenez #include <config.h>
2441c99275SPeter Avalos #endif
2541c99275SPeter Avalos
26*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
2741c99275SPeter Avalos
28411677aeSAaron LI #include "netdissect.h"
2941c99275SPeter Avalos #include "extract.h"
3041c99275SPeter Avalos #include "addrtoname.h"
3141c99275SPeter Avalos #include "ethertype.h"
3241c99275SPeter Avalos #include "gmpls.h"
3341c99275SPeter Avalos #include "af.h"
3427bfbee1SPeter Avalos #include "signature.h"
3541c99275SPeter Avalos
36411677aeSAaron LI
3741c99275SPeter Avalos /*
3841c99275SPeter Avalos * RFC 2205 common header
3941c99275SPeter Avalos *
4041c99275SPeter Avalos * 0 1 2 3
4141c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
4241c99275SPeter Avalos * | Vers | Flags| Msg Type | RSVP Checksum |
4341c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
4441c99275SPeter Avalos * | Send_TTL | (Reserved) | RSVP Length |
4541c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
4641c99275SPeter Avalos *
4741c99275SPeter Avalos */
4841c99275SPeter Avalos
4941c99275SPeter Avalos struct rsvp_common_header {
50*ed775ee7SAntonio Huete Jimenez nd_uint8_t version_flags;
51*ed775ee7SAntonio Huete Jimenez nd_uint8_t msg_type;
52*ed775ee7SAntonio Huete Jimenez nd_uint16_t checksum;
53*ed775ee7SAntonio Huete Jimenez nd_uint8_t ttl;
54*ed775ee7SAntonio Huete Jimenez nd_byte reserved[1];
55*ed775ee7SAntonio Huete Jimenez nd_uint16_t length;
5641c99275SPeter Avalos };
5741c99275SPeter Avalos
5841c99275SPeter Avalos /*
5941c99275SPeter Avalos * RFC2205 object header
6041c99275SPeter Avalos *
6141c99275SPeter Avalos *
6241c99275SPeter Avalos * 0 1 2 3
6341c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
6441c99275SPeter Avalos * | Length (bytes) | Class-Num | C-Type |
6541c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
6641c99275SPeter Avalos * | |
6741c99275SPeter Avalos * // (Object contents) //
6841c99275SPeter Avalos * | |
6941c99275SPeter Avalos * +-------------+-------------+-------------+-------------+
7041c99275SPeter Avalos */
7141c99275SPeter Avalos
7241c99275SPeter Avalos struct rsvp_object_header {
73*ed775ee7SAntonio Huete Jimenez nd_uint16_t length;
74*ed775ee7SAntonio Huete Jimenez nd_uint8_t class_num;
75*ed775ee7SAntonio Huete Jimenez nd_uint8_t ctype;
7641c99275SPeter Avalos };
7741c99275SPeter Avalos
7841c99275SPeter Avalos #define RSVP_VERSION 1
7941c99275SPeter Avalos #define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
8041c99275SPeter Avalos #define RSVP_EXTRACT_FLAGS(x) ((x)&0x0f)
8141c99275SPeter Avalos
8241c99275SPeter Avalos #define RSVP_MSGTYPE_PATH 1
8341c99275SPeter Avalos #define RSVP_MSGTYPE_RESV 2
8441c99275SPeter Avalos #define RSVP_MSGTYPE_PATHERR 3
8541c99275SPeter Avalos #define RSVP_MSGTYPE_RESVERR 4
8641c99275SPeter Avalos #define RSVP_MSGTYPE_PATHTEAR 5
8741c99275SPeter Avalos #define RSVP_MSGTYPE_RESVTEAR 6
8841c99275SPeter Avalos #define RSVP_MSGTYPE_RESVCONF 7
89411677aeSAaron LI #define RSVP_MSGTYPE_BUNDLE 12
9041c99275SPeter Avalos #define RSVP_MSGTYPE_ACK 13
9141c99275SPeter Avalos #define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */
9241c99275SPeter Avalos #define RSVP_MSGTYPE_SREFRESH 15
9341c99275SPeter Avalos #define RSVP_MSGTYPE_HELLO 20
9441c99275SPeter Avalos
9541c99275SPeter Avalos static const struct tok rsvp_msg_type_values[] = {
9641c99275SPeter Avalos { RSVP_MSGTYPE_PATH, "Path" },
9741c99275SPeter Avalos { RSVP_MSGTYPE_RESV, "Resv" },
9841c99275SPeter Avalos { RSVP_MSGTYPE_PATHERR, "PathErr" },
9941c99275SPeter Avalos { RSVP_MSGTYPE_RESVERR, "ResvErr" },
10041c99275SPeter Avalos { RSVP_MSGTYPE_PATHTEAR, "PathTear" },
10141c99275SPeter Avalos { RSVP_MSGTYPE_RESVTEAR, "ResvTear" },
10241c99275SPeter Avalos { RSVP_MSGTYPE_RESVCONF, "ResvConf" },
103411677aeSAaron LI { RSVP_MSGTYPE_BUNDLE, "Bundle" },
10441c99275SPeter Avalos { RSVP_MSGTYPE_ACK, "Acknowledgement" },
10541c99275SPeter Avalos { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" },
10641c99275SPeter Avalos { RSVP_MSGTYPE_SREFRESH, "Refresh" },
10741c99275SPeter Avalos { RSVP_MSGTYPE_HELLO, "Hello" },
10841c99275SPeter Avalos { 0, NULL}
10941c99275SPeter Avalos };
11041c99275SPeter Avalos
11141c99275SPeter Avalos static const struct tok rsvp_header_flag_values[] = {
11241c99275SPeter Avalos { 0x01, "Refresh reduction capable" }, /* rfc2961 */
11341c99275SPeter Avalos { 0, NULL}
11441c99275SPeter Avalos };
11541c99275SPeter Avalos
116*ed775ee7SAntonio Huete Jimenez static const struct tok rsvp_obj_capability_flag_values[] = {
117*ed775ee7SAntonio Huete Jimenez { 0x0004, "RecoveryPath Transmit Enabled" },
118*ed775ee7SAntonio Huete Jimenez { 0x0002, "RecoveryPath Desired" },
119*ed775ee7SAntonio Huete Jimenez { 0x0001, "RecoveryPath Srefresh Capable" },
120*ed775ee7SAntonio Huete Jimenez { 0, NULL}
121*ed775ee7SAntonio Huete Jimenez };
122*ed775ee7SAntonio Huete Jimenez
12341c99275SPeter Avalos #define RSVP_OBJ_SESSION 1 /* rfc2205 */
12441c99275SPeter Avalos #define RSVP_OBJ_RSVP_HOP 3 /* rfc2205, rfc3473 */
12541c99275SPeter Avalos #define RSVP_OBJ_INTEGRITY 4 /* rfc2747 */
12641c99275SPeter Avalos #define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */
12741c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC 6
12841c99275SPeter Avalos #define RSVP_OBJ_SCOPE 7
12941c99275SPeter Avalos #define RSVP_OBJ_STYLE 8 /* rfc2205 */
13041c99275SPeter Avalos #define RSVP_OBJ_FLOWSPEC 9 /* rfc2215 */
13141c99275SPeter Avalos #define RSVP_OBJ_FILTERSPEC 10 /* rfc2215 */
13241c99275SPeter Avalos #define RSVP_OBJ_SENDER_TEMPLATE 11
13341c99275SPeter Avalos #define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2215 */
13441c99275SPeter Avalos #define RSVP_OBJ_ADSPEC 13 /* rfc2215 */
13541c99275SPeter Avalos #define RSVP_OBJ_POLICY_DATA 14
13641c99275SPeter Avalos #define RSVP_OBJ_CONFIRM 15 /* rfc2205 */
13741c99275SPeter Avalos #define RSVP_OBJ_LABEL 16 /* rfc3209 */
13841c99275SPeter Avalos #define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */
13941c99275SPeter Avalos #define RSVP_OBJ_ERO 20 /* rfc3209 */
14041c99275SPeter Avalos #define RSVP_OBJ_RRO 21 /* rfc3209 */
14141c99275SPeter Avalos #define RSVP_OBJ_HELLO 22 /* rfc3209 */
14241c99275SPeter Avalos #define RSVP_OBJ_MESSAGE_ID 23 /* rfc2961 */
14341c99275SPeter Avalos #define RSVP_OBJ_MESSAGE_ID_ACK 24 /* rfc2961 */
14441c99275SPeter Avalos #define RSVP_OBJ_MESSAGE_ID_LIST 25 /* rfc2961 */
14541c99275SPeter Avalos #define RSVP_OBJ_RECOVERY_LABEL 34 /* rfc3473 */
14641c99275SPeter Avalos #define RSVP_OBJ_UPSTREAM_LABEL 35 /* rfc3473 */
14741c99275SPeter Avalos #define RSVP_OBJ_LABEL_SET 36 /* rfc3473 */
14841c99275SPeter Avalos #define RSVP_OBJ_PROTECTION 37 /* rfc3473 */
14927bfbee1SPeter Avalos #define RSVP_OBJ_S2L 50 /* rfc4875 */
150*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_DETOUR 63 /* rfc4090 */
15141c99275SPeter Avalos #define RSVP_OBJ_CLASSTYPE 66 /* rfc4124 */
15241c99275SPeter Avalos #define RSVP_OBJ_CLASSTYPE_OLD 125 /* draft-ietf-tewg-diff-te-proto-07 */
15341c99275SPeter Avalos #define RSVP_OBJ_SUGGESTED_LABEL 129 /* rfc3473 */
15441c99275SPeter Avalos #define RSVP_OBJ_ACCEPT_LABEL_SET 130 /* rfc3473 */
15541c99275SPeter Avalos #define RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
156*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_CAPABILITY 134 /* rfc5063 */
15741c99275SPeter Avalos #define RSVP_OBJ_NOTIFY_REQ 195 /* rfc3473 */
15841c99275SPeter Avalos #define RSVP_OBJ_ADMIN_STATUS 196 /* rfc3473 */
15941c99275SPeter Avalos #define RSVP_OBJ_PROPERTIES 204 /* juniper proprietary */
160*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_FASTREROUTE 205 /* rfc4090 */
16141c99275SPeter Avalos #define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */
16241c99275SPeter Avalos #define RSVP_OBJ_GENERALIZED_UNI 229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
16341c99275SPeter Avalos #define RSVP_OBJ_CALL_ID 230 /* rfc3474 */
16441c99275SPeter Avalos #define RSVP_OBJ_CALL_OPS 236 /* rfc3474 */
16541c99275SPeter Avalos
16641c99275SPeter Avalos static const struct tok rsvp_obj_values[] = {
16741c99275SPeter Avalos { RSVP_OBJ_SESSION, "Session" },
16841c99275SPeter Avalos { RSVP_OBJ_RSVP_HOP, "RSVP Hop" },
16941c99275SPeter Avalos { RSVP_OBJ_INTEGRITY, "Integrity" },
17041c99275SPeter Avalos { RSVP_OBJ_TIME_VALUES, "Time Values" },
17141c99275SPeter Avalos { RSVP_OBJ_ERROR_SPEC, "Error Spec" },
17241c99275SPeter Avalos { RSVP_OBJ_SCOPE, "Scope" },
17341c99275SPeter Avalos { RSVP_OBJ_STYLE, "Style" },
17441c99275SPeter Avalos { RSVP_OBJ_FLOWSPEC, "Flowspec" },
17541c99275SPeter Avalos { RSVP_OBJ_FILTERSPEC, "FilterSpec" },
17641c99275SPeter Avalos { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" },
17741c99275SPeter Avalos { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" },
17841c99275SPeter Avalos { RSVP_OBJ_ADSPEC, "Adspec" },
17941c99275SPeter Avalos { RSVP_OBJ_POLICY_DATA, "Policy Data" },
18041c99275SPeter Avalos { RSVP_OBJ_CONFIRM, "Confirm" },
18141c99275SPeter Avalos { RSVP_OBJ_LABEL, "Label" },
18241c99275SPeter Avalos { RSVP_OBJ_LABEL_REQ, "Label Request" },
18341c99275SPeter Avalos { RSVP_OBJ_ERO, "ERO" },
18441c99275SPeter Avalos { RSVP_OBJ_RRO, "RRO" },
18541c99275SPeter Avalos { RSVP_OBJ_HELLO, "Hello" },
18641c99275SPeter Avalos { RSVP_OBJ_MESSAGE_ID, "Message ID" },
18741c99275SPeter Avalos { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" },
18841c99275SPeter Avalos { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" },
18941c99275SPeter Avalos { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" },
19041c99275SPeter Avalos { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" },
19141c99275SPeter Avalos { RSVP_OBJ_LABEL_SET, "Label Set" },
19241c99275SPeter Avalos { RSVP_OBJ_ACCEPT_LABEL_SET, "Acceptable Label Set" },
19341c99275SPeter Avalos { RSVP_OBJ_DETOUR, "Detour" },
19441c99275SPeter Avalos { RSVP_OBJ_CLASSTYPE, "Class Type" },
19541c99275SPeter Avalos { RSVP_OBJ_CLASSTYPE_OLD, "Class Type (old)" },
19641c99275SPeter Avalos { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" },
19741c99275SPeter Avalos { RSVP_OBJ_PROPERTIES, "Properties" },
19841c99275SPeter Avalos { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" },
19941c99275SPeter Avalos { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" },
20041c99275SPeter Avalos { RSVP_OBJ_GENERALIZED_UNI, "Generalized UNI" },
20141c99275SPeter Avalos { RSVP_OBJ_CALL_ID, "Call-ID" },
20241c99275SPeter Avalos { RSVP_OBJ_CALL_OPS, "Call Capability" },
20341c99275SPeter Avalos { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
204*ed775ee7SAntonio Huete Jimenez { RSVP_OBJ_CAPABILITY, "Capability" },
20541c99275SPeter Avalos { RSVP_OBJ_NOTIFY_REQ, "Notify Request" },
20641c99275SPeter Avalos { RSVP_OBJ_PROTECTION, "Protection" },
20741c99275SPeter Avalos { RSVP_OBJ_ADMIN_STATUS, "Administrative Status" },
20827bfbee1SPeter Avalos { RSVP_OBJ_S2L, "Sub-LSP to LSP" },
20941c99275SPeter Avalos { 0, NULL}
21041c99275SPeter Avalos };
21141c99275SPeter Avalos
21241c99275SPeter Avalos #define RSVP_CTYPE_IPV4 1
21341c99275SPeter Avalos #define RSVP_CTYPE_IPV6 2
21441c99275SPeter Avalos #define RSVP_CTYPE_TUNNEL_IPV4 7
21541c99275SPeter Avalos #define RSVP_CTYPE_TUNNEL_IPV6 8
21641c99275SPeter Avalos #define RSVP_CTYPE_UNI_IPV4 11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
21741c99275SPeter Avalos #define RSVP_CTYPE_1 1
21841c99275SPeter Avalos #define RSVP_CTYPE_2 2
21941c99275SPeter Avalos #define RSVP_CTYPE_3 3
22041c99275SPeter Avalos #define RSVP_CTYPE_4 4
22127bfbee1SPeter Avalos #define RSVP_CTYPE_12 12
22227bfbee1SPeter Avalos #define RSVP_CTYPE_13 13
22327bfbee1SPeter Avalos #define RSVP_CTYPE_14 14
22441c99275SPeter Avalos
22541c99275SPeter Avalos /*
22641c99275SPeter Avalos * the ctypes are not globally unique so for
22741c99275SPeter Avalos * translating it to strings we build a table based
22841c99275SPeter Avalos * on objects offsetted by the ctype
22941c99275SPeter Avalos */
23041c99275SPeter Avalos
23141c99275SPeter Avalos static const struct tok rsvp_ctype_values[] = {
23241c99275SPeter Avalos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" },
23341c99275SPeter Avalos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" },
23441c99275SPeter Avalos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
23541c99275SPeter Avalos { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
23641c99275SPeter Avalos { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4, "IPv4" },
23741c99275SPeter Avalos { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6, "IPv6" },
23841c99275SPeter Avalos { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4, "IPv4" },
23941c99275SPeter Avalos { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6, "IPv6" },
24041c99275SPeter Avalos { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" },
24141c99275SPeter Avalos { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" },
24241c99275SPeter Avalos { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" },
24341c99275SPeter Avalos { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2, "IntServ" },
24441c99275SPeter Avalos { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2, "IntServ" },
24541c99275SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" },
24641c99275SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" },
24741c99275SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" },
24841c99275SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
24927bfbee1SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
25027bfbee1SPeter Avalos { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
25141c99275SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" },
25241c99275SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" },
25341c99275SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
25441c99275SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4, "UNI IPv4" },
25527bfbee1SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13, "IPv4 P2MP LSP Tunnel" },
25627bfbee1SPeter Avalos { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14, "IPv6 P2MP LSP Tunnel" },
25741c99275SPeter Avalos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4, "IPv4" },
25841c99275SPeter Avalos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6, "IPv6" },
25941c99275SPeter Avalos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
26027bfbee1SPeter Avalos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
26127bfbee1SPeter Avalos { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
26241c99275SPeter Avalos { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1, "1" },
26341c99275SPeter Avalos { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1, "Message id ack" },
26441c99275SPeter Avalos { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2, "Message id nack" },
26541c99275SPeter Avalos { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1, "1" },
26641c99275SPeter Avalos { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" },
26741c99275SPeter Avalos { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" },
26841c99275SPeter Avalos { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" },
26941c99275SPeter Avalos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" },
27041c99275SPeter Avalos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" },
27141c99275SPeter Avalos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" },
27241c99275SPeter Avalos { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4, "Generalized Label" },
27341c99275SPeter Avalos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "Label" },
27441c99275SPeter Avalos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2, "Generalized Label" },
27541c99275SPeter Avalos { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
27641c99275SPeter Avalos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1, "Label" },
27741c99275SPeter Avalos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2, "Generalized Label" },
27841c99275SPeter Avalos { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
27941c99275SPeter Avalos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1, "Label" },
28041c99275SPeter Avalos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2, "Generalized Label" },
28141c99275SPeter Avalos { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
28241c99275SPeter Avalos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1, "Label" },
28341c99275SPeter Avalos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2, "Generalized Label" },
28441c99275SPeter Avalos { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
28541c99275SPeter Avalos { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" },
28641c99275SPeter Avalos { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" },
28741c99275SPeter Avalos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4, "IPv4" },
28841c99275SPeter Avalos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6, "IPv6" },
28941c99275SPeter Avalos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
29041c99275SPeter Avalos { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
29141c99275SPeter Avalos { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" },
292*ed775ee7SAntonio Huete Jimenez { 256*RSVP_OBJ_CAPABILITY+RSVP_CTYPE_1, "1" },
29341c99275SPeter Avalos { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
29441c99275SPeter Avalos { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, /* old style*/
29541c99275SPeter Avalos { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1, "1" }, /* new style */
29641c99275SPeter Avalos { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
29741c99275SPeter Avalos { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1, "1" },
29841c99275SPeter Avalos { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1, "1" },
29941c99275SPeter Avalos { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1, "1" },
30041c99275SPeter Avalos { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1, "1" },
30141c99275SPeter Avalos { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1, "1" },
30241c99275SPeter Avalos { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1, "1" },
30327bfbee1SPeter Avalos { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4, "IPv4 sub-LSP" },
30427bfbee1SPeter Avalos { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6, "IPv6 sub-LSP" },
30541c99275SPeter Avalos { 0, NULL}
30641c99275SPeter Avalos };
30741c99275SPeter Avalos
308*ed775ee7SAntonio Huete Jimenez /*
309*ed775ee7SAntonio Huete Jimenez * XXX - this assumes a 16-byte digest, which is true for HMAC-MD5, but
310*ed775ee7SAntonio Huete Jimenez * isn't necessarily the case for other hash algorithms.
311*ed775ee7SAntonio Huete Jimenez *
312*ed775ee7SAntonio Huete Jimenez * Unless I've missed something, there's nothing in RFC 2747 to indicate
313*ed775ee7SAntonio Huete Jimenez * the hash algorithm being used, so it's presumably something set up
314*ed775ee7SAntonio Huete Jimenez * out-of-band, or negotiated by other RSVP objects.
315*ed775ee7SAntonio Huete Jimenez */
31641c99275SPeter Avalos struct rsvp_obj_integrity_t {
317411677aeSAaron LI uint8_t flags;
318411677aeSAaron LI uint8_t res;
319411677aeSAaron LI uint8_t key_id[6];
320411677aeSAaron LI uint8_t sequence[8];
321411677aeSAaron LI uint8_t digest[16];
32241c99275SPeter Avalos };
32341c99275SPeter Avalos
32441c99275SPeter Avalos static const struct tok rsvp_obj_integrity_flag_values[] = {
32541c99275SPeter Avalos { 0x80, "Handshake" },
32641c99275SPeter Avalos { 0, NULL}
32741c99275SPeter Avalos };
32841c99275SPeter Avalos
32941c99275SPeter Avalos struct rsvp_obj_frr_t {
330411677aeSAaron LI uint8_t setup_prio;
331411677aeSAaron LI uint8_t hold_prio;
332411677aeSAaron LI uint8_t hop_limit;
333411677aeSAaron LI uint8_t flags;
334411677aeSAaron LI uint8_t bandwidth[4];
335411677aeSAaron LI uint8_t include_any[4];
336411677aeSAaron LI uint8_t exclude_any[4];
337411677aeSAaron LI uint8_t include_all[4];
33841c99275SPeter Avalos };
33941c99275SPeter Avalos
34041c99275SPeter Avalos
34141c99275SPeter Avalos #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
34241c99275SPeter Avalos #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
34341c99275SPeter Avalos
344*ed775ee7SAntonio Huete Jimenez #define RSVP_OBJ_CAPABILITY_FLAGS_MASK 0x7U
345*ed775ee7SAntonio Huete Jimenez
34641c99275SPeter Avalos #define RSVP_OBJ_XRO_RES 0
34741c99275SPeter Avalos #define RSVP_OBJ_XRO_IPV4 1
34841c99275SPeter Avalos #define RSVP_OBJ_XRO_IPV6 2
34927bfbee1SPeter Avalos #define RSVP_OBJ_XRO_LABEL 3
35041c99275SPeter Avalos #define RSVP_OBJ_XRO_ASN 32
35141c99275SPeter Avalos #define RSVP_OBJ_XRO_MPLS 64
35241c99275SPeter Avalos
35341c99275SPeter Avalos static const struct tok rsvp_obj_xro_values[] = {
35441c99275SPeter Avalos { RSVP_OBJ_XRO_RES, "Reserved" },
35541c99275SPeter Avalos { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" },
35641c99275SPeter Avalos { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" },
35727bfbee1SPeter Avalos { RSVP_OBJ_XRO_LABEL, "Label" },
35841c99275SPeter Avalos { RSVP_OBJ_XRO_ASN, "Autonomous system number" },
35941c99275SPeter Avalos { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" },
36041c99275SPeter Avalos { 0, NULL}
36141c99275SPeter Avalos };
36241c99275SPeter Avalos
363*ed775ee7SAntonio Huete Jimenez /* RFC4090 */
36441c99275SPeter Avalos static const struct tok rsvp_obj_rro_flag_values[] = {
36541c99275SPeter Avalos { 0x01, "Local protection available" },
36641c99275SPeter Avalos { 0x02, "Local protection in use" },
36741c99275SPeter Avalos { 0x04, "Bandwidth protection" },
36841c99275SPeter Avalos { 0x08, "Node protection" },
36941c99275SPeter Avalos { 0, NULL}
37041c99275SPeter Avalos };
37141c99275SPeter Avalos
37227bfbee1SPeter Avalos /* RFC3209 */
37327bfbee1SPeter Avalos static const struct tok rsvp_obj_rro_label_flag_values[] = {
37427bfbee1SPeter Avalos { 0x01, "Global" },
37527bfbee1SPeter Avalos { 0, NULL}
37627bfbee1SPeter Avalos };
37727bfbee1SPeter Avalos
37841c99275SPeter Avalos static const struct tok rsvp_resstyle_values[] = {
37941c99275SPeter Avalos { 17, "Wildcard Filter" },
38041c99275SPeter Avalos { 10, "Fixed Filter" },
38141c99275SPeter Avalos { 18, "Shared Explicit" },
38241c99275SPeter Avalos { 0, NULL}
38341c99275SPeter Avalos };
38441c99275SPeter Avalos
38541c99275SPeter Avalos #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
38641c99275SPeter Avalos #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
38741c99275SPeter Avalos
38841c99275SPeter Avalos static const struct tok rsvp_intserv_service_type_values[] = {
38941c99275SPeter Avalos { 1, "Default/Global Information" },
39041c99275SPeter Avalos { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
39141c99275SPeter Avalos { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" },
39241c99275SPeter Avalos { 0, NULL}
39341c99275SPeter Avalos };
39441c99275SPeter Avalos
39541c99275SPeter Avalos static const struct tok rsvp_intserv_parameter_id_values[] = {
39641c99275SPeter Avalos { 4, "IS hop cnt" },
39741c99275SPeter Avalos { 6, "Path b/w estimate" },
39841c99275SPeter Avalos { 8, "Minimum path latency" },
39941c99275SPeter Avalos { 10, "Composed MTU" },
40041c99275SPeter Avalos { 127, "Token Bucket TSpec" },
40141c99275SPeter Avalos { 130, "Guaranteed Service RSpec" },
40241c99275SPeter Avalos { 133, "End-to-end composed value for C" },
40341c99275SPeter Avalos { 134, "End-to-end composed value for D" },
40441c99275SPeter Avalos { 135, "Since-last-reshaping point composed C" },
40541c99275SPeter Avalos { 136, "Since-last-reshaping point composed D" },
40641c99275SPeter Avalos { 0, NULL}
40741c99275SPeter Avalos };
40841c99275SPeter Avalos
409411677aeSAaron LI static const struct tok rsvp_session_attribute_flag_values[] = {
41027bfbee1SPeter Avalos { 0x01, "Local Protection" },
41127bfbee1SPeter Avalos { 0x02, "Label Recording" },
41227bfbee1SPeter Avalos { 0x04, "SE Style" },
41327bfbee1SPeter Avalos { 0x08, "Bandwidth protection" }, /* RFC4090 */
41427bfbee1SPeter Avalos { 0x10, "Node protection" }, /* RFC4090 */
41541c99275SPeter Avalos { 0, NULL}
41641c99275SPeter Avalos };
41741c99275SPeter Avalos
418411677aeSAaron LI static const struct tok rsvp_obj_prop_tlv_values[] = {
41941c99275SPeter Avalos { 0x01, "Cos" },
42041c99275SPeter Avalos { 0x02, "Metric 1" },
42141c99275SPeter Avalos { 0x04, "Metric 2" },
42241c99275SPeter Avalos { 0x08, "CCC Status" },
42341c99275SPeter Avalos { 0x10, "Path Type" },
42441c99275SPeter Avalos { 0, NULL}
42541c99275SPeter Avalos };
42641c99275SPeter Avalos
42741c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
42841c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY 25
42941c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
43041c99275SPeter Avalos #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
43141c99275SPeter Avalos
432411677aeSAaron LI static const struct tok rsvp_obj_error_code_values[] = {
43341c99275SPeter Avalos { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
43441c99275SPeter Avalos { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY, "Notify Error" },
43541c99275SPeter Avalos { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
43641c99275SPeter Avalos { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
43741c99275SPeter Avalos { 0, NULL}
43841c99275SPeter Avalos };
43941c99275SPeter Avalos
440411677aeSAaron LI static const struct tok rsvp_obj_error_code_routing_values[] = {
44141c99275SPeter Avalos { 1, "Bad EXPLICIT_ROUTE object" },
44241c99275SPeter Avalos { 2, "Bad strict node" },
44341c99275SPeter Avalos { 3, "Bad loose node" },
44441c99275SPeter Avalos { 4, "Bad initial subobject" },
44541c99275SPeter Avalos { 5, "No route available toward destination" },
44641c99275SPeter Avalos { 6, "Unacceptable label value" },
44741c99275SPeter Avalos { 7, "RRO indicated routing loops" },
44841c99275SPeter Avalos { 8, "non-RSVP-capable router in the path" },
44941c99275SPeter Avalos { 9, "MPLS label allocation failure" },
45041c99275SPeter Avalos { 10, "Unsupported L3PID" },
45141c99275SPeter Avalos { 0, NULL}
45241c99275SPeter Avalos };
45341c99275SPeter Avalos
454411677aeSAaron LI static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
45541c99275SPeter Avalos { 1, "Unexpected CT object" },
45641c99275SPeter Avalos { 2, "Unsupported CT" },
45741c99275SPeter Avalos { 3, "Invalid CT value" },
45841c99275SPeter Avalos { 4, "CT/setup priority do not form a configured TE-Class" },
45941c99275SPeter Avalos { 5, "CT/holding priority do not form a configured TE-Class" },
46041c99275SPeter Avalos { 6, "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
46141c99275SPeter Avalos { 7, "Inconsistency between signaled PSC and signaled CT" },
46241c99275SPeter Avalos { 8, "Inconsistency between signaled PHBs and signaled CT" },
46341c99275SPeter Avalos { 0, NULL}
46441c99275SPeter Avalos };
46541c99275SPeter Avalos
46641c99275SPeter Avalos /* rfc3473 / rfc 3471 */
46741c99275SPeter Avalos static const struct tok rsvp_obj_admin_status_flag_values[] = {
46841c99275SPeter Avalos { 0x80000000, "Reflect" },
46941c99275SPeter Avalos { 0x00000004, "Testing" },
47041c99275SPeter Avalos { 0x00000002, "Admin-down" },
47141c99275SPeter Avalos { 0x00000001, "Delete-in-progress" },
47241c99275SPeter Avalos { 0, NULL}
47341c99275SPeter Avalos };
47441c99275SPeter Avalos
47541c99275SPeter Avalos /* label set actions - rfc3471 */
47641c99275SPeter Avalos #define LABEL_SET_INCLUSIVE_LIST 0
47741c99275SPeter Avalos #define LABEL_SET_EXCLUSIVE_LIST 1
47841c99275SPeter Avalos #define LABEL_SET_INCLUSIVE_RANGE 2
47941c99275SPeter Avalos #define LABEL_SET_EXCLUSIVE_RANGE 3
48041c99275SPeter Avalos
48141c99275SPeter Avalos static const struct tok rsvp_obj_label_set_action_values[] = {
48241c99275SPeter Avalos { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
48341c99275SPeter Avalos { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
48441c99275SPeter Avalos { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
48541c99275SPeter Avalos { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
48641c99275SPeter Avalos { 0, NULL}
48741c99275SPeter Avalos };
48841c99275SPeter Avalos
48941c99275SPeter Avalos /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
49041c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS 1
49141c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
49241c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY 3
49341c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL 4
49441c99275SPeter Avalos #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL 5
49541c99275SPeter Avalos
49641c99275SPeter Avalos static const struct tok rsvp_obj_generalized_uni_values[] = {
49741c99275SPeter Avalos { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
49841c99275SPeter Avalos { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
49941c99275SPeter Avalos { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
50041c99275SPeter Avalos { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
50141c99275SPeter Avalos { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
50241c99275SPeter Avalos { 0, NULL}
50341c99275SPeter Avalos };
50441c99275SPeter Avalos
50541c99275SPeter Avalos /*
50641c99275SPeter Avalos * this is a dissector for all the intserv defined
50741c99275SPeter Avalos * specs as defined per rfc2215
50841c99275SPeter Avalos * it is called from various rsvp objects;
50941c99275SPeter Avalos * returns the amount of bytes being processed
51041c99275SPeter Avalos */
511*ed775ee7SAntonio Huete Jimenez static u_int
rsvp_intserv_print(netdissect_options * ndo,const u_char * tptr,u_int obj_tlen)512411677aeSAaron LI rsvp_intserv_print(netdissect_options *ndo,
513*ed775ee7SAntonio Huete Jimenez const u_char *tptr, u_int obj_tlen)
514411677aeSAaron LI {
515*ed775ee7SAntonio Huete Jimenez u_int parameter_id,parameter_length;
51641c99275SPeter Avalos union {
51741c99275SPeter Avalos float f;
518411677aeSAaron LI uint32_t i;
51941c99275SPeter Avalos } bw;
52041c99275SPeter Avalos
52141c99275SPeter Avalos if (obj_tlen < 4)
52241c99275SPeter Avalos return 0;
523*ed775ee7SAntonio Huete Jimenez parameter_id = GET_U_1(tptr);
524*ed775ee7SAntonio Huete Jimenez parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */
52541c99275SPeter Avalos
526*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
52741c99275SPeter Avalos tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
52841c99275SPeter Avalos parameter_id,
52941c99275SPeter Avalos parameter_length,
530*ed775ee7SAntonio Huete Jimenez GET_U_1(tptr + 1));
53141c99275SPeter Avalos
53241c99275SPeter Avalos if (obj_tlen < parameter_length+4)
53341c99275SPeter Avalos return 0;
53441c99275SPeter Avalos switch(parameter_id) { /* parameter_id */
53541c99275SPeter Avalos
53641c99275SPeter Avalos case 4:
53741c99275SPeter Avalos /*
53841c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53941c99275SPeter Avalos * | 4 (e) | (f) | 1 (g) |
54041c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54141c99275SPeter Avalos * | IS hop cnt (32-bit unsigned integer) |
54241c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54341c99275SPeter Avalos */
544411677aeSAaron LI if (parameter_length == 4) {
545*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4));
546411677aeSAaron LI }
54741c99275SPeter Avalos break;
54841c99275SPeter Avalos
54941c99275SPeter Avalos case 6:
55041c99275SPeter Avalos /*
55141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55241c99275SPeter Avalos * | 6 (h) | (i) | 1 (j) |
55341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55441c99275SPeter Avalos * | Path b/w estimate (32-bit IEEE floating point number) |
55541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55641c99275SPeter Avalos */
55741c99275SPeter Avalos if (parameter_length == 4) {
558*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(tptr + 4);
559*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000);
56041c99275SPeter Avalos }
56141c99275SPeter Avalos break;
56241c99275SPeter Avalos
56341c99275SPeter Avalos case 8:
56441c99275SPeter Avalos /*
56541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56641c99275SPeter Avalos * | 8 (k) | (l) | 1 (m) |
56741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56841c99275SPeter Avalos * | Minimum path latency (32-bit integer) |
56941c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57041c99275SPeter Avalos */
57141c99275SPeter Avalos if (parameter_length == 4) {
572*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tMinimum path latency: ");
573*ed775ee7SAntonio Huete Jimenez if (GET_BE_U_4(tptr + 4) == 0xffffffff)
574*ed775ee7SAntonio Huete Jimenez ND_PRINT("don't care");
57541c99275SPeter Avalos else
576*ed775ee7SAntonio Huete Jimenez ND_PRINT("%u", GET_BE_U_4(tptr + 4));
57741c99275SPeter Avalos }
57841c99275SPeter Avalos break;
57941c99275SPeter Avalos
58041c99275SPeter Avalos case 10:
58141c99275SPeter Avalos
58241c99275SPeter Avalos /*
58341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58441c99275SPeter Avalos * | 10 (n) | (o) | 1 (p) |
58541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58641c99275SPeter Avalos * | Composed MTU (32-bit unsigned integer) |
58741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58841c99275SPeter Avalos */
589411677aeSAaron LI if (parameter_length == 4) {
590*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4));
591411677aeSAaron LI }
59241c99275SPeter Avalos break;
59341c99275SPeter Avalos case 127:
59441c99275SPeter Avalos /*
59541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59641c99275SPeter Avalos * | 127 (e) | 0 (f) | 5 (g) |
59741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59841c99275SPeter Avalos * | Token Bucket Rate [r] (32-bit IEEE floating point number) |
59941c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60041c99275SPeter Avalos * | Token Bucket Size [b] (32-bit IEEE floating point number) |
60141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60241c99275SPeter Avalos * | Peak Data Rate [p] (32-bit IEEE floating point number) |
60341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60441c99275SPeter Avalos * | Minimum Policed Unit [m] (32-bit integer) |
60541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60641c99275SPeter Avalos * | Maximum Packet Size [M] (32-bit integer) |
60741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60841c99275SPeter Avalos */
60941c99275SPeter Avalos
61041c99275SPeter Avalos if (parameter_length == 20) {
611*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr + 4, 20);
612*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(tptr + 4);
613*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000);
614*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(tptr + 8);
615*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tToken Bucket Size: %.10g bytes", bw.f);
616*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(tptr + 12);
617*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000);
618*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tMinimum Policed Unit: %u bytes",
619*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(tptr + 16));
620*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tMaximum Packet Size: %u bytes",
621*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(tptr + 20));
62241c99275SPeter Avalos }
62341c99275SPeter Avalos break;
62441c99275SPeter Avalos
62541c99275SPeter Avalos case 130:
62641c99275SPeter Avalos /*
62741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62841c99275SPeter Avalos * | 130 (h) | 0 (i) | 2 (j) |
62941c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63041c99275SPeter Avalos * | Rate [R] (32-bit IEEE floating point number) |
63141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63241c99275SPeter Avalos * | Slack Term [S] (32-bit integer) |
63341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63441c99275SPeter Avalos */
63541c99275SPeter Avalos
63641c99275SPeter Avalos if (parameter_length == 8) {
637*ed775ee7SAntonio Huete Jimenez ND_TCHECK_8(tptr + 4);
638*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(tptr + 4);
639*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000);
640*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8));
64141c99275SPeter Avalos }
64241c99275SPeter Avalos break;
64341c99275SPeter Avalos
64441c99275SPeter Avalos case 133:
64541c99275SPeter Avalos case 134:
64641c99275SPeter Avalos case 135:
64741c99275SPeter Avalos case 136:
648411677aeSAaron LI if (parameter_length == 4) {
649*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4));
650411677aeSAaron LI }
65141c99275SPeter Avalos break;
65241c99275SPeter Avalos
65341c99275SPeter Avalos default:
654411677aeSAaron LI if (ndo->ndo_vflag <= 1)
655411677aeSAaron LI print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
65641c99275SPeter Avalos }
65741c99275SPeter Avalos return (parameter_length+4); /* header length 4 bytes */
658411677aeSAaron LI
659411677aeSAaron LI trunc:
660*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
661411677aeSAaron LI return 0;
662411677aeSAaron LI }
663411677aeSAaron LI
664411677aeSAaron LI /*
665411677aeSAaron LI * Clear checksum prior to signature verification.
666411677aeSAaron LI */
667411677aeSAaron LI static void
rsvp_clear_checksum(void * header)668411677aeSAaron LI rsvp_clear_checksum(void *header)
669411677aeSAaron LI {
670411677aeSAaron LI struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header;
671411677aeSAaron LI
672411677aeSAaron LI rsvp_com_header->checksum[0] = 0;
673411677aeSAaron LI rsvp_com_header->checksum[1] = 0;
67441c99275SPeter Avalos }
67541c99275SPeter Avalos
67641c99275SPeter Avalos static int
rsvp_obj_print(netdissect_options * ndo,const u_char * pptr,u_int plen,const u_char * tptr,const char * indent,u_int tlen,const struct rsvp_common_header * rsvp_com_header)677411677aeSAaron LI rsvp_obj_print(netdissect_options *ndo,
678411677aeSAaron LI const u_char *pptr, u_int plen, const u_char *tptr,
679*ed775ee7SAntonio Huete Jimenez const char *indent, u_int tlen,
680411677aeSAaron LI const struct rsvp_common_header *rsvp_com_header)
681411677aeSAaron LI {
68241c99275SPeter Avalos const struct rsvp_object_header *rsvp_obj_header;
68341c99275SPeter Avalos const u_char *obj_tptr;
68441c99275SPeter Avalos union {
68541c99275SPeter Avalos const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
68641c99275SPeter Avalos const struct rsvp_obj_frr_t *rsvp_obj_frr;
68741c99275SPeter Avalos } obj_ptr;
68841c99275SPeter Avalos
689*ed775ee7SAntonio Huete Jimenez u_short rsvp_obj_len,rsvp_obj_ctype,rsvp_obj_class_num;
690*ed775ee7SAntonio Huete Jimenez u_int obj_tlen,intserv_serv_tlen;
691*ed775ee7SAntonio Huete Jimenez int hexdump;
692*ed775ee7SAntonio Huete Jimenez u_int processed,padbytes,error_code,error_value,i,sigcheck;
69341c99275SPeter Avalos union {
69441c99275SPeter Avalos float f;
695411677aeSAaron LI uint32_t i;
69641c99275SPeter Avalos } bw;
697*ed775ee7SAntonio Huete Jimenez u_int namelen;
69841c99275SPeter Avalos
69941c99275SPeter Avalos u_int action, subchannel;
70041c99275SPeter Avalos
70141c99275SPeter Avalos while(tlen>=sizeof(struct rsvp_object_header)) {
70241c99275SPeter Avalos /* did we capture enough for fully decoding the object header ? */
703*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header));
70441c99275SPeter Avalos
70541c99275SPeter Avalos rsvp_obj_header = (const struct rsvp_object_header *)tptr;
706*ed775ee7SAntonio Huete Jimenez rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length);
707*ed775ee7SAntonio Huete Jimenez rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype);
70841c99275SPeter Avalos
70941c99275SPeter Avalos if(rsvp_obj_len % 4) {
710*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: object header size %u not a multiple of 4", indent, rsvp_obj_len);
71141c99275SPeter Avalos return -1;
71241c99275SPeter Avalos }
71341c99275SPeter Avalos if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
714*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: object header too short %u < %zu", indent, rsvp_obj_len,
715*ed775ee7SAntonio Huete Jimenez sizeof(struct rsvp_object_header));
71641c99275SPeter Avalos return -1;
71741c99275SPeter Avalos }
71841c99275SPeter Avalos
719*ed775ee7SAntonio Huete Jimenez rsvp_obj_class_num = GET_U_1(rsvp_obj_header->class_num);
720*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s%s Object (%u) Flags: [%s",
721*ed775ee7SAntonio Huete Jimenez indent,
72241c99275SPeter Avalos tok2str(rsvp_obj_values,
72341c99275SPeter Avalos "Unknown",
724*ed775ee7SAntonio Huete Jimenez rsvp_obj_class_num),
725*ed775ee7SAntonio Huete Jimenez rsvp_obj_class_num,
726*ed775ee7SAntonio Huete Jimenez (rsvp_obj_class_num & 0x80) ?
727*ed775ee7SAntonio Huete Jimenez ((rsvp_obj_class_num & 0x40) ? "ignore and forward" :
728*ed775ee7SAntonio Huete Jimenez "ignore silently") :
729*ed775ee7SAntonio Huete Jimenez "reject");
73041c99275SPeter Avalos
731*ed775ee7SAntonio Huete Jimenez ND_PRINT(" if unknown], Class-Type: %s (%u), length: %u",
73241c99275SPeter Avalos tok2str(rsvp_ctype_values,
73341c99275SPeter Avalos "Unknown",
734*ed775ee7SAntonio Huete Jimenez (rsvp_obj_class_num<<8)+rsvp_obj_ctype),
73541c99275SPeter Avalos rsvp_obj_ctype,
736*ed775ee7SAntonio Huete Jimenez rsvp_obj_len);
73741c99275SPeter Avalos
73841c99275SPeter Avalos if(tlen < rsvp_obj_len) {
739*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: object goes past end of objects TLV", indent);
74041c99275SPeter Avalos return -1;
74141c99275SPeter Avalos }
74241c99275SPeter Avalos
74341c99275SPeter Avalos obj_tptr=tptr+sizeof(struct rsvp_object_header);
74441c99275SPeter Avalos obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
74541c99275SPeter Avalos
74641c99275SPeter Avalos /* did we capture enough for fully decoding the object ? */
747*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr, rsvp_obj_len);
74841c99275SPeter Avalos hexdump=FALSE;
74941c99275SPeter Avalos
750*ed775ee7SAntonio Huete Jimenez switch(rsvp_obj_class_num) {
75141c99275SPeter Avalos case RSVP_OBJ_SESSION:
75241c99275SPeter Avalos switch(rsvp_obj_ctype) {
75341c99275SPeter Avalos case RSVP_CTYPE_IPV4:
75441c99275SPeter Avalos if (obj_tlen < 8)
755*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
756*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 DestAddress: %s, Protocol ID: 0x%02x",
757*ed775ee7SAntonio Huete Jimenez indent,
758*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
759*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + sizeof(nd_ipv4)));
760*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Flags: [0x%02x], DestPort %u",
761*ed775ee7SAntonio Huete Jimenez indent,
762*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 5)),
763*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6));
76441c99275SPeter Avalos obj_tlen-=8;
76541c99275SPeter Avalos obj_tptr+=8;
76641c99275SPeter Avalos break;
76741c99275SPeter Avalos case RSVP_CTYPE_IPV6:
76841c99275SPeter Avalos if (obj_tlen < 20)
769*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
770*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 DestAddress: %s, Protocol ID: 0x%02x",
771*ed775ee7SAntonio Huete Jimenez indent,
772*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
773*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + sizeof(nd_ipv6)));
774*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Flags: [0x%02x], DestPort %u",
775*ed775ee7SAntonio Huete Jimenez indent,
776*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + sizeof(nd_ipv6) + 1)),
777*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + sizeof(nd_ipv6) + 2));
77841c99275SPeter Avalos obj_tlen-=20;
77941c99275SPeter Avalos obj_tptr+=20;
78041c99275SPeter Avalos break;
78141c99275SPeter Avalos
78241c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV6:
78341c99275SPeter Avalos if (obj_tlen < 36)
784*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
785*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
786*ed775ee7SAntonio Huete Jimenez indent,
787*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
788*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18),
789*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr + 20));
79041c99275SPeter Avalos obj_tlen-=36;
79141c99275SPeter Avalos obj_tptr+=36;
79241c99275SPeter Avalos break;
79327bfbee1SPeter Avalos
79427bfbee1SPeter Avalos case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
79527bfbee1SPeter Avalos if (obj_tlen < 26)
796*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
797*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
798*ed775ee7SAntonio Huete Jimenez indent,
799*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr),
800*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6),
801*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr + 8));
80227bfbee1SPeter Avalos obj_tlen-=26;
80327bfbee1SPeter Avalos obj_tptr+=26;
80427bfbee1SPeter Avalos break;
80527bfbee1SPeter Avalos case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
80627bfbee1SPeter Avalos if (obj_tlen < 12)
807*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
808*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
809*ed775ee7SAntonio Huete Jimenez indent,
810*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
811*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6),
812*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr + 8));
81327bfbee1SPeter Avalos obj_tlen-=12;
81427bfbee1SPeter Avalos obj_tptr+=12;
81527bfbee1SPeter Avalos break;
81641c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4:
81741c99275SPeter Avalos case RSVP_CTYPE_UNI_IPV4:
81841c99275SPeter Avalos if (obj_tlen < 12)
819*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
820*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
821*ed775ee7SAntonio Huete Jimenez indent,
822*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
823*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6),
824*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr + 8));
82541c99275SPeter Avalos obj_tlen-=12;
82641c99275SPeter Avalos obj_tptr+=12;
82741c99275SPeter Avalos break;
82841c99275SPeter Avalos default:
82941c99275SPeter Avalos hexdump=TRUE;
83041c99275SPeter Avalos }
83141c99275SPeter Avalos break;
83241c99275SPeter Avalos
83341c99275SPeter Avalos case RSVP_OBJ_CONFIRM:
83441c99275SPeter Avalos switch(rsvp_obj_ctype) {
83541c99275SPeter Avalos case RSVP_CTYPE_IPV4:
836*ed775ee7SAntonio Huete Jimenez if (obj_tlen < sizeof(nd_ipv4))
837*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
838*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Receiver Address: %s",
839*ed775ee7SAntonio Huete Jimenez indent,
840*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr));
841*ed775ee7SAntonio Huete Jimenez obj_tlen-=sizeof(nd_ipv4);
842*ed775ee7SAntonio Huete Jimenez obj_tptr+=sizeof(nd_ipv4);
84341c99275SPeter Avalos break;
84441c99275SPeter Avalos case RSVP_CTYPE_IPV6:
845*ed775ee7SAntonio Huete Jimenez if (obj_tlen < sizeof(nd_ipv6))
846*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
847*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 Receiver Address: %s",
848*ed775ee7SAntonio Huete Jimenez indent,
849*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr));
850*ed775ee7SAntonio Huete Jimenez obj_tlen-=sizeof(nd_ipv6);
851*ed775ee7SAntonio Huete Jimenez obj_tptr+=sizeof(nd_ipv6);
85241c99275SPeter Avalos break;
85341c99275SPeter Avalos default:
85441c99275SPeter Avalos hexdump=TRUE;
85541c99275SPeter Avalos }
85641c99275SPeter Avalos break;
85741c99275SPeter Avalos
85841c99275SPeter Avalos case RSVP_OBJ_NOTIFY_REQ:
85941c99275SPeter Avalos switch(rsvp_obj_ctype) {
86041c99275SPeter Avalos case RSVP_CTYPE_IPV4:
861*ed775ee7SAntonio Huete Jimenez if (obj_tlen < sizeof(nd_ipv4))
862*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
863*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Notify Node Address: %s",
864*ed775ee7SAntonio Huete Jimenez indent,
865*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr));
866*ed775ee7SAntonio Huete Jimenez obj_tlen-=sizeof(nd_ipv4);
867*ed775ee7SAntonio Huete Jimenez obj_tptr+=sizeof(nd_ipv4);
86841c99275SPeter Avalos break;
86941c99275SPeter Avalos case RSVP_CTYPE_IPV6:
870*ed775ee7SAntonio Huete Jimenez if (obj_tlen < sizeof(nd_ipv6))
871*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
872*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 Notify Node Address: %s",
873*ed775ee7SAntonio Huete Jimenez indent,
874*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr));
875*ed775ee7SAntonio Huete Jimenez obj_tlen-=sizeof(nd_ipv6);
876*ed775ee7SAntonio Huete Jimenez obj_tptr+=sizeof(nd_ipv6);
87741c99275SPeter Avalos break;
87841c99275SPeter Avalos default:
87941c99275SPeter Avalos hexdump=TRUE;
88041c99275SPeter Avalos }
88141c99275SPeter Avalos break;
88241c99275SPeter Avalos
88341c99275SPeter Avalos case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
88441c99275SPeter Avalos case RSVP_OBJ_UPSTREAM_LABEL: /* fall through */
88541c99275SPeter Avalos case RSVP_OBJ_RECOVERY_LABEL: /* fall through */
88641c99275SPeter Avalos case RSVP_OBJ_LABEL:
88741c99275SPeter Avalos switch(rsvp_obj_ctype) {
88841c99275SPeter Avalos case RSVP_CTYPE_1:
88941c99275SPeter Avalos while(obj_tlen >= 4 ) {
890*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Label: %u", indent, GET_BE_U_4(obj_tptr));
89141c99275SPeter Avalos obj_tlen-=4;
89241c99275SPeter Avalos obj_tptr+=4;
89341c99275SPeter Avalos }
89441c99275SPeter Avalos break;
89541c99275SPeter Avalos case RSVP_CTYPE_2:
89641c99275SPeter Avalos if (obj_tlen < 4)
897*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
898*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Generalized Label: %u",
899*ed775ee7SAntonio Huete Jimenez indent,
900*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr));
90141c99275SPeter Avalos obj_tlen-=4;
90241c99275SPeter Avalos obj_tptr+=4;
90341c99275SPeter Avalos break;
90441c99275SPeter Avalos case RSVP_CTYPE_3:
90541c99275SPeter Avalos if (obj_tlen < 12)
906*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
907*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Waveband ID: %u%s Start Label: %u, Stop Label: %u",
908*ed775ee7SAntonio Huete Jimenez indent,
909*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr),
910*ed775ee7SAntonio Huete Jimenez indent,
911*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4),
912*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 8));
91341c99275SPeter Avalos obj_tlen-=12;
91441c99275SPeter Avalos obj_tptr+=12;
91541c99275SPeter Avalos break;
91641c99275SPeter Avalos default:
91741c99275SPeter Avalos hexdump=TRUE;
91841c99275SPeter Avalos }
91941c99275SPeter Avalos break;
92041c99275SPeter Avalos
92141c99275SPeter Avalos case RSVP_OBJ_STYLE:
92241c99275SPeter Avalos switch(rsvp_obj_ctype) {
92341c99275SPeter Avalos case RSVP_CTYPE_1:
92441c99275SPeter Avalos if (obj_tlen < 4)
925*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
926*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Reservation Style: %s, Flags: [0x%02x]",
927*ed775ee7SAntonio Huete Jimenez indent,
92841c99275SPeter Avalos tok2str(rsvp_resstyle_values,
92941c99275SPeter Avalos "Unknown",
930*ed775ee7SAntonio Huete Jimenez GET_BE_U_3(obj_tptr + 1)),
931*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr));
93241c99275SPeter Avalos obj_tlen-=4;
93341c99275SPeter Avalos obj_tptr+=4;
93441c99275SPeter Avalos break;
93541c99275SPeter Avalos default:
93641c99275SPeter Avalos hexdump=TRUE;
93741c99275SPeter Avalos }
93841c99275SPeter Avalos break;
93941c99275SPeter Avalos
94041c99275SPeter Avalos case RSVP_OBJ_SENDER_TEMPLATE:
94141c99275SPeter Avalos switch(rsvp_obj_ctype) {
94241c99275SPeter Avalos case RSVP_CTYPE_IPV4:
94341c99275SPeter Avalos if (obj_tlen < 8)
944*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
945*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, Source Port: %u",
946*ed775ee7SAntonio Huete Jimenez indent,
947*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
948*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6));
94941c99275SPeter Avalos obj_tlen-=8;
95041c99275SPeter Avalos obj_tptr+=8;
95141c99275SPeter Avalos break;
95241c99275SPeter Avalos case RSVP_CTYPE_IPV6:
95341c99275SPeter Avalos if (obj_tlen < 20)
954*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
955*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, Source Port: %u",
956*ed775ee7SAntonio Huete Jimenez indent,
957*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
958*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18));
95941c99275SPeter Avalos obj_tlen-=20;
96041c99275SPeter Avalos obj_tptr+=20;
96141c99275SPeter Avalos break;
96227bfbee1SPeter Avalos case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
96327bfbee1SPeter Avalos if (obj_tlen < 40)
964*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
965*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
96627bfbee1SPeter Avalos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
967*ed775ee7SAntonio Huete Jimenez indent,
968*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
969*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18),
970*ed775ee7SAntonio Huete Jimenez indent,
971*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr+20),
972*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 38));
97327bfbee1SPeter Avalos obj_tlen-=40;
97427bfbee1SPeter Avalos obj_tptr+=40;
97527bfbee1SPeter Avalos break;
97641c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4:
97741c99275SPeter Avalos if (obj_tlen < 8)
978*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
979*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
980*ed775ee7SAntonio Huete Jimenez indent,
981*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
982*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6));
98341c99275SPeter Avalos obj_tlen-=8;
98441c99275SPeter Avalos obj_tptr+=8;
98541c99275SPeter Avalos break;
98627bfbee1SPeter Avalos case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
98727bfbee1SPeter Avalos if (obj_tlen < 16)
988*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
989*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
99027bfbee1SPeter Avalos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
991*ed775ee7SAntonio Huete Jimenez indent,
992*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
993*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6),
994*ed775ee7SAntonio Huete Jimenez indent,
995*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr+8),
996*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 12));
99727bfbee1SPeter Avalos obj_tlen-=16;
99827bfbee1SPeter Avalos obj_tptr+=16;
99927bfbee1SPeter Avalos break;
100041c99275SPeter Avalos default:
100141c99275SPeter Avalos hexdump=TRUE;
100241c99275SPeter Avalos }
100341c99275SPeter Avalos break;
100441c99275SPeter Avalos
100541c99275SPeter Avalos case RSVP_OBJ_LABEL_REQ:
100641c99275SPeter Avalos switch(rsvp_obj_ctype) {
100741c99275SPeter Avalos case RSVP_CTYPE_1:
100841c99275SPeter Avalos while(obj_tlen >= 4 ) {
1009*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s L3 Protocol ID: %s",
1010*ed775ee7SAntonio Huete Jimenez indent,
101141c99275SPeter Avalos tok2str(ethertype_values,
101241c99275SPeter Avalos "Unknown Protocol (0x%04x)",
1013*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2)));
101441c99275SPeter Avalos obj_tlen-=4;
101541c99275SPeter Avalos obj_tptr+=4;
101641c99275SPeter Avalos }
101741c99275SPeter Avalos break;
101841c99275SPeter Avalos case RSVP_CTYPE_2:
101941c99275SPeter Avalos if (obj_tlen < 12)
1020*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1021*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s L3 Protocol ID: %s",
1022*ed775ee7SAntonio Huete Jimenez indent,
102341c99275SPeter Avalos tok2str(ethertype_values,
102441c99275SPeter Avalos "Unknown Protocol (0x%04x)",
1025*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2)));
1026*ed775ee7SAntonio Huete Jimenez ND_PRINT(",%s merge capability",
1027*ed775ee7SAntonio Huete Jimenez ((GET_U_1(obj_tptr + 4)) & 0x80) ? "no" : "" );
1028*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Minimum VPI/VCI: %u/%u",
1029*ed775ee7SAntonio Huete Jimenez indent,
1030*ed775ee7SAntonio Huete Jimenez (GET_BE_U_2(obj_tptr + 4))&0xfff,
1031*ed775ee7SAntonio Huete Jimenez (GET_BE_U_2(obj_tptr + 6)) & 0xfff);
1032*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Maximum VPI/VCI: %u/%u",
1033*ed775ee7SAntonio Huete Jimenez indent,
1034*ed775ee7SAntonio Huete Jimenez (GET_BE_U_2(obj_tptr + 8))&0xfff,
1035*ed775ee7SAntonio Huete Jimenez (GET_BE_U_2(obj_tptr + 10)) & 0xfff);
103641c99275SPeter Avalos obj_tlen-=12;
103741c99275SPeter Avalos obj_tptr+=12;
103841c99275SPeter Avalos break;
103941c99275SPeter Avalos case RSVP_CTYPE_3:
104041c99275SPeter Avalos if (obj_tlen < 12)
1041*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1042*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s L3 Protocol ID: %s",
1043*ed775ee7SAntonio Huete Jimenez indent,
104441c99275SPeter Avalos tok2str(ethertype_values,
104541c99275SPeter Avalos "Unknown Protocol (0x%04x)",
1046*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2)));
1047*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
1048*ed775ee7SAntonio Huete Jimenez indent,
1049*ed775ee7SAntonio Huete Jimenez (GET_BE_U_4(obj_tptr + 4))&0x7fffff,
1050*ed775ee7SAntonio Huete Jimenez (GET_BE_U_4(obj_tptr + 8))&0x7fffff,
1051*ed775ee7SAntonio Huete Jimenez (((GET_BE_U_2(obj_tptr + 4)>>7)&3) == 0 ) ? "10" : "",
1052*ed775ee7SAntonio Huete Jimenez (((GET_BE_U_2(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : "");
105341c99275SPeter Avalos obj_tlen-=12;
105441c99275SPeter Avalos obj_tptr+=12;
105541c99275SPeter Avalos break;
105641c99275SPeter Avalos case RSVP_CTYPE_4:
105741c99275SPeter Avalos if (obj_tlen < 4)
1058*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1059*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s LSP Encoding Type: %s (%u)",
1060*ed775ee7SAntonio Huete Jimenez indent,
106141c99275SPeter Avalos tok2str(gmpls_encoding_values,
106241c99275SPeter Avalos "Unknown",
1063*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr)),
1064*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr));
1065*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Switching Type: %s (%u), Payload ID: %s (0x%04x)",
1066*ed775ee7SAntonio Huete Jimenez indent,
106741c99275SPeter Avalos tok2str(gmpls_switch_cap_values,
106841c99275SPeter Avalos "Unknown",
1069*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 1))),
1070*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 1),
107141c99275SPeter Avalos tok2str(gmpls_payload_values,
107241c99275SPeter Avalos "Unknown",
1073*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2)),
1074*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2));
107541c99275SPeter Avalos obj_tlen-=4;
107641c99275SPeter Avalos obj_tptr+=4;
107741c99275SPeter Avalos break;
107841c99275SPeter Avalos default:
107941c99275SPeter Avalos hexdump=TRUE;
108041c99275SPeter Avalos }
108141c99275SPeter Avalos break;
108241c99275SPeter Avalos
108341c99275SPeter Avalos case RSVP_OBJ_RRO:
108441c99275SPeter Avalos case RSVP_OBJ_ERO:
108541c99275SPeter Avalos switch(rsvp_obj_ctype) {
108641c99275SPeter Avalos case RSVP_CTYPE_IPV4:
108741c99275SPeter Avalos while(obj_tlen >= 4 ) {
1088411677aeSAaron LI u_char length;
1089411677aeSAaron LI
1090*ed775ee7SAntonio Huete Jimenez ND_TCHECK_4(obj_tptr);
1091*ed775ee7SAntonio Huete Jimenez length = GET_U_1(obj_tptr + 1);
1092*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Subobject Type: %s, length %u",
1093*ed775ee7SAntonio Huete Jimenez indent,
109441c99275SPeter Avalos tok2str(rsvp_obj_xro_values,
109541c99275SPeter Avalos "Unknown %u",
1096*ed775ee7SAntonio Huete Jimenez RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))),
1097*ed775ee7SAntonio Huete Jimenez length);
1098*ed775ee7SAntonio Huete Jimenez if (obj_tlen < length) {
1099*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s ERROR: ERO subobject length > object length", indent);
110041c99275SPeter Avalos break;
110141c99275SPeter Avalos }
110241c99275SPeter Avalos
1103*ed775ee7SAntonio Huete Jimenez if (length == 0) { /* prevent infinite loops */
1104*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s ERROR: zero length ERO subtype", indent);
1105*ed775ee7SAntonio Huete Jimenez break;
1106*ed775ee7SAntonio Huete Jimenez }
1107*ed775ee7SAntonio Huete Jimenez
1108*ed775ee7SAntonio Huete Jimenez switch(RSVP_OBJ_XRO_MASK_SUBOBJ(GET_U_1(obj_tptr))) {
1109411677aeSAaron LI u_char prefix_length;
1110411677aeSAaron LI
111141c99275SPeter Avalos case RSVP_OBJ_XRO_IPV4:
1112411677aeSAaron LI if (length != 8) {
1113*ed775ee7SAntonio Huete Jimenez ND_PRINT(" ERROR: length != 8");
1114411677aeSAaron LI goto invalid;
1115411677aeSAaron LI }
1116*ed775ee7SAntonio Huete Jimenez ND_TCHECK_8(obj_tptr);
1117*ed775ee7SAntonio Huete Jimenez prefix_length = GET_U_1(obj_tptr + 6);
1118411677aeSAaron LI if (prefix_length != 32) {
1119*ed775ee7SAntonio Huete Jimenez ND_PRINT(" ERROR: Prefix length %u != 32",
1120*ed775ee7SAntonio Huete Jimenez prefix_length);
1121411677aeSAaron LI goto invalid;
1122411677aeSAaron LI }
1123*ed775ee7SAntonio Huete Jimenez ND_PRINT(", %s, %s/%u, Flags: [%s]",
1124*ed775ee7SAntonio Huete Jimenez RSVP_OBJ_XRO_MASK_LOOSE(GET_U_1(obj_tptr)) ? "Loose" : "Strict",
1125*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr+2),
1126*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 6)),
112741c99275SPeter Avalos bittok2str(rsvp_obj_rro_flag_values,
112841c99275SPeter Avalos "none",
1129*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
113027bfbee1SPeter Avalos break;
113127bfbee1SPeter Avalos case RSVP_OBJ_XRO_LABEL:
1132411677aeSAaron LI if (length != 8) {
1133*ed775ee7SAntonio Huete Jimenez ND_PRINT(" ERROR: length != 8");
1134411677aeSAaron LI goto invalid;
1135411677aeSAaron LI }
1136*ed775ee7SAntonio Huete Jimenez ND_TCHECK_8(obj_tptr);
1137*ed775ee7SAntonio Huete Jimenez ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
113827bfbee1SPeter Avalos bittok2str(rsvp_obj_rro_label_flag_values,
113927bfbee1SPeter Avalos "none",
1140*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 2))),
1141*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 2),
114227bfbee1SPeter Avalos tok2str(rsvp_ctype_values,
114327bfbee1SPeter Avalos "Unknown",
1144*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 3)) + (256 * RSVP_OBJ_RRO)),
1145*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 3)),
1146*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4));
114741c99275SPeter Avalos }
1148*ed775ee7SAntonio Huete Jimenez obj_tlen-=length;
1149*ed775ee7SAntonio Huete Jimenez obj_tptr+=length;
115041c99275SPeter Avalos }
115141c99275SPeter Avalos break;
115241c99275SPeter Avalos default:
115341c99275SPeter Avalos hexdump=TRUE;
115441c99275SPeter Avalos }
115541c99275SPeter Avalos break;
115641c99275SPeter Avalos
115741c99275SPeter Avalos case RSVP_OBJ_HELLO:
115841c99275SPeter Avalos switch(rsvp_obj_ctype) {
115941c99275SPeter Avalos case RSVP_CTYPE_1:
116041c99275SPeter Avalos case RSVP_CTYPE_2:
116141c99275SPeter Avalos if (obj_tlen < 8)
1162*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1163*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Instance: 0x%08x, Destination Instance: 0x%08x",
1164*ed775ee7SAntonio Huete Jimenez indent,
1165*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr),
1166*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4));
116741c99275SPeter Avalos obj_tlen-=8;
116841c99275SPeter Avalos obj_tptr+=8;
116941c99275SPeter Avalos break;
117041c99275SPeter Avalos default:
117141c99275SPeter Avalos hexdump=TRUE;
117241c99275SPeter Avalos }
117341c99275SPeter Avalos break;
117441c99275SPeter Avalos
117541c99275SPeter Avalos case RSVP_OBJ_RESTART_CAPABILITY:
117641c99275SPeter Avalos switch(rsvp_obj_ctype) {
117741c99275SPeter Avalos case RSVP_CTYPE_1:
117841c99275SPeter Avalos if (obj_tlen < 8)
1179*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1180*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Restart Time: %ums, Recovery Time: %ums",
1181*ed775ee7SAntonio Huete Jimenez indent,
1182*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr),
1183*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4));
118441c99275SPeter Avalos obj_tlen-=8;
118541c99275SPeter Avalos obj_tptr+=8;
118641c99275SPeter Avalos break;
118741c99275SPeter Avalos default:
118841c99275SPeter Avalos hexdump=TRUE;
118941c99275SPeter Avalos }
119041c99275SPeter Avalos break;
119141c99275SPeter Avalos
1192*ed775ee7SAntonio Huete Jimenez case RSVP_OBJ_CAPABILITY:
1193*ed775ee7SAntonio Huete Jimenez switch(rsvp_obj_ctype) {
1194*ed775ee7SAntonio Huete Jimenez case RSVP_CTYPE_1:
1195*ed775ee7SAntonio Huete Jimenez if (obj_tlen < 4)
1196*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1197*ed775ee7SAntonio Huete Jimenez uint32_t unused_and_flags = GET_BE_U_4(obj_tptr);
1198*ed775ee7SAntonio Huete Jimenez if (unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK)
1199*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s [reserved=0x%08x must be zero]", indent,
1200*ed775ee7SAntonio Huete Jimenez unused_and_flags & ~RSVP_OBJ_CAPABILITY_FLAGS_MASK);
1201*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Flags: [%s]",
1202*ed775ee7SAntonio Huete Jimenez indent,
1203*ed775ee7SAntonio Huete Jimenez bittok2str(rsvp_obj_capability_flag_values,
1204*ed775ee7SAntonio Huete Jimenez "none",
1205*ed775ee7SAntonio Huete Jimenez (unused_and_flags & RSVP_OBJ_CAPABILITY_FLAGS_MASK)));
1206*ed775ee7SAntonio Huete Jimenez obj_tlen-=4;
1207*ed775ee7SAntonio Huete Jimenez obj_tptr+=4;
1208*ed775ee7SAntonio Huete Jimenez break;
1209*ed775ee7SAntonio Huete Jimenez default:
1210*ed775ee7SAntonio Huete Jimenez hexdump=TRUE;
1211*ed775ee7SAntonio Huete Jimenez }
1212*ed775ee7SAntonio Huete Jimenez break;
1213*ed775ee7SAntonio Huete Jimenez
121441c99275SPeter Avalos case RSVP_OBJ_SESSION_ATTRIBUTE:
121541c99275SPeter Avalos switch(rsvp_obj_ctype) {
121641c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4:
121741c99275SPeter Avalos if (obj_tlen < 4)
1218*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1219*ed775ee7SAntonio Huete Jimenez namelen = GET_U_1(obj_tptr + 3);
122041c99275SPeter Avalos if (obj_tlen < 4+namelen)
1221*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1222*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Session Name: ", indent);
122341c99275SPeter Avalos for (i = 0; i < namelen; i++)
1224*ed775ee7SAntonio Huete Jimenez fn_print_char(ndo, GET_U_1(obj_tptr + 4 + i));
1225*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
1226*ed775ee7SAntonio Huete Jimenez indent,
1227*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr),
1228*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 1),
122927bfbee1SPeter Avalos bittok2str(rsvp_session_attribute_flag_values,
123041c99275SPeter Avalos "none",
1231*ed775ee7SAntonio Huete Jimenez GET_U_1((obj_tptr + 2))),
1232*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 2));
1233*ed775ee7SAntonio Huete Jimenez obj_tlen-=4+namelen;
1234*ed775ee7SAntonio Huete Jimenez obj_tptr+=4+namelen;
123541c99275SPeter Avalos break;
123641c99275SPeter Avalos default:
123741c99275SPeter Avalos hexdump=TRUE;
123841c99275SPeter Avalos }
123941c99275SPeter Avalos break;
124041c99275SPeter Avalos
124141c99275SPeter Avalos case RSVP_OBJ_GENERALIZED_UNI:
124241c99275SPeter Avalos switch(rsvp_obj_ctype) {
1243*ed775ee7SAntonio Huete Jimenez u_int subobj_type,af,subobj_len,total_subobj_len;
124441c99275SPeter Avalos
124541c99275SPeter Avalos case RSVP_CTYPE_1:
124641c99275SPeter Avalos
124741c99275SPeter Avalos if (obj_tlen < 4)
1248*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
124941c99275SPeter Avalos
125041c99275SPeter Avalos /* read variable length subobjects */
125141c99275SPeter Avalos total_subobj_len = obj_tlen;
125241c99275SPeter Avalos while(total_subobj_len > 0) {
1253411677aeSAaron LI /* If RFC 3476 Section 3.1 defined that a sub-object of the
1254411677aeSAaron LI * GENERALIZED_UNI RSVP object must have the Length field as
1255411677aeSAaron LI * a multiple of 4, instead of the check below it would be
1256411677aeSAaron LI * better to test total_subobj_len only once before the loop.
1257411677aeSAaron LI * So long as it does not define it and this while loop does
1258411677aeSAaron LI * not implement such a requirement, let's accept that within
1259411677aeSAaron LI * each iteration subobj_len may happen to be a multiple of 1
1260411677aeSAaron LI * and test it and total_subobj_len respectively.
1261411677aeSAaron LI */
1262411677aeSAaron LI if (total_subobj_len < 4)
1263411677aeSAaron LI goto invalid;
1264*ed775ee7SAntonio Huete Jimenez subobj_len = GET_BE_U_2(obj_tptr);
1265*ed775ee7SAntonio Huete Jimenez subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8;
1266*ed775ee7SAntonio Huete Jimenez af = (GET_BE_U_2(obj_tptr + 2))&0x00FF;
126741c99275SPeter Avalos
1268*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Subobject Type: %s (%u), AF: %s (%u), length: %u",
1269*ed775ee7SAntonio Huete Jimenez indent,
127041c99275SPeter Avalos tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
127141c99275SPeter Avalos subobj_type,
127241c99275SPeter Avalos tok2str(af_values, "Unknown", af), af,
1273*ed775ee7SAntonio Huete Jimenez subobj_len);
1274411677aeSAaron LI
1275411677aeSAaron LI /* In addition to what is explained above, the same spec does not
1276411677aeSAaron LI * explicitly say that the same Length field includes the 4-octet
1277411677aeSAaron LI * sub-object header, but as long as this while loop implements it
1278411677aeSAaron LI * as it does include, let's keep the check below consistent with
1279411677aeSAaron LI * the rest of the code.
1280*ed775ee7SAntonio Huete Jimenez *
1281*ed775ee7SAntonio Huete Jimenez * XXX - RFC 3476 Section 3.1 says "The contents of these
1282*ed775ee7SAntonio Huete Jimenez * sub-objects are described in [8]", where [8] is
1283*ed775ee7SAntonio Huete Jimenez * UNI 1.0 Signaling Specification, The Optical
1284*ed775ee7SAntonio Huete Jimenez * Internetworking Forum. The URL they give for that
1285*ed775ee7SAntonio Huete Jimenez * document is
1286*ed775ee7SAntonio Huete Jimenez *
1287*ed775ee7SAntonio Huete Jimenez * http://www.oiforum.com/public/UNI_1.0_ia.html
1288*ed775ee7SAntonio Huete Jimenez *
1289*ed775ee7SAntonio Huete Jimenez * but that doesn't work; the new URL appears to be
1290*ed775ee7SAntonio Huete Jimenez *
1291*ed775ee7SAntonio Huete Jimenez * https://web.archive.org/web/20160401194747/http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf
1292*ed775ee7SAntonio Huete Jimenez *
1293*ed775ee7SAntonio Huete Jimenez * and *that* document, in section 12.5.2.3
1294*ed775ee7SAntonio Huete Jimenez * "GENERALIZED_UNI Object (Class-Num=11bbbbbb (TBA))",
1295*ed775ee7SAntonio Huete Jimenez * says nothing about the length field in general, but
1296*ed775ee7SAntonio Huete Jimenez * some of the examples it gives in subsections have
1297*ed775ee7SAntonio Huete Jimenez * length field values that clearly includes the length
1298*ed775ee7SAntonio Huete Jimenez * of the sub-object header as well as the length of the
1299*ed775ee7SAntonio Huete Jimenez * value.
1300411677aeSAaron LI */
1301*ed775ee7SAntonio Huete Jimenez if(subobj_len < 4 || subobj_len > total_subobj_len ||
1302*ed775ee7SAntonio Huete Jimenez obj_tlen < subobj_len)
1303411677aeSAaron LI goto invalid;
130441c99275SPeter Avalos
130541c99275SPeter Avalos switch(subobj_type) {
130641c99275SPeter Avalos case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
130741c99275SPeter Avalos case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
130841c99275SPeter Avalos
130941c99275SPeter Avalos switch(af) {
131041c99275SPeter Avalos case AFNUM_INET:
131141c99275SPeter Avalos if (subobj_len < 8)
1312*ed775ee7SAntonio Huete Jimenez goto subobj_tooshort;
1313*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s UNI IPv4 TNA address: %s",
1314*ed775ee7SAntonio Huete Jimenez indent, GET_IPADDR_STRING(obj_tptr + 4));
131541c99275SPeter Avalos break;
131641c99275SPeter Avalos case AFNUM_INET6:
131741c99275SPeter Avalos if (subobj_len < 20)
1318*ed775ee7SAntonio Huete Jimenez goto subobj_tooshort;
1319*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s UNI IPv6 TNA address: %s",
1320*ed775ee7SAntonio Huete Jimenez indent, GET_IP6ADDR_STRING(obj_tptr + 4));
132141c99275SPeter Avalos break;
132241c99275SPeter Avalos case AFNUM_NSAP:
132341c99275SPeter Avalos if (subobj_len) {
132441c99275SPeter Avalos /* unless we have a TLV parser lets just hexdump */
132541c99275SPeter Avalos hexdump=TRUE;
132641c99275SPeter Avalos }
132741c99275SPeter Avalos break;
132841c99275SPeter Avalos }
132941c99275SPeter Avalos break;
133041c99275SPeter Avalos
133141c99275SPeter Avalos case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
1332*ed775ee7SAntonio Huete Jimenez if (subobj_len > 4) {
133341c99275SPeter Avalos /* unless we have a TLV parser lets just hexdump */
133441c99275SPeter Avalos hexdump=TRUE;
133541c99275SPeter Avalos }
133641c99275SPeter Avalos break;
133741c99275SPeter Avalos
133841c99275SPeter Avalos case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
133941c99275SPeter Avalos if (subobj_len < 16) {
1340*ed775ee7SAntonio Huete Jimenez goto subobj_tooshort;
134141c99275SPeter Avalos }
134241c99275SPeter Avalos
1343*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
1344*ed775ee7SAntonio Huete Jimenez indent,
1345*ed775ee7SAntonio Huete Jimenez ((GET_BE_U_4(obj_tptr + 4))>>31),
1346*ed775ee7SAntonio Huete Jimenez ((GET_BE_U_4(obj_tptr + 4))&0xFF),
1347*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 8),
1348*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 12));
134941c99275SPeter Avalos break;
135041c99275SPeter Avalos
135141c99275SPeter Avalos case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
135241c99275SPeter Avalos if (subobj_len < 8) {
1353*ed775ee7SAntonio Huete Jimenez goto subobj_tooshort;
135441c99275SPeter Avalos }
135541c99275SPeter Avalos
1356*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Service level: %u",
1357*ed775ee7SAntonio Huete Jimenez indent, (GET_BE_U_4(obj_tptr + 4)) >> 24);
135841c99275SPeter Avalos break;
135941c99275SPeter Avalos
136041c99275SPeter Avalos default:
136141c99275SPeter Avalos hexdump=TRUE;
136241c99275SPeter Avalos break;
136341c99275SPeter Avalos }
136441c99275SPeter Avalos total_subobj_len-=subobj_len;
136541c99275SPeter Avalos obj_tptr+=subobj_len;
136641c99275SPeter Avalos obj_tlen+=subobj_len;
136741c99275SPeter Avalos }
136841c99275SPeter Avalos break;
136941c99275SPeter Avalos
137041c99275SPeter Avalos default:
137141c99275SPeter Avalos hexdump=TRUE;
137241c99275SPeter Avalos }
137341c99275SPeter Avalos break;
137441c99275SPeter Avalos
137541c99275SPeter Avalos case RSVP_OBJ_RSVP_HOP:
137641c99275SPeter Avalos switch(rsvp_obj_ctype) {
137741c99275SPeter Avalos case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
137841c99275SPeter Avalos case RSVP_CTYPE_IPV4:
137941c99275SPeter Avalos if (obj_tlen < 8)
1380*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1381*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1382*ed775ee7SAntonio Huete Jimenez indent,
1383*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1384*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4));
138541c99275SPeter Avalos obj_tlen-=8;
138641c99275SPeter Avalos obj_tptr+=8;
138741c99275SPeter Avalos if (obj_tlen)
138841c99275SPeter Avalos hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
138941c99275SPeter Avalos break;
139041c99275SPeter Avalos case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
139141c99275SPeter Avalos case RSVP_CTYPE_IPV6:
139241c99275SPeter Avalos if (obj_tlen < 20)
1393*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1394*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
1395*ed775ee7SAntonio Huete Jimenez indent,
1396*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
1397*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 16));
139841c99275SPeter Avalos obj_tlen-=20;
139941c99275SPeter Avalos obj_tptr+=20;
140041c99275SPeter Avalos hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
140141c99275SPeter Avalos break;
140241c99275SPeter Avalos default:
140341c99275SPeter Avalos hexdump=TRUE;
140441c99275SPeter Avalos }
140541c99275SPeter Avalos break;
140641c99275SPeter Avalos
140741c99275SPeter Avalos case RSVP_OBJ_TIME_VALUES:
140841c99275SPeter Avalos switch(rsvp_obj_ctype) {
140941c99275SPeter Avalos case RSVP_CTYPE_1:
141041c99275SPeter Avalos if (obj_tlen < 4)
1411*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1412*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Refresh Period: %ums",
1413*ed775ee7SAntonio Huete Jimenez indent,
1414*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr));
141541c99275SPeter Avalos obj_tlen-=4;
141641c99275SPeter Avalos obj_tptr+=4;
141741c99275SPeter Avalos break;
141841c99275SPeter Avalos default:
141941c99275SPeter Avalos hexdump=TRUE;
142041c99275SPeter Avalos }
142141c99275SPeter Avalos break;
142241c99275SPeter Avalos
142341c99275SPeter Avalos /* those three objects do share the same semantics */
142441c99275SPeter Avalos case RSVP_OBJ_SENDER_TSPEC:
142541c99275SPeter Avalos case RSVP_OBJ_ADSPEC:
142641c99275SPeter Avalos case RSVP_OBJ_FLOWSPEC:
142741c99275SPeter Avalos switch(rsvp_obj_ctype) {
142841c99275SPeter Avalos case RSVP_CTYPE_2:
142941c99275SPeter Avalos if (obj_tlen < 4)
1430*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1431*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Msg-Version: %u, length: %u",
1432*ed775ee7SAntonio Huete Jimenez indent,
1433*ed775ee7SAntonio Huete Jimenez (GET_U_1(obj_tptr) & 0xf0) >> 4,
1434*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 2) << 2);
143541c99275SPeter Avalos obj_tptr+=4; /* get to the start of the service header */
143641c99275SPeter Avalos obj_tlen-=4;
143741c99275SPeter Avalos
143841c99275SPeter Avalos while (obj_tlen >= 4) {
1439*ed775ee7SAntonio Huete Jimenez intserv_serv_tlen=GET_BE_U_2(obj_tptr + 2)<<2;
1440*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Service Type: %s (%u), break bit %sset, Service length: %u",
1441*ed775ee7SAntonio Huete Jimenez indent,
1442*ed775ee7SAntonio Huete Jimenez tok2str(rsvp_intserv_service_type_values,"unknown",GET_U_1((obj_tptr))),
1443*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr),
1444*ed775ee7SAntonio Huete Jimenez (GET_U_1(obj_tptr + 1)&0x80) ? "" : "not ",
1445*ed775ee7SAntonio Huete Jimenez intserv_serv_tlen);
144641c99275SPeter Avalos
144741c99275SPeter Avalos obj_tptr+=4; /* get to the start of the parameter list */
144841c99275SPeter Avalos obj_tlen-=4;
144941c99275SPeter Avalos
145041c99275SPeter Avalos while (intserv_serv_tlen>=4) {
1451411677aeSAaron LI processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
145241c99275SPeter Avalos if (processed == 0)
145341c99275SPeter Avalos break;
145441c99275SPeter Avalos obj_tlen-=processed;
145541c99275SPeter Avalos intserv_serv_tlen-=processed;
145641c99275SPeter Avalos obj_tptr+=processed;
145741c99275SPeter Avalos }
145841c99275SPeter Avalos }
145941c99275SPeter Avalos break;
146041c99275SPeter Avalos default:
146141c99275SPeter Avalos hexdump=TRUE;
146241c99275SPeter Avalos }
146341c99275SPeter Avalos break;
146441c99275SPeter Avalos
146541c99275SPeter Avalos case RSVP_OBJ_FILTERSPEC:
146641c99275SPeter Avalos switch(rsvp_obj_ctype) {
146741c99275SPeter Avalos case RSVP_CTYPE_IPV4:
146841c99275SPeter Avalos if (obj_tlen < 8)
1469*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1470*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, Source Port: %u",
1471*ed775ee7SAntonio Huete Jimenez indent,
1472*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1473*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6));
147441c99275SPeter Avalos obj_tlen-=8;
147541c99275SPeter Avalos obj_tptr+=8;
147641c99275SPeter Avalos break;
147741c99275SPeter Avalos case RSVP_CTYPE_IPV6:
147841c99275SPeter Avalos if (obj_tlen < 20)
1479*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1480*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, Source Port: %u",
1481*ed775ee7SAntonio Huete Jimenez indent,
1482*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
1483*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18));
148441c99275SPeter Avalos obj_tlen-=20;
148541c99275SPeter Avalos obj_tptr+=20;
148641c99275SPeter Avalos break;
148741c99275SPeter Avalos case RSVP_CTYPE_3:
148841c99275SPeter Avalos if (obj_tlen < 20)
1489*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1490*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, Flow Label: %u",
1491*ed775ee7SAntonio Huete Jimenez indent,
1492*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
1493*ed775ee7SAntonio Huete Jimenez GET_BE_U_3(obj_tptr + 17));
149441c99275SPeter Avalos obj_tlen-=20;
149541c99275SPeter Avalos obj_tptr+=20;
149641c99275SPeter Avalos break;
149741c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV6:
149841c99275SPeter Avalos if (obj_tlen < 20)
1499*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1500*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, LSP-ID: 0x%04x",
1501*ed775ee7SAntonio Huete Jimenez indent,
1502*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1503*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18));
150441c99275SPeter Avalos obj_tlen-=20;
150541c99275SPeter Avalos obj_tptr+=20;
150641c99275SPeter Avalos break;
150727bfbee1SPeter Avalos case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
150827bfbee1SPeter Avalos if (obj_tlen < 40)
1509*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1510*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
151127bfbee1SPeter Avalos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1512*ed775ee7SAntonio Huete Jimenez indent,
1513*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
1514*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 18),
1515*ed775ee7SAntonio Huete Jimenez indent,
1516*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr+20),
1517*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 38));
151827bfbee1SPeter Avalos obj_tlen-=40;
151927bfbee1SPeter Avalos obj_tptr+=40;
152027bfbee1SPeter Avalos break;
152141c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4:
152241c99275SPeter Avalos if (obj_tlen < 8)
1523*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1524*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Source Address: %s, LSP-ID: 0x%04x",
1525*ed775ee7SAntonio Huete Jimenez indent,
1526*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1527*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6));
152841c99275SPeter Avalos obj_tlen-=8;
152941c99275SPeter Avalos obj_tptr+=8;
153041c99275SPeter Avalos break;
153127bfbee1SPeter Avalos case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
153227bfbee1SPeter Avalos if (obj_tlen < 16)
1533*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1534*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
153527bfbee1SPeter Avalos "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
1536*ed775ee7SAntonio Huete Jimenez indent,
1537*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1538*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 6),
1539*ed775ee7SAntonio Huete Jimenez indent,
1540*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr+8),
1541*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr + 12));
154227bfbee1SPeter Avalos obj_tlen-=16;
154327bfbee1SPeter Avalos obj_tptr+=16;
154427bfbee1SPeter Avalos break;
154541c99275SPeter Avalos default:
154641c99275SPeter Avalos hexdump=TRUE;
154741c99275SPeter Avalos }
154841c99275SPeter Avalos break;
154941c99275SPeter Avalos
155041c99275SPeter Avalos case RSVP_OBJ_FASTREROUTE:
155141c99275SPeter Avalos /* the differences between c-type 1 and 7 are minor */
155241c99275SPeter Avalos obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
155341c99275SPeter Avalos
155441c99275SPeter Avalos switch(rsvp_obj_ctype) {
155541c99275SPeter Avalos case RSVP_CTYPE_1: /* new style */
155641c99275SPeter Avalos if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
1557*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1558*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1559*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1560*ed775ee7SAntonio Huete Jimenez indent,
1561*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->setup_prio,
1562*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->hold_prio,
1563*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->hop_limit,
1564*ed775ee7SAntonio Huete Jimenez bw.f * 8 / 1000000);
1565*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
1566*ed775ee7SAntonio Huete Jimenez indent,
1567*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1568*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any),
1569*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all));
157041c99275SPeter Avalos obj_tlen-=sizeof(struct rsvp_obj_frr_t);
157141c99275SPeter Avalos obj_tptr+=sizeof(struct rsvp_obj_frr_t);
157241c99275SPeter Avalos break;
157341c99275SPeter Avalos
157441c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
157541c99275SPeter Avalos if (obj_tlen < 16)
1576*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1577*ed775ee7SAntonio Huete Jimenez bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
1578*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
1579*ed775ee7SAntonio Huete Jimenez indent,
1580*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->setup_prio,
1581*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->hold_prio,
1582*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_frr->hop_limit,
1583*ed775ee7SAntonio Huete Jimenez bw.f * 8 / 1000000);
1584*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Include Colors: 0x%08x, Exclude Colors: 0x%08x",
1585*ed775ee7SAntonio Huete Jimenez indent,
1586*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
1587*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any));
158841c99275SPeter Avalos obj_tlen-=16;
158941c99275SPeter Avalos obj_tptr+=16;
159041c99275SPeter Avalos break;
159141c99275SPeter Avalos
159241c99275SPeter Avalos default:
159341c99275SPeter Avalos hexdump=TRUE;
159441c99275SPeter Avalos }
159541c99275SPeter Avalos break;
159641c99275SPeter Avalos
159741c99275SPeter Avalos case RSVP_OBJ_DETOUR:
159841c99275SPeter Avalos switch(rsvp_obj_ctype) {
159941c99275SPeter Avalos case RSVP_CTYPE_TUNNEL_IPV4:
160041c99275SPeter Avalos while(obj_tlen >= 8) {
1601*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s PLR-ID: %s, Avoid-Node-ID: %s",
1602*ed775ee7SAntonio Huete Jimenez indent,
1603*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1604*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr + 4));
160541c99275SPeter Avalos obj_tlen-=8;
160641c99275SPeter Avalos obj_tptr+=8;
160741c99275SPeter Avalos }
160841c99275SPeter Avalos break;
160941c99275SPeter Avalos default:
161041c99275SPeter Avalos hexdump=TRUE;
161141c99275SPeter Avalos }
161241c99275SPeter Avalos break;
161341c99275SPeter Avalos
161441c99275SPeter Avalos case RSVP_OBJ_CLASSTYPE:
161541c99275SPeter Avalos case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
161641c99275SPeter Avalos switch(rsvp_obj_ctype) {
161741c99275SPeter Avalos case RSVP_CTYPE_1:
1618*ed775ee7SAntonio Huete Jimenez if (obj_tlen < 4)
1619*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1620*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s CT: %u",
1621*ed775ee7SAntonio Huete Jimenez indent,
1622*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr) & 0x7);
162341c99275SPeter Avalos obj_tlen-=4;
162441c99275SPeter Avalos obj_tptr+=4;
162541c99275SPeter Avalos break;
162641c99275SPeter Avalos default:
162741c99275SPeter Avalos hexdump=TRUE;
162841c99275SPeter Avalos }
162941c99275SPeter Avalos break;
163041c99275SPeter Avalos
163141c99275SPeter Avalos case RSVP_OBJ_ERROR_SPEC:
163241c99275SPeter Avalos switch(rsvp_obj_ctype) {
163341c99275SPeter Avalos case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
163441c99275SPeter Avalos case RSVP_CTYPE_IPV4:
163541c99275SPeter Avalos if (obj_tlen < 8)
1636*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1637*ed775ee7SAntonio Huete Jimenez error_code=GET_U_1(obj_tptr + 5);
1638*ed775ee7SAntonio Huete Jimenez error_value=GET_BE_U_2(obj_tptr + 6);
1639*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
1640*ed775ee7SAntonio Huete Jimenez indent,
1641*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(obj_tptr),
1642*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 4),
1643*ed775ee7SAntonio Huete Jimenez indent,
164441c99275SPeter Avalos tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1645*ed775ee7SAntonio Huete Jimenez error_code);
164641c99275SPeter Avalos switch (error_code) {
164741c99275SPeter Avalos case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1648*ed775ee7SAntonio Huete Jimenez ND_PRINT(", Error Value: %s (%u)",
164941c99275SPeter Avalos tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1650*ed775ee7SAntonio Huete Jimenez error_value);
165141c99275SPeter Avalos break;
165241c99275SPeter Avalos case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
165341c99275SPeter Avalos case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
1654*ed775ee7SAntonio Huete Jimenez ND_PRINT(", Error Value: %s (%u)",
165541c99275SPeter Avalos tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
1656*ed775ee7SAntonio Huete Jimenez error_value);
165741c99275SPeter Avalos break;
165841c99275SPeter Avalos default:
1659*ed775ee7SAntonio Huete Jimenez ND_PRINT(", Unknown Error Value (%u)", error_value);
166041c99275SPeter Avalos break;
166141c99275SPeter Avalos }
166241c99275SPeter Avalos obj_tlen-=8;
166341c99275SPeter Avalos obj_tptr+=8;
166441c99275SPeter Avalos break;
166541c99275SPeter Avalos case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
166641c99275SPeter Avalos case RSVP_CTYPE_IPV6:
166741c99275SPeter Avalos if (obj_tlen < 20)
1668*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1669*ed775ee7SAntonio Huete Jimenez error_code=GET_U_1(obj_tptr + 17);
1670*ed775ee7SAntonio Huete Jimenez error_value=GET_BE_U_2(obj_tptr + 18);
1671*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
1672*ed775ee7SAntonio Huete Jimenez indent,
1673*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(obj_tptr),
1674*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 16),
1675*ed775ee7SAntonio Huete Jimenez indent,
167641c99275SPeter Avalos tok2str(rsvp_obj_error_code_values,"unknown",error_code),
1677*ed775ee7SAntonio Huete Jimenez error_code);
167841c99275SPeter Avalos
167941c99275SPeter Avalos switch (error_code) {
168041c99275SPeter Avalos case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
1681*ed775ee7SAntonio Huete Jimenez ND_PRINT(", Error Value: %s (%u)",
168241c99275SPeter Avalos tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
1683*ed775ee7SAntonio Huete Jimenez error_value);
168441c99275SPeter Avalos break;
168541c99275SPeter Avalos default:
168641c99275SPeter Avalos break;
168741c99275SPeter Avalos }
168841c99275SPeter Avalos obj_tlen-=20;
168941c99275SPeter Avalos obj_tptr+=20;
169041c99275SPeter Avalos break;
169141c99275SPeter Avalos default:
169241c99275SPeter Avalos hexdump=TRUE;
169341c99275SPeter Avalos }
169441c99275SPeter Avalos break;
169541c99275SPeter Avalos
169641c99275SPeter Avalos case RSVP_OBJ_PROPERTIES:
169741c99275SPeter Avalos switch(rsvp_obj_ctype) {
169841c99275SPeter Avalos case RSVP_CTYPE_1:
169941c99275SPeter Avalos if (obj_tlen < 4)
1700*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1701*ed775ee7SAntonio Huete Jimenez padbytes = GET_BE_U_2(obj_tptr + 2);
1702*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s TLV count: %u, padding bytes: %u",
1703*ed775ee7SAntonio Huete Jimenez indent,
1704*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_tptr),
1705*ed775ee7SAntonio Huete Jimenez padbytes);
170641c99275SPeter Avalos obj_tlen-=4;
170741c99275SPeter Avalos obj_tptr+=4;
170841c99275SPeter Avalos /* loop through as long there is anything longer than the TLV header (2) */
170941c99275SPeter Avalos while(obj_tlen >= 2 + padbytes) {
1710*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s %s TLV (0x%02x), length: %u", /* length includes header */
1711*ed775ee7SAntonio Huete Jimenez indent,
1712*ed775ee7SAntonio Huete Jimenez tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)),
1713*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr),
1714*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 1));
1715*ed775ee7SAntonio Huete Jimenez if (obj_tlen < GET_U_1(obj_tptr + 1))
1716*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1717*ed775ee7SAntonio Huete Jimenez if (GET_U_1(obj_tptr + 1) < 2) {
1718*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: property TLV is too short", indent);
171941c99275SPeter Avalos return -1;
1720*ed775ee7SAntonio Huete Jimenez }
1721*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, obj_tptr + 2, "\n\t\t",
1722*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr + 1) - 2);
1723*ed775ee7SAntonio Huete Jimenez obj_tlen-=GET_U_1(obj_tptr + 1);
1724*ed775ee7SAntonio Huete Jimenez obj_tptr+=GET_U_1(obj_tptr + 1);
172541c99275SPeter Avalos }
172641c99275SPeter Avalos break;
172741c99275SPeter Avalos default:
172841c99275SPeter Avalos hexdump=TRUE;
172941c99275SPeter Avalos }
173041c99275SPeter Avalos break;
173141c99275SPeter Avalos
173241c99275SPeter Avalos case RSVP_OBJ_MESSAGE_ID: /* fall through */
173341c99275SPeter Avalos case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
173441c99275SPeter Avalos case RSVP_OBJ_MESSAGE_ID_LIST:
173541c99275SPeter Avalos switch(rsvp_obj_ctype) {
173641c99275SPeter Avalos case RSVP_CTYPE_1:
173741c99275SPeter Avalos case RSVP_CTYPE_2:
1738*ed775ee7SAntonio Huete Jimenez if (obj_tlen < 4)
1739*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1740*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Flags [0x%02x], epoch: %u",
1741*ed775ee7SAntonio Huete Jimenez indent,
1742*ed775ee7SAntonio Huete Jimenez GET_U_1(obj_tptr),
1743*ed775ee7SAntonio Huete Jimenez GET_BE_U_3(obj_tptr + 1));
174441c99275SPeter Avalos obj_tlen-=4;
174541c99275SPeter Avalos obj_tptr+=4;
174641c99275SPeter Avalos /* loop through as long there are no messages left */
174741c99275SPeter Avalos while(obj_tlen >= 4) {
1748*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Message-ID 0x%08x (%u)",
1749*ed775ee7SAntonio Huete Jimenez indent,
1750*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr),
1751*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr));
175241c99275SPeter Avalos obj_tlen-=4;
175341c99275SPeter Avalos obj_tptr+=4;
175441c99275SPeter Avalos }
175541c99275SPeter Avalos break;
175641c99275SPeter Avalos default:
175741c99275SPeter Avalos hexdump=TRUE;
175841c99275SPeter Avalos }
175941c99275SPeter Avalos break;
176041c99275SPeter Avalos
176141c99275SPeter Avalos case RSVP_OBJ_INTEGRITY:
176241c99275SPeter Avalos switch(rsvp_obj_ctype) {
176341c99275SPeter Avalos case RSVP_CTYPE_1:
176441c99275SPeter Avalos if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
1765*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
176641c99275SPeter Avalos obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
1767*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
1768*ed775ee7SAntonio Huete Jimenez indent,
1769*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id),
1770*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2),
1771*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence),
1772*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4),
177341c99275SPeter Avalos bittok2str(rsvp_obj_integrity_flag_values,
177441c99275SPeter Avalos "none",
1775*ed775ee7SAntonio Huete Jimenez obj_ptr.rsvp_obj_integrity->flags));
1776*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s MD5-sum 0x%08x%08x%08x%08x ",
1777*ed775ee7SAntonio Huete Jimenez indent,
1778*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest),
1779*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4),
1780*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8),
1781*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12));
178227bfbee1SPeter Avalos
1783411677aeSAaron LI sigcheck = signature_verify(ndo, pptr, plen,
1784411677aeSAaron LI obj_ptr.rsvp_obj_integrity->digest,
1785411677aeSAaron LI rsvp_clear_checksum,
1786411677aeSAaron LI rsvp_com_header);
1787*ed775ee7SAntonio Huete Jimenez ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
178827bfbee1SPeter Avalos
178941c99275SPeter Avalos obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
179041c99275SPeter Avalos obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
179141c99275SPeter Avalos break;
179241c99275SPeter Avalos default:
179341c99275SPeter Avalos hexdump=TRUE;
179441c99275SPeter Avalos }
179541c99275SPeter Avalos break;
179641c99275SPeter Avalos
179741c99275SPeter Avalos case RSVP_OBJ_ADMIN_STATUS:
179841c99275SPeter Avalos switch(rsvp_obj_ctype) {
179941c99275SPeter Avalos case RSVP_CTYPE_1:
180041c99275SPeter Avalos if (obj_tlen < 4)
1801*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1802*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Flags [%s]", indent,
180341c99275SPeter Avalos bittok2str(rsvp_obj_admin_status_flag_values, "none",
1804*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr)));
180541c99275SPeter Avalos obj_tlen-=4;
180641c99275SPeter Avalos obj_tptr+=4;
180741c99275SPeter Avalos break;
180841c99275SPeter Avalos default:
180941c99275SPeter Avalos hexdump=TRUE;
181041c99275SPeter Avalos }
181141c99275SPeter Avalos break;
181241c99275SPeter Avalos
181341c99275SPeter Avalos case RSVP_OBJ_LABEL_SET:
181441c99275SPeter Avalos switch(rsvp_obj_ctype) {
181541c99275SPeter Avalos case RSVP_CTYPE_1:
181641c99275SPeter Avalos if (obj_tlen < 4)
1817*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1818*ed775ee7SAntonio Huete Jimenez action = (GET_BE_U_2(obj_tptr)>>8);
181941c99275SPeter Avalos
1820*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Action: %s (%u), Label type: %u", indent,
182141c99275SPeter Avalos tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
1822*ed775ee7SAntonio Huete Jimenez action, (GET_BE_U_4(obj_tptr) & 0x7F));
182341c99275SPeter Avalos
182441c99275SPeter Avalos switch (action) {
182541c99275SPeter Avalos case LABEL_SET_INCLUSIVE_RANGE:
182641c99275SPeter Avalos case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
182741c99275SPeter Avalos
182841c99275SPeter Avalos /* only a couple of subchannels are expected */
182941c99275SPeter Avalos if (obj_tlen < 12)
1830*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1831*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Start range: %u, End range: %u", indent,
1832*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 4),
1833*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr + 8));
183441c99275SPeter Avalos obj_tlen-=12;
183541c99275SPeter Avalos obj_tptr+=12;
183641c99275SPeter Avalos break;
183741c99275SPeter Avalos
183841c99275SPeter Avalos default:
183941c99275SPeter Avalos obj_tlen-=4;
184041c99275SPeter Avalos obj_tptr+=4;
184141c99275SPeter Avalos subchannel = 1;
184241c99275SPeter Avalos while(obj_tlen >= 4 ) {
1843*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Subchannel #%u: %u", indent, subchannel,
1844*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(obj_tptr));
184541c99275SPeter Avalos obj_tptr+=4;
184641c99275SPeter Avalos obj_tlen-=4;
184741c99275SPeter Avalos subchannel++;
184841c99275SPeter Avalos }
184941c99275SPeter Avalos break;
185041c99275SPeter Avalos }
185141c99275SPeter Avalos break;
185227bfbee1SPeter Avalos default:
185327bfbee1SPeter Avalos hexdump=TRUE;
185427bfbee1SPeter Avalos }
1855*ed775ee7SAntonio Huete Jimenez break;
185641c99275SPeter Avalos
185727bfbee1SPeter Avalos case RSVP_OBJ_S2L:
185827bfbee1SPeter Avalos switch (rsvp_obj_ctype) {
185927bfbee1SPeter Avalos case RSVP_CTYPE_IPV4:
186027bfbee1SPeter Avalos if (obj_tlen < 4)
1861*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1862*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Sub-LSP destination address: %s",
1863*ed775ee7SAntonio Huete Jimenez indent, GET_IPADDR_STRING(obj_tptr));
186427bfbee1SPeter Avalos
186527bfbee1SPeter Avalos obj_tlen-=4;
186627bfbee1SPeter Avalos obj_tptr+=4;
186727bfbee1SPeter Avalos break;
186827bfbee1SPeter Avalos case RSVP_CTYPE_IPV6:
186927bfbee1SPeter Avalos if (obj_tlen < 16)
1870*ed775ee7SAntonio Huete Jimenez goto obj_tooshort;
1871*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s Sub-LSP destination address: %s",
1872*ed775ee7SAntonio Huete Jimenez indent, GET_IP6ADDR_STRING(obj_tptr));
187327bfbee1SPeter Avalos
187427bfbee1SPeter Avalos obj_tlen-=16;
187527bfbee1SPeter Avalos obj_tptr+=16;
187627bfbee1SPeter Avalos break;
187741c99275SPeter Avalos default:
187841c99275SPeter Avalos hexdump=TRUE;
187941c99275SPeter Avalos }
1880*ed775ee7SAntonio Huete Jimenez break;
188141c99275SPeter Avalos
188241c99275SPeter Avalos /*
188341c99275SPeter Avalos * FIXME those are the defined objects that lack a decoder
188441c99275SPeter Avalos * you are welcome to contribute code ;-)
188541c99275SPeter Avalos */
188641c99275SPeter Avalos
188741c99275SPeter Avalos case RSVP_OBJ_SCOPE:
188841c99275SPeter Avalos case RSVP_OBJ_POLICY_DATA:
188941c99275SPeter Avalos case RSVP_OBJ_ACCEPT_LABEL_SET:
189041c99275SPeter Avalos case RSVP_OBJ_PROTECTION:
189141c99275SPeter Avalos default:
1892411677aeSAaron LI if (ndo->ndo_vflag <= 1)
1893411677aeSAaron LI print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen); /* FIXME indentation */
189441c99275SPeter Avalos break;
189541c99275SPeter Avalos }
189641c99275SPeter Avalos /* do we also want to see a hex dump ? */
1897411677aeSAaron LI if (ndo->ndo_vflag > 1 || hexdump == TRUE)
1898411677aeSAaron LI print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t ", /* FIXME indentation */
189941c99275SPeter Avalos rsvp_obj_len - sizeof(struct rsvp_object_header));
190041c99275SPeter Avalos
190141c99275SPeter Avalos tptr+=rsvp_obj_len;
190241c99275SPeter Avalos tlen-=rsvp_obj_len;
190341c99275SPeter Avalos }
190441c99275SPeter Avalos return 0;
1905*ed775ee7SAntonio Huete Jimenez subobj_tooshort:
1906*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: sub-object is too short", indent);
1907*ed775ee7SAntonio Huete Jimenez return -1;
1908*ed775ee7SAntonio Huete Jimenez obj_tooshort:
1909*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sERROR: object is too short", indent);
1910*ed775ee7SAntonio Huete Jimenez return -1;
1911411677aeSAaron LI invalid:
1912*ed775ee7SAntonio Huete Jimenez nd_print_invalid(ndo);
1913411677aeSAaron LI return -1;
191441c99275SPeter Avalos trunc:
1915*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
191641c99275SPeter Avalos return -1;
191741c99275SPeter Avalos }
191841c99275SPeter Avalos
191941c99275SPeter Avalos void
rsvp_print(netdissect_options * ndo,const u_char * pptr,u_int len)1920411677aeSAaron LI rsvp_print(netdissect_options *ndo,
1921*ed775ee7SAntonio Huete Jimenez const u_char *pptr, u_int len)
1922411677aeSAaron LI {
1923411677aeSAaron LI const struct rsvp_common_header *rsvp_com_header;
1924*ed775ee7SAntonio Huete Jimenez uint8_t version_flags, msg_type;
1925411677aeSAaron LI const u_char *tptr;
1926411677aeSAaron LI u_short plen, tlen;
192741c99275SPeter Avalos
1928*ed775ee7SAntonio Huete Jimenez ndo->ndo_protocol = "rsvp";
192941c99275SPeter Avalos tptr=pptr;
193041c99275SPeter Avalos
1931411677aeSAaron LI rsvp_com_header = (const struct rsvp_common_header *)pptr;
1932*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(rsvp_com_header);
1933*ed775ee7SAntonio Huete Jimenez version_flags = GET_U_1(rsvp_com_header->version_flags);
193441c99275SPeter Avalos
193541c99275SPeter Avalos /*
193641c99275SPeter Avalos * Sanity checking of the header.
193741c99275SPeter Avalos */
1938*ed775ee7SAntonio Huete Jimenez if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1939*ed775ee7SAntonio Huete Jimenez ND_PRINT("ERROR: RSVP version %u packet not supported",
1940*ed775ee7SAntonio Huete Jimenez RSVP_EXTRACT_VERSION(version_flags));
194141c99275SPeter Avalos return;
194241c99275SPeter Avalos }
194341c99275SPeter Avalos
1944*ed775ee7SAntonio Huete Jimenez msg_type = GET_U_1(rsvp_com_header->msg_type);
1945*ed775ee7SAntonio Huete Jimenez
194641c99275SPeter Avalos /* in non-verbose mode just lets print the basic Message Type*/
1947411677aeSAaron LI if (ndo->ndo_vflag < 1) {
1948*ed775ee7SAntonio Huete Jimenez ND_PRINT("RSVPv%u %s Message, length: %u",
1949*ed775ee7SAntonio Huete Jimenez RSVP_EXTRACT_VERSION(version_flags),
1950*ed775ee7SAntonio Huete Jimenez tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type),
1951*ed775ee7SAntonio Huete Jimenez len);
195241c99275SPeter Avalos return;
195341c99275SPeter Avalos }
195441c99275SPeter Avalos
195541c99275SPeter Avalos /* ok they seem to want to know everything - lets fully decode it */
195641c99275SPeter Avalos
1957*ed775ee7SAntonio Huete Jimenez plen = tlen = GET_BE_U_2(rsvp_com_header->length);
195841c99275SPeter Avalos
1959*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
1960*ed775ee7SAntonio Huete Jimenez RSVP_EXTRACT_VERSION(version_flags),
1961*ed775ee7SAntonio Huete Jimenez tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
1962*ed775ee7SAntonio Huete Jimenez msg_type,
1963*ed775ee7SAntonio Huete Jimenez bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
196441c99275SPeter Avalos tlen,
1965*ed775ee7SAntonio Huete Jimenez GET_U_1(rsvp_com_header->ttl),
1966*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(rsvp_com_header->checksum));
196727bfbee1SPeter Avalos
1968*ed775ee7SAntonio Huete Jimenez if (tlen < sizeof(struct rsvp_common_header)) {
1969*ed775ee7SAntonio Huete Jimenez ND_PRINT("ERROR: common header too short %u < %zu", tlen,
1970*ed775ee7SAntonio Huete Jimenez sizeof(struct rsvp_common_header));
197141c99275SPeter Avalos return;
197241c99275SPeter Avalos }
197341c99275SPeter Avalos
1974*ed775ee7SAntonio Huete Jimenez tptr+=sizeof(struct rsvp_common_header);
1975*ed775ee7SAntonio Huete Jimenez tlen-=sizeof(struct rsvp_common_header);
197641c99275SPeter Avalos
1977*ed775ee7SAntonio Huete Jimenez switch(msg_type) {
197841c99275SPeter Avalos
1979411677aeSAaron LI case RSVP_MSGTYPE_BUNDLE:
1980411677aeSAaron LI /*
1981411677aeSAaron LI * Process each submessage in the bundle message.
1982411677aeSAaron LI * Bundle messages may not contain bundle submessages, so we don't
1983411677aeSAaron LI * need to handle bundle submessages specially.
1984411677aeSAaron LI */
198541c99275SPeter Avalos while(tlen > 0) {
1986411677aeSAaron LI const u_char *subpptr=tptr, *subtptr;
1987411677aeSAaron LI u_short subplen, subtlen;
1988411677aeSAaron LI
1989411677aeSAaron LI subtptr=subpptr;
1990411677aeSAaron LI
1991411677aeSAaron LI rsvp_com_header = (const struct rsvp_common_header *)subpptr;
1992*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(rsvp_com_header);
1993*ed775ee7SAntonio Huete Jimenez version_flags = GET_U_1(rsvp_com_header->version_flags);
199441c99275SPeter Avalos
199541c99275SPeter Avalos /*
199641c99275SPeter Avalos * Sanity checking of the header.
199741c99275SPeter Avalos */
1998*ed775ee7SAntonio Huete Jimenez if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
1999*ed775ee7SAntonio Huete Jimenez ND_PRINT("ERROR: RSVP version %u packet not supported",
2000*ed775ee7SAntonio Huete Jimenez RSVP_EXTRACT_VERSION(version_flags));
200141c99275SPeter Avalos return;
200241c99275SPeter Avalos }
200341c99275SPeter Avalos
2004*ed775ee7SAntonio Huete Jimenez subplen = subtlen = GET_BE_U_2(rsvp_com_header->length);
2005411677aeSAaron LI
2006*ed775ee7SAntonio Huete Jimenez msg_type = GET_U_1(rsvp_com_header->msg_type);
2007*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
2008*ed775ee7SAntonio Huete Jimenez RSVP_EXTRACT_VERSION(version_flags),
2009*ed775ee7SAntonio Huete Jimenez tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
2010*ed775ee7SAntonio Huete Jimenez msg_type,
2011*ed775ee7SAntonio Huete Jimenez bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
201241c99275SPeter Avalos subtlen,
2013*ed775ee7SAntonio Huete Jimenez GET_U_1(rsvp_com_header->ttl),
2014*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(rsvp_com_header->checksum));
201527bfbee1SPeter Avalos
2016*ed775ee7SAntonio Huete Jimenez if (subtlen < sizeof(struct rsvp_common_header)) {
2017*ed775ee7SAntonio Huete Jimenez ND_PRINT("ERROR: common header too short %u < %zu", subtlen,
2018*ed775ee7SAntonio Huete Jimenez sizeof(struct rsvp_common_header));
201941c99275SPeter Avalos return;
202041c99275SPeter Avalos }
202141c99275SPeter Avalos
202241c99275SPeter Avalos if (tlen < subtlen) {
2023*ed775ee7SAntonio Huete Jimenez ND_PRINT("ERROR: common header too large %u > %u", subtlen,
2024*ed775ee7SAntonio Huete Jimenez tlen);
202541c99275SPeter Avalos return;
202641c99275SPeter Avalos }
202741c99275SPeter Avalos
2028*ed775ee7SAntonio Huete Jimenez subtptr+=sizeof(struct rsvp_common_header);
2029*ed775ee7SAntonio Huete Jimenez subtlen-=sizeof(struct rsvp_common_header);
203041c99275SPeter Avalos
2031411677aeSAaron LI /*
2032411677aeSAaron LI * Print all objects in the submessage.
2033411677aeSAaron LI */
2034411677aeSAaron LI if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t ", subtlen, rsvp_com_header) == -1)
203541c99275SPeter Avalos return;
203641c99275SPeter Avalos
2037*ed775ee7SAntonio Huete Jimenez tptr+=subtlen+sizeof(struct rsvp_common_header);
2038*ed775ee7SAntonio Huete Jimenez tlen-=subtlen+sizeof(struct rsvp_common_header);
203941c99275SPeter Avalos }
204041c99275SPeter Avalos
204141c99275SPeter Avalos break;
204241c99275SPeter Avalos
204341c99275SPeter Avalos case RSVP_MSGTYPE_PATH:
204441c99275SPeter Avalos case RSVP_MSGTYPE_RESV:
204541c99275SPeter Avalos case RSVP_MSGTYPE_PATHERR:
204641c99275SPeter Avalos case RSVP_MSGTYPE_RESVERR:
204741c99275SPeter Avalos case RSVP_MSGTYPE_PATHTEAR:
204841c99275SPeter Avalos case RSVP_MSGTYPE_RESVTEAR:
204941c99275SPeter Avalos case RSVP_MSGTYPE_RESVCONF:
205041c99275SPeter Avalos case RSVP_MSGTYPE_HELLO_OLD:
205141c99275SPeter Avalos case RSVP_MSGTYPE_HELLO:
205241c99275SPeter Avalos case RSVP_MSGTYPE_ACK:
205341c99275SPeter Avalos case RSVP_MSGTYPE_SREFRESH:
2054411677aeSAaron LI /*
2055411677aeSAaron LI * Print all objects in the message.
2056411677aeSAaron LI */
2057411677aeSAaron LI if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t ", tlen, rsvp_com_header) == -1)
205841c99275SPeter Avalos return;
205941c99275SPeter Avalos break;
206041c99275SPeter Avalos
206141c99275SPeter Avalos default:
2062411677aeSAaron LI print_unknown_data(ndo, tptr, "\n\t ", tlen);
206341c99275SPeter Avalos break;
206441c99275SPeter Avalos }
206541c99275SPeter Avalos
206641c99275SPeter Avalos return;
206741c99275SPeter Avalos trunc:
2068*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
206941c99275SPeter Avalos }
2070