+ case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
+ if (obj_tlen < 16)
+ goto obj_tooshort;
+ ND_PRINT("%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
+ "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
+ indent,
+ GET_IPADDR_STRING(obj_tptr),
+ GET_BE_U_2(obj_tptr + 6),
+ indent,
+ GET_IPADDR_STRING(obj_tptr+8),
+ GET_BE_U_2(obj_tptr + 12));
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_FASTREROUTE:
+ /* the differences between c-type 1 and 7 are minor */
+ obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
+
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1: /* new style */
+ if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
+ goto obj_tooshort;
+ bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
+ ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
+ indent,
+ obj_ptr.rsvp_obj_frr->setup_prio,
+ obj_ptr.rsvp_obj_frr->hold_prio,
+ obj_ptr.rsvp_obj_frr->hop_limit,
+ bw.f * 8 / 1000000);
+ ND_PRINT("%s Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
+ indent,
+ GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
+ GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any),
+ GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_all));
+ obj_tlen-=sizeof(struct rsvp_obj_frr_t);
+ obj_tptr+=sizeof(struct rsvp_obj_frr_t);
+ break;
+
+ case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
+ if (obj_tlen < 16)
+ goto obj_tooshort;
+ bw.i = GET_BE_U_4(obj_ptr.rsvp_obj_frr->bandwidth);
+ ND_PRINT("%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
+ indent,
+ obj_ptr.rsvp_obj_frr->setup_prio,
+ obj_ptr.rsvp_obj_frr->hold_prio,
+ obj_ptr.rsvp_obj_frr->hop_limit,
+ bw.f * 8 / 1000000);
+ ND_PRINT("%s Include Colors: 0x%08x, Exclude Colors: 0x%08x",
+ indent,
+ GET_BE_U_4(obj_ptr.rsvp_obj_frr->include_any),
+ GET_BE_U_4(obj_ptr.rsvp_obj_frr->exclude_any));
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;
+
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_DETOUR:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_TUNNEL_IPV4:
+ while(obj_tlen >= 8) {
+ ND_PRINT("%s PLR-ID: %s, Avoid-Node-ID: %s",
+ indent,
+ GET_IPADDR_STRING(obj_tptr),
+ GET_IPADDR_STRING(obj_tptr + 4));
+ obj_tlen-=8;
+ obj_tptr+=8;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_CLASSTYPE:
+ case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ ND_PRINT("%s CT: %u",
+ indent,
+ GET_BE_U_4(obj_tptr) & 0x7);
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_ERROR_SPEC:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 8)
+ goto obj_tooshort;
+ error_code=GET_U_1(obj_tptr + 5);
+ error_value=GET_BE_U_2(obj_tptr + 6);
+ ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
+ indent,
+ GET_IPADDR_STRING(obj_tptr),
+ GET_U_1(obj_tptr + 4),
+ indent,
+ tok2str(rsvp_obj_error_code_values,"unknown",error_code),
+ error_code);
+ switch (error_code) {
+ case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
+ ND_PRINT(", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
+ error_value);
+ break;
+ case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
+ case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
+ ND_PRINT(", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
+ error_value);
+ break;
+ default:
+ ND_PRINT(", Unknown Error Value (%u)", error_value);
+ break;
+ }
+ obj_tlen-=8;
+ obj_tptr+=8;
+ break;
+ case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 20)
+ goto obj_tooshort;
+ error_code=GET_U_1(obj_tptr + 17);
+ error_value=GET_BE_U_2(obj_tptr + 18);
+ ND_PRINT("%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
+ indent,
+ GET_IP6ADDR_STRING(obj_tptr),
+ GET_U_1(obj_tptr + 16),
+ indent,
+ tok2str(rsvp_obj_error_code_values,"unknown",error_code),
+ error_code);
+
+ switch (error_code) {
+ case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
+ ND_PRINT(", Error Value: %s (%u)",
+ tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
+ error_value);
+ break;
+ default:
+ break;
+ }
+ obj_tlen-=20;
+ obj_tptr+=20;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_PROPERTIES:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ padbytes = GET_BE_U_2(obj_tptr + 2);
+ ND_PRINT("%s TLV count: %u, padding bytes: %u",
+ indent,
+ GET_BE_U_2(obj_tptr),
+ padbytes);
+ obj_tlen-=4;
+ obj_tptr+=4;
+ /* loop through as long there is anything longer than the TLV header (2) */
+ while(obj_tlen >= 2 + padbytes) {
+ ND_PRINT("%s %s TLV (0x%02x), length: %u", /* length includes header */
+ indent,
+ tok2str(rsvp_obj_prop_tlv_values,"unknown",GET_U_1(obj_tptr)),
+ GET_U_1(obj_tptr),
+ GET_U_1(obj_tptr + 1));
+ if (obj_tlen < GET_U_1(obj_tptr + 1))
+ goto obj_tooshort;
+ if (GET_U_1(obj_tptr + 1) < 2) {
+ ND_PRINT("%sERROR: property TLV is too short", indent);
+ return -1;
+ }
+ print_unknown_data(ndo, obj_tptr + 2, "\n\t\t",
+ GET_U_1(obj_tptr + 1) - 2);
+ obj_tlen-=GET_U_1(obj_tptr + 1);
+ obj_tptr+=GET_U_1(obj_tptr + 1);
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_MESSAGE_ID: /* fall through */
+ case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
+ case RSVP_OBJ_MESSAGE_ID_LIST:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ case RSVP_CTYPE_2:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ ND_PRINT("%s Flags [0x%02x], epoch: %u",
+ indent,
+ GET_U_1(obj_tptr),
+ GET_BE_U_3(obj_tptr + 1));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ /* loop through as long there are no messages left */
+ while(obj_tlen >= 4) {
+ ND_PRINT("%s Message-ID 0x%08x (%u)",
+ indent,
+ GET_BE_U_4(obj_tptr),
+ GET_BE_U_4(obj_tptr));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_INTEGRITY:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
+ goto obj_tooshort;
+ obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
+ ND_PRINT("%s Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
+ indent,
+ GET_BE_U_2(obj_ptr.rsvp_obj_integrity->key_id),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->key_id + 2),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->sequence + 4),
+ bittok2str(rsvp_obj_integrity_flag_values,
+ "none",
+ obj_ptr.rsvp_obj_integrity->flags));
+ ND_PRINT("%s MD5-sum 0x%08x%08x%08x%08x ",
+ indent,
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 4),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 8),
+ GET_BE_U_4(obj_ptr.rsvp_obj_integrity->digest + 12));
+
+ sigcheck = signature_verify(ndo, pptr, plen,
+ obj_ptr.rsvp_obj_integrity->digest,
+ rsvp_clear_checksum,
+ rsvp_com_header);
+ ND_PRINT(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
+
+ obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
+ obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_ADMIN_STATUS:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ ND_PRINT("%s Flags [%s]", indent,
+ bittok2str(rsvp_obj_admin_status_flag_values, "none",
+ GET_BE_U_4(obj_tptr)));
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_LABEL_SET:
+ switch(rsvp_obj_ctype) {
+ case RSVP_CTYPE_1:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ action = (GET_BE_U_2(obj_tptr)>>8);
+
+ ND_PRINT("%s Action: %s (%u), Label type: %u", indent,
+ tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
+ action, (GET_BE_U_4(obj_tptr) & 0x7F));
+
+ switch (action) {
+ case LABEL_SET_INCLUSIVE_RANGE:
+ case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
+
+ /* only a couple of subchannels are expected */
+ if (obj_tlen < 12)
+ goto obj_tooshort;
+ ND_PRINT("%s Start range: %u, End range: %u", indent,
+ GET_BE_U_4(obj_tptr + 4),
+ GET_BE_U_4(obj_tptr + 8));
+ obj_tlen-=12;
+ obj_tptr+=12;
+ break;
+
+ default:
+ obj_tlen-=4;
+ obj_tptr+=4;
+ subchannel = 1;
+ while(obj_tlen >= 4 ) {
+ ND_PRINT("%s Subchannel #%u: %u", indent, subchannel,
+ GET_BE_U_4(obj_tptr));
+ obj_tptr+=4;
+ obj_tlen-=4;
+ subchannel++;
+ }
+ break;
+ }
+ break;
+ default:
+ hexdump=TRUE;
+ }
+ break;
+
+ case RSVP_OBJ_S2L:
+ switch (rsvp_obj_ctype) {
+ case RSVP_CTYPE_IPV4:
+ if (obj_tlen < 4)
+ goto obj_tooshort;
+ ND_PRINT("%s Sub-LSP destination address: %s",
+ indent, GET_IPADDR_STRING(obj_tptr));
+
+ obj_tlen-=4;
+ obj_tptr+=4;
+ break;
+ case RSVP_CTYPE_IPV6:
+ if (obj_tlen < 16)
+ goto obj_tooshort;
+ ND_PRINT("%s Sub-LSP destination address: %s",
+ indent, GET_IP6ADDR_STRING(obj_tptr));
+
+ obj_tlen-=16;
+ obj_tptr+=16;
+ break;