#include "netdissect-stdinc.h"
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "extract.h"
#include "addrtoname.h"
#define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
#define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
-#define RSVP_OBJ_CAPABILITY_FLAGS_MASK 0x7
+#define RSVP_OBJ_CAPABILITY_FLAGS_MASK 0x7U
#define RSVP_OBJ_XRO_RES 0
#define RSVP_OBJ_XRO_IPV4 1
uint32_t i;
} bw;
- if (obj_tlen < 4)
- return 0;
- ND_TCHECK_1(tptr);
+ ND_LCHECK_U(obj_tlen, 4);
parameter_id = GET_U_1(tptr);
- ND_TCHECK_2(tptr + 2);
parameter_length = GET_BE_U_2(tptr + 2)<<2; /* convert wordcount to bytecount */
ND_PRINT("\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
parameter_length,
GET_U_1(tptr + 1));
- if (obj_tlen < parameter_length+4)
- return 0;
+ ND_LCHECK_U(obj_tlen, parameter_length + 4);
switch(parameter_id) { /* parameter_id */
case 4:
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
if (parameter_length == 4) {
- ND_TCHECK_4(tptr + 4);
ND_PRINT("\n\t\tIS hop count: %u", GET_BE_U_4(tptr + 4));
}
break;
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
if (parameter_length == 4) {
- ND_TCHECK_4(tptr + 4);
bw.i = GET_BE_U_4(tptr + 4);
ND_PRINT("\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000);
}
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
if (parameter_length == 4) {
- ND_TCHECK_4(tptr + 4);
ND_PRINT("\n\t\tMinimum path latency: ");
if (GET_BE_U_4(tptr + 4) == 0xffffffff)
ND_PRINT("don't care");
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
if (parameter_length == 4) {
- ND_TCHECK_4(tptr + 4);
ND_PRINT("\n\t\tComposed MTU: %u bytes", GET_BE_U_4(tptr + 4));
}
break;
*/
if (parameter_length == 20) {
- ND_TCHECK_LEN(tptr + 4, 20);
bw.i = GET_BE_U_4(tptr + 4);
ND_PRINT("\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000);
bw.i = GET_BE_U_4(tptr + 8);
*/
if (parameter_length == 8) {
- ND_TCHECK_8(tptr + 4);
bw.i = GET_BE_U_4(tptr + 4);
ND_PRINT("\n\t\tRate: %.10g Mbps", bw.f / 125000);
ND_PRINT("\n\t\tSlack Term: %u", GET_BE_U_4(tptr + 8));
case 135:
case 136:
if (parameter_length == 4) {
- ND_TCHECK_4(tptr + 4);
ND_PRINT("\n\t\tValue: %u", GET_BE_U_4(tptr + 4));
}
break;
}
return (parameter_length+4); /* header length 4 bytes */
-trunc:
- nd_print_trunc(ndo);
+invalid:
+ nd_print_invalid(ndo);
return 0;
}
u_int action, subchannel;
while(tlen>=sizeof(struct rsvp_object_header)) {
- /* did we capture enough for fully decoding the object header ? */
- ND_TCHECK_LEN(tptr, sizeof(struct rsvp_object_header));
-
rsvp_obj_header = (const struct rsvp_object_header *)tptr;
rsvp_obj_len=GET_BE_U_2(rsvp_obj_header->length);
rsvp_obj_ctype=GET_U_1(rsvp_obj_header->ctype);
ND_PRINT(" ERROR: length != 8");
goto invalid;
}
- ND_TCHECK_8(obj_tptr);
ND_PRINT(", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
bittok2str(rsvp_obj_rro_label_flag_values,
"none",
* each iteration subobj_len may happen to be a multiple of 1
* and test it and total_subobj_len respectively.
*/
- if (total_subobj_len < 4)
- goto invalid;
+ ND_LCHECK_U(total_subobj_len, 4);
subobj_len = GET_BE_U_2(obj_tptr);
subobj_type = (GET_BE_U_2(obj_tptr + 2))>>8;
af = (GET_BE_U_2(obj_tptr + 2))&0x00FF;
invalid:
nd_print_invalid(ndo);
return -1;
-trunc:
- nd_print_trunc(ndo);
- return -1;
}
void
print_unknown_data(ndo, tptr, "\n\t ", tlen);
break;
}
-
- return;
-trunc:
- nd_print_trunc(ndo);
}