LCOV - code coverage report
Current view: top level - netinet - tcp_debug.c (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 31 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.13