[BACK]Return to tcp_debug.c CVS log [TXT][DIR] Up to [local] / sys / netinet

Annotation of sys/netinet/tcp_debug.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: tcp_debug.c,v 1.20 2004/09/24 15:02:43 markus 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: #include <net/if.h>
                     87:
                     88: #include <netinet/in.h>
                     89: #include <netinet/in_systm.h>
                     90: #include <netinet/ip.h>
                     91: #include <netinet/in_pcb.h>
                     92: #include <netinet/ip_var.h>
                     93: #include <netinet/tcp.h>
                     94: #include <netinet/tcp_timer.h>
                     95: #include <netinet/tcp_var.h>
                     96: #include <netinet/tcpip.h>
                     97: #include <netinet/tcp_debug.h>
                     98: #include <netinet/tcp_fsm.h>
                     99:
                    100: #ifdef INET6
                    101: #ifndef INET
                    102: #include <netinet/in.h>
                    103: #endif
                    104: #include <netinet/ip6.h>
                    105: #endif /* INET6 */
                    106:
                    107: #ifdef TCPDEBUG
                    108: int    tcpconsdebug = 0;
                    109: #endif
                    110:
                    111: struct tcp_debug tcp_debug[TCP_NDEBUG];
                    112: int    tcp_debx;
                    113:
                    114: /*
                    115:  * Tcp debug routines
                    116:  */
                    117: void
                    118: tcp_trace(short act, short ostate, struct tcpcb *tp, caddr_t headers,
                    119:    int req, int len)
                    120: {
                    121: #ifdef TCPDEBUG
                    122:        tcp_seq seq, ack;
                    123:        int flags;
                    124: #endif
                    125:        struct tcp_debug *td = &tcp_debug[tcp_debx++];
                    126:        struct tcpiphdr *ti = (struct tcpiphdr *)headers;
                    127:        struct tcphdr *th;
                    128: #ifdef INET6
                    129:        struct tcpipv6hdr *ti6 = (struct tcpipv6hdr *)ti;
                    130: #endif
                    131:
                    132:        if (tcp_debx == TCP_NDEBUG)
                    133:                tcp_debx = 0;
                    134:        td->td_time = iptime();
                    135:        td->td_act = act;
                    136:        td->td_ostate = ostate;
                    137:        td->td_tcb = (caddr_t)tp;
                    138:        if (tp)
                    139:                td->td_cb = *tp;
                    140:        else
                    141:                bzero((caddr_t)&td->td_cb, sizeof (*tp));
                    142:        switch (tp->pf) {
                    143: #ifdef INET6
                    144:        case PF_INET6:
                    145:                if (ti6) {
                    146:                        th = &ti6->ti6_t;
                    147:                        td->td_ti6 = *ti6;
                    148:                        td->td_ti6.ti6_plen = len;
                    149:                } else
                    150:                        bzero(&td->td_ti6, sizeof(struct tcpipv6hdr));
                    151:                break;
                    152: #endif /* INET6 */
                    153:        case PF_INET:
                    154:                if (ti) {
                    155:                        th = &ti->ti_t;
                    156:                        td->td_ti = *ti;
                    157:                        td->td_ti.ti_len = len;
                    158:                } else
                    159:                        bzero(&td->td_ti, sizeof(struct tcpiphdr));
                    160:                break;
                    161:        default:
                    162:                return;
                    163:        }
                    164:
                    165:        td->td_req = req;
                    166: #ifdef TCPDEBUG
                    167:        if (tcpconsdebug == 0)
                    168:                return;
                    169:        if (tp)
                    170:                printf("%x %s:", tp, tcpstates[ostate]);
                    171:        else
                    172:                printf("???????? ");
                    173:        printf("%s ", tanames[act]);
                    174:        switch (act) {
                    175:
                    176:        case TA_INPUT:
                    177:        case TA_OUTPUT:
                    178:        case TA_DROP:
                    179:                if (ti == 0)
                    180:                        break;
                    181:                seq = th->th_seq;
                    182:                ack = th->th_ack;
                    183:                if (act == TA_OUTPUT) {
                    184:                        seq = ntohl(seq);
                    185:                        ack = ntohl(ack);
                    186:                }
                    187:                if (len)
                    188:                        printf("[%x..%x)", seq, seq+len);
                    189:                else
                    190:                        printf("%x", seq);
                    191:                printf("@%x, urp=%x", ack, th->th_urp);
                    192:                flags = th->th_flags;
                    193:                if (flags) {
                    194: #ifndef lint
                    195:                        char *cp = "<";
                    196: #define pf(f) { if (th->th_flags&TH_##f) { printf("%s%s", cp, "f"); cp = ","; } }
                    197:                        pf(SYN); pf(ACK); pf(FIN); pf(RST); pf(PUSH); pf(URG);
                    198: #endif
                    199:                        printf(">");
                    200:                }
                    201:                break;
                    202:
                    203:        case TA_USER:
                    204:                printf("%s", prurequests[req&0xff]);
                    205:                if ((req & 0xff) == PRU_SLOWTIMO)
                    206:                        printf("<%s>", tcptimers[req>>8]);
                    207:                break;
                    208:        }
                    209:        if (tp)
                    210:                printf(" -> %s", tcpstates[tp->t_state]);
                    211:        /* print out internal state of tp !?! */
                    212:        printf("\n");
                    213:        if (tp == 0)
                    214:                return;
                    215:        printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
                    216:            tp->rcv_nxt, tp->rcv_wnd, tp->rcv_up, tp->snd_una, tp->snd_nxt,
                    217:            tp->snd_max);
                    218:        printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
                    219:            tp->snd_wl1, tp->snd_wl2, tp->snd_wnd);
                    220: #endif /* TCPDEBUG */
                    221: }

CVSweb