X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/258fb362b92f0a61ab0fd5d8bc69fa798e7e1c8b..a4a13734bb167ab42f86da26c3aa1cb4da9954fd:/print-ppp.c diff --git a/print-ppp.c b/print-ppp.c index 1bd206ee..ea8e00b2 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.103 2004-09-11 14:23:28 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 @@ -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" }, @@ -99,9 +101,12 @@ struct tok ppptype2str[] = { { 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 } }; @@ -200,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) */ @@ -238,43 +243,35 @@ static const char *lcpconfopts[] = { /* 27-254 unassigned */ #define CCPOPT_RESV 255 /* RFC1962 */ -#define CCPOPT_MIN CCPOPT_OUI -#define CCPOPT_MAX CCPOPT_DEFLATE /* XXX: should be CCPOPT_RESV but... */ - -static const char *ccpconfopts[] = { - "OUI", /* (0) */ - "Pred-1", /* (1) */ - "Pred-2", /* (2) */ - "Puddle", /* (3) */ - "unassigned(4)", /* (4) */ - "unassigned(5)", /* (5) */ - "unassigned(6)", /* (6) */ - "unassigned(7)", /* (7) */ - "unassigned(8)", /* (8) */ - "unassigned(9)", /* (9) */ - "unassigned(10)", /* (10) */ - "unassigned(11)", /* (11) */ - "unassigned(12)", /* (12) */ - "unassigned(13)", /* (13) */ - "unassigned(14)", /* (14) */ - "unassigned(15)", /* (15) */ - "HP-PPC", /* (16) */ - "Stac-LZS", /* (17) */ - "MPPC", /* (18) */ - "Gand-FZA", /* (19) */ - "V.42bis", /* (20) */ - "BSD-Comp", /* (21) */ - "unassigned(22)", /* (22) */ - "LZS-DCP", /* (23) */ - "MVRCA", /* (24) */ - "DEC", /* (25) */ - "Deflate", /* (26) */ +const struct tok ccpconfopts_values[] = { + { CCPOPT_OUI, "OUI" }, + { CCPOPT_PRED1, "Pred-1" }, + { CCPOPT_PRED2, "Pred-2" }, + { CCPOPT_PJUMP, "Puddle" }, + { CCPOPT_HPPPC, "HP-PPC" }, + { CCPOPT_STACLZS, "Stac-LZS" }, + { CCPOPT_MPPC, "MPPC" }, + { CCPOPT_GFZA, "Gand-FZA" }, + { CCPOPT_V42BIS, "V.42bis" }, + { CCPOPT_BSDCOMP, "BSD-Comp" }, + { CCPOPT_LZSDCP, "LZS-DCP" }, + { CCPOPT_MVRCA, "MVRCA" }, + { CCPOPT_DEC, "DEC" }, + { CCPOPT_DEFLATE, "Deflate" }, + { CCPOPT_RESV, "Reserved"}, + {0, NULL} }; /* BACP Config Options */ #define BACPOPT_FPEER 1 /* RFC2125 */ +const struct tok bacconfopts_values[] = { + { BACPOPT_FPEER, "Favored-Peer" }, + {0, NULL} +}; + + /* SDCP - to be supported */ /* IPCP Config Options */ @@ -299,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 @@ -322,6 +333,13 @@ 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) */ @@ -340,6 +358,16 @@ struct tok ip6cpopt_values[] = { #define CALLBACK_X500 4 /* X.500 distinguished name */ #define CALLBACK_CBCP 6 /* Location is determined during CBCP nego */ +struct tok ppp_callback_values[] = { + { CALLBACK_AUTH, "UserAuth" }, + { CALLBACK_DSTR, "DialString" }, + { CALLBACK_LID, "LocalID" }, + { CALLBACK_E164, "E.164" }, + { CALLBACK_X500, "X.500" }, + { CALLBACK_CBCP, "CBCP" }, + { 0, NULL } +}; + /* CHAP */ #define CHAP_CHAL 1 @@ -382,6 +410,7 @@ 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); @@ -411,24 +440,34 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) code = *tptr++; - printf("%s (0x%02x), id %u", + printf("%s (0x%02x), id %u, length %u", tok2str(cpcodes, "Unknown Opcode",code), - code, - *tptr++); /* ID */ + code, + *tptr++, /* ID */ + length+2); + + if (!vflag) + return; + + if (length <= 4) + return; /* there may be a NULL confreq etc. */ TCHECK2(*tptr, 2); len = EXTRACT_16BITS(tptr); tptr += 2; - if (length <= 4) - goto print_len_and_return; /* there may be a NULL confreq etc. */ + printf("\n\tencoded length %u (=Option(s) length %u)",len,len-4); + + if (vflag>1) + print_unknown_data(pptr-2,"\n\t",6); + switch (code) { case CPCODES_VEXT: if (length < 11) break; TCHECK2(*tptr, 4); - printf(", Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); + printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); tptr += 4; TCHECK2(*tptr, 3); printf(" Vendor: %s (%u)", @@ -488,26 +527,45 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) if (length < 6) break; TCHECK2(*tptr, 2); - printf(", Rejected %s Protocol (0x%04x)", + printf("\n\t Rejected %s Protocol (0x%04x)", tok2str(ppptype2str,"unknown", EXTRACT_16BITS(tptr)), EXTRACT_16BITS(tptr)); - /* XXX: need to decode Rejected-Information? */ + /* XXX: need to decode Rejected-Information? - hexdump for now */ + if (len > 6) { + printf("\n\t Rejected Packet"); + print_unknown_data(tptr+2,"\n\t ",len-2); + } break; case CPCODES_ECHO_REQ: case CPCODES_ECHO_RPL: case CPCODES_DISC_REQ: + if (length < 8) + break; + TCHECK2(*tptr, 4); + printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); + /* XXX: need to decode Data? - hexdump for now */ + if (len > 8) { + printf("\n\t -----trailing data-----"); + TCHECK2(tptr[4], len-8); + print_unknown_data(tptr+4,"\n\t ",len-8); + } + break; case CPCODES_ID: if (length < 8) break; TCHECK2(*tptr, 4); - printf(", Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); - /* XXX: need to decode Data? */ + printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); + /* RFC 1661 says this is intended to be human readable */ + if (len > 8) { + printf("\n\t Message\n\t "); + fn_printn(tptr+4,len-4,snapend); + } break; case CPCODES_TIME_REM: if (length < 12) break; TCHECK2(*tptr, 4); - printf(", Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); + printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); TCHECK2(*(tptr + 4), 4); printf(", Seconds-Remaining %us", EXTRACT_32BITS(tptr + 4)); /* XXX: need to decode Message? */ @@ -517,15 +575,9 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) * original pointer passed to the begin * the PPP packet */ if (vflag <= 1) - print_unknown_data(pptr-2,"\n\t",length+2); + print_unknown_data(pptr-2,"\n\t ",length+2); break; } - - print_len_and_return: - printf(", length %u", length); - - if (vflag >1) - print_unknown_data(pptr-2,"\n\t",length+2); return; trunc: @@ -545,10 +597,17 @@ print_lcp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; + if (len < 2) { + if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) + printf("\n\t %s Option (0x%02x), length %u (bogus, should be >= 2)", lcpconfopts[opt],opt,len); + else + printf("\n\tunknown LCP option 0x%02x", opt); + return 0; + } if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) - printf(", %s (%u)", lcpconfopts[opt],opt); + printf("\n\t %s Option (0x%02x), length %u: ", lcpconfopts[opt],opt,len); else { - printf(", unknown LCP option 0x%02x", opt); + printf("\n\tunknown LCP option 0x%02x", opt); return len; } @@ -556,7 +615,7 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_VEXT: if (len >= 6) { TCHECK2(*(p + 2), 3); - printf(" Vendor: %s (%u)", + printf("Vendor: %s (%u)", tok2str(oui_values,"Unknown",EXTRACT_24BITS(p+2)), EXTRACT_24BITS(p+2)); #if 0 @@ -573,51 +632,32 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_MRU: if (len == 4) { TCHECK2(*(p + 2), 2); - printf(" %u", EXTRACT_16BITS(p + 2)); + printf("%u", EXTRACT_16BITS(p + 2)); } break; case LCPOPT_ACCM: if (len == 6) { TCHECK2(*(p + 2), 4); - printf(" 0x%08x", EXTRACT_32BITS(p + 2)); + printf("0x%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]); - 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; @@ -633,7 +673,7 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_MN: if (len == 6) { TCHECK2(*(p + 2), 4); - printf(" 0x%08x", EXTRACT_32BITS(p + 2)); + printf("0x%08x", EXTRACT_32BITS(p + 2)); } break; case LCPOPT_PFC: @@ -643,41 +683,21 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_LD: if (len == 4) { TCHECK2(*(p + 2), 2); - printf(" 0x%04x", EXTRACT_16BITS(p + 2)); + printf("0x%04x", EXTRACT_16BITS(p + 2)); } break; case LCPOPT_CBACK: if (len < 3) break; TCHECK(p[2]); - switch (p[2]) { /* Operation */ - case CALLBACK_AUTH: - printf(" UserAuth"); - break; - case CALLBACK_DSTR: - printf(" DialString"); - break; - case CALLBACK_LID: - printf(" LocalID"); - break; - case CALLBACK_E164: - printf(" E.164"); - break; - case CALLBACK_X500: - printf(" X.500"); - break; - case CALLBACK_CBCP: - printf(" CBCP"); - break; - default: - printf(" unknown-operation=%u", p[2]); - break; - } + printf("Callback Operation %s (%u)", + tok2str(ppp_callback_values,"Unknown",p[2]), + p[2]); break; case LCPOPT_MLMRRU: if (len == 4) { TCHECK2(*(p + 2), 2); - printf(" %u", EXTRACT_16BITS(p + 2)); + printf("%u", EXTRACT_16BITS(p + 2)); } break; case LCPOPT_MLED: @@ -686,29 +706,29 @@ print_lcp_config_options(const u_char *p, int length) TCHECK(p[2]); switch (p[2]) { /* class */ case MEDCLASS_NULL: - printf(" Null"); + printf("Null"); break; case MEDCLASS_LOCAL: - printf(" Local"); /* XXX */ + printf("Local"); /* XXX */ break; case MEDCLASS_IPV4: if (len != 7) break; TCHECK2(*(p + 3), 4); - printf(" IPv4 %s", ipaddr_string(p + 3)); + printf("IPv4 %s", ipaddr_string(p + 3)); break; case MEDCLASS_MAC: if (len != 9) break; TCHECK(p[8]); - printf(" MAC %02x:%02x:%02x:%02x:%02x:%02x", + printf("MAC %02x:%02x:%02x:%02x:%02x:%02x", p[3], p[4], p[5], p[6], p[7], p[8]); break; case MEDCLASS_MNB: - printf(" Magic-Num-Block"); /* XXX */ + printf("Magic-Num-Block"); /* XXX */ break; case MEDCLASS_PSNDN: - printf(" PSNDN"); /* XXX */ + printf("PSNDN"); /* XXX */ break; } break; @@ -723,7 +743,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: @@ -736,7 +756,15 @@ print_lcp_config_options(const u_char *p, int length) case LCPOPT_PPPMUX: break; #endif + default: + if(vflag<2) + print_unknown_data(&p[2],"\n\t ",len-2); + break; } + + if (vflag>1) + print_unknown_data(&p[2],"\n\t ",len-2); /* exclude TLV header */ + return len; trunc: @@ -744,6 +772,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) @@ -857,6 +906,16 @@ handle_pap(const u_char *p, int length) 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) @@ -920,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; @@ -928,10 +988,18 @@ print_ipcp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; + if (len < 2) { + printf("\n\t %s Option (0x%02x), length %u (bogus, should be >= 2)", + tok2str(ipcpopt_values,"unknown",opt), + opt, + len); + return 0; + } - printf(", %s (0x%02x) ", + printf("\n\t %s Option (0x%02x), length %u: ", tok2str(ipcpopt_values,"unknown",opt), - opt); + opt, + len); switch (opt) { case IPCPOPT_2ADDR: /* deprecated */ @@ -946,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 */ @@ -965,9 +1084,12 @@ print_ipcp_config_options(const u_char *p, int length) printf("%s", ipaddr_string(p + 2)); break; default: - printf(", unknown-%d", opt); + if(vflag<2) + print_unknown_data(&p[2],"\n\t ",len-2); break; } + if (vflag>1) + print_unknown_data(&p[2],"\n\t ",len-2); /* exclude TLV header */ return len; invlen: @@ -992,10 +1114,18 @@ print_ip6cp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; + if (len < 2) { + printf("\n\t %s Option (0x%02x), length %u (bogus, should be >= 2)", + tok2str(ip6cpopt_values,"unknown",opt), + opt, + len); + return 0; + } - printf(", %s (0x%02x) ", + printf("\n\t %s Option (0x%02x), length %u: ", tok2str(ip6cpopt_values,"unknown",opt), - opt); + opt, + len); switch (opt) { case IP6CP_IFID: @@ -1009,9 +1139,13 @@ print_ip6cp_config_options(const u_char *p, int length) EXTRACT_16BITS(p + 8)); break; default: - printf(", unknown-%d", opt); + if(vflag<2) + print_unknown_data(&p[2],"\n\t ",len-2); break; } + if (vflag>1) + print_unknown_data(&p[2],"\n\t ",len-2); /* exclude TLV header */ + return len; invlen: @@ -1037,10 +1171,21 @@ print_ccp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; - if ((opt >= CCPOPT_MIN) && (opt <= CCPOPT_MAX)) - printf(", %s", ccpconfopts[opt]); -#if 0 /* XXX */ + if (len < 2) { + printf("\n\t %s Option (0x%02x), length %u (bogus, should be >= 2)", + tok2str(ccpconfopts_values, "Unknown", opt), + opt, + len); + return 0; + } + + printf("\n\t %s Option (0x%02x), length %u:", + tok2str(ccpconfopts_values, "Unknown", opt), + opt, + len); + switch (opt) { + /* fall through --> default: nothing supported yet */ case CCPOPT_OUI: case CCPOPT_PRED1: case CCPOPT_PRED2: @@ -1056,13 +1201,14 @@ print_ccp_config_options(const u_char *p, int length) case CCPOPT_DEC: case CCPOPT_DEFLATE: case CCPOPT_RESV: - break; - default: - printf(", unknown-%d", opt); + if(vflag<2) + print_unknown_data(&p[2],"\n\t ",len-2); break; } -#endif + if (vflag>1) + print_unknown_data(&p[2],"\n\t ",len-2); /* exclude TLV header */ + return len; trunc: @@ -1083,13 +1229,32 @@ print_bacp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; - if (opt == BACPOPT_FPEER) { + if (len < 2) { + printf("\n\t %s Option (0x%02x), length %u (bogus, should be >= 2)", + tok2str(bacconfopts_values, "Unknown", opt), + opt, + len); + return 0; + } + + printf("\n\t %s Option (0x%02x), length %u:", + tok2str(bacconfopts_values, "Unknown", opt), + opt, + len); + + switch (opt) { + case BACPOPT_FPEER: TCHECK2(*(p + 2), 4); - printf(", Favored-Peer"); printf(", Magic-Num 0x%08x", EXTRACT_32BITS(p + 2)); - } else { - printf(", unknown-option-%d", opt); + break; + default: + if(vflag<2) + print_unknown_data(&p[2],"\n\t ",len-2); + break; } + if (vflag>1) + print_unknown_data(&p[2],"\n\t ",len-2); /* exclude TLV header */ + return len; trunc: @@ -1134,21 +1299,21 @@ 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); - goto cleanup; + ip6_print(gndo, b+1, t - b - 1); + goto cleanup; #endif default: /* no luck - try next guess */ - break; + break; } 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; @@ -1174,7 +1339,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: @@ -1183,6 +1348,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; @@ -1195,12 +1363,12 @@ 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*/ case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case ETHERTYPE_IPX: /*XXX*/ @@ -1461,7 +1629,7 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ hdrlength += 1; } else { /* Un-compressed protocol field */ - ptype = ntohs(*(u_int16_t *)p); + ptype = EXTRACT_16BITS(p); if (eflag) printf("%04x ", ptype); p += 2; @@ -1481,7 +1649,7 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ && ph->phdr_ctl == PPP_CONTROL) { if (eflag) printf("%02x %02x ", q[0], q[1]); - ptype = ntohs(ph->phdr_type); + ptype = EXTRACT_16BITS(&ph->phdr_type); if (eflag && (ptype == PPP_VJC || ptype == PPP_VJNC)) { printf("%s ", tok2str(ppptype2str, "proto-#%d", ptype)); @@ -1507,11 +1675,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ p += hdrlength; switch (ptype) { case PPP_IP: - ip_print(p, length); + ip_print(gndo, p, length); break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: @@ -1526,11 +1694,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ p += hdrlength; switch (ptype) { case PPP_IP: - ip_print(p, length); + ip_print(gndo, p, length); break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: @@ -1562,12 +1730,12 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_ break; #ifdef INET6 case PPP_IPV6: - ip6_print(p, length); + ip6_print(gndo, p, length); break; #endif case PPP_MPLS_UCAST: case PPP_MPLS_MCAST: - mpls_print(p, length); + mpls_print(gndo, p, length); break; default: printf("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype)); @@ -1579,3 +1747,11 @@ printx: #endif /* __bsdi__ */ return (hdrlength); } + + +/* + * Local Variables: + * c-style: whitesmith + * c-basic-offset: 8 + * End: + */