diff options
author | thepish <thepish@FreeBSD.org> | 1998-08-30 05:32:44 +0000 |
---|---|---|
committer | thepish <thepish@FreeBSD.org> | 1998-08-30 05:32:44 +0000 |
commit | 30bccc19254382ddee335fbe86e0c573424c12bb (patch) | |
tree | 9623631d63c698800bca6b22cb9a91db5a4ec271 /contrib/tcpdump | |
parent | 6df2d2c0534d00e65ea7a2d25a1e6d8db7363aac (diff) | |
download | FreeBSD-src-30bccc19254382ddee335fbe86e0c573424c12bb.zip FreeBSD-src-30bccc19254382ddee335fbe86e0c573424c12bb.tar.gz |
PR: 7741
Submitted by: Hellmuth Michaelis <hm@kts.org>
add LCP/PAP/CHAP/IPCP frame printing functionality
Diffstat (limited to 'contrib/tcpdump')
-rw-r--r-- | contrib/tcpdump/print-ppp.c | 427 |
1 files changed, 391 insertions, 36 deletions
diff --git a/contrib/tcpdump/print-ppp.c b/contrib/tcpdump/print-ppp.c index daae3ae..bd5e805 100644 --- a/contrib/tcpdump/print-ppp.c +++ b/contrib/tcpdump/print-ppp.c @@ -64,10 +64,6 @@ static struct protonames protonames[] = { * Protocol field values. */ PPP_IP, "IP", /* Internet Protocol */ -#ifndef PPP_ISO -#define PPP_ISO 0x23 -#endif - PPP_ISO, "ISO", /* ISO 8473 */ PPP_XNS, "XNS", /* Xerox NS */ PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */ PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */ @@ -82,49 +78,416 @@ static struct protonames protonames[] = { PPP_CHAP, "CHAP", /* Cryptographic Handshake Auth. Proto*/ }; +/* LCP */ + +#define LCP_CONF_REQ 1 +#define LCP_CONF_ACK 2 +#define LCP_CONF_NAK 3 +#define LCP_CONF_REJ 4 +#define LCP_TERM_REQ 5 +#define LCP_TERM_ACK 6 +#define LCP_CODE_REJ 7 +#define LCP_PROT_REJ 8 +#define LCP_ECHO_REQ 9 +#define LCP_ECHO_RPL 10 +#define LCP_DISC_REQ 11 + +#define LCP_MIN LCP_CONF_REQ +#define LCP_MAX LCP_DISC_REQ + +static char *lcpcodes[] = { + /* + * LCP code values (RFC1661, pp26) + */ + "Configure-Request", + "Configure-Ack", + "Configure-Nak", + "Configure-Reject", + "Terminate-Request", + "Terminate-Ack", + "Code-Reject", + "Protocol-Reject", + "Echo-Request", + "Echo-Reply", + "Discard-Request", +}; + +#define LCPOPT_VEXT 0 +#define LCPOPT_MRU 1 +#define LCPOPT_ACCM 2 +#define LCPOPT_AP 3 +#define LCPOPT_QP 4 +#define LCPOPT_MN 5 +#define LCPOPT_PFC 7 +#define LCPOPT_ACFC 8 + +#define LCPOPT_MIN 0 +#define LCPOPT_MAX 24 + +static char *lcpconfopts[] = { + "Vendor-Ext", + "Max-Rx-Unit", + "Async-Ctrl-Char-Map", + "Auth-Prot", + "Quality-Prot", + "Magic-Number", + "unassigned (6)", + "Prot-Field-Compr", + "Add-Ctrl-Field-Compr", + "FCS-Alternatives", + "Self-Describing-Pad", + "Numbered-Mode", + "Multi-Link-Procedure", + "Call-Back", + "Connect-Time" + "Compund-Frames", + "Nominal-Data-Encap", + "Multilink-MRRU", + "Multilink-SSNHF", + "Multilink-ED", + "Proprietary", + "DCE-Identifier", + "Multilink-Plus-Proc", + "Link-Discriminator", + "LCP-Auth-Option", +}; + +/* CHAP */ + +#define CHAP_CHAL 1 +#define CHAP_RESP 2 +#define CHAP_SUCC 3 +#define CHAP_FAIL 4 + +#define CHAP_CODEMIN 1 +#define CHAP_CODEMAX 4 + +static char *chapcode[] = { + "Challenge", + "Response", + "Success", + "Failure", +}; + +/* PAP */ + +#define PAP_AREQ 1 +#define PAP_AACK 2 +#define PAP_ANAK 3 + +#define PAP_CODEMIN 1 +#define PAP_CODEMAX 3 + +static char *papcode[] = { + "Authenticate-Request", + "Authenticate-Ack", + "Authenticate-Nak", +}; + +/* IPCP */ + +#define IPCP_2ADDR 1 +#define IPCP_CP 2 +#define IPCP_ADDR 3 + +static int handle_lcp(const u_char *p, int length); +static int print_lcp_config_options(u_char *p); +static int handle_chap(const u_char *p, int length); +static int handle_ipcp(const u_char *p, int length); +static int handle_pap(const u_char *p, int length); + void ppp_hdlc_print(const u_char *p, int length) { int proto = PPP_PROTOCOL(p); - int i; - - printf("%4d %02x ", length, PPP_CONTROL(p)); + int i, j, x; + u_char *ptr; - for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i){ - if (proto == protonames[i].protocol) { + printf("ID-%03d ", *(p+5)); + + for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i) + { + if (proto == protonames[i].protocol) + { printf("%s: ", protonames[i].name); + + switch(proto) + { + case PPP_LCP: + handle_lcp(p, length); + break; + case PPP_CHAP: + handle_chap(p, length); + break; + case PPP_PAP: + handle_pap(p, length); + break; + case PPP_IPCP: + handle_ipcp(p, length); + break; + } break; } } if (i < 0) + { printf("%04x: ", proto); + } } -void -ppp_if_print(u_char *user, const struct pcap_pkthdr *h, - register const u_char *p) +/* print LCP frame */ + +static int +handle_lcp(const u_char *p, int length) { - register u_int length = h->len; - register u_int caplen = h->caplen; + int x, j; + u_char *ptr; + + x = *(p+4); + + if((x >= LCP_MIN) && (x <= LCP_MAX)) + { + printf("%s", lcpcodes[x-1]); + } + else + { + printf("0x%02x", x); + return; + } - int frame_relay = 0; - int proto = PPP_CONTROL(p); + length -= 4; + + switch(x) + { + case LCP_CONF_REQ: + case LCP_CONF_ACK: + case LCP_CONF_NAK: + case LCP_CONF_REJ: + x = length; + ptr = (u_char *)p+8; + do + { + if((j = print_lcp_config_options(ptr)) == 0) + break; + x -= j; + ptr += j; + } + while(x > 0); + break; + + case LCP_ECHO_REQ: + case LCP_ECHO_RPL: + printf(", Magic-Number=%d", ((*(p+8) << 24) + (*(p+9) << 16) + (*(p+10) << 8) + (*(p+11)))); + break; + case LCP_TERM_REQ: + case LCP_TERM_ACK: + case LCP_CODE_REJ: + case LCP_PROT_REJ: + case LCP_DISC_REQ: + default: + break; + } +} - if(caplen > length) caplen = length; +/* LCP config options */ - /* - * Check to see if this is a frame-relay, we have to do this - * because BPF could not differentiate between PPP and Framerelay - * link types. - */ +static int +print_lcp_config_options(u_char *p) +{ + int len = *(p+1); + int opt = *p; + + if((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) + printf(", %s", lcpconfopts[opt]); - frame_relay = (fr_addr_len(p) >= 2); + switch(opt) + { + case LCPOPT_MRU: + if(len == 4) + printf("=%d", (*(p+2) << 8) + *(p+3)); + break; + case LCPOPT_AP: + if(len >= 4) + { + if(*(p+2) == 0xc0 && *(p+3) == 0x23) + { + printf(" PAP"); + } + else if(*(p+2) == 0xc2 && *(p+3) == 0x23) + { + printf(" CHAP/"); + switch(*(p+4)) + { + default: + printf("unknown-algorithm-%d", *(p+4)); + break; + case 5: + printf("MD5"); + break; + case 0x80: + printf("Microsoft"); + break; + } + } + else if(*(p+2) == 0xc2 && *(p+3) == 0x27) + { + printf(" EAP"); + } + else if(*(p+2) == 0xc0 && *(p+3) == 0x27) + { + printf(" SPAP"); + } + else if(*(p+2) == 0xc1 && *(p+3) == 0x23) + { + printf(" Old-SPAP"); + } + else + { + printf("unknown"); + } + } + break; + case LCPOPT_QP: + if(len >= 4) + { + if(*(p+2) == 0xc0 && *(p+3) == 0x25) + printf(" LQR"); + else + printf(" unknown"); + } + break; + case LCPOPT_MN: + if(len == 6) + { + printf("=%d", ((*(p+2) << 24) + (*(p+3) << 16) + (*(p+4) << 8) + (*(p+5)))); + } + break; + case LCPOPT_PFC: + printf(" PFC"); + break; + case LCPOPT_ACFC: + printf(" ACFC"); + break; + } + return(len); +} + +/* CHAP */ + +static int +handle_chap(const u_char *p, int length) +{ + int x, j; + u_char *ptr; + + x = *(p+4); + + if((x >= CHAP_CODEMIN) && (x <= CHAP_CODEMAX)) + { + printf("%s", chapcode[x-1]); + } + else + { + printf("0x%02x", x); + return; + } + + length -= 4; + + switch(x) + { + case CHAP_CHAL: + case CHAP_RESP: + printf(", Value="); + x = *(p+8); /* value size */ + ptr = (u_char *)p+9; + while(--x >= 0) + printf("%02x", *ptr++); + x = length - *(p+8) - 1; + printf(", Name="); + while(--x >= 0) + printf("%c", *ptr++); + break; + } +} + +/* PAP */ + +static int +handle_pap(const u_char *p, int length) +{ + int x, j; + u_char *ptr; + + x = *(p+4); - if(frame_relay) { - fr_if_print(user, h, p); + if((x >= PAP_CODEMIN) && (x <= PAP_CODEMAX)) + { + printf("%s", papcode[x-1]); + } + else + { + printf("0x%02x", x); return; } + length -= 4; + + switch(x) + { + case PAP_AREQ: + printf(", Peer-Id="); + x = *(p+8); /* peerid size */ + ptr = (u_char *)p+9; + while(--x >= 0) + printf("%c", *ptr++); + x = *ptr++; + printf(", Passwd="); + while(--x >= 0) + printf("%c", *ptr++); + break; + case PAP_AACK: + case PAP_ANAK: + break; + } +} + +/* IPCP */ + +static int +handle_ipcp(const u_char *p, int length) +{ + int x, j; + + x = *(p+8); + + length -= 4; + + switch(x) + { + case IPCP_2ADDR: + printf("IP-Addresses"); + printf(", Src=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); + printf(", Dst=%d.%d.%d.%d", *(p+14), *(p+15), *(p+16), *(p+17)); + break; + + case IPCP_CP: + printf("IP-Compression-Protocol"); + break; + + case IPCP_ADDR: + printf("IP-Address=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); + break; + } +} + +void +ppp_if_print(u_char *user, const struct pcap_pkthdr *h, + register const u_char *p) +{ + register u_int length = h->len; + register u_int caplen = h->caplen; + ts_print(&h->ts); if (caplen < PPP_HDRLEN) { @@ -154,18 +517,10 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h, case ETHERTYPE_IPX: ipx_print((const u_char *)(p + PPP_HDRLEN), length); break; - - case PPP_ISO: - isoclns_print((const u_char *)(p + PPP_HDRLEN), length, - caplen, "000000", "000000"); - break; + default: - if(!eflag) { - if (frame_relay) - fr_hdlc_print(p, length); - else - ppp_hdlc_print(p, length); - } + if(!eflag) + ppp_hdlc_print(p, length); if(!xflag) default_print((const u_char *)(p + PPP_HDRLEN), caplen - PPP_HDRLEN); |