1
/***********************************************************************
5
* Implementation of user-space PPPoE redirector for Linux.
7
* Functions for printing debugging information
9
* Copyright (C) 2000 by Roaring Penguin Software Inc.
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.
14
***********************************************************************/
16
static char const RCSID[] =
17
"$Id: debug.c,v 1.2 2008/06/09 08:34:23 paulus Exp $";
25
/**********************************************************************
28
* fp -- file to dump to
29
* buf -- buffer to dump
30
* len -- length of data
34
* Dumps buffer to fp in an easy-to-read format
35
***********************************************************************/
37
dumpHex(FILE *fp, unsigned char const *buf, int len)
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");
50
for (base=0; base<len; base += 16) {
51
for (i=base; i<base+16; i++) {
53
fprintf(fp, "%02x ", (unsigned) buf[i]);
59
for (i=base; i<base+16; i++) {
61
if (isprint(buf[i])) {
62
fprintf(fp, "%c", buf[i]);
74
/**********************************************************************
75
*%FUNCTION: dumpPacket
77
* fp -- file to dump to
78
* packet -- a PPPoE packet
79
* dir -- either SENT or RCVD
83
* Dumps the PPPoE packet to fp in an easy-to-read format
84
***********************************************************************/
86
dumpPacket(FILE *fp, PPPoEPacket *packet, char const *dir)
88
int len = ntohs(packet->length);
90
/* Sheesh... printing times is a pain... */
97
UINT16_t type = etherType(packet);
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);
110
fprintf(fp, "Unknown (%x) ", (unsigned) type);
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_PADM: fprintf(fp, "PADM "); break;
120
case CODE_PADN: fprintf(fp, "PADN "); break;
121
case CODE_SESS: fprintf(fp, "SESS "); break;
124
fprintf(fp, "sess-id %d length %d\n",
125
(int) ntohs(packet->session),
128
/* Ugly... I apologize... */
130
"SourceAddr %02x:%02x:%02x:%02x:%02x:%02x "
131
"DestAddr %02x:%02x:%02x:%02x:%02x:%02x\n",
132
(unsigned) packet->ethHdr.h_source[0],
133
(unsigned) packet->ethHdr.h_source[1],
134
(unsigned) packet->ethHdr.h_source[2],
135
(unsigned) packet->ethHdr.h_source[3],
136
(unsigned) packet->ethHdr.h_source[4],
137
(unsigned) packet->ethHdr.h_source[5],
138
(unsigned) packet->ethHdr.h_dest[0],
139
(unsigned) packet->ethHdr.h_dest[1],
140
(unsigned) packet->ethHdr.h_dest[2],
141
(unsigned) packet->ethHdr.h_dest[3],
142
(unsigned) packet->ethHdr.h_dest[4],
143
(unsigned) packet->ethHdr.h_dest[5]);
144
dumpHex(fp, packet->payload, ntohs(packet->length));