mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-27 20:14:12 +08:00
add support for further dissection of the IPCP Compression Option
This commit is contained in:
parent
b2bf371ad5
commit
78299f4f5b
76
print-ppp.c
76
print-ppp.c
@ -31,7 +31,7 @@
|
||||
|
||||
#ifndef lint
|
||||
static const char rcsid[] _U_ =
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.113 2005-11-03 07:30:25 hannes Exp $ (LBL)";
|
||||
"@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.114 2005-12-05 11:35:58 hannes Exp $ (LBL)";
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
@ -296,6 +296,20 @@ struct tok ipcpopt_values[] = {
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
#define IPCPOPT_IPCOMP_HDRCOMP 0x61 /* rfc3544 */
|
||||
#define IPCPOPT_IPCOMP_MINLEN 14
|
||||
|
||||
struct tok ipcpopt_compproto_values[] = {
|
||||
{ PPP_VJC, "VJ-Comp" },
|
||||
{ IPCPOPT_IPCOMP_HDRCOMP, "IP Header Compression" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
struct tok ipcpopt_compproto_subopt_values[] = {
|
||||
{ 1, "RTP-Compression" },
|
||||
{ 2, "Enhanced RTP-Compression" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
/* IP6CP Config Options */
|
||||
#define IP6CP_IFID 1
|
||||
@ -965,6 +979,7 @@ static int
|
||||
print_ipcp_config_options(const u_char *p, int length)
|
||||
{
|
||||
int len, opt;
|
||||
u_int compproto, ipcomp_subopttotallen, ipcomp_subopt, ipcomp_suboptlen;
|
||||
|
||||
if (length < 2)
|
||||
return 0;
|
||||
@ -999,11 +1014,62 @@ print_ipcp_config_options(const u_char *p, int length)
|
||||
if (len < 4)
|
||||
goto invlen;
|
||||
TCHECK2(*(p + 2), 2);
|
||||
if (EXTRACT_16BITS(p + 2) == PPP_VJC) {
|
||||
printf("VJ-Comp");
|
||||
compproto = EXTRACT_16BITS(p+2);
|
||||
|
||||
printf("%s (0x%02x):",
|
||||
tok2str(ipcpopt_compproto_values,"Unknown",compproto),
|
||||
compproto);
|
||||
|
||||
switch (compproto) {
|
||||
case PPP_VJC:
|
||||
/* XXX: VJ-Comp parameters should be decoded */
|
||||
} else
|
||||
printf("unknown-comp-proto %04x", EXTRACT_16BITS(p + 2));
|
||||
break;
|
||||
case IPCPOPT_IPCOMP_HDRCOMP:
|
||||
if (len < IPCPOPT_IPCOMP_MINLEN)
|
||||
goto invlen;
|
||||
|
||||
TCHECK2(*(p + 2), IPCPOPT_IPCOMP_MINLEN);
|
||||
printf("\n\t TCP Space %u, non-TCP Space %u" \
|
||||
", maxPeriod %u, maxTime %u, maxHdr %u",
|
||||
EXTRACT_16BITS(p+4),
|
||||
EXTRACT_16BITS(p+6),
|
||||
EXTRACT_16BITS(p+8),
|
||||
EXTRACT_16BITS(p+10),
|
||||
EXTRACT_16BITS(p+12));
|
||||
|
||||
/* suboptions present ? */
|
||||
if (len > IPCPOPT_IPCOMP_MINLEN) {
|
||||
ipcomp_subopttotallen = len - IPCPOPT_IPCOMP_MINLEN;
|
||||
p += IPCPOPT_IPCOMP_MINLEN;
|
||||
|
||||
printf("\n\t Suboptions, length %u", ipcomp_subopttotallen);
|
||||
|
||||
while (ipcomp_subopttotallen >= 2) {
|
||||
TCHECK2(*p, 2);
|
||||
ipcomp_subopt = *p;
|
||||
ipcomp_suboptlen = *(p+1);
|
||||
|
||||
/* sanity check */
|
||||
if (ipcomp_subopt == 0 ||
|
||||
ipcomp_suboptlen == 0 )
|
||||
break;
|
||||
|
||||
/* XXX: just display the suboptions for now */
|
||||
printf("\n\t\t%s Suboption #%u, length %u",
|
||||
tok2str(ipcpopt_compproto_subopt_values,
|
||||
"Unknown",
|
||||
ipcomp_subopt),
|
||||
ipcomp_subopt,
|
||||
ipcomp_suboptlen);
|
||||
|
||||
ipcomp_subopttotallen -= ipcomp_suboptlen;
|
||||
p += ipcomp_suboptlen;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case IPCPOPT_ADDR: /* those options share the same format - fall through */
|
||||
|
Loading…
Reference in New Issue
Block a user