X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/a663702261188104f00e32b831218b102d1e14dd..1ee09c1510704191a14df4eb914dba3d5dc9ab58:/print-ppp.c diff --git a/print-ppp.c b/print-ppp.c index ee903976..603dd6c4 100644 --- a/print-ppp.c +++ b/print-ppp.c @@ -31,7 +31,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.101 2004-08-18 14:56:28 hannes Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.109 2005-04-20 22:15:17 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -80,6 +80,8 @@ struct tok ppptype2str[] = { { PPP_MPLS_UCAST, "MPLS" }, { PPP_MPLS_MCAST, "MPLS" }, { PPP_COMP, "Compressed"}, + { PPP_ML, "MLPPP"}, + { PPP_IPV6, "IP6"}, { PPP_HELLO, "HELLO" }, { PPP_LUXCOM, "LUXCOM" }, @@ -92,15 +94,19 @@ struct tok ppptype2str[] = { { PPP_IPXCP, "IPXCP" }, { PPP_STIICP, "STIICP" }, { PPP_VINESCP, "VINESCP" }, + { PPP_IPV6CP, "IP6CP" }, { PPP_MPLSCP, "MPLSCP" }, { PPP_LCP, "LCP" }, { PPP_PAP, "PAP" }, { PPP_LQM, "LQM" }, { PPP_CHAP, "CHAP" }, + { PPP_EAP, "EAP" }, + { PPP_SPAP, "SPAP" }, + { PPP_SPAP_OLD, "Old-SPAP" }, { PPP_BACP, "BACP" }, { PPP_BAP, "BAP" }, - { PPP_MP, "ML" }, + { PPP_MPCP, "MLPPP-CP" }, { 0, NULL } }; @@ -199,7 +205,7 @@ static const char *lcpconfopts[] = { "deprecated(15)", /* used to be a Compund-Frames */ "deprecated(16)", /* used to be a Nominal-Data-Encap */ "MRRU", /* (17) */ - "SSNHF", /* (18) */ + "12-Bit seq #", /* (18) */ "End-Disc", /* (19) */ "Proprietary", /* (20) */ "DCE-Id", /* (21) */ @@ -214,7 +220,6 @@ static const char *lcpconfopts[] = { "PPP-Muxing", /* (30) */ }; -/* IPV6CP - to be supported */ /* ECP - to be supported */ /* CCP Config Options */ @@ -278,17 +283,36 @@ static const char *ccpconfopts[] = { /* SDCP - to be supported */ /* IPCP Config Options */ - #define IPCPOPT_2ADDR 1 /* RFC1172, RFC1332 (deprecated) */ #define IPCPOPT_IPCOMP 2 /* RFC1332 */ #define IPCPOPT_ADDR 3 /* RFC1332 */ #define IPCPOPT_MOBILE4 4 /* RFC2290 */ - #define IPCPOPT_PRIDNS 129 /* RFC1877 */ #define IPCPOPT_PRINBNS 130 /* RFC1877 */ #define IPCPOPT_SECDNS 131 /* RFC1877 */ #define IPCPOPT_SECNBNS 132 /* RFC1877 */ +struct tok ipcpopt_values[] = { + { IPCPOPT_2ADDR, "IP-Addrs" }, + { IPCPOPT_IPCOMP, "IP-Comp" }, + { IPCPOPT_ADDR, "IP-Addr" }, + { IPCPOPT_MOBILE4, "Home-Addr" }, + { IPCPOPT_PRIDNS, "Pri-DNS" }, + { IPCPOPT_PRINBNS, "Pri-NBNS" }, + { IPCPOPT_SECDNS, "Sec-DNS" }, + { IPCPOPT_SECNBNS, "Sec-NBNS" }, + { 0, NULL } +}; + + +/* IP6CP Config Options */ +#define IP6CP_IFID 1 + +struct tok ip6cpopt_values[] = { + { IP6CP_IFID, "Interface-ID" }, + { 0, NULL } +}; + /* ATCP - to be supported */ /* OSINLCP - to be supported */ /* BVCP - to be supported */ @@ -303,6 +327,13 @@ static const char *ccpconfopts[] = { #define AUTHALG_MSCHAP1 128 /* RFC2433 */ #define AUTHALG_MSCHAP2 129 /* RFC2795 */ +struct tok authalg_values[] = { + { AUTHALG_CHAPMD5, "MD5" }, + { AUTHALG_MSCHAP1, "MS-CHAPv1" }, + { AUTHALG_MSCHAP2, "MS-CHAPv2" }, + { 0, NULL } +}; + /* FCS Alternatives - to be supported */ /* Multilink Endpoint Discriminator (RFC1717) */ @@ -328,14 +359,12 @@ static const char *ccpconfopts[] = { #define CHAP_SUCC 3 #define CHAP_FAIL 4 -#define CHAP_CODEMIN CHAP_CHAL -#define CHAP_CODEMAX CHAP_FAIL - -static const char *chapcode[] = { - "Chal", /* (1) */ - "Resp", /* (2) */ - "Succ", /* (3) */ - "Fail", /* (4) */ +struct tok chapcode_values[] = { + { CHAP_CHAL, "Challenge" }, + { CHAP_RESP, "Response" }, + { CHAP_SUCC, "Success" }, + { CHAP_FAIL, "Fail" }, + { 0, NULL} }; /* PAP */ @@ -344,13 +373,11 @@ static const char *chapcode[] = { #define PAP_AACK 2 #define PAP_ANAK 3 -#define PAP_CODEMIN PAP_AREQ -#define PAP_CODEMAX PAP_ANAK - -static const char *papcode[] = { - "Auth-Req", /* (1) */ - "Auth-Ack", /* (2) */ - "Auth-Nak", /* (3) */ +struct tok papcode_values[] = { + { PAP_AREQ, "Auth-Req" }, + { PAP_AACK, "Auth-ACK" }, + { PAP_ANAK, "Auth-NACK" }, + { 0, NULL } }; /* BAP */ @@ -367,8 +394,10 @@ static void handle_ctrl_proto (u_int proto,const u_char *p, int length); static void handle_chap (const u_char *p, int length); static void handle_pap (const u_char *p, int length); static void handle_bap (const u_char *p, int length); +static void handle_mlppp(const u_char *p, int length); static int print_lcp_config_options (const u_char *p, int); static int print_ipcp_config_options (const u_char *p, int); +static int print_ip6cp_config_options (const u_char *p, int); static int print_ccp_config_options (const u_char *p, int); static int print_bacp_config_options (const u_char *p, int); static void handle_ppp (u_int proto, const u_char *p, int length); @@ -386,7 +415,7 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) tptr=pptr; - typestr = tok2str(ppptype2str, "unknown", proto); + typestr = tok2str(ppptype2str, "unknown ctrl-proto (0x%04x)", proto); printf("%s, ",typestr); if (length < 4) /* FIXME weak boundary checking */ @@ -405,7 +434,7 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) tptr += 2; if (length <= 4) - return; /* there may be a NULL confreq etc. */ + goto print_len_and_return; /* there may be a NULL confreq etc. */ switch (code) { case CPCODES_VEXT: @@ -433,6 +462,9 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) case PPP_IPCP: pfunc = print_ipcp_config_options; break; + case PPP_IPV6CP: + pfunc = print_ip6cp_config_options; + break; case PPP_CCP: pfunc = print_ccp_config_options; break; @@ -501,6 +533,8 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) print_unknown_data(pptr-2,"\n\t",length+2); break; } + + print_len_and_return: printf(", length %u", length); if (vflag >1) @@ -564,39 +598,20 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_AP: if (len >= 4) { TCHECK2(*(p + 2), 2); + printf(" %s", tok2str(ppptype2str,"Unknown Auth Proto (0x04x)",EXTRACT_16BITS(p+2))); + switch (EXTRACT_16BITS(p+2)) { - case PPP_PAP: - printf(" PAP"); - break; case PPP_CHAP: - printf(" CHAP"); TCHECK(p[4]); - switch (p[4]) { - default: - printf(", unknown-algorithm-%u", p[4]); - break; - case AUTHALG_CHAPMD5: - printf(", MD5"); - break; - case AUTHALG_MSCHAP1: - printf(", MSCHAPv1"); - break; - case AUTHALG_MSCHAP2: - printf(", MSCHAPv2"); - break; - } + printf(", %s",tok2str(authalg_values,"Unknown Auth Alg %u",p[4])); break; + case PPP_PAP: /* fall through */ case PPP_EAP: - printf(" EAP"); - break; case PPP_SPAP: - printf(" SPAP"); - break; case PPP_SPAP_OLD: - printf(" Old-SPAP"); - break; + break; default: - printf("unknown"); + print_unknown_data(p,"\n\t",len); } } break; @@ -702,7 +717,7 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_DEP14: case LCPOPT_DEP15: case LCPOPT_DEP16: - case LCPOPT_MLSSNHF: + case LCPOPT_MLSSNHF: case LCPOPT_PROP: case LCPOPT_DCEID: case LCPOPT_MPP: @@ -723,6 +738,27 @@ trunc: return 0; } +/* ML-PPP*/ +struct tok ppp_ml_flag_values[] = { + { 0x80, "begin" }, + { 0x40, "end" }, + { 0, NULL } +}; + +static void +handle_mlppp(const u_char *p, int length) { + + if (!eflag) + printf("MLPPP, "); + + printf("seq 0x%03x, Flags [%s], length %u", + (EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */ + bittok2str(ppp_ml_flag_values, "none", *p & 0xc0), + length); + + return; +} + /* CHAP */ static void handle_chap(const u_char *p, int length) @@ -744,16 +780,13 @@ handle_chap(const u_char *p, int length) TCHECK(*p); code = *p; - if ((code >= CHAP_CODEMIN) && (code <= CHAP_CODEMAX)) - printf("%s", chapcode[code - 1]); - else { - printf("0x%02x", code); - return; - } + printf("CHAP, %s (0x%02x)", + tok2str(chapcode_values,"unknown",code), + code); p++; TCHECK(*p); - printf("(%u)", *p); /* ID */ + printf(", id %u", *p); /* ID */ p++; TCHECK2(*p, 2); @@ -826,22 +859,29 @@ handle_pap(const u_char *p, int length) TCHECK(*p); code = *p; - if ((code >= PAP_CODEMIN) && (code <= PAP_CODEMAX)) - printf("%s", papcode[code - 1]); - else { - printf("0x%02x", code); - return; - } + printf("PAP, %s (0x%02x)", + tok2str(papcode_values,"unknown",code), + code); p++; TCHECK(*p); - printf("(%u)", *p); /* ID */ + printf(", id %u", *p); /* ID */ p++; TCHECK2(*p, 2); len = EXTRACT_16BITS(p); p += 2; + if ((int)len > length) { + printf(", length %u > packet size", len); + return; + } + length = len; + if (length < (p - p0)) { + printf(", length %u < PAP header length", length); + return; + } + switch (code) { case PAP_AREQ: if (length - (p - p0) < 1) @@ -913,61 +953,41 @@ print_ipcp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; + + printf(", %s (0x%02x) ", + tok2str(ipcpopt_values,"unknown",opt), + opt); + switch (opt) { case IPCPOPT_2ADDR: /* deprecated */ if (len != 10) goto invlen; TCHECK2(*(p + 6), 4); - printf(", IP-Addrs src %s, dst %s", + printf("src %s, dst %s", ipaddr_string(p + 2), ipaddr_string(p + 6)); break; case IPCPOPT_IPCOMP: if (len < 4) goto invlen; - printf(", IP-Comp"); TCHECK2(*(p + 2), 2); if (EXTRACT_16BITS(p + 2) == PPP_VJC) { - printf(" VJ-Comp"); + printf("VJ-Comp"); /* XXX: VJ-Comp parameters should be decoded */ } else - printf(" unknown-comp-proto=%04x", EXTRACT_16BITS(p + 2)); - break; - case IPCPOPT_ADDR: - if (len != 6) - goto invlen; - TCHECK2(*(p + 2), 4); - printf(", IP-Addr %s", ipaddr_string(p + 2)); + printf("unknown-comp-proto %04x", EXTRACT_16BITS(p + 2)); break; + + case IPCPOPT_ADDR: /* those options share the same format - fall through */ case IPCPOPT_MOBILE4: - if (len != 6) - goto invlen; - TCHECK2(*(p + 2), 4); - printf(", Home-Addr %s", ipaddr_string(p + 2)); - break; case IPCPOPT_PRIDNS: - if (len != 6) - goto invlen; - TCHECK2(*(p + 2), 4); - printf(", Pri-DNS %s", ipaddr_string(p + 2)); - break; case IPCPOPT_PRINBNS: - if (len != 6) - goto invlen; - TCHECK2(*(p + 2), 4); - printf(", Pri-NBNS %s", ipaddr_string(p + 2)); - break; case IPCPOPT_SECDNS: - if (len != 6) - goto invlen; - TCHECK2(*(p + 2), 4); - printf(", Sec-DNS %s", ipaddr_string(p + 2)); - break; case IPCPOPT_SECNBNS: if (len != 6) goto invlen; TCHECK2(*(p + 2), 4); - printf(", Sec-NBNS %s", ipaddr_string(p + 2)); + printf("%s", ipaddr_string(p + 2)); break; default: printf(", unknown-%d", opt); @@ -984,6 +1004,51 @@ trunc: return 0; } +/* IP6CP config options */ +static int +print_ip6cp_config_options(const u_char *p, int length) +{ + int len, opt; + + if (length < 2) + return 0; + TCHECK2(*p, 2); + len = p[1]; + opt = p[0]; + if (length < len) + return 0; + + printf(", %s (0x%02x) ", + tok2str(ip6cpopt_values,"unknown",opt), + opt); + + switch (opt) { + case IP6CP_IFID: + if (len != 10) + goto invlen; + TCHECK2(*(p + 2), 8); + printf("%04x:%04x:%04x:%04x", + EXTRACT_16BITS(p + 2), + EXTRACT_16BITS(p + 4), + EXTRACT_16BITS(p + 6), + EXTRACT_16BITS(p + 8)); + break; + default: + printf(", unknown-%d", opt); + break; + } + return len; + +invlen: + printf(", invalid-length-%d", opt); + return 0; + +trunc: + printf("[|ip6cp]"); + return 0; +} + + /* CCP config options */ static int print_ccp_config_options(const u_char *p, int length) @@ -1094,8 +1159,8 @@ ppp_hdlc(const u_char *p, int length) switch (proto) { case PPP_IP: - ip_print(b+1, t - b - 1); - goto cleanup; + ip_print(gndo, b+1, t - b - 1); + goto cleanup; #ifdef INET6 case PPP_IPV6: ip6_print(b+1, t - b - 1); @@ -1108,7 +1173,7 @@ ppp_hdlc(const u_char *p, int length) proto = EXTRACT_16BITS(b); /* next guess - load two octets */ switch (proto) { - case 0xff03: /* looks like a PPP frame */ + case (PPP_ADDRESS << 8 | PPP_CONTROL): /* looks like a PPP frame */ proto = EXTRACT_16BITS(b+2); /* load the PPP proto-id */ handle_ppp(proto, b+4, t - b - 4); break; @@ -1134,7 +1199,7 @@ handle_ppp(u_int proto, const u_char *p, int length) } switch (proto) { - case PPP_LCP: + case PPP_LCP: /* fall through */ case PPP_IPCP: case PPP_OSICP: case PPP_MPLSCP: @@ -1143,6 +1208,9 @@ handle_ppp(u_int proto, const u_char *p, int length) case PPP_BACP: handle_ctrl_proto(proto, p, length); break; + case PPP_ML: + handle_mlppp(p, length); + break; case PPP_CHAP: handle_chap(p, length); break; @@ -1155,7 +1223,7 @@ handle_ppp(u_int proto, const u_char *p, int length) case ETHERTYPE_IP: /*XXX*/ case PPP_VJNC: case PPP_IP: - ip_print(p, length); + ip_print(gndo, p, length); break; #ifdef INET6 case ETHERTYPE_IPV6: /*XXX*/ @@ -1539,3 +1607,11 @@ printx: #endif /* __bsdi__ */ return (hdrlength); } + + +/* + * Local Variables: + * c-style: whitesmith + * c-basic-offset: 8 + * End: + */