diff options
author | mickey <mickey@openbsd.org> | 1999-02-11 12:48:29 +0000 |
---|---|---|
committer | mickey <mickey@openbsd.org> | 1999-02-11 12:48:29 +0000 |
commit | f2bd261c93b8bf637e59654055e0ae51f85e99e4 (patch) | |
tree | 25d2959a65f74461e23f36200aa54426c361042e /usr.sbin/tcpdump/print-ppp.c | |
parent | When resending chap challenges, resend the same challenge (diff) | |
download | wireguard-openbsd-f2bd261c93b8bf637e59654055e0ae51f85e99e4.tar.xz wireguard-openbsd-f2bd261c93b8bf637e59654055e0ae51f85e99e4.zip |
print ppp; from isdn4bsd package by Hellmuth Michaellis <mh@hcs.de>
Diffstat (limited to 'usr.sbin/tcpdump/print-ppp.c')
-rw-r--r-- | usr.sbin/tcpdump/print-ppp.c | 483 |
1 files changed, 471 insertions, 12 deletions
diff --git a/usr.sbin/tcpdump/print-ppp.c b/usr.sbin/tcpdump/print-ppp.c index d7e810079b9..70be01054b9 100644 --- a/usr.sbin/tcpdump/print-ppp.c +++ b/usr.sbin/tcpdump/print-ppp.c @@ -1,3 +1,5 @@ +/* $OpenBSD: print-ppp.c,v 1.7 1999/02/11 12:48:29 mickey Exp $ */ + /* * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996 * The Regents of the University of California. All rights reserved. @@ -21,7 +23,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /home/cvs/src/usr.sbin/tcpdump/print-ppp.c,v 1.6 1997/07/25 20:12:27 mickey Exp $ (LBL)"; + "@(#) $Header: /home/cvs/src/usr.sbin/tcpdump/print-ppp.c,v 1.7 1999/02/11 12:48:29 mickey Exp $ (LBL)"; #endif #ifdef PPP @@ -41,25 +43,461 @@ struct rtentry; #include <netinet/in_systm.h> #include <netinet/ip.h> +#include <netipx/ipx.h> +#include <netipx/ipx_if.h> + #include <ctype.h> #include <netdb.h> #include <pcap.h> #include <signal.h> #include <stdio.h> +#include <netinet/if_ether.h> +#include "ethertype.h" + +#include <net/ppp_defs.h> #include "interface.h" #include "addrtoname.h" -/* XXX This goes somewhere else. */ -#define PPP_HDRLEN 4 +struct protonames { + u_short protocol; + char *name; +}; + +static struct protonames protonames[] = { + /* + * Protocol field values. + */ + PPP_IP, "IP", /* Internet Protocol */ + PPP_XNS, "XNS", /* Xerox NS */ + PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */ + PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */ + PPP_VJC_UNCOMP, "VJC_UNCOMP", /* VJ uncompressed TCP */ + PPP_COMP, "COMP", /* compressed packet */ + PPP_IPCP, "IPCP", /* IP Control Protocol */ + PPP_IPXCP, "IPXCP", /* IPX Control Protocol (RFC1552) */ + PPP_CCP, "CCP", /* Compression Control Protocol */ + PPP_LCP, "LCP", /* Link Control Protocol */ + PPP_PAP, "PAP", /* Password Authentication Protocol */ + PPP_LQR, "LQR", /* Link Quality Report protocol */ + 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_CODE_CFG_REQ 1 +#define IPCP_CODE_CFG_ACK 2 +#define IPCP_CODE_CFG_NAK 3 +#define IPCP_CODE_CFG_REJ 4 +#define IPCP_CODE_TRM_REQ 5 +#define IPCP_CODE_TRM_ACK 6 +#define IPCP_CODE_COD_REJ 7 + +#define IPCP_CODE_MIN IPCP_CODE_CFG_REQ +#define IPCP_CODE_MAX IPCP_CODE_COD_REJ + +#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(p, length) + const u_char *p; + int length; +{ + int proto = PPP_PROTOCOL(p); + int i, j, x; + u_char *ptr; + + 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); +} + +/* print LCP frame */ + +static int +handle_lcp(p, length) + const u_char *p; + int length; +{ + 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; + } + + 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; + } +} + +/* LCP config options */ + +static int +print_lcp_config_options(p) + u_char *p; +{ + int len = *(p+1); + int opt = *p; + + if((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) + printf(", %s", lcpconfopts[opt]); + + 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("Micro$oft"); + 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(p, length) + 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(p, length) + const u_char *p; + int length; +{ + int x, j; + u_char *ptr; + + x = *(p+4); + + 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(p, length) + const u_char *p; + int length; +{ + int x, j; + u_char *ptr; + + x = *(p+4); + + if((x >= IPCP_CODE_MIN) && (x <= IPCP_CODE_MAX)) + printf("%s", lcpcodes[x-1]); /* share table with LCP */ + else { + printf("0x%02x", x); + return; + } + + length -= 4; + + switch(*(p+8)) + { + 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; + default: + printf(", Unknown IPCP code 0x%x", *(p+8)); + break; + } +} void -ppp_if_print(u_char *user, const struct pcap_pkthdr *h, - register const u_char *p) +ppp_if_print(user, h, p) + 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; - const struct ip *ip; ts_print(&h->ts); @@ -77,19 +515,37 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h, snapend = p + caplen; if (eflag) - printf("%c %4d %02x %04x: ", p[0] ? 'O' : 'I', length, - p[1], ntohs(*(u_short *)&p[2])); + ppp_hdlc_print(p, length); length -= PPP_HDRLEN; - ip = (struct ip *)(p + PPP_HDRLEN); - ip_print((const u_char *)ip, length); + + switch(PPP_PROTOCOL(p)) { + case PPP_IP: + case ETHERTYPE_IP: + ip_print((const u_char *)(p + PPP_HDRLEN), length); + break; + case PPP_IPX: + case ETHERTYPE_IPX: + ipx_print((const u_char *)(p + PPP_HDRLEN), length); + break; + + default: + if(!eflag) + ppp_hdlc_print(p, length); + if(!xflag) + default_print((const u_char *)(p + PPP_HDRLEN), + caplen - PPP_HDRLEN); + } if (xflag) - default_print((const u_char *)ip, caplen - PPP_HDRLEN); + default_print((const u_char *)(p + PPP_HDRLEN), + caplen - PPP_HDRLEN); out: putchar('\n'); } + #else + #include <sys/types.h> #include <sys/time.h> @@ -97,7 +553,10 @@ out: #include "interface.h" void -ppp_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) +ppp_if_print(user, h, p) + u_char *user; + const struct pcap_pkthdr *h; + const u_char *p; { error("not configured for ppp"); /* NOTREACHED */ |