Enable ND_LONGJMP_FROM_TCHECK. Remove both ND_TCHECK*() instances
because they are redundant. Report invalid packets as invalid, not
truncated. Test whether the invalid packet is entirely in the buffer.
Replace a long switch block with a ternary assignment.
#include "netdissect-stdinc.h"
#include "netdissect-stdinc.h"
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "extract.h"
#include "mpls.h"
#include "netdissect.h"
#include "extract.h"
#include "mpls.h"
const u_char *p;
uint32_t label_entry;
uint16_t label_stack_depth = 0;
const u_char *p;
uint32_t label_entry;
uint16_t label_stack_depth = 0;
enum mpls_packet_type pt = PT_UNKNOWN;
ndo->ndo_protocol = "mpls";
p = bp;
nd_print_protocol_caps(ndo);
do {
enum mpls_packet_type pt = PT_UNKNOWN;
ndo->ndo_protocol = "mpls";
p = bp;
nd_print_protocol_caps(ndo);
do {
- ND_TCHECK_LEN(p, sizeof(label_entry));
if (length < sizeof(label_entry))
if (length < sizeof(label_entry))
label_entry = GET_BE_U_4(p);
ND_PRINT("%s(label %u",
(label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
label_entry = GET_BE_U_4(p);
ND_PRINT("%s(label %u",
(label_stack_depth && ndo->ndo_vflag) ? "\n\t" : " ",
* Cisco sends control-plane traffic MPLS-encapsulated in
* this fashion.
*/
* Cisco sends control-plane traffic MPLS-encapsulated in
* this fashion.
*/
if (length < 1) {
/* nothing to print */
return;
}
if (length < 1) {
/* nothing to print */
return;
}
- switch(GET_U_1(p)) {
-
- case 0x45:
- case 0x46:
- case 0x47:
- case 0x48:
- case 0x49:
- case 0x4a:
- case 0x4b:
- case 0x4c:
- case 0x4d:
- case 0x4e:
- case 0x4f:
- pt = PT_IPV4;
- break;
-
- case 0x60:
- case 0x61:
- case 0x62:
- case 0x63:
- case 0x64:
- case 0x65:
- case 0x66:
- case 0x67:
- case 0x68:
- case 0x69:
- case 0x6a:
- case 0x6b:
- case 0x6c:
- case 0x6d:
- case 0x6e:
- case 0x6f:
- pt = PT_IPV6;
- break;
-
- case 0x81:
- case 0x82:
- case 0x83:
- pt = PT_OSI;
- break;
-
- default:
+ first = GET_U_1(p);
+ pt =
+ (first >= 0x45 && first <= 0x4f) ? PT_IPV4 :
+ (first >= 0x60 && first <= 0x6f) ? PT_IPV6 :
+ (first >= 0x81 && first <= 0x83) ? PT_OSI :
/* ok bail out - we did not figure out what it is*/
/* ok bail out - we did not figure out what it is*/
-trunc:
- nd_print_trunc(ndo);
+invalid:
+ nd_print_invalid(ndo);
+ ND_TCHECK_LEN(p, length);