tcp_debug.c
上传用户:tjbfgc
上传日期:2013-03-31
资源大小:140k
文件大小:5k
源码类别:

网络编程

开发平台:

C/C++

  1. /*
  2.  * Copyright (c) 1982, 1986, 1993
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the University of
  16.  * California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93
  34.  */
  35. #ifdef TCPDEBUG
  36. /* load symbolic names */
  37. #define PRUREQUESTS
  38. #define TCPSTATES
  39. #define TCPTIMERS
  40. #define TANAMES
  41. #endif
  42. #include <sys/param.h>
  43. #include <sys/systm.h>
  44. #include <sys/mbuf.h>
  45. #include <sys/socket.h>
  46. #include <sys/socketvar.h>
  47. #include <sys/protosw.h>
  48. #include <sys/errno.h>
  49. #include <net/route.h>
  50. #include <net/if.h>
  51. #include <netinet/in.h>
  52. #include <netinet/in_systm.h>
  53. #include <netinet/ip.h>
  54. #include <netinet/in_pcb.h>
  55. #include <netinet/ip_var.h>
  56. #include <netinet/tcp.h>
  57. #include <netinet/tcp_fsm.h>
  58. #include <netinet/tcp_seq.h>
  59. #include <netinet/tcp_timer.h>
  60. #include <netinet/tcp_var.h>
  61. #include <netinet/tcpip.h>
  62. #include <netinet/tcp_debug.h>
  63. #ifdef TCPDEBUG
  64. int tcpconsdebug = 0;
  65. #endif
  66. /*
  67.  * Tcp debug routines
  68.  */
  69. void
  70. tcp_trace(act, ostate, tp, ti, req)
  71. short act, ostate;
  72. struct tcpcb *tp;
  73. struct tcpiphdr *ti;
  74. int req;
  75. {
  76. tcp_seq seq, ack;
  77. int len, flags;
  78. struct tcp_debug *td = &tcp_debug[tcp_debx++];
  79. if (tcp_debx == TCP_NDEBUG)
  80. tcp_debx = 0;
  81. td->td_time = iptime();
  82. td->td_act = act;
  83. td->td_ostate = ostate;
  84. td->td_tcb = (caddr_t)tp;
  85. if (tp)
  86. td->td_cb = *tp;
  87. else
  88. bzero((caddr_t)&td->td_cb, sizeof (*tp));
  89. if (ti)
  90. td->td_ti = *ti;
  91. else
  92. bzero((caddr_t)&td->td_ti, sizeof (*ti));
  93. td->td_req = req;
  94. #ifdef TCPDEBUG
  95. if (tcpconsdebug == 0)
  96. return;
  97. if (tp)
  98. printf("%x %s:", tp, tcpstates[ostate]);
  99. else
  100. printf("???????? ");
  101. printf("%s ", tanames[act]);
  102. switch (act) {
  103. case TA_INPUT:
  104. case TA_OUTPUT:
  105. case TA_DROP:
  106. if (ti == 0)
  107. break;
  108. seq = ti->ti_seq;
  109. ack = ti->ti_ack;
  110. len = ti->ti_len;
  111. if (act == TA_OUTPUT) {
  112. seq = ntohl(seq);
  113. ack = ntohl(ack);
  114. len = ntohs((u_short)len);
  115. }
  116. if (act == TA_OUTPUT)
  117. len -= sizeof (struct tcphdr);
  118. if (len)
  119. printf("[%x..%x)", seq, seq+len);
  120. else
  121. printf("%x", seq);
  122. printf("@%x, urp=%x", ack, ti->ti_urp);
  123. flags = ti->ti_flags;
  124. if (flags) {
  125. #ifndef lint
  126. char *cp = "<";
  127. #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } }
  128. pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG);
  129. #endif
  130. printf(">");
  131. }
  132. break;
  133. case TA_USER:
  134. printf("%s", prurequests[req&0xff]);
  135. if ((req & 0xff) == PRU_SLOWTIMO)
  136. printf("<%s>", tcptimers[req>>8]);
  137. break;
  138. }
  139. if (tp)
  140. printf(" -> %s", tcpstates[tp->t_state]);
  141. /* print out internal state of tp !?! */
  142. printf("n");
  143. if (tp == 0)
  144. return;
  145. printf("trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)n",
  146.     tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt,
  147.     tp->snd_max);
  148. printf("tsnd_(wl1,wl2,wnd) (%x,%x,%x)n",
  149.     tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
  150. #endif /* TCPDEBUG */
  151. }