]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/chap.c
added stuff to print packets in readable form
[ppp.git] / pppd / chap.c
index e0ea4afeee00e569bb28879fc4f32909043ae20d..043dad9d00987cf5e61b93528940ed16cb5160a6 100644 (file)
@@ -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()