diff options
author | hannes <hannes> | 2005-05-08 20:35:20 +0000 |
---|---|---|
committer | hannes <hannes> | 2005-05-08 20:35:20 +0000 |
commit | d4fd1493e8d3a04727264ca4b71d88a8bcc43db6 (patch) | |
tree | 0513bfbcfa5c6d278caac0f7b43269d1beaf73ab /print-ppp.c | |
parent | c44d8840e1699dfaa63a74a19b1ace0f544802e4 (diff) | |
download | tcpdump-d4fd1493e8d3a04727264ca4b71d88a8bcc43db6.tar.gz |
-make the PPP printer multiline (behind vflag)
-make more use of tok2str()
-improve unknown option hexprinting
Diffstat (limited to 'print-ppp.c')
-rw-r--r-- | print-ppp.c | 238 |
1 files changed, 133 insertions, 105 deletions
diff --git a/print-ppp.c b/print-ppp.c index 603dd6c4..cef95418 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.109 2005-04-20 22:15:17 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.110 2005-05-08 20:35:20 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -243,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 */ @@ -352,6 +344,16 @@ struct tok authalg_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 @@ -424,24 +426,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)", @@ -501,10 +513,14 @@ 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 Unknown Data"); + print_unknown_data(tptr+2,"\n\t ",len-2); + } break; case CPCODES_ECHO_REQ: case CPCODES_ECHO_RPL: @@ -513,14 +529,18 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length) 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)); + /* XXX: need to decode Data? - hexdump for now */ + if (len > 8) { + printf("\n\t Unknown Data"); + print_unknown_data(tptr+4,"\n\t ",len-4); + } 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? */ @@ -530,15 +550,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: @@ -559,9 +573,9 @@ 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("\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; } @@ -569,7 +583,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 @@ -586,19 +600,19 @@ 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))); + printf("%s", tok2str(ppptype2str,"Unknown Auth Proto (0x04x)",EXTRACT_16BITS(p+2))); switch (EXTRACT_16BITS(p+2)) { case PPP_CHAP: @@ -627,7 +641,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: @@ -637,41 +651,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: @@ -680,29 +674,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; @@ -730,7 +724,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: @@ -954,9 +956,10 @@ print_ipcp_config_options(const u_char *p, int length) if (length < 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 */ @@ -990,9 +993,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: @@ -1018,9 +1024,10 @@ print_ip6cp_config_options(const u_char *p, int length) if (length < 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: @@ -1034,9 +1041,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: @@ -1062,10 +1073,14 @@ 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 */ + + 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: @@ -1081,13 +1096,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: @@ -1108,13 +1124,25 @@ print_bacp_config_options(const u_char *p, int length) opt = p[0]; if (length < len) return 0; - if (opt == BACPOPT_FPEER) { + + 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: |