#include <net/if_ppp.h>
#endif
-#include <stdlib.h>
-
#include "netdissect.h"
#include "extract.h"
#include "addrtoname.h"
ND_PRINT(" (length bogus, should be = 7)");
return 0;
}
- ND_TCHECK_4(p + 3);
ND_PRINT(": IPv4 %s", GET_IPADDR_STRING(p + 3));
break;
case MEDCLASS_MAC:
ND_PRINT(" (length bogus, should be = 10)");
return len;
}
- ND_TCHECK_4(p + 6);
ND_PRINT(": src %s, dst %s",
GET_IPADDR_STRING(p + 2),
GET_IPADDR_STRING(p + 6));
ND_PRINT(" (length bogus, should be = 6)");
return 0;
}
- ND_TCHECK_4(p + 2);
ND_PRINT(": %s", GET_IPADDR_STRING(p + 2));
break;
default:
u_char *b, *t, c;
const u_char *s;
u_int i, proto;
- const void *se;
+ const void *sb, *se;
if (caplen == 0)
return;
/*
* Unescape all the data into a temporary, private, buffer.
- * Do this so that we dont overwrite the original packet
+ * Do this so that we don't overwrite the original packet
* contents.
*/
for (s = p, t = b, i = caplen; i != 0; i--) {
/*
* Change the end pointer, so bounds checks work.
+ * Change the pointer to packet data to help debugging.
*/
+ sb = ndo->ndo_packetp;
se = ndo->ndo_snapend;
+ ndo->ndo_packetp = b;
ndo->ndo_snapend = t;
length = ND_BYTES_AVAILABLE_AFTER(b);
if (length < 4)
goto trunc;
proto = GET_BE_U_2(b + 2); /* load the PPP proto-id */
- handle_ppp(ndo, proto, b + 4, length - 4);
+ if ((proto & 0xff00) == 0x7e00)
+ ND_PRINT("(protocol 0x%04x invalid)", proto);
+ else
+ handle_ppp(ndo, proto, b + 4, length - 4);
break;
default: /* last guess - proto must be a PPP proto-id */
- handle_ppp(ndo, proto, b + 2, length - 2);
+ if ((proto & 0xff00) == 0x7e00)
+ ND_PRINT("(protocol 0x%04x invalid)", proto);
+ else
+ handle_ppp(ndo, proto, b + 2, length - 2);
break;
}
cleanup:
+ ndo->ndo_packetp = sb;
ndo->ndo_snapend = se;
return;
trunc:
+ ndo->ndo_packetp = sb;
ndo->ndo_snapend = se;
nd_print_trunc(ndo);
}
hdr_len += 2;
}
- if (ndo->ndo_eflag)
- ND_PRINT("%s (0x%04x), length %u: ",
- tok2str(ppptype2str, "unknown", proto),
+ if (ndo->ndo_eflag) {
+ const char *typestr;
+ typestr = tok2str(ppptype2str, "unknown", proto);
+ ND_PRINT("%s (0x%04x), length %u",
+ typestr,
proto,
olen);
+ if (*typestr == 'u') /* "unknown" */
+ return hdr_len;
+
+ ND_PRINT(": ");
+ }
handle_ppp(ndo, proto, p, length);
return (hdr_len);