1*deae2c9bSjoerg /* $NetBSD: tcp.c,v 1.16 2014/06/03 22:22:41 joerg Exp $ */
200116cf5Sad
300116cf5Sad /*
4fc391547Sad * Copyright (c) 1999, 2000 Andrew Doran <ad@NetBSD.org>
500116cf5Sad * All rights reserved.
600116cf5Sad *
700116cf5Sad * Redistribution and use in source and binary forms, with or without
800116cf5Sad * modification, are permitted provided that the following conditions
900116cf5Sad * are met:
1000116cf5Sad * 1. Redistributions of source code must retain the above copyright
1100116cf5Sad * notice, this list of conditions and the following disclaimer.
1200116cf5Sad * 2. Redistributions in binary form must reproduce the above copyright
1300116cf5Sad * notice, this list of conditions and the following disclaimer in the
1400116cf5Sad * documentation and/or other materials provided with the distribution.
1500116cf5Sad *
1600116cf5Sad * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1700116cf5Sad * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1800116cf5Sad * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1900116cf5Sad * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2000116cf5Sad * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2100116cf5Sad * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2200116cf5Sad * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2300116cf5Sad * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2400116cf5Sad * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2500116cf5Sad * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2600116cf5Sad * SUCH DAMAGE.
2700116cf5Sad *
2800116cf5Sad */
2900116cf5Sad
3000116cf5Sad #include <sys/cdefs.h>
3100116cf5Sad #ifndef lint
32*deae2c9bSjoerg __RCSID("$NetBSD: tcp.c,v 1.16 2014/06/03 22:22:41 joerg Exp $");
3300116cf5Sad #endif /* not lint */
3400116cf5Sad
3500116cf5Sad #include <sys/param.h>
3600116cf5Sad #include <sys/sysctl.h>
3700116cf5Sad
3800116cf5Sad #include <netinet/in.h>
3900116cf5Sad #include <netinet/in_systm.h>
4000116cf5Sad #include <netinet/ip.h>
4100116cf5Sad #include <netinet/ip_var.h>
4200116cf5Sad #include <netinet/tcp.h>
4300116cf5Sad #include <netinet/tcp_timer.h>
4400116cf5Sad #include <netinet/tcp_var.h>
4500116cf5Sad
46828483a7Ssimonb #include <string.h>
47b7de5e44Sad
4800116cf5Sad #include "systat.h"
4900116cf5Sad #include "extern.h"
5000116cf5Sad
5100116cf5Sad #define LHD(row, str) mvwprintw(wnd, row, 10, str)
5200116cf5Sad #define RHD(row, str) mvwprintw(wnd, row, 45, str)
53fc391547Sad #define SHOW(row, col, stat) \
54f5c68c0bSthorpej mvwprintw(wnd, row, col, "%9llu", (unsigned long long)curstat[stat])
5500116cf5Sad
56fc391547Sad enum update {
57fc391547Sad UPDATE_TIME,
58fc391547Sad UPDATE_BOOT,
59fc391547Sad UPDATE_RUN,
60fc391547Sad };
61fc391547Sad
62fc391547Sad static enum update update = UPDATE_TIME;
63f5c68c0bSthorpej static uint64_t curstat[TCP_NSTATS];
64f5c68c0bSthorpej static uint64_t newstat[TCP_NSTATS];
65f5c68c0bSthorpej static uint64_t oldstat[TCP_NSTATS];
6600116cf5Sad
6700116cf5Sad WINDOW *
opentcp(void)6800116cf5Sad opentcp(void)
6900116cf5Sad {
7000116cf5Sad
719f46bb07Sdsl return (subwin(stdscr, -1, 0, 5, 0));
7200116cf5Sad }
7300116cf5Sad
7400116cf5Sad void
closetcp(WINDOW * w)75fc391547Sad closetcp(WINDOW *w)
7600116cf5Sad {
7700116cf5Sad
7800116cf5Sad if (w != NULL) {
7900116cf5Sad wclear(w);
8000116cf5Sad wrefresh(w);
8100116cf5Sad delwin(w);
8200116cf5Sad }
8300116cf5Sad }
8400116cf5Sad
8500116cf5Sad void
labeltcp(void)8600116cf5Sad labeltcp(void)
8700116cf5Sad {
885cd87151Sad
8900116cf5Sad wmove(wnd, 0, 0); wclrtoeol(wnd);
9000116cf5Sad
9100116cf5Sad LHD(0, "connections initiated");
9200116cf5Sad LHD(1, "connections accepted");
9300116cf5Sad LHD(2, "connections established");
9400116cf5Sad
9500116cf5Sad LHD(4, "connections dropped");
9600116cf5Sad LHD(5, " in embryonic state");
9700116cf5Sad LHD(6, " on retransmit timeout");
9800116cf5Sad LHD(7, " by keepalive");
9900116cf5Sad LHD(8, " by persist");
10000116cf5Sad
10100116cf5Sad LHD(10, "potential rtt updates");
10200116cf5Sad LHD(11, "successful rtt updates");
10300116cf5Sad LHD(12, "delayed acks sent");
10400116cf5Sad LHD(13, "retransmit timeouts");
10500116cf5Sad LHD(14, "persist timeouts");
10600116cf5Sad LHD(15, "keepalive probes");
10700116cf5Sad LHD(16, "keepalive timeouts");
10800116cf5Sad
10900116cf5Sad RHD(9, "total TCP packets received");
11000116cf5Sad RHD(10, " in sequence");
11100116cf5Sad RHD(11, " completely duplicate");
11200116cf5Sad RHD(12, " with some duplicate data");
11300116cf5Sad RHD(13, " out of order");
11400116cf5Sad RHD(14, " duplicate acks");
11500116cf5Sad RHD(15, " acks");
11600116cf5Sad RHD(16, " window probes");
11700116cf5Sad RHD(17, " window updates");
11800116cf5Sad
11900116cf5Sad RHD(0, "total TCP packets sent");
12000116cf5Sad RHD(1, " data");
12100116cf5Sad RHD(2, " data (retransmit)");
12200116cf5Sad RHD(3, " ack-only");
12300116cf5Sad RHD(4, " window probes");
12400116cf5Sad RHD(5, " window updates");
12500116cf5Sad RHD(6, " urgent data only");
12600116cf5Sad RHD(7, " control");
12700116cf5Sad }
12800116cf5Sad
12900116cf5Sad void
showtcpsyn(void)13000116cf5Sad showtcpsyn(void)
13100116cf5Sad {
13200116cf5Sad
133f5c68c0bSthorpej SHOW(0, 0, TCP_STAT_SC_ADDED);
134f5c68c0bSthorpej SHOW(1, 0, TCP_STAT_SC_COMPLETED);
135f5c68c0bSthorpej SHOW(2, 0, TCP_STAT_SC_TIMED_OUT);
136f5c68c0bSthorpej SHOW(3, 0, TCP_STAT_SC_DUPESYN);
137f5c68c0bSthorpej SHOW(4, 0, TCP_STAT_SC_COLLISIONS);
138f5c68c0bSthorpej SHOW(5, 0, TCP_STAT_SC_RETRANSMITTED);
139f5c68c0bSthorpej SHOW(6, 0, TCP_STAT_SC_ABORTED);
140f5c68c0bSthorpej SHOW(7, 0, TCP_STAT_SC_OVERFLOWED);
141f5c68c0bSthorpej SHOW(8, 0, TCP_STAT_SC_RESET);
142f5c68c0bSthorpej SHOW(9, 0, TCP_STAT_SC_UNREACH);
143f5c68c0bSthorpej SHOW(10, 0, TCP_STAT_SC_BUCKETOVERFLOW);
144f5c68c0bSthorpej SHOW(11, 0, TCP_STAT_SC_DROPPED);
14500116cf5Sad }
14600116cf5Sad
14700116cf5Sad void
labeltcpsyn(void)14800116cf5Sad labeltcpsyn(void)
14900116cf5Sad {
15000116cf5Sad
15100116cf5Sad wmove(wnd, 0, 0); wclrtoeol(wnd);
15200116cf5Sad LHD(0, "entries added");
15300116cf5Sad LHD(1, "connections completed");
15400116cf5Sad LHD(2, "entries timed out");
1550a600be8Swiz LHD(3, "duplicate SYNs received");
15600116cf5Sad LHD(4, "hash collisions");
15700116cf5Sad LHD(5, "retransmissions");
15800116cf5Sad LHD(6, "entries aborted (no memory)");
15900116cf5Sad LHD(7, "dropped (overflow)");
16000116cf5Sad LHD(8, "dropped (RST)");
16100116cf5Sad LHD(9, "dropped (ICMP UNRCH)");
16200116cf5Sad LHD(10, "dropped (bucket overflow)");
16300116cf5Sad LHD(11, "dropped (unreachable/no memory)");
16400116cf5Sad }
16500116cf5Sad
16600116cf5Sad void
showtcp(void)16700116cf5Sad showtcp(void)
16800116cf5Sad {
16900116cf5Sad
170f5c68c0bSthorpej SHOW(0, 0, TCP_STAT_CONNATTEMPT);
171f5c68c0bSthorpej SHOW(1, 0, TCP_STAT_ACCEPTS);
172f5c68c0bSthorpej SHOW(2, 0, TCP_STAT_CONNECTS);
17300116cf5Sad
174f5c68c0bSthorpej SHOW(4, 0, TCP_STAT_DROPS);
175f5c68c0bSthorpej SHOW(5, 0, TCP_STAT_CONNDROPS);
176f5c68c0bSthorpej SHOW(6, 0, TCP_STAT_TIMEOUTDROP);
177f5c68c0bSthorpej SHOW(7, 0, TCP_STAT_KEEPDROPS);
178f5c68c0bSthorpej SHOW(8, 0, TCP_STAT_PERSISTDROPS);
17900116cf5Sad
180f5c68c0bSthorpej SHOW(10, 0, TCP_STAT_SEGSTIMED);
181f5c68c0bSthorpej SHOW(11, 0, TCP_STAT_RTTUPDATED);
182f5c68c0bSthorpej SHOW(12, 0, TCP_STAT_DELACK);
183f5c68c0bSthorpej SHOW(13, 0, TCP_STAT_REXMTTIMEO);
184f5c68c0bSthorpej SHOW(14, 0, TCP_STAT_PERSISTTIMEO);
185f5c68c0bSthorpej SHOW(15, 0, TCP_STAT_KEEPPROBE);
186f5c68c0bSthorpej SHOW(16, 0, TCP_STAT_KEEPTIMEO);
18700116cf5Sad
188f5c68c0bSthorpej SHOW(0, 35, TCP_STAT_SNDTOTAL);
189f5c68c0bSthorpej SHOW(1, 35, TCP_STAT_SNDPACK);
190f5c68c0bSthorpej SHOW(2, 35, TCP_STAT_SNDREXMITPACK);
19100116cf5Sad
192f5c68c0bSthorpej SHOW(3, 35, TCP_STAT_SNDACKS);
193f5c68c0bSthorpej SHOW(4, 35, TCP_STAT_SNDPROBE);
194f5c68c0bSthorpej SHOW(5, 35, TCP_STAT_SNDWINUP);
195f5c68c0bSthorpej SHOW(6, 35, TCP_STAT_SNDURG);
196f5c68c0bSthorpej SHOW(7, 35, TCP_STAT_SNDCTRL);
19700116cf5Sad
198f5c68c0bSthorpej SHOW(9, 35, TCP_STAT_RCVTOTAL);
199f5c68c0bSthorpej SHOW(10, 35, TCP_STAT_RCVPACK);
200f5c68c0bSthorpej SHOW(11, 35, TCP_STAT_RCVDUPPACK);
201f5c68c0bSthorpej SHOW(12, 35, TCP_STAT_RCVPARTDUPPACK);
202f5c68c0bSthorpej SHOW(13, 35, TCP_STAT_RCVOOPACK);
203f5c68c0bSthorpej SHOW(14, 35, TCP_STAT_RCVDUPACK);
204f5c68c0bSthorpej SHOW(15, 35, TCP_STAT_RCVACKPACK);
205f5c68c0bSthorpej SHOW(16, 35, TCP_STAT_RCVWINPROBE);
206f5c68c0bSthorpej SHOW(17, 35, TCP_STAT_RCVWINUPD);
20700116cf5Sad }
20800116cf5Sad
20900116cf5Sad int
inittcp(void)21000116cf5Sad inittcp(void)
21100116cf5Sad {
21200116cf5Sad return 1;
21300116cf5Sad }
21400116cf5Sad
21500116cf5Sad void
fetchtcp(void)21600116cf5Sad fetchtcp(void)
21700116cf5Sad {
218*deae2c9bSjoerg size_t i, size = sizeof(newstat);
2195cd87151Sad
220*deae2c9bSjoerg if (sysctlbyname("net.inet.tcp.stats", newstat, &size, NULL, 0) == -1)
221f2bff8adSthorpej return;
222fc391547Sad
223f5c68c0bSthorpej for (i = 0; i < TCP_NSTATS; i++)
224f5c68c0bSthorpej xADJINETCTR(curstat, oldstat, newstat, i);
225fc391547Sad
226fc391547Sad if (update == UPDATE_TIME)
227f5c68c0bSthorpej memcpy(oldstat, newstat, sizeof(oldstat));
228fc391547Sad }
229fc391547Sad
230fc391547Sad void
tcp_boot(char * args)231fc391547Sad tcp_boot(char *args)
232fc391547Sad {
233fc391547Sad
234f5c68c0bSthorpej memset(oldstat, 0, sizeof(oldstat));
235fc391547Sad update = UPDATE_BOOT;
236fc391547Sad }
237fc391547Sad
238fc391547Sad void
tcp_run(char * args)239fc391547Sad tcp_run(char *args)
240fc391547Sad {
241fc391547Sad
242fc391547Sad if (update != UPDATE_RUN) {
243f5c68c0bSthorpej memcpy(oldstat, newstat, sizeof(oldstat));
244fc391547Sad update = UPDATE_RUN;
245fc391547Sad }
246fc391547Sad }
247fc391547Sad
248fc391547Sad void
tcp_time(char * args)249fc391547Sad tcp_time(char *args)
250fc391547Sad {
251fc391547Sad
252fc391547Sad if (update != UPDATE_TIME) {
253f5c68c0bSthorpej memcpy(oldstat, newstat, sizeof(oldstat));
254fc391547Sad update = UPDATE_TIME;
255fc391547Sad }
256fc391547Sad }
257fc391547Sad
258fc391547Sad void
tcp_zero(char * args)259fc391547Sad tcp_zero(char *args)
260fc391547Sad {
261fc391547Sad
262fc391547Sad if (update == UPDATE_RUN)
263f5c68c0bSthorpej memcpy(oldstat, newstat, sizeof(oldstat));
26400116cf5Sad }
265