Home | History | Annotate | Download | only in rp-pppoe
      1 /***********************************************************************
      2 *
      3 * debug.c
      4 *
      5 * Implementation of user-space PPPoE redirector for Linux.
      6 *
      7 * Functions for printing debugging information
      8 *
      9 * Copyright (C) 2000 by Roaring Penguin Software Inc.
     10 *
     11 * This program may be distributed according to the terms of the GNU
     12 * General Public License, version 2 or (at your option) any later version.
     13 *
     14 ***********************************************************************/
     15 
     16 static char const RCSID[] =
     17 "$Id: debug.c,v 1.1 2001/12/14 02:55:20 mostrows Exp $";
     18 
     19 #include "pppoe.h"
     20 #include <sys/time.h>
     21 #include <time.h>
     22 #include <unistd.h>
     23 #include <ctype.h>
     24 
     25 /**********************************************************************
     26 *%FUNCTION: dumpHex
     27 *%ARGUMENTS:
     28 * fp -- file to dump to
     29 * buf -- buffer to dump
     30 * len -- length of data
     31 *%RETURNS:
     32 * Nothing
     33 *%DESCRIPTION:
     34 * Dumps buffer to fp in an easy-to-read format
     35 ***********************************************************************/
     36 void
     37 dumpHex(FILE *fp, unsigned char const *buf, int len)
     38 {
     39     int i;
     40     int base;
     41 
     42     if (!fp) return;
     43 
     44     /* do NOT dump PAP packets */
     45     if (len >= 2 && buf[0] == 0xC0 && buf[1] == 0x23) {
     46 	fprintf(fp, "(PAP Authentication Frame -- Contents not dumped)\n");
     47 	return;
     48     }
     49 
     50     for (base=0; base<len; base += 16) {
     51 	for (i=base; i<base+16; i++) {
     52 	    if (i < len) {
     53 		fprintf(fp, "%02x ", (unsigned) buf[i]);
     54 	    } else {
     55 		fprintf(fp, "   ");
     56 	    }
     57 	}
     58 	fprintf(fp, "  ");
     59 	for (i=base; i<base+16; i++) {
     60 	    if (i < len) {
     61 		if (isprint(buf[i])) {
     62 		    fprintf(fp, "%c", buf[i]);
     63 		} else {
     64 		    fprintf(fp, ".");
     65 		}
     66 	    } else {
     67 		break;
     68 	    }
     69 	}
     70 	fprintf(fp, "\n");
     71     }
     72 }
     73 
     74 /**********************************************************************
     75 *%FUNCTION: dumpPacket
     76 *%ARGUMENTS:
     77 * fp -- file to dump to
     78 * packet -- a PPPoE packet
     79 * dir -- either SENT or RCVD
     80 *%RETURNS:
     81 * Nothing
     82 *%DESCRIPTION:
     83 * Dumps the PPPoE packet to fp in an easy-to-read format
     84 ***********************************************************************/
     85 void
     86 dumpPacket(FILE *fp, PPPoEPacket *packet, char const *dir)
     87 {
     88     int len = ntohs(packet->length);
     89 
     90     /* Sheesh... printing times is a pain... */
     91     struct timeval tv;
     92     time_t now;
     93     int millisec;
     94     struct tm *lt;
     95     char timebuf[256];
     96 
     97     UINT16_t type = etherType(packet);
     98     if (!fp) return;
     99     gettimeofday(&tv, NULL);
    100     now = (time_t) tv.tv_sec;
    101     millisec = tv.tv_usec / 1000;
    102     lt = localtime(&now);
    103     strftime(timebuf, 256, "%H:%M:%S", lt);
    104     fprintf(fp, "%s.%03d %s PPPoE ", timebuf, millisec, dir);
    105     if (type == Eth_PPPOE_Discovery) {
    106 	fprintf(fp, "Discovery (%x) ", (unsigned) type);
    107     } else if (type == Eth_PPPOE_Session) {
    108 	fprintf(fp, "Session (%x) ", (unsigned) type);
    109     } else {
    110 	fprintf(fp, "Unknown (%x) ", (unsigned) type);
    111     }
    112 
    113     switch(packet->code) {
    114     case CODE_PADI: fprintf(fp, "PADI "); break;
    115     case CODE_PADO: fprintf(fp, "PADO "); break;
    116     case CODE_PADR: fprintf(fp, "PADR "); break;
    117     case CODE_PADS: fprintf(fp, "PADS "); break;
    118     case CODE_PADT: fprintf(fp, "PADT "); break;
    119     case CODE_SESS: fprintf(fp, "SESS "); break;
    120     }
    121 
    122     fprintf(fp, "sess-id %d length %d\n",
    123 	    (int) ntohs(packet->session),
    124 	    len);
    125 
    126     /* Ugly... I apologize... */
    127     fprintf(fp,
    128 	    "SourceAddr %02x:%02x:%02x:%02x:%02x:%02x "
    129 	    "DestAddr %02x:%02x:%02x:%02x:%02x:%02x\n",
    130 	    (unsigned) packet->ethHdr.h_source[0],
    131 	    (unsigned) packet->ethHdr.h_source[1],
    132 	    (unsigned) packet->ethHdr.h_source[2],
    133 	    (unsigned) packet->ethHdr.h_source[3],
    134 	    (unsigned) packet->ethHdr.h_source[4],
    135 	    (unsigned) packet->ethHdr.h_source[5],
    136 	    (unsigned) packet->ethHdr.h_dest[0],
    137 	    (unsigned) packet->ethHdr.h_dest[1],
    138 	    (unsigned) packet->ethHdr.h_dest[2],
    139 	    (unsigned) packet->ethHdr.h_dest[3],
    140 	    (unsigned) packet->ethHdr.h_dest[4],
    141 	    (unsigned) packet->ethHdr.h_dest[5]);
    142     dumpHex(fp, packet->payload, ntohs(packet->length));
    143 }
    144