Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/tcpdump/print-ppp.c
Show First 20 Lines • Show All 801 Lines • ▼ Show 20 Lines | |||||
static const struct tok ppp_ml_flag_values[] = { | static const struct tok ppp_ml_flag_values[] = { | ||||
{ 0x80, "begin" }, | { 0x80, "begin" }, | ||||
{ 0x40, "end" }, | { 0x40, "end" }, | ||||
{ 0, NULL } | { 0, NULL } | ||||
}; | }; | ||||
static void | static void | ||||
handle_mlppp(netdissect_options *ndo, | handle_mlppp(netdissect_options *ndo, | ||||
const u_char *p, int length) { | const u_char *p, int length) | ||||
{ | |||||
if (!ndo->ndo_eflag) | if (!ndo->ndo_eflag) | ||||
ND_PRINT((ndo, "MLPPP, ")); | ND_PRINT((ndo, "MLPPP, ")); | ||||
ND_PRINT((ndo, "seq 0x%03x, Flags [%s], length %u", | ND_PRINT((ndo, "seq 0x%03x, Flags [%s], length %u", | ||||
(EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */ | (EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */ | ||||
bittok2str(ppp_ml_flag_values, "none", *p & 0xc0), | bittok2str(ppp_ml_flag_values, "none", *p & 0xc0), | ||||
length)); | length)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 528 Lines • ▼ Show 20 Lines | trunc: | ||||
ND_PRINT((ndo, "[|bacp]")); | ND_PRINT((ndo, "[|bacp]")); | ||||
return 0; | return 0; | ||||
} | } | ||||
static void | static void | ||||
ppp_hdlc(netdissect_options *ndo, | ppp_hdlc(netdissect_options *ndo, | ||||
const u_char *p, int length) | const u_char *p, int length) | ||||
{ | { | ||||
u_char *b, *s, *t, c; | u_char *b, *t, c; | ||||
const u_char *s; | |||||
int i, proto; | int i, proto; | ||||
const void *se; | const void *se; | ||||
if (length <= 0) | if (length <= 0) | ||||
return; | return; | ||||
b = (uint8_t *)malloc(length); | b = (u_char *)malloc(length); | ||||
if (b == NULL) | if (b == NULL) | ||||
return; | return; | ||||
/* | /* | ||||
* Unescape all the data into a temporary, private, buffer. | * Unescape all the data into a temporary, private, buffer. | ||||
* Do this so that we dont overwrite the original packet | * Do this so that we dont overwrite the original packet | ||||
* contents. | * contents. | ||||
*/ | */ | ||||
for (s = (u_char *)p, t = b, i = length; i > 0; i--) { | for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) { | ||||
c = *s++; | c = *s++; | ||||
if (c == 0x7d) { | if (c == 0x7d) { | ||||
if (i > 1) { | if (i <= 1 || !ND_TTEST(*s)) | ||||
break; | |||||
i--; | i--; | ||||
c = *s++ ^ 0x20; | c = *s++ ^ 0x20; | ||||
} else | |||||
continue; | |||||
} | } | ||||
*t++ = c; | *t++ = c; | ||||
} | } | ||||
se = ndo->ndo_snapend; | se = ndo->ndo_snapend; | ||||
ndo->ndo_snapend = t; | ndo->ndo_snapend = t; | ||||
length = t - b; | length = t - b; | ||||
/* now lets guess about the payload codepoint format */ | /* now lets guess about the payload codepoint format */ | ||||
if (length < 1) | if (length < 1) | ||||
goto trunc; | goto trunc; | ||||
proto = *b; /* start with a one-octet codepoint guess */ | proto = *b; /* start with a one-octet codepoint guess */ | ||||
switch (proto) { | switch (proto) { | ||||
case PPP_IP: | case PPP_IP: | ||||
ip_print(ndo, b + 1, length - 1); | ip_print(ndo, b + 1, length - 1); | ||||
goto cleanup; | goto cleanup; | ||||
#ifdef INET6 | |||||
case PPP_IPV6: | case PPP_IPV6: | ||||
ip6_print(ndo, b + 1, length - 1); | ip6_print(ndo, b + 1, length - 1); | ||||
goto cleanup; | goto cleanup; | ||||
#endif | |||||
default: /* no luck - try next guess */ | default: /* no luck - try next guess */ | ||||
break; | break; | ||||
} | } | ||||
if (length < 2) | if (length < 2) | ||||
goto trunc; | goto trunc; | ||||
proto = EXTRACT_16BITS(b); /* next guess - load two octets */ | proto = EXTRACT_16BITS(b); /* next guess - load two octets */ | ||||
▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | handle_ppp(netdissect_options *ndo, | ||||
case PPP_BAP: /* XXX: not yet completed */ | case PPP_BAP: /* XXX: not yet completed */ | ||||
handle_bap(ndo, p, length); | handle_bap(ndo, p, length); | ||||
break; | break; | ||||
case ETHERTYPE_IP: /*XXX*/ | case ETHERTYPE_IP: /*XXX*/ | ||||
case PPP_VJNC: | case PPP_VJNC: | ||||
case PPP_IP: | case PPP_IP: | ||||
ip_print(ndo, p, length); | ip_print(ndo, p, length); | ||||
break; | break; | ||||
#ifdef INET6 | |||||
case ETHERTYPE_IPV6: /*XXX*/ | case ETHERTYPE_IPV6: /*XXX*/ | ||||
case PPP_IPV6: | case PPP_IPV6: | ||||
ip6_print(ndo, p, length); | ip6_print(ndo, p, length); | ||||
break; | break; | ||||
#endif | |||||
case ETHERTYPE_IPX: /*XXX*/ | case ETHERTYPE_IPX: /*XXX*/ | ||||
case PPP_IPX: | case PPP_IPX: | ||||
ipx_print(ndo, p, length); | ipx_print(ndo, p, length); | ||||
break; | break; | ||||
case PPP_OSI: | case PPP_OSI: | ||||
isoclns_print(ndo, p, length, length); | isoclns_print(ndo, p, length, length); | ||||
break; | break; | ||||
case PPP_MPLS_UCAST: | case PPP_MPLS_UCAST: | ||||
▲ Show 20 Lines • Show All 293 Lines • ▼ Show 20 Lines | if (p[SLC_CHL]) { | ||||
case PPP_VJC: | case PPP_VJC: | ||||
ptype = vjc_print(ndo, q, ptype); | ptype = vjc_print(ndo, q, ptype); | ||||
hdrlength = PPP_BSDI_HDRLEN; | hdrlength = PPP_BSDI_HDRLEN; | ||||
p += hdrlength; | p += hdrlength; | ||||
switch (ptype) { | switch (ptype) { | ||||
case PPP_IP: | case PPP_IP: | ||||
ip_print(ndo, p, length); | ip_print(ndo, p, length); | ||||
break; | break; | ||||
#ifdef INET6 | |||||
case PPP_IPV6: | case PPP_IPV6: | ||||
ip6_print(ndo, p, length); | ip6_print(ndo, p, length); | ||||
break; | break; | ||||
#endif | |||||
case PPP_MPLS_UCAST: | case PPP_MPLS_UCAST: | ||||
case PPP_MPLS_MCAST: | case PPP_MPLS_MCAST: | ||||
mpls_print(ndo, p, length); | mpls_print(ndo, p, length); | ||||
break; | break; | ||||
} | } | ||||
goto printx; | goto printx; | ||||
case PPP_VJNC: | case PPP_VJNC: | ||||
ptype = vjc_print(ndo, q, ptype); | ptype = vjc_print(ndo, q, ptype); | ||||
hdrlength = PPP_BSDI_HDRLEN; | hdrlength = PPP_BSDI_HDRLEN; | ||||
p += hdrlength; | p += hdrlength; | ||||
switch (ptype) { | switch (ptype) { | ||||
case PPP_IP: | case PPP_IP: | ||||
ip_print(ndo, p, length); | ip_print(ndo, p, length); | ||||
break; | break; | ||||
#ifdef INET6 | |||||
case PPP_IPV6: | case PPP_IPV6: | ||||
ip6_print(ndo, p, length); | ip6_print(ndo, p, length); | ||||
break; | break; | ||||
#endif | |||||
case PPP_MPLS_UCAST: | case PPP_MPLS_UCAST: | ||||
case PPP_MPLS_MCAST: | case PPP_MPLS_MCAST: | ||||
mpls_print(ndo, p, length); | mpls_print(ndo, p, length); | ||||
break; | break; | ||||
} | } | ||||
goto printx; | goto printx; | ||||
default: | default: | ||||
if (ndo->ndo_eflag) { | if (ndo->ndo_eflag) { | ||||
Show All 11 Lines | #endif | ||||
length -= hdrlength; | length -= hdrlength; | ||||
p += hdrlength; | p += hdrlength; | ||||
switch (ptype) { | switch (ptype) { | ||||
case PPP_IP: | case PPP_IP: | ||||
ip_print(p, length); | ip_print(p, length); | ||||
break; | break; | ||||
#ifdef INET6 | |||||
case PPP_IPV6: | case PPP_IPV6: | ||||
ip6_print(ndo, p, length); | ip6_print(ndo, p, length); | ||||
break; | break; | ||||
#endif | |||||
case PPP_MPLS_UCAST: | case PPP_MPLS_UCAST: | ||||
case PPP_MPLS_MCAST: | case PPP_MPLS_MCAST: | ||||
mpls_print(ndo, p, length); | mpls_print(ndo, p, length); | ||||
break; | break; | ||||
default: | default: | ||||
ND_PRINT((ndo, "%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype))); | ND_PRINT((ndo, "%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype))); | ||||
} | } | ||||
Show All 14 Lines |