1 1.32 maxv /* $NetBSD: tcp_debug.c,v 1.32 2018/05/03 07:13:48 maxv Exp $ */ 2 1.14 itojun 3 1.14 itojun /* 4 1.14 itojun * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 1.14 itojun * All rights reserved. 6 1.18 itojun * 7 1.14 itojun * Redistribution and use in source and binary forms, with or without 8 1.14 itojun * modification, are permitted provided that the following conditions 9 1.14 itojun * are met: 10 1.14 itojun * 1. Redistributions of source code must retain the above copyright 11 1.14 itojun * notice, this list of conditions and the following disclaimer. 12 1.14 itojun * 2. Redistributions in binary form must reproduce the above copyright 13 1.14 itojun * notice, this list of conditions and the following disclaimer in the 14 1.14 itojun * documentation and/or other materials provided with the distribution. 15 1.14 itojun * 3. Neither the name of the project nor the names of its contributors 16 1.14 itojun * may be used to endorse or promote products derived from this software 17 1.14 itojun * without specific prior written permission. 18 1.18 itojun * 19 1.14 itojun * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 20 1.14 itojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.14 itojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.14 itojun * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 23 1.14 itojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.14 itojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.14 itojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.14 itojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.14 itojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.14 itojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.14 itojun * SUCH DAMAGE. 30 1.14 itojun */ 31 1.8 cgd 32 1.1 cgd /* 33 1.7 mycroft * Copyright (c) 1982, 1986, 1993 34 1.7 mycroft * The Regents of the University of California. All rights reserved. 35 1.1 cgd * 36 1.1 cgd * Redistribution and use in source and binary forms, with or without 37 1.1 cgd * modification, are permitted provided that the following conditions 38 1.1 cgd * are met: 39 1.1 cgd * 1. Redistributions of source code must retain the above copyright 40 1.1 cgd * notice, this list of conditions and the following disclaimer. 41 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 42 1.1 cgd * notice, this list of conditions and the following disclaimer in the 43 1.1 cgd * documentation and/or other materials provided with the distribution. 44 1.19 agc * 3. Neither the name of the University nor the names of its contributors 45 1.1 cgd * may be used to endorse or promote products derived from this software 46 1.1 cgd * without specific prior written permission. 47 1.1 cgd * 48 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 1.1 cgd * SUCH DAMAGE. 59 1.1 cgd * 60 1.8 cgd * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93 61 1.1 cgd */ 62 1.17 lukem 63 1.17 lukem #include <sys/cdefs.h> 64 1.32 maxv __KERNEL_RCSID(0, "$NetBSD: tcp_debug.c,v 1.32 2018/05/03 07:13:48 maxv Exp $"); 65 1.1 cgd 66 1.29 pooka #ifdef _KERNEL_OPT 67 1.14 itojun #include "opt_inet.h" 68 1.16 abs #include "opt_tcp_debug.h" 69 1.29 pooka #endif 70 1.14 itojun 71 1.1 cgd /* load symbolic names */ 72 1.5 mycroft #define PRUREQUESTS 73 1.5 mycroft #define TCPSTATES 74 1.1 cgd #define TCPTIMERS 75 1.1 cgd #define TANAMES 76 1.1 cgd 77 1.4 mycroft #include <sys/param.h> 78 1.4 mycroft #include <sys/systm.h> 79 1.4 mycroft #include <sys/mbuf.h> 80 1.4 mycroft #include <sys/socket.h> 81 1.4 mycroft #include <sys/socketvar.h> 82 1.4 mycroft #include <sys/protosw.h> 83 1.4 mycroft #include <sys/errno.h> 84 1.1 cgd 85 1.4 mycroft #include <net/if.h> 86 1.1 cgd 87 1.4 mycroft #include <netinet/in.h> 88 1.4 mycroft #include <netinet/in_systm.h> 89 1.4 mycroft #include <netinet/ip.h> 90 1.4 mycroft #include <netinet/in_pcb.h> 91 1.4 mycroft #include <netinet/ip_var.h> 92 1.14 itojun 93 1.14 itojun #ifdef INET6 94 1.14 itojun #include <netinet/ip6.h> 95 1.14 itojun #endif 96 1.14 itojun 97 1.4 mycroft #include <netinet/tcp.h> 98 1.4 mycroft #include <netinet/tcp_fsm.h> 99 1.4 mycroft #include <netinet/tcp_seq.h> 100 1.4 mycroft #include <netinet/tcp_timer.h> 101 1.4 mycroft #include <netinet/tcp_var.h> 102 1.4 mycroft #include <netinet/tcp_debug.h> 103 1.1 cgd 104 1.16 abs struct tcp_debug tcp_debug[TCP_NDEBUG]; 105 1.16 abs int tcp_debx; 106 1.1 cgd int tcpconsdebug = 0; 107 1.1 cgd /* 108 1.1 cgd * Tcp debug routines 109 1.1 cgd */ 110 1.6 mycroft void 111 1.21 perry tcp_trace(short act, short ostate, struct tcpcb *tp, struct mbuf *m, int req) 112 1.1 cgd { 113 1.1 cgd tcp_seq seq, ack; 114 1.1 cgd int len, flags; 115 1.14 itojun struct tcphdr *th; 116 1.1 cgd struct tcp_debug *td = &tcp_debug[tcp_debx++]; 117 1.1 cgd 118 1.1 cgd if (tcp_debx == TCP_NDEBUG) 119 1.1 cgd tcp_debx = 0; 120 1.1 cgd td->td_time = iptime(); 121 1.1 cgd td->td_act = act; 122 1.1 cgd td->td_ostate = ostate; 123 1.25 christos td->td_tcb = (void *)tp; 124 1.1 cgd if (tp) 125 1.1 cgd td->td_cb = *tp; 126 1.1 cgd else 127 1.26 cegger memset((void *)&td->td_cb, 0, sizeof (*tp)); 128 1.14 itojun td->td_family = tp->t_family; 129 1.26 cegger memset((void *)&td->td_ti, 0, sizeof (td->td_ti)); 130 1.14 itojun #ifdef INET6 131 1.26 cegger memset((void *)&td->td_ti6, 0, sizeof (td->td_ti6)); 132 1.14 itojun #endif 133 1.14 itojun th = NULL; 134 1.14 itojun if (m) { 135 1.14 itojun struct ip *ip; 136 1.14 itojun ip = mtod(m, struct ip *); 137 1.14 itojun switch (ip->ip_v) { 138 1.14 itojun case 4: 139 1.14 itojun if (m->m_len < sizeof(td->td_ti)) 140 1.14 itojun break; 141 1.28 tsutsui memcpy(&td->td_ti, mtod(m, void *), sizeof(td->td_ti)); 142 1.25 christos th = (struct tcphdr *)((char *)&td->td_ti + 143 1.23 rpaulo sizeof(struct ip)); 144 1.14 itojun break; 145 1.14 itojun #ifdef INET6 146 1.14 itojun case 6: 147 1.14 itojun if (m->m_len < sizeof(td->td_ti6)) 148 1.14 itojun break; 149 1.28 tsutsui memcpy(&td->td_ti6, mtod(m, void *), 150 1.14 itojun sizeof(td->td_ti6)); 151 1.25 christos th = (struct tcphdr *)((char *)&td->td_ti6 + 152 1.23 rpaulo sizeof(struct ip6_hdr)); 153 1.14 itojun break; 154 1.14 itojun #endif 155 1.14 itojun } 156 1.14 itojun } 157 1.1 cgd td->td_req = req; 158 1.1 cgd if (tcpconsdebug == 0) 159 1.1 cgd return; 160 1.1 cgd if (tp) 161 1.15 abs printf("%p %s:", tp, tcpstates[ostate]); 162 1.1 cgd else 163 1.12 christos printf("???????? "); 164 1.12 christos printf("%s ", tanames[act]); 165 1.1 cgd switch (act) { 166 1.1 cgd 167 1.1 cgd case TA_INPUT: 168 1.1 cgd case TA_OUTPUT: 169 1.1 cgd case TA_DROP: 170 1.14 itojun if (th == 0) 171 1.1 cgd break; 172 1.14 itojun seq = th->th_seq; 173 1.14 itojun ack = th->th_ack; 174 1.15 abs len = m->m_pkthdr.len; 175 1.1 cgd if (act == TA_OUTPUT) { 176 1.1 cgd seq = ntohl(seq); 177 1.1 cgd ack = ntohl(ack); 178 1.9 cgd len = ntohs((u_int16_t)len); 179 1.1 cgd } 180 1.1 cgd if (act == TA_OUTPUT) 181 1.1 cgd len -= sizeof (struct tcphdr); 182 1.1 cgd if (len) 183 1.12 christos printf("[%x..%x)", seq, seq+len); 184 1.1 cgd else 185 1.12 christos printf("%x", seq); 186 1.14 itojun printf("@%x, urp=%x", ack, th->th_urp); 187 1.14 itojun flags = th->th_flags; 188 1.1 cgd if (flags) { 189 1.1 cgd #ifndef lint 190 1.22 riz const char *cp = "<"; 191 1.23 rpaulo #define pf(f) { if (th->th_flags&__CONCAT(TH_,f)) { \ 192 1.23 rpaulo printf("%s%s", cp, "f"); cp = ","; } } 193 1.1 cgd pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG); 194 1.1 cgd #endif 195 1.13 christos printf(">"); 196 1.1 cgd } 197 1.1 cgd break; 198 1.1 cgd 199 1.1 cgd case TA_USER: 200 1.12 christos printf("%s", prurequests[req&0xff]); 201 1.1 cgd if ((req & 0xff) == PRU_SLOWTIMO) 202 1.12 christos printf("<%s>", tcptimers[req>>8]); 203 1.1 cgd break; 204 1.1 cgd } 205 1.1 cgd if (tp) 206 1.12 christos printf(" -> %s", tcpstates[tp->t_state]); 207 1.1 cgd /* print out internal state of tp !?! */ 208 1.12 christos printf("\n"); 209 1.1 cgd if (tp == 0) 210 1.1 cgd return; 211 1.15 abs printf("\trcv_(nxt,wnd,up) (%x,%lx,%x) snd_(una,nxt,max) (%x,%x,%x)\n", 212 1.1 cgd tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt, 213 1.1 cgd tp->snd_max); 214 1.15 abs printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%lx)\n", 215 1.1 cgd tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); 216 1.1 cgd } 217