From f1085e1db51d5fc24764f1e1a9f0101e86bf7ca0 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Mon, 11 Apr 1994 07:13:44 +0000 Subject: [PATCH] added stuff to print packets in readable form --- pppd/chap.c | 67 ++++++++++++++++++++++++- pppd/chap.h | 7 +-- pppd/lcp.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++- pppd/lcp.h | 12 ++++- pppd/upap.c | 81 +++++++++++++++++++++++++++++- pppd/upap.h | 4 +- 6 files changed, 299 insertions(+), 10 deletions(-) diff --git a/pppd/chap.c b/pppd/chap.c index e0ea4af..043dad9 100644 --- a/pppd/chap.c +++ b/pppd/chap.c @@ -19,7 +19,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: chap.c,v 1.1 1993/11/11 03:54:25 paulus Exp $"; +static char rcsid[] = "$Id: chap.c,v 1.2 1994/04/11 07:13:44 paulus Exp $"; #endif /* @@ -738,6 +738,71 @@ ChapSendResponse(cstate) ++cstate->resp_transmits; } +/* + * ChapPrintPkt - print the contents of a CHAP packet. + */ +char *ChapCodenames[] = { + "Challenge", "Response", "Success", "Failure" +}; + +int +ChapPrintPkt(p, plen, printer, arg) + u_char *p; + int plen; + void (*printer) __ARGS((void *, char *, ...)); + void *arg; +{ + int code, id, len; + int clen, nlen; + u_char x; + + if (plen < CHAP_HEADERLEN) + return 0; + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < CHAP_HEADERLEN || len > plen) + return 0; + + if (code >= 1 && code <= sizeof(ChapCodenames) / sizeof(char *)) + printer(arg, " %s", ChapCodenames[code-1]); + else + printer(arg, " code=0x%x", code); + printer(arg, " id=0x%x", id); + len -= CHAP_HEADERLEN; + switch (code) { + case CHAP_CHALLENGE: + case CHAP_RESPONSE: + if (len < 1) + break; + clen = p[0]; + if (len < clen + 1) + break; + ++p; + nlen = len - clen - 1; + printer(arg, " <"); + for (; clen > 0; --clen) { + GETCHAR(x, p); + printer(arg, "%.2x", x); + } + printer(arg, ">, name = "); + print_string((char *)p, nlen, printer, arg); + break; + case CHAP_FAILURE: + case CHAP_SUCCESS: + printer(arg, " "); + print_string((char *)p, len, printer, arg); + break; + default: + for (clen = len; clen > 0; --clen) { + GETCHAR(x, p); + printer(arg, " %.2x", x); + } + } + + return len + CHAP_HEADERLEN; +} + #ifdef NO_DRAND48 double drand48() diff --git a/pppd/chap.h b/pppd/chap.h index e91d4fb..682ecb8 100644 --- a/pppd/chap.h +++ b/pppd/chap.h @@ -1,6 +1,5 @@ /* * chap.h - Cryptographic Handshake Authentication Protocol definitions. - * based on November 1991 draft of PPP Authentication RFC * * Copyright (c) 1991 Gregory M. Christy * All rights reserved. @@ -16,13 +15,13 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: chap.h,v 1.1 1993/11/11 03:54:25 paulus Exp $ + * $Id: chap.h,v 1.2 1994/04/11 07:13:44 paulus Exp $ */ #ifndef __CHAP_INCLUDE__ /* Code + ID + length */ -#define CHAP_HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short)) +#define CHAP_HEADERLEN 4 /* * CHAP codes. @@ -106,6 +105,8 @@ void ChapLowerUp __ARGS((int)); void ChapLowerDown __ARGS((int)); void ChapInput __ARGS((int, u_char *, int)); void ChapProtocolReject __ARGS((int)); +int ChapPrintPkt __ARGS((u_char *, int, + void (*) __ARGS((void *, char *, ...)), void *)); #define __CHAP_INCLUDE__ #endif /* __CHAP_INCLUDE__ */ diff --git a/pppd/lcp.c b/pppd/lcp.c index c475f4c..e03432c 100644 --- a/pppd/lcp.c +++ b/pppd/lcp.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: lcp.c,v 1.1 1993/11/11 03:54:25 paulus Exp $"; +static char rcsid[] = "$Id: lcp.c,v 1.2 1994/04/11 07:13:44 paulus Exp $"; #endif /* @@ -1279,3 +1279,139 @@ lcp_finished(f) link_terminated(f->unit); } + +/* + * lcp_printpkt - print the contents of an LCP packet. + */ +char *lcp_codenames[] = { + "ConfReq", "ConfAck", "ConfNak", "ConfRej", + "TermReq", "TermAck", "CodeRej", "ProtRej", + "EchoReq", "EchoRep", "DiscReq" +}; + +int +lcp_printpkt(p, plen, printer, arg) + u_char *p; + int plen; + void (*printer) __ARGS((void *, char *, ...)); + void *arg; +{ + int code, id, len, olen; + u_char *pstart, *optend; + u_short cishort; + u_long cilong; + + if (plen < HEADERLEN) + return 0; + pstart = p; + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < HEADERLEN || len > plen) + return 0; + + if (code >= 1 && code <= sizeof(lcp_codenames) / sizeof(char *)) + printer(arg, " %s", lcp_codenames[code-1]); + else + printer(arg, " code=0x%x", code); + printer(arg, " id=0x%x", id); + len -= HEADERLEN; + switch (code) { + case CONFREQ: + case CONFACK: + case CONFNAK: + case CONFREJ: + /* print option list */ + while (len >= 2) { + GETCHAR(code, p); + GETCHAR(olen, p); + p -= 2; + if (olen < 2 || olen > len) { + break; + } + printer(arg, " <"); + len -= olen; + optend = p + olen; + switch (code) { + case CI_MRU: + if (olen == CILEN_SHORT) { + p += 2; + GETSHORT(cishort, p); + printer(arg, "mru %d", cishort); + } + break; + case CI_ASYNCMAP: + if (olen == CILEN_LONG) { + p += 2; + GETLONG(cilong, p); + printer(arg, "asyncmap 0x%x", cilong); + } + break; + case CI_AUTHTYPE: + if (olen >= CILEN_SHORT) { + p += 2; + printer(arg, "auth "); + GETSHORT(cishort, p); + switch (cishort) { + case UPAP: + printer(arg, "upap"); + break; + case CHAP: + printer(arg, "chap"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_QUALITY: + if (olen >= CILEN_SHORT) { + p += 2; + printer(arg, "quality "); + GETSHORT(cishort, p); + switch (cishort) { + case LQR: + printer(arg, "lqr"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_MAGICNUMBER: + if (olen == CILEN_LONG) { + p += 2; + GETLONG(cilong, p); + printer(arg, "magic 0x%x", cilong); + } + break; + case CI_PCOMPRESSION: + if (olen == CILEN_VOID) { + p += 2; + printer(arg, "pcomp"); + } + break; + case CI_ACCOMPRESSION: + if (olen == CILEN_VOID) { + p += 2; + printer(arg, "accomp"); + } + break; + } + while (p < optend) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + printer(arg, ">"); + } + break; + } + + /* print the rest of the bytes in the packet */ + for (; len > 0; --len) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + + return p - pstart; +} diff --git a/pppd/lcp.h b/pppd/lcp.h index f7d5ea2..586efd6 100644 --- a/pppd/lcp.h +++ b/pppd/lcp.h @@ -16,7 +16,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: lcp.h,v 1.1 1993/11/11 03:54:25 paulus Exp $ + * $Id: lcp.h,v 1.2 1994/04/11 07:13:44 paulus Exp $ */ /* @@ -27,10 +27,16 @@ #define CI_AUTHTYPE 3 /* Authentication Type */ #define CI_QUALITY 4 /* Quality Protocol */ #define CI_MAGICNUMBER 5 /* Magic Number */ -#define CI_KEEPALIVE 6 /* Keep Alive Parameters - OBSOLETE */ #define CI_PCOMPRESSION 7 /* Protocol Field Compression */ #define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ +/* + * LCP-specific packet types. + */ +#define PROTREJ 8 /* Protocol Reject */ +#define ECHOREQ 9 /* Echo Request */ +#define ECHOREP 10 /* Echo Reply */ +#define DISCREQ 11 /* Discard Request */ /* * The state of options is described by an lcp_options structure. @@ -73,6 +79,8 @@ void lcp_lowerdown __ARGS((int)); void lcp_input __ARGS((int, u_char *, int)); void lcp_protrej __ARGS((int)); void lcp_sprotrej __ARGS((int, u_char *, int)); +int lcp_printpkt __ARGS((u_char *, int, + void (*) __ARGS((void *, char *, ...)), void *)); extern int lcp_warnloops; /* Warn about a loopback this often */ #define DEFWARNLOOPS 10 /* Default value for above */ diff --git a/pppd/upap.c b/pppd/upap.c index 47b3477..61d22ac 100644 --- a/pppd/upap.c +++ b/pppd/upap.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: upap.c,v 1.1 1993/11/11 03:54:25 paulus Exp $"; +static char rcsid[] = "$Id: upap.c,v 1.2 1994/04/11 07:13:44 paulus Exp $"; #endif /* @@ -310,7 +310,7 @@ upap_rauthreq(u, inp, id, len) return; } GETCHAR(ruserlen, inp); - len -= sizeof (u_char) + ruserlen + sizeof (u_char);; + len -= sizeof (u_char) + ruserlen + sizeof (u_char); if (len < 0) { UPAPDEBUG((LOG_INFO, "upap_rauth: rcvd short packet.")); return; @@ -482,3 +482,80 @@ upap_sresp(u, code, id, msg, msglen) UPAPDEBUG((LOG_INFO, "upap_sresp: Sent code %d, id %d.", code, id)); } + +/* + * upap_printpkt - print the contents of a PAP packet. + */ +char *upap_codenames[] = { + "AuthReq", "AuthAck", "AuthNak" +}; + +int +upap_printpkt(p, plen, printer, arg) + u_char *p; + int plen; + void (*printer) __ARGS((void *, char *, ...)); + void *arg; +{ + int code, id, len; + int mlen, ulen, wlen; + char *user, *pwd, *msg; + u_char *pstart; + + if (plen < UPAP_HEADERLEN) + return 0; + pstart = p; + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < UPAP_HEADERLEN || len > plen) + return 0; + + if (code >= 1 && code <= sizeof(upap_codenames) / sizeof(char *)) + printer(arg, " %s", upap_codenames[code-1]); + else + printer(arg, " code=0x%x", code); + printer(arg, " id=0x%x", id); + len -= UPAP_HEADERLEN; + switch (code) { + case UPAP_AUTHREQ: + if (len < 1) + break; + ulen = p[0]; + if (len < ulen + 2) + break; + wlen = p[ulen + 1]; + if (len < ulen + wlen + 2) + break; + user = (char *) (p + 1); + pwd = (char *) (p + ulen + 2); + p += ulen + wlen + 2; + len -= ulen + wlen + 2; + printer(arg, " user="); + print_string(user, ulen, printer, arg); + printer(arg, " password="); + print_string(pwd, wlen, printer, arg); + break; + case UPAP_AUTHACK: + case UPAP_AUTHNAK: + if (len < 1) + break; + mlen = p[0]; + if (len < mlen + 1) + break; + msg = (char *) (p + 1); + p += mlen + 1; + len -= mlen + 1; + printer(arg, "msg="); + print_string(msg, mlen, printer, arg); + break; + } + + /* print the rest of the bytes in the packet */ + for (; len > 0; --len) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + + return p - pstart; +} diff --git a/pppd/upap.h b/pppd/upap.h index c77c198..10c3414 100644 --- a/pppd/upap.h +++ b/pppd/upap.h @@ -16,7 +16,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: upap.h,v 1.1 1993/11/11 03:54:25 paulus Exp $ + * $Id: upap.h,v 1.2 1994/04/11 07:13:44 paulus Exp $ */ /* @@ -87,3 +87,5 @@ void upap_lowerup __ARGS((int)); void upap_lowerdown __ARGS((int)); void upap_input __ARGS((int, u_char *, int)); void upap_protrej __ARGS((int)); +int upap_printpkt __ARGS((u_char *, int, + void (*) __ARGS((void *, char *, ...)), void *)); -- 2.39.2