Statistics
| Branch: | Revision:

root / slirp / debug.c @ 3b46e624

History | View | Annotate | Download (11.3 kB)

1
/*
2
 * Copyright (c) 1995 Danny Gasparovski.
3
 * Portions copyright (c) 2000 Kelly Price.
4
 *
5
 * Please read the file COPYRIGHT for the
6
 * terms and conditions of the copyright.
7
 */
8

    
9
#include <slirp.h>
10

    
11
FILE *dfd = NULL;
12
#ifdef DEBUG
13
int dostats = 1;
14
#else
15
int dostats = 0;
16
#endif
17
int slirp_debug = 0;
18

    
19
extern char *strerror _P((int));
20

    
21
/* Carry over one item from main.c so that the tty's restored.
22
 * Only done when the tty being used is /dev/tty --RedWolf */
23
extern struct termios slirp_tty_settings;
24
extern int slirp_tty_restore;
25

    
26

    
27
void
28
debug_init(file, dbg)
29
        char *file;
30
        int dbg;
31
{
32
        /* Close the old debugging file */
33
        if (dfd)
34
           fclose(dfd);
35

    
36
        dfd = fopen(file,"w");
37
        if (dfd != NULL) {
38
#if 0
39
                fprintf(dfd,"Slirp %s - Debugging Started.\n", SLIRP_VERSION);
40
#endif
41
                fprintf(dfd,"Debugging Started level %i.\r\n",dbg);
42
                fflush(dfd);
43
                slirp_debug = dbg;
44
        } else {
45
                lprint("Error: Debugging file \"%s\" could not be opened: %s\r\n",
46
                        file, strerror(errno));
47
        }
48
}
49

    
50
/*
51
 * Dump a packet in the same format as tcpdump -x
52
 */
53
#ifdef DEBUG
54
void
55
dump_packet(dat, n)
56
        void *dat;
57
        int n;
58
{
59
        u_char *pptr = (u_char *)dat;
60
        int j,k;
61

    
62
        n /= 16;
63
        n++;
64
        DEBUG_MISC((dfd, "PACKET DUMPED: \n"));
65
        for(j = 0; j < n; j++) {
66
                for(k = 0; k < 6; k++)
67
                        DEBUG_MISC((dfd, "%02x ", *pptr++));
68
                DEBUG_MISC((dfd, "\n"));
69
                fflush(dfd);
70
        }
71
}
72
#endif
73

    
74
#if 0
75
/*
76
 * Statistic routines
77
 *
78
 * These will print statistics to the screen, the debug file (dfd), or
79
 * a buffer, depending on "type", so that the stats can be sent over
80
 * the link as well.
81
 */
82

83
void
84
ttystats(ttyp)
85
        struct ttys *ttyp;
86
{
87
        struct slirp_ifstats *is = &ttyp->ifstats;
88
        char buff[512];
89

90
        lprint(" \r\n");
91

92
        if (if_comp & IF_COMPRESS)
93
           strcpy(buff, "on");
94
        else if (if_comp & IF_NOCOMPRESS)
95
           strcpy(buff, "off");
96
        else
97
           strcpy(buff, "off (for now)");
98
        lprint("Unit %d:\r\n", ttyp->unit);
99
        lprint("  using %s encapsulation (VJ compression is %s)\r\n", (
100
#ifdef USE_PPP
101
               ttyp->proto==PROTO_PPP?"PPP":
102
#endif
103
               "SLIP"), buff);
104
        lprint("  %d baudrate\r\n", ttyp->baud);
105
        lprint("  interface is %s\r\n", ttyp->up?"up":"down");
106
        lprint("  using fd %d, guardian pid is %d\r\n", ttyp->fd, ttyp->pid);
107
#ifndef FULL_BOLT
108
        lprint("  towrite is %d bytes\r\n", ttyp->towrite);
109
#endif
110
        if (ttyp->zeros)
111
           lprint("  %d zeros have been typed\r\n", ttyp->zeros);
112
        else if (ttyp->ones)
113
           lprint("  %d ones have been typed\r\n", ttyp->ones);
114
        lprint("Interface stats:\r\n");
115
        lprint("  %6d output packets sent (%d bytes)\r\n", is->out_pkts, is->out_bytes);
116
        lprint("  %6d output packets dropped (%d bytes)\r\n", is->out_errpkts, is->out_errbytes);
117
        lprint("  %6d input packets received (%d bytes)\r\n", is->in_pkts, is->in_bytes);
118
        lprint("  %6d input packets dropped (%d bytes)\r\n", is->in_errpkts, is->in_errbytes);
119
        lprint("  %6d bad input packets\r\n", is->in_mbad);
120
}
121

    
122
void
123
allttystats()
124
{
125
        struct ttys *ttyp;
126

    
127
        for (ttyp = ttys; ttyp; ttyp = ttyp->next)
128
           ttystats(ttyp);
129
}
130
#endif
131

    
132
void
133
ipstats()
134
{
135
        lprint(" \r\n");
136

    
137
        lprint("IP stats:\r\n");
138
        lprint("  %6d total packets received (%d were unaligned)\r\n",
139
                        ipstat.ips_total, ipstat.ips_unaligned);
140
        lprint("  %6d with incorrect version\r\n", ipstat.ips_badvers);
141
        lprint("  %6d with bad header checksum\r\n", ipstat.ips_badsum);
142
        lprint("  %6d with length too short (len < sizeof(iphdr))\r\n", ipstat.ips_tooshort);
143
        lprint("  %6d with length too small (len < ip->len)\r\n", ipstat.ips_toosmall);
144
        lprint("  %6d with bad header length\r\n", ipstat.ips_badhlen);
145
        lprint("  %6d with bad packet length\r\n", ipstat.ips_badlen);
146
        lprint("  %6d fragments received\r\n", ipstat.ips_fragments);
147
        lprint("  %6d fragments dropped\r\n", ipstat.ips_fragdropped);
148
        lprint("  %6d fragments timed out\r\n", ipstat.ips_fragtimeout);
149
        lprint("  %6d packets reassembled ok\r\n", ipstat.ips_reassembled);
150
        lprint("  %6d outgoing packets fragmented\r\n", ipstat.ips_fragmented);
151
        lprint("  %6d total outgoing fragments\r\n", ipstat.ips_ofragments);
152
        lprint("  %6d with bad protocol field\r\n", ipstat.ips_noproto);
153
        lprint("  %6d total packets delivered\r\n", ipstat.ips_delivered);
154
}
155

    
156
#if 0
157
void
158
vjstats()
159
{
160
        lprint(" \r\n");
161

162
        lprint("VJ compression stats:\r\n");
163

164
        lprint("  %6d outbound packets (%d compressed)\r\n",
165
               comp_s.sls_packets, comp_s.sls_compressed);
166
        lprint("  %6d searches for connection stats (%d misses)\r\n",
167
               comp_s.sls_searches, comp_s.sls_misses);
168
        lprint("  %6d inbound uncompressed packets\r\n", comp_s.sls_uncompressedin);
169
        lprint("  %6d inbound compressed packets\r\n", comp_s.sls_compressedin);
170
        lprint("  %6d inbound unknown type packets\r\n", comp_s.sls_errorin);
171
        lprint("  %6d inbound packets tossed due to error\r\n", comp_s.sls_tossed);
172
}
173
#endif
174

    
175
void
176
tcpstats()
177
{
178
        lprint(" \r\n");
179

    
180
        lprint("TCP stats:\r\n");
181

    
182
        lprint("  %6d packets sent\r\n", tcpstat.tcps_sndtotal);
183
        lprint("          %6d data packets (%d bytes)\r\n",
184
                        tcpstat.tcps_sndpack, tcpstat.tcps_sndbyte);
185
        lprint("          %6d data packets retransmitted (%d bytes)\r\n",
186
                        tcpstat.tcps_sndrexmitpack, tcpstat.tcps_sndrexmitbyte);
187
        lprint("          %6d ack-only packets (%d delayed)\r\n",
188
                        tcpstat.tcps_sndacks, tcpstat.tcps_delack);
189
        lprint("          %6d URG only packets\r\n", tcpstat.tcps_sndurg);
190
        lprint("          %6d window probe packets\r\n", tcpstat.tcps_sndprobe);
191
        lprint("          %6d window update packets\r\n", tcpstat.tcps_sndwinup);
192
        lprint("          %6d control (SYN/FIN/RST) packets\r\n", tcpstat.tcps_sndctrl);
193
        lprint("          %6d times tcp_output did nothing\r\n", tcpstat.tcps_didnuttin);
194

    
195
        lprint("  %6d packets received\r\n", tcpstat.tcps_rcvtotal);
196
        lprint("          %6d acks (for %d bytes)\r\n",
197
                        tcpstat.tcps_rcvackpack, tcpstat.tcps_rcvackbyte);
198
        lprint("          %6d duplicate acks\r\n", tcpstat.tcps_rcvdupack);
199
        lprint("          %6d acks for unsent data\r\n", tcpstat.tcps_rcvacktoomuch);
200
        lprint("          %6d packets received in sequence (%d bytes)\r\n",
201
                        tcpstat.tcps_rcvpack, tcpstat.tcps_rcvbyte);
202
        lprint("          %6d completely duplicate packets (%d bytes)\r\n",
203
                        tcpstat.tcps_rcvduppack, tcpstat.tcps_rcvdupbyte);
204

    
205
        lprint("          %6d packets with some duplicate data (%d bytes duped)\r\n",
206
                        tcpstat.tcps_rcvpartduppack, tcpstat.tcps_rcvpartdupbyte);
207
        lprint("          %6d out-of-order packets (%d bytes)\r\n",
208
                        tcpstat.tcps_rcvoopack, tcpstat.tcps_rcvoobyte);
209
        lprint("          %6d packets of data after window (%d bytes)\r\n",
210
                        tcpstat.tcps_rcvpackafterwin, tcpstat.tcps_rcvbyteafterwin);
211
        lprint("          %6d window probes\r\n", tcpstat.tcps_rcvwinprobe);
212
        lprint("          %6d window update packets\r\n", tcpstat.tcps_rcvwinupd);
213
        lprint("          %6d packets received after close\r\n", tcpstat.tcps_rcvafterclose);
214
        lprint("          %6d discarded for bad checksums\r\n", tcpstat.tcps_rcvbadsum);
215
        lprint("          %6d discarded for bad header offset fields\r\n",
216
                        tcpstat.tcps_rcvbadoff);
217

    
218
        lprint("  %6d connection requests\r\n", tcpstat.tcps_connattempt);
219
        lprint("  %6d connection accepts\r\n", tcpstat.tcps_accepts);
220
        lprint("  %6d connections established (including accepts)\r\n", tcpstat.tcps_connects);
221
        lprint("  %6d connections closed (including %d drop)\r\n",
222
                        tcpstat.tcps_closed, tcpstat.tcps_drops);
223
        lprint("  %6d embryonic connections dropped\r\n", tcpstat.tcps_conndrops);
224
        lprint("  %6d segments we tried to get rtt (%d succeeded)\r\n",
225
                        tcpstat.tcps_segstimed, tcpstat.tcps_rttupdated);
226
        lprint("  %6d retransmit timeouts\r\n", tcpstat.tcps_rexmttimeo);
227
        lprint("          %6d connections dropped by rxmt timeout\r\n",
228
                        tcpstat.tcps_timeoutdrop);
229
        lprint("  %6d persist timeouts\r\n", tcpstat.tcps_persisttimeo);
230
        lprint("  %6d keepalive timeouts\r\n", tcpstat.tcps_keeptimeo);
231
        lprint("          %6d keepalive probes sent\r\n", tcpstat.tcps_keepprobe);
232
        lprint("          %6d connections dropped by keepalive\r\n", tcpstat.tcps_keepdrops);
233
        lprint("  %6d correct ACK header predictions\r\n", tcpstat.tcps_predack);
234
        lprint("  %6d correct data packet header predictions\n", tcpstat.tcps_preddat);
235
        lprint("  %6d TCP cache misses\r\n", tcpstat.tcps_socachemiss);
236

    
237

    
238
/*        lprint("    Packets received too short:                %d\r\n", tcpstat.tcps_rcvshort); */
239
/*        lprint("    Segments dropped due to PAWS:        %d\r\n", tcpstat.tcps_pawsdrop); */
240

    
241
}
242

    
243
void
244
udpstats()
245
{
246
        lprint(" \r\n");
247

    
248
        lprint("UDP stats:\r\n");
249
        lprint("  %6d datagrams received\r\n", udpstat.udps_ipackets);
250
        lprint("  %6d with packets shorter than header\r\n", udpstat.udps_hdrops);
251
        lprint("  %6d with bad checksums\r\n", udpstat.udps_badsum);
252
        lprint("  %6d with data length larger than packet\r\n", udpstat.udps_badlen);
253
        lprint("  %6d UDP socket cache misses\r\n", udpstat.udpps_pcbcachemiss);
254
        lprint("  %6d datagrams sent\r\n", udpstat.udps_opackets);
255
}
256

    
257
void
258
icmpstats()
259
{
260
        lprint(" \r\n");
261
        lprint("ICMP stats:\r\n");
262
        lprint("  %6d ICMP packets received\r\n", icmpstat.icps_received);
263
        lprint("  %6d were too short\r\n", icmpstat.icps_tooshort);
264
        lprint("  %6d with bad checksums\r\n", icmpstat.icps_checksum);
265
        lprint("  %6d with type not supported\r\n", icmpstat.icps_notsupp);
266
        lprint("  %6d with bad type feilds\r\n", icmpstat.icps_badtype);
267
        lprint("  %6d ICMP packets sent in reply\r\n", icmpstat.icps_reflect);
268
}
269

    
270
void
271
mbufstats()
272
{
273
        struct mbuf *m;
274
        int i;
275

    
276
        lprint(" \r\n");
277

    
278
        lprint("Mbuf stats:\r\n");
279

    
280
        lprint("  %6d mbufs allocated (%d max)\r\n", mbuf_alloced, mbuf_max);
281

    
282
        i = 0;
283
        for (m = m_freelist.m_next; m != &m_freelist; m = m->m_next)
284
                i++;
285
        lprint("  %6d mbufs on free list\r\n",  i);
286

    
287
        i = 0;
288
        for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next)
289
                i++;
290
        lprint("  %6d mbufs on used list\r\n",  i);
291
        lprint("  %6d mbufs queued as packets\r\n\r\n", if_queued);
292
}
293

    
294
void
295
sockstats()
296
{
297
        char buff[256];
298
        int n;
299
        struct socket *so;
300

    
301
        lprint(" \r\n");
302

    
303
        lprint(
304
           "Proto[state]     Sock     Local Address, Port  Remote Address, Port RecvQ SendQ\r\n");
305

    
306
        for (so = tcb.so_next; so != &tcb; so = so->so_next) {
307

    
308
                n = sprintf(buff, "tcp[%s]", so->so_tcpcb?tcpstates[so->so_tcpcb->t_state]:"NONE");
309
                while (n < 17)
310
                   buff[n++] = ' ';
311
                buff[17] = 0;
312
                lprint("%s %3d   %15s %5d ",
313
                                buff, so->s,
314
                                inet_ntoa(so->so_laddr), ntohs(so->so_lport));
315
                lprint("%15s %5d %5d %5d\r\n",
316
                                inet_ntoa(so->so_faddr), ntohs(so->so_fport),
317
                                so->so_rcv.sb_cc, so->so_snd.sb_cc);
318
        }
319

    
320
        for (so = udb.so_next; so != &udb; so = so->so_next) {
321

    
322
                n = sprintf(buff, "udp[%d sec]", (so->so_expire - curtime) / 1000);
323
                while (n < 17)
324
                   buff[n++] = ' ';
325
                buff[17] = 0;
326
                lprint("%s %3d  %15s %5d  ",
327
                                buff, so->s,
328
                                inet_ntoa(so->so_laddr), ntohs(so->so_lport));
329
                lprint("%15s %5d %5d %5d\r\n",
330
                                inet_ntoa(so->so_faddr), ntohs(so->so_fport),
331
                                so->so_rcv.sb_cc, so->so_snd.sb_cc);
332
        }
333
}
334

    
335
#if 0
336
void
337
slirp_exit(exit_status)
338
        int exit_status;
339
{
340
        struct ttys *ttyp;
341

342
        DEBUG_CALL("slirp_exit");
343
        DEBUG_ARG("exit_status = %d", exit_status);
344

345
        if (dostats) {
346
                lprint_print = (int (*) _P((void *, const char *, va_list)))vfprintf;
347
                if (!dfd)
348
                   debug_init("slirp_stats", 0xf);
349
                lprint_arg = (char **)&dfd;
350

351
                ipstats();
352
                tcpstats();
353
                udpstats();
354
                icmpstats();
355
                mbufstats();
356
                sockstats();
357
                allttystats();
358
                vjstats();
359
        }
360

361
        for (ttyp = ttys; ttyp; ttyp = ttyp->next)
362
           tty_detached(ttyp, 1);
363

364
        if (slirp_forked) {
365
                /* Menendez time */
366
                if (kill(getppid(), SIGQUIT) < 0)
367
                        lprint("Couldn't kill parent process %ld!\n",
368
                            (long) getppid());
369
            }
370

371
        /* Restore the terminal if we gotta */
372
        if(slirp_tty_restore)
373
          tcsetattr(0,TCSANOW, &slirp_tty_settings);  /* NOW DAMMIT! */
374
        exit(exit_status);
375
}
376
#endif