+ return 0;
+subobj_tooshort:
+ ND_PRINT("%sERROR: sub-object is too short", indent);
+ return -1;
+obj_tooshort:
+ ND_PRINT("%sERROR: object is too short", indent);
+ return -1;
+invalid:
+ nd_print_invalid(ndo);
+ return -1;
+trunc:
+ nd_print_trunc(ndo);
+ return -1;
+}
+
+void
+rsvp_print(netdissect_options *ndo,
+ const u_char *pptr, u_int len)
+{
+ const struct rsvp_common_header *rsvp_com_header;
+ uint8_t version_flags, msg_type;
+ const u_char *tptr;
+ u_short plen, tlen;
+
+ ndo->ndo_protocol = "rsvp";
+ tptr=pptr;
+
+ rsvp_com_header = (const struct rsvp_common_header *)pptr;
+ ND_TCHECK_SIZE(rsvp_com_header);
+ version_flags = GET_U_1(rsvp_com_header->version_flags);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
+ ND_PRINT("ERROR: RSVP version %u packet not supported",
+ RSVP_EXTRACT_VERSION(version_flags));
+ return;
+ }
+
+ msg_type = GET_U_1(rsvp_com_header->msg_type);
+
+ /* in non-verbose mode just lets print the basic Message Type*/
+ if (ndo->ndo_vflag < 1) {
+ ND_PRINT("RSVPv%u %s Message, length: %u",
+ RSVP_EXTRACT_VERSION(version_flags),
+ tok2str(rsvp_msg_type_values, "unknown (%u)",msg_type),
+ len);
+ return;
+ }
+
+ /* ok they seem to want to know everything - lets fully decode it */
+
+ plen = tlen = GET_BE_U_2(rsvp_com_header->length);
+
+ ND_PRINT("\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
+ RSVP_EXTRACT_VERSION(version_flags),
+ tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
+ msg_type,
+ bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
+ tlen,
+ GET_U_1(rsvp_com_header->ttl),
+ GET_BE_U_2(rsvp_com_header->checksum));
+
+ if (tlen < sizeof(struct rsvp_common_header)) {
+ ND_PRINT("ERROR: common header too short %u < %zu", tlen,
+ sizeof(struct rsvp_common_header));
+ return;
+ }
+
+ tptr+=sizeof(struct rsvp_common_header);
+ tlen-=sizeof(struct rsvp_common_header);
+
+ switch(msg_type) {
+
+ case RSVP_MSGTYPE_BUNDLE:
+ /*
+ * Process each submessage in the bundle message.
+ * Bundle messages may not contain bundle submessages, so we don't
+ * need to handle bundle submessages specially.
+ */
+ while(tlen > 0) {
+ const u_char *subpptr=tptr, *subtptr;
+ u_short subplen, subtlen;
+
+ subtptr=subpptr;
+
+ rsvp_com_header = (const struct rsvp_common_header *)subpptr;
+ ND_TCHECK_SIZE(rsvp_com_header);
+ version_flags = GET_U_1(rsvp_com_header->version_flags);
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (RSVP_EXTRACT_VERSION(version_flags) != RSVP_VERSION) {
+ ND_PRINT("ERROR: RSVP version %u packet not supported",
+ RSVP_EXTRACT_VERSION(version_flags));
+ return;
+ }
+
+ subplen = subtlen = GET_BE_U_2(rsvp_com_header->length);
+
+ msg_type = GET_U_1(rsvp_com_header->msg_type);
+ ND_PRINT("\n\t RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
+ RSVP_EXTRACT_VERSION(version_flags),
+ tok2str(rsvp_msg_type_values, "unknown, type: %u",msg_type),
+ msg_type,
+ bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(version_flags)),
+ subtlen,
+ GET_U_1(rsvp_com_header->ttl),
+ GET_BE_U_2(rsvp_com_header->checksum));
+
+ if (subtlen < sizeof(struct rsvp_common_header)) {
+ ND_PRINT("ERROR: common header too short %u < %zu", subtlen,
+ sizeof(struct rsvp_common_header));
+ return;
+ }
+
+ if (tlen < subtlen) {
+ ND_PRINT("ERROR: common header too large %u > %u", subtlen,
+ tlen);
+ return;
+ }
+
+ subtptr+=sizeof(struct rsvp_common_header);
+ subtlen-=sizeof(struct rsvp_common_header);
+
+ /*
+ * Print all objects in the submessage.
+ */
+ if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t ", subtlen, rsvp_com_header) == -1)
+ return;
+
+ tptr+=subtlen+sizeof(struct rsvp_common_header);
+ tlen-=subtlen+sizeof(struct rsvp_common_header);
+ }
+
+ break;
+
+ case RSVP_MSGTYPE_PATH:
+ case RSVP_MSGTYPE_RESV:
+ case RSVP_MSGTYPE_PATHERR:
+ case RSVP_MSGTYPE_RESVERR:
+ case RSVP_MSGTYPE_PATHTEAR:
+ case RSVP_MSGTYPE_RESVTEAR:
+ case RSVP_MSGTYPE_RESVCONF:
+ case RSVP_MSGTYPE_HELLO_OLD:
+ case RSVP_MSGTYPE_HELLO:
+ case RSVP_MSGTYPE_ACK:
+ case RSVP_MSGTYPE_SREFRESH:
+ /*
+ * Print all objects in the message.
+ */
+ if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t ", tlen, rsvp_com_header) == -1)
+ return;
+ break;
+
+ default:
+ print_unknown_data(ndo, tptr, "\n\t ", tlen);
+ break;
+ }
+