tcp_debug.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:7k
开发平台:

MultiPlatform

  1. /* tcp_debug.c - TCP debug routines */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  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. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  * This product includes software developed by the University of
  19.  * California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93
  37.  */
  38. /*
  39. modification history
  40. --------------------
  41. 01d,20may02,vvv  moved tcpstates definition and pTcpstates initialization to
  42.                  tcpLib.c (SPR #62272)
  43. 01c,12oct01,rae  merge from truestack (VIRTUAL_STACK, printf formats)
  44. 01b,14nov00,ham  fixed messed tcpstates declaration(SPR 62272).
  45. 01a,03mar96,vin  created from BSD4.4 stuff,integrated with 02l of tcp_debug.c
  46. */
  47. /*
  48. DESCRIPTION
  49. */
  50. /* includes */
  51. #define TCPDEBUG
  52. #ifdef TCPDEBUG
  53. /* load symbolic names */
  54. #define PRUREQUESTS
  55. #define TCPSTATES
  56. #define TCPTIMERS
  57. #define TANAMES
  58. #endif
  59. #include "vxWorks.h"
  60. #include "stdioLib.h"
  61. #include "net/systm.h"
  62. #include "net/unixLib.h"
  63. #include "net/mbuf.h"
  64. #include "sys/socket.h"
  65. #include "net/socketvar.h"
  66. #include "net/protosw.h"
  67. #include "errno.h"
  68. #include "net/route.h"
  69. #include "net/if.h"
  70. #include "netinet/in.h"
  71. #include "netinet/in_pcb.h"
  72. #include "netinet/in_systm.h"
  73. #include "netinet/ip.h"
  74. #include "netinet/ip_var.h"
  75. #include "netinet/tcp.h"
  76. #include "netinet/tcp_fsm.h"
  77. #include "netinet/tcp_seq.h"
  78. #include "netinet/tcp_timer.h"
  79. #include "netinet/tcp_var.h"
  80. #include "netinet/tcpip.h"
  81. #include "netinet/tcp_debug.h"
  82. /* globals */
  83. #ifdef VIRTUAL_STACK
  84. #include "netinet/vsLib.h"
  85. #else
  86. int tcpDebugCons = 0;
  87. BOOL tcpDebugConsVerbose = TRUE;
  88. #endif
  89. /* locals */
  90. #ifndef VIRTUAL_STACK
  91. LOCAL struct tcp_debug tcp_debug[TCP_NDEBUG];
  92. LOCAL int tcp_debx;
  93. LOCAL int tcp_debug_valid = 0;
  94. #endif
  95. /* forward declarations */
  96. LOCAL void tcp_trace (short act, short ostate, struct tcpcb *tp,
  97.     struct tcpiphdr *ti, int req);
  98. LOCAL void tcpDebugPrint (struct tcp_debug *td, BOOL verbose);
  99. LOCAL void tcp_report (int num, BOOL verbose);
  100. void tcpTraceInit (void)
  101.     {
  102.     tcpTraceRtn = (VOIDFUNCPTR) tcp_trace;
  103.     tcpReportRtn = (VOIDFUNCPTR) tcp_report;
  104. #ifdef VIRTUAL_STACK
  105.     /*
  106.      * Assign (former) global variables previously initialized by the compiler.
  107.      * Setting 0 is repeated for clarity - the vsLib.c setup zeroes all values.
  108.      */
  109.     tcpDebugCons = 0;
  110.     tcpDebugConsVerbose = TRUE;
  111.     tcp_debug_valid = 0;
  112. #endif
  113.     }
  114. LOCAL void tcp_trace
  115.     (
  116.     short act,
  117.     short ostate,
  118.     struct tcpcb *tp,
  119.     struct tcpiphdr *ti,
  120.     int req
  121.     )
  122.     {
  123. #ifdef VIRTUAL_STACK
  124.     /* Virtual stack requires different variable name from structure tag. */
  125.     struct tcp_debug *td = &tcp_tracelog[tcp_debx++];
  126. #else
  127.     struct tcp_debug *td = &tcp_debug[tcp_debx++];
  128. #endif
  129.     if (tcp_debug_valid < TCP_NDEBUG)
  130.         tcp_debug_valid++;
  131.     if (tcp_debx == TCP_NDEBUG)
  132. tcp_debx = 0;
  133.     td->td_time = iptime();
  134.     td->td_act = act;
  135.     td->td_ostate = ostate;
  136.     td->td_req = req;
  137.     if (tp)
  138. {
  139. td->td_cb = *tp;
  140. td->td_tcb = (caddr_t) tp;
  141. }
  142.     else
  143. td->td_tcb = NULL;
  144.     if (ti)
  145. {
  146. td->td_ti = *ti;
  147. td->td_tiphdr = (caddr_t) ti;
  148. }
  149.     else
  150. td->td_tiphdr = NULL;
  151.     if (tcpDebugCons)
  152.         tcpDebugPrint (td, tcpDebugConsVerbose);
  153.     }
  154. LOCAL void tcpDebugPrint
  155.     (
  156.     struct tcp_debug *td,
  157.     BOOL verbose
  158.     )
  159.     {
  160.     struct tcpcb *tp;
  161.     struct tcpiphdr *ti;
  162.     tcp_seq seq, ack;
  163.     int len;
  164.     printf ("%lu  %s  %s", td->td_time, tanames [td->td_act],
  165. pTcpstates [td->td_ostate]);
  166.     if (!verbose)
  167.         printf ("n");
  168.     else
  169. {
  170.         if (td->td_tcb != NULL)
  171.     printf(" -> %s , &tcpcb=%xn", pTcpstates[td->td_cb.t_state],
  172. (UINT32) td->td_tcb);
  173. switch (td->td_act)
  174.     {
  175.     case TA_INPUT:
  176.     case TA_OUTPUT:
  177.     case TA_DROP:
  178. if (td->td_tiphdr == NULL)
  179.     break;
  180.                 ti = &td->td_ti;
  181. if (td->td_act == TA_OUTPUT)
  182.     {
  183.     seq = ntohl(ti->ti_seq);
  184.     ack = ntohl(ti->ti_ack);
  185.     len = ntohs(ti->ti_len);
  186.     }
  187.                 else
  188.     {
  189.     seq = ti->ti_seq;
  190.     ack = ti->ti_ack;
  191.     len = ti->ti_len;
  192.     }
  193. if (td->td_act == TA_OUTPUT)
  194.     len -= sizeof (struct tcphdr);
  195. if (len)
  196. printf("tseq=[%lx..%lx]", seq, seq+len);
  197. else
  198. printf("tseq=%lx", seq);
  199. printf(" ack=%lx, urp=%x, ", ack, ti->ti_urp);
  200. if (ti->ti_flags)
  201.     {
  202.     printf ("flags=<");
  203.     if (ti->ti_flags & TH_FIN)
  204. printf (" FIN");
  205.     if (ti->ti_flags & TH_SYN)
  206. printf (" SYN");
  207.     if (ti->ti_flags & TH_RST)
  208. printf (" RST");
  209.     if (ti->ti_flags & TH_PUSH)
  210. printf (" PUSH");
  211.     if (ti->ti_flags & TH_ACK)
  212. printf (" ACK");
  213.     if (ti->ti_flags & TH_URG)
  214. printf (" URG");
  215.     printf (" >n");
  216.     }
  217. break;
  218.     case TA_USER:
  219. printf("%s", prurequests[td->td_req&0xff]);
  220. if ((td->td_req & 0xff) == PRU_SLOWTIMO)
  221. printf("<%s>n", tcptimers[td->td_req>>8]);
  222.                 break;
  223.     }
  224. if (td->td_tcb == NULL)
  225.     {
  226.     printf ("nn");
  227.     return;
  228.     }
  229.         tp = &td->td_cb;
  230. printf("trcv_(nxt,wnd,up)  = (%lx,%lx,%lx)n",
  231.     tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up);
  232. printf("tsnd_(una,nxt,max) = (%lx,%lx,%lx)n",
  233.     tp->snd_una, tp->snd_nxt, tp->snd_max);
  234. printf("tsnd_(wl1,wl2,wnd) = (%lx,%lx,%lx)nn",
  235.     tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
  236.         }
  237.     }
  238. LOCAL void tcp_report 
  239.     (
  240.     int num, /* number of entries to print */
  241.     BOOL verbose
  242.     )
  243.     {
  244.     int s = splnet(); /* accessing structures that change async */
  245.     num = max (num, 0);
  246.     num = tcp_debx - min (num, tcp_debug_valid);
  247.     if (num < 0) /* adjust for warap-around */
  248. num += (TCP_NDEBUG + 1);
  249.     for (; num != tcp_debx; num++)
  250. {
  251. if (num >= TCP_NDEBUG) /* start over at beginning of array */
  252.     num = 0;
  253. #ifdef VIRTUAL_STACK
  254.     /* Virtual stack requires different variable name from structure tag. */
  255.         tcpDebugPrint (&tcp_tracelog [num], verbose);
  256. #else
  257.         tcpDebugPrint (&tcp_debug [num], verbose);
  258. #endif
  259.         }
  260.     splx (s);
  261.     }