diff options
Diffstat (limited to 'contrib/tcpdump/print-ppp.c')
-rw-r--r-- | contrib/tcpdump/print-ppp.c | 409 |
1 files changed, 122 insertions, 287 deletions
diff --git a/contrib/tcpdump/print-ppp.c b/contrib/tcpdump/print-ppp.c index a685322..c63b197 100644 --- a/contrib/tcpdump/print-ppp.c +++ b/contrib/tcpdump/print-ppp.c @@ -20,6 +20,8 @@ * * Extensively modified by Motonori Shindo (mshindo@mshindo.net) for more * complete PPP support. + * + * $FreeBSD$ */ /* @@ -31,7 +33,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.108 2005/04/06 21:32:42 mcr Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.89.2.4 2004/07/13 16:00:25 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -47,7 +49,6 @@ static const char rcsid[] _U_ = #include <pcap.h> #include <stdio.h> -#include <stdlib.h> #include "interface.h" #include "extract.h" @@ -55,7 +56,6 @@ static const char rcsid[] _U_ = #include "ppp.h" #include "chdlc.h" #include "ethertype.h" -#include "oui.h" /* * The following constatns are defined by IANA. Please refer to @@ -72,16 +72,13 @@ struct tok ppptype2str[] = { { PPP_DECNET, "DECNET" }, { PPP_APPLE, "APPLE" }, { PPP_IPX, "IPX" }, - { PPP_VJC, "VJC IP" }, - { PPP_VJNC, "VJNC IP" }, + { PPP_VJC, "VJC" }, + { PPP_VJNC, "VJNC" }, { PPP_BRPDU, "BRPDU" }, { PPP_STII, "STII" }, { PPP_VINES, "VINES" }, { PPP_MPLS_UCAST, "MPLS" }, { PPP_MPLS_MCAST, "MPLS" }, - { PPP_COMP, "Compressed"}, - { PPP_ML, "MLPPP"}, - { PPP_IPV6, "IP6"}, { PPP_HELLO, "HELLO" }, { PPP_LUXCOM, "LUXCOM" }, @@ -94,19 +91,15 @@ 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_MPCP, "MLPPP-CP" }, + { PPP_MP, "ML" }, { 0, NULL } }; @@ -205,7 +198,7 @@ static const char *lcpconfopts[] = { "deprecated(15)", /* used to be a Compund-Frames */ "deprecated(16)", /* used to be a Nominal-Data-Encap */ "MRRU", /* (17) */ - "12-Bit seq #", /* (18) */ + "SSNHF", /* (18) */ "End-Disc", /* (19) */ "Proprietary", /* (20) */ "DCE-Id", /* (21) */ @@ -220,6 +213,7 @@ static const char *lcpconfopts[] = { "PPP-Muxing", /* (30) */ }; +/* IPV6CP - to be supported */ /* ECP - to be supported */ /* CCP Config Options */ @@ -283,36 +277,17 @@ 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 */ @@ -327,13 +302,6 @@ struct tok ip6cpopt_values[] = { #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) */ @@ -359,12 +327,14 @@ struct tok authalg_values[] = { #define CHAP_SUCC 3 #define CHAP_FAIL 4 -struct tok chapcode_values[] = { - { CHAP_CHAL, "Challenge" }, - { CHAP_RESP, "Response" }, - { CHAP_SUCC, "Success" }, - { CHAP_FAIL, "Fail" }, - { 0, NULL} +#define CHAP_CODEMIN CHAP_CHAL +#define CHAP_CODEMAX CHAP_FAIL + +static const char *chapcode[] = { + "Chal", /* (1) */ + "Resp", /* (2) */ + "Succ", /* (3) */ + "Fail", /* (4) */ }; /* PAP */ @@ -373,11 +343,13 @@ struct tok chapcode_values[] = { #define PAP_AACK 2 #define PAP_ANAK 3 -struct tok papcode_values[] = { - { PAP_AREQ, "Auth-Req" }, - { PAP_AACK, "Auth-ACK" }, - { PAP_ANAK, "Auth-NACK" }, - { 0, NULL } +#define PAP_CODEMIN PAP_AREQ +#define PAP_CODEMAX PAP_ANAK + +static const char *papcode[] = { + "Auth-Req", /* (1) */ + "Auth-Ack", /* (2) */ + "Auth-Nak", /* (3) */ }; /* BAP */ @@ -394,14 +366,11 @@ 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); -static void ppp_hdlc(const u_char *p, int length); /* generic Control Protocol (e.g. LCP, IPCP, CCP, etc.) handler */ static void @@ -415,7 +384,7 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) tptr=pptr; - typestr = tok2str(ppptype2str, "unknown ctrl-proto (0x%04x)", proto); + typestr = tok2str(ppptype2str, "unknown", proto); printf("%s, ",typestr); if (length < 4) /* FIXME weak boundary checking */ @@ -434,7 +403,7 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) tptr += 2; if (length <= 4) - goto print_len_and_return; /* there may be a NULL confreq etc. */ + return; /* there may be a NULL confreq etc. */ switch (code) { case CPCODES_VEXT: @@ -444,9 +413,7 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) printf(", Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); tptr += 4; TCHECK2(*tptr, 3); - printf(" Vendor: %s (%u)", - tok2str(oui_values,"Unknown",EXTRACT_24BITS(tptr)), - EXTRACT_24BITS(tptr)); + printf(" OUI 0x%06x", EXTRACT_24BITS(tptr)); /* XXX: need to decode Kind and Value(s)? */ break; case CPCODES_CONF_REQ: @@ -462,9 +429,6 @@ 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; @@ -473,16 +437,17 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) break; default: /* - * No print routine for the options for - * this protocol. + * This should never happen, but we set + * "pfunc" to squelch uninitialized + * variable warnings from compilers. */ pfunc = NULL; break; } - if (pfunc == NULL) /* catch the above null pointer if unknown CP */ - break; - + if (pfunc == NULL) /* catch the above null pointer if unknown CP */ + break; + if ((j = (*pfunc)(tptr, len)) == 0) break; x -= j; @@ -533,8 +498,6 @@ 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) @@ -559,7 +522,7 @@ print_lcp_config_options(const u_char *p, int length) if (length < len) return 0; if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) - printf(", %s (%u)", lcpconfopts[opt],opt); + printf(", %s ", lcpconfopts[opt]); else { printf(", unknown LCP option 0x%02x", opt); return len; @@ -569,13 +532,11 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_VEXT: if (len >= 6) { TCHECK2(*(p + 2), 3); - printf(" Vendor: %s (%u)", - tok2str(oui_values,"Unknown",EXTRACT_24BITS(p+2)), - EXTRACT_24BITS(p+2)); + printf(" OUI 0x%06x", EXTRACT_24BITS(p+2)); #if 0 TCHECK(p[5]); - printf(", kind: 0x%02x", p[5]); - printf(", Value: 0x") + printf(" kind 0x%02x", p[5]); + printf(" val 0x") for (i = 0; i < len - 6; i++) { TCHECK(p[6 + i]); printf("%02x", p[6 + i]); @@ -592,26 +553,45 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_ACCM: if (len == 6) { TCHECK2(*(p + 2), 4); - printf(" 0x%08x", EXTRACT_32BITS(p + 2)); + printf(" %08x", EXTRACT_32BITS(p + 2)); } break; 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]); - printf(", %s",tok2str(authalg_values,"Unknown Auth Alg %u",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; + } break; - case PPP_PAP: /* fall through */ case PPP_EAP: + printf(" EAP"); + break; case PPP_SPAP: + printf(" SPAP"); + break; case PPP_SPAP_OLD: - break; + printf(" Old-SPAP"); + break; default: - print_unknown_data(p,"\n\t",len); + printf("unknown"); } } break; @@ -717,7 +697,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: @@ -738,27 +718,6 @@ 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) @@ -780,13 +739,16 @@ handle_chap(const u_char *p, int length) TCHECK(*p); code = *p; - printf("CHAP, %s (0x%02x)", - tok2str(chapcode_values,"unknown",code), - code); + if ((code >= CHAP_CODEMIN) && (code <= CHAP_CODEMAX)) + printf("%s", chapcode[code - 1]); + else { + printf("0x%02x", code); + return; + } p++; TCHECK(*p); - printf(", id %u", *p); /* ID */ + printf("(%u)", *p); /* ID */ p++; TCHECK2(*p, 2); @@ -859,13 +821,16 @@ handle_pap(const u_char *p, int length) TCHECK(*p); code = *p; - printf("PAP, %s (0x%02x)", - tok2str(papcode_values,"unknown",code), - code); + if ((code >= PAP_CODEMIN) && (code <= PAP_CODEMAX)) + printf("%s", papcode[code - 1]); + else { + printf("0x%02x", code); + return; + } p++; TCHECK(*p); - printf(", id %u", *p); /* ID */ + printf("(%u)", *p); /* ID */ p++; TCHECK2(*p, 2); @@ -943,85 +908,61 @@ 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("src %s, dst %s", + printf(", IP-Addrs 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)); + 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)); 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: - case IPCPOPT_SECDNS: - case IPCPOPT_SECNBNS: if (len != 6) goto invlen; TCHECK2(*(p + 2), 4); - printf("%s", ipaddr_string(p + 2)); + printf(", Pri-NBNS %s", ipaddr_string(p + 2)); break; - default: - printf(", unknown-%d", opt); + case IPCPOPT_SECDNS: + if (len != 6) + goto invlen; + TCHECK2(*(p + 2), 4); + printf(", Sec-DNS %s", ipaddr_string(p + 2)); break; - } - return len; - -invlen: - printf(", invalid-length-%d", opt); - return 0; - -trunc: - printf("[|ipcp]"); - 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) + case IPCPOPT_SECNBNS: + if (len != 6) 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)); + TCHECK2(*(p + 2), 4); + printf(", Sec-NBNS %s", ipaddr_string(p + 2)); break; default: printf(", unknown-%d", opt); @@ -1034,11 +975,10 @@ invlen: return 0; trunc: - printf("[|ip6cp]"); + printf("[|ipcp]"); return 0; } - /* CCP config options */ static int print_ccp_config_options(const u_char *p, int length) @@ -1113,83 +1053,12 @@ trunc: } -static void -ppp_hdlc(const u_char *p, int length) -{ - u_char *b, *s, *t, c; - int i, proto; - const void *se; - - b = (u_int8_t *)malloc(length); - if (b == NULL) - return; - - /* - * Unescape all the data into a temporary, private, buffer. - * Do this so that we dont overwrite the original packet - * contents. - */ - for (s = (u_char *)p, t = b, i = length; i > 0; i--) { - c = *s++; - if (c == 0x7d) { - if (i > 1) { - i--; - c = *s++ ^ 0x20; - } else - continue; - } - *t++ = c; - } - - se = snapend; - snapend = t; - - /* now lets guess about the payload codepoint format */ - proto = *b; /* start with a one-octet codepoint guess */ - - switch (proto) { - case PPP_IP: - ip_print(gndo, b+1, t - b - 1); - goto cleanup; -#ifdef INET6 - case PPP_IPV6: - ip6_print(b+1, t - b - 1); - goto cleanup; -#endif - default: /* no luck - try next guess */ - break; - } - - proto = EXTRACT_16BITS(b); /* next guess - load two octets */ - - switch (proto) { - 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; - default: /* last guess - proto must be a PPP proto-id */ - handle_ppp(proto, b+2, t - b - 2); - break; - } - -cleanup: - snapend = se; - free(b); - return; -} - - /* PPP */ static void handle_ppp(u_int proto, const u_char *p, int length) { - if ((proto & 0xff00) == 0x7e00) {/* is this an escape code ? */ - ppp_hdlc(p-1, length); - return; - } - switch (proto) { - case PPP_LCP: /* fall through */ + case PPP_LCP: case PPP_IPCP: case PPP_OSICP: case PPP_MPLSCP: @@ -1198,9 +1067,6 @@ 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; @@ -1211,9 +1077,8 @@ handle_ppp(u_int proto, const u_char *p, int length) handle_bap(p, length); break; case ETHERTYPE_IP: /*XXX*/ - case PPP_VJNC: case PPP_IP: - ip_print(gndo, p, length); + ip_print(p, length); break; #ifdef INET6 case ETHERTYPE_IPV6: /*XXX*/ @@ -1232,13 +1097,10 @@ handle_ppp(u_int proto, const u_char *p, int length) case PPP_MPLS_MCAST: mpls_print(p, length); break; - case PPP_COMP: - printf("compressed PPP data"); - break; default: - printf("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", proto)); - print_unknown_data(p,"\n\t",length); - break; + printf("unknown PPP protocol (0x%04x)", proto); + print_unknown_data(p,"\n\t",length); + break; } } @@ -1246,7 +1108,7 @@ handle_ppp(u_int proto, const u_char *p, int length) u_int ppp_print(register const u_char *p, u_int length) { - u_int proto,ppp_header; + u_int proto; u_int olen = length; /* _o_riginal length */ u_int hdr_len = 0; @@ -1257,30 +1119,11 @@ ppp_print(register const u_char *p, u_int length) if (length < 2) goto trunc; TCHECK2(*p, 2); - ppp_header = EXTRACT_16BITS(p); - - switch(ppp_header) { - case (PPP_WITHDIRECTION_IN << 8 | PPP_CONTROL): - if (eflag) printf("In "); - p += 2; - length -= 2; - hdr_len += 2; - break; - case (PPP_WITHDIRECTION_OUT << 8 | PPP_CONTROL): - if (eflag) printf("Out "); - p += 2; - length -= 2; - hdr_len += 2; - break; - case (PPP_ADDRESS << 8 | PPP_CONTROL): - p += 2; /* ACFC not used */ - length -= 2; - hdr_len += 2; - break; - - default: - break; - } + if (*p == PPP_ADDRESS && *(p + 1) == PPP_CONTROL) { + p += 2; /* ACFC not used */ + length -= 2; + hdr_len += 2; + } if (length < 2) goto trunc; @@ -1299,7 +1142,7 @@ ppp_print(register const u_char *p, u_int length) } if (eflag) - printf("%s (0x%04x), length %u: ", + printf("PPP-%s (0x%04x), length %u: ", tok2str(ppptype2str, "unknown", proto), proto, olen); @@ -1597,11 +1440,3 @@ printx: #endif /* __bsdi__ */ return (hdrlength); } - - -/* - * Local Variables: - * c-style: whitesmith - * c-basic-offset: 8 - * End: - */ |