#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-l2tp.c,v 1.17 2003-12-26 23:20:58 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-l2tp.c,v 1.19 2005-04-20 21:49:56 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
const u_int16_t *ptr = (u_int16_t *)dat;
u_int cnt = 0; /* total octets consumed */
u_int16_t pad;
- int flag_t, flag_l, flag_s, flag_o, flag_p;
+ int flag_t, flag_l, flag_s, flag_o;
u_int16_t l2tp_len;
- flag_t = flag_l = flag_s = flag_o = flag_p = FALSE;
+ flag_t = flag_l = flag_s = flag_o = FALSE;
TCHECK(*ptr); /* Flags & Version */
if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {
flag_o = TRUE;
printf("O");
}
- if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY) {
- flag_p = TRUE;
+ if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY)
printf("P");
- }
printf("]");
ptr++;
cnt += (2 + pad);
}
+ if (flag_l) {
+ if (length < l2tp_len) {
+ printf(" Length %u larger than packet", l2tp_len);
+ return;
+ }
+ length = l2tp_len;
+ }
+ if (length < cnt) {
+ printf(" Length %u smaller than header length", length);
+ return;
+ }
if (flag_t) {
+ if (!flag_l) {
+ printf(" No length");
+ return;
+ }
if (length - cnt == 0) {
printf(" ZLB");
} else {