Line data Source code
1 : /* $OpenBSD: tcp_debug.c,v 1.28 2018/06/11 21:23:34 bluhm Exp $ */
2 : /* $NetBSD: tcp_debug.c,v 1.10 1996/02/13 23:43:36 christos Exp $ */
3 :
4 : /*
5 : * Copyright (c) 1982, 1986, 1993
6 : * The Regents of the University of California. All rights reserved.
7 : *
8 : * Redistribution and use in source and binary forms, with or without
9 : * modification, are permitted provided that the following conditions
10 : * are met:
11 : * 1. Redistributions of source code must retain the above copyright
12 : * notice, this list of conditions and the following disclaimer.
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : * 3. Neither the name of the University nor the names of its contributors
17 : * may be used to endorse or promote products derived from this software
18 : * without specific prior written permission.
19 : *
20 : * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 : * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 : * SUCH DAMAGE.
31 : *
32 : * @(#)COPYRIGHT 1.1 (NRL) 17 January 1995
33 : *
34 : * NRL grants permission for redistribution and use in source and binary
35 : * forms, with or without modification, of the software and documentation
36 : * created at NRL provided that the following conditions are met:
37 : *
38 : * 1. Redistributions of source code must retain the above copyright
39 : * notice, this list of conditions and the following disclaimer.
40 : * 2. Redistributions in binary form must reproduce the above copyright
41 : * notice, this list of conditions and the following disclaimer in the
42 : * documentation and/or other materials provided with the distribution.
43 : * 3. All advertising materials mentioning features or use of this software
44 : * must display the following acknowledgements:
45 : * This product includes software developed by the University of
46 : * California, Berkeley and its contributors.
47 : * This product includes software developed at the Information
48 : * Technology Division, US Naval Research Laboratory.
49 : * 4. Neither the name of the NRL nor the names of its contributors
50 : * may be used to endorse or promote products derived from this software
51 : * without specific prior written permission.
52 : *
53 : * THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS
54 : * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
55 : * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
56 : * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NRL OR
57 : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
58 : * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
59 : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
60 : * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
61 : * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
62 : * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
63 : * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64 : *
65 : * The views and conclusions contained in the software and documentation
66 : * are those of the authors and should not be interpreted as representing
67 : * official policies, either expressed or implied, of the US Naval
68 : * Research Laboratory (NRL).
69 : */
70 :
71 : #ifdef TCPDEBUG
72 : /* load symbolic names */
73 : #define PRUREQUESTS
74 : #define TCPSTATES
75 : #define TCPTIMERS
76 : #define TANAMES
77 : #endif
78 :
79 : #include <sys/param.h>
80 : #include <sys/systm.h>
81 : #include <sys/mbuf.h>
82 : #include <sys/socket.h>
83 : #include <sys/protosw.h>
84 :
85 : #include <net/route.h>
86 :
87 : #include <netinet/in.h>
88 : #include <netinet/in_systm.h>
89 : #include <netinet/ip.h>
90 : #include <netinet/in_pcb.h>
91 : #include <netinet/ip_var.h>
92 : #include <netinet/tcp.h>
93 : #include <netinet/tcp_timer.h>
94 : #include <netinet/tcp_var.h>
95 : #include <netinet/tcp_debug.h>
96 : #include <netinet/tcp_fsm.h>
97 :
98 : #ifdef INET6
99 : #include <netinet/ip6.h>
100 : #endif /* INET6 */
101 :
102 : #ifdef TCPDEBUG
103 : int tcpconsdebug = 0;
104 : #endif
105 :
106 : struct tcp_debug tcp_debug[TCP_NDEBUG];
107 : int tcp_debx;
108 :
109 : /*
110 : * Tcp debug routines
111 : */
112 : void
113 0 : tcp_trace(short act, short ostate, struct tcpcb *tp, struct tcpcb *otp,
114 : caddr_t headers, int req, int len)
115 : {
116 : #ifdef TCPDEBUG
117 : tcp_seq seq, ack;
118 : int flags;
119 : #endif
120 : int pf = PF_UNSPEC;
121 0 : struct tcp_debug *td = &tcp_debug[tcp_debx++];
122 0 : struct tcpiphdr *ti = (struct tcpiphdr *)headers;
123 0 : struct tcpipv6hdr *ti6 = (struct tcpipv6hdr *)headers;
124 : struct tcphdr *th;
125 :
126 0 : if (tcp_debx == TCP_NDEBUG)
127 0 : tcp_debx = 0;
128 0 : td->td_time = iptime();
129 0 : td->td_act = act;
130 0 : td->td_ostate = ostate;
131 0 : td->td_tcb = (caddr_t)otp;
132 0 : if (tp) {
133 0 : pf = tp->pf;
134 0 : td->td_cb = *tp;
135 0 : } else
136 0 : bzero((caddr_t)&td->td_cb, sizeof (*tp));
137 :
138 0 : bzero(&td->td_ti6, sizeof(struct tcpipv6hdr));
139 0 : bzero(&td->td_ti, sizeof(struct tcpiphdr));
140 0 : if (headers) {
141 : /* The address family may be in tcpcb or ip header. */
142 0 : if (pf == PF_UNSPEC) {
143 0 : switch (ti6->ti6_i.ip6_vfc & IPV6_VERSION_MASK) {
144 : #ifdef INET6
145 : case IPV6_VERSION:
146 : pf = PF_INET6;
147 0 : break;
148 : #endif /* INET6 */
149 : case IPVERSION:
150 : pf = PF_INET;
151 : break;
152 : }
153 : }
154 0 : switch (pf) {
155 : #ifdef INET6
156 : case PF_INET6:
157 : th = &ti6->ti6_t;
158 0 : td->td_ti6 = *ti6;
159 0 : td->td_ti6.ti6_plen = len;
160 0 : break;
161 : #endif /* INET6 */
162 : case PF_INET:
163 : th = &ti->ti_t;
164 0 : td->td_ti = *ti;
165 0 : td->td_ti.ti_len = len;
166 0 : break;
167 : default:
168 : headers = NULL;
169 0 : break;
170 : }
171 : }
172 :
173 0 : td->td_req = req;
174 : #ifdef TCPDEBUG
175 : if (tcpconsdebug == 0)
176 : return;
177 : if (otp)
178 : printf("%p %s:", otp, tcpstates[ostate]);
179 : else
180 : printf("???????? ");
181 : printf("%s ", tanames[act]);
182 : switch (act) {
183 :
184 : case TA_INPUT:
185 : case TA_OUTPUT:
186 : case TA_DROP:
187 : if (headers == NULL)
188 : break;
189 : seq = th->th_seq;
190 : ack = th->th_ack;
191 : if (act == TA_OUTPUT) {
192 : seq = ntohl(seq);
193 : ack = ntohl(ack);
194 : }
195 : if (len)
196 : printf("[%x..%x)", seq, seq+len);
197 : else
198 : printf("%x", seq);
199 : printf("@%x, urp=%x", ack, th->th_urp);
200 : flags = th->th_flags;
201 : if (flags) {
202 : char *cp = "<";
203 : #define pf(f) { if (th->th_flags&TH_##f) { printf("%s%s", cp, "f"); cp = ","; } }
204 : pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG);
205 : printf(">");
206 : }
207 : break;
208 :
209 : case TA_USER:
210 : printf("%s", prurequests[req]);
211 : break;
212 :
213 : case TA_TIMER:
214 : printf("%s", tcptimers[req]);
215 : break;
216 : }
217 : if (tp)
218 : printf(" -> %s", tcpstates[tp->t_state]);
219 : /* print out internal state of tp !?! */
220 : printf("\n");
221 : if (tp == NULL)
222 : return;
223 : printf("\trcv_(nxt,wnd,up) (%x,%lx,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
224 : tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt,
225 : tp->snd_max);
226 : printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%lx)\n",
227 : tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
228 : #endif /* TCPDEBUG */
229 0 : }
|