| 1 | /* tcp_debug.c 4.9 83/02/10 */ |
| 2 | |
| 3 | #include "../h/param.h" |
| 4 | #include "../h/systm.h" |
| 5 | #include "../h/mbuf.h" |
| 6 | #include "../h/socket.h" |
| 7 | #include "../h/socketvar.h" |
| 8 | #define PRUREQUESTS |
| 9 | #include "../h/protosw.h" |
| 10 | #include "../h/errno.h" |
| 11 | |
| 12 | #include "../net/route.h" |
| 13 | #include "../net/if.h" |
| 14 | |
| 15 | #include "../netinet/in.h" |
| 16 | #include "../netinet/in_pcb.h" |
| 17 | #include "../netinet/in_systm.h" |
| 18 | #include "../netinet/ip.h" |
| 19 | #include "../netinet/ip_var.h" |
| 20 | #include "../netinet/tcp.h" |
| 21 | #define TCPSTATES |
| 22 | #include "../netinet/tcp_fsm.h" |
| 23 | #include "../netinet/tcp_seq.h" |
| 24 | #define TCPTIMERS |
| 25 | #include "../netinet/tcp_timer.h" |
| 26 | #include "../netinet/tcp_var.h" |
| 27 | #include "../netinet/tcpip.h" |
| 28 | #define TANAMES |
| 29 | #include "../netinet/tcp_debug.h" |
| 30 | |
| 31 | int tcpconsdebug = 0; |
| 32 | /* |
| 33 | * Tcp debug routines |
| 34 | */ |
| 35 | tcp_trace(act, ostate, tp, ti, req) |
| 36 | short act, ostate; |
| 37 | struct tcpcb *tp; |
| 38 | struct tcpiphdr *ti; |
| 39 | int req; |
| 40 | { |
| 41 | tcp_seq seq, ack; |
| 42 | int len, flags; |
| 43 | struct tcp_debug *td = &tcp_debug[tcp_debx++]; |
| 44 | |
| 45 | if (tcp_debx == TCP_NDEBUG) |
| 46 | tcp_debx = 0; |
| 47 | td->td_time = iptime(); |
| 48 | td->td_act = act; |
| 49 | td->td_ostate = ostate; |
| 50 | td->td_tcb = (caddr_t)tp; |
| 51 | if (tp) |
| 52 | td->td_cb = *tp; |
| 53 | else |
| 54 | bzero((caddr_t)&td->td_cb, sizeof (*tp)); |
| 55 | if (ti) |
| 56 | td->td_ti = *ti; |
| 57 | else |
| 58 | bzero((caddr_t)&td->td_ti, sizeof (*ti)); |
| 59 | td->td_req = req; |
| 60 | if (tcpconsdebug == 0) |
| 61 | return; |
| 62 | if (tp) |
| 63 | printf("%x %s:", tp, tcpstates[ostate]); |
| 64 | else |
| 65 | printf("???????? "); |
| 66 | printf("%s ", tanames[act]); |
| 67 | switch (act) { |
| 68 | |
| 69 | case TA_INPUT: |
| 70 | case TA_OUTPUT: |
| 71 | seq = ti->ti_seq; |
| 72 | ack = ti->ti_ack; |
| 73 | len = ti->ti_len; |
| 74 | if (act == TA_OUTPUT) { |
| 75 | seq = ntohl(seq); |
| 76 | ack = ntohl(ack); |
| 77 | len = ntohs((u_short)len); |
| 78 | } |
| 79 | if (act == TA_OUTPUT) |
| 80 | len -= sizeof (struct tcphdr); |
| 81 | if (len) |
| 82 | printf("[%x..%x)", seq, seq+len); |
| 83 | else |
| 84 | printf("%x", seq); |
| 85 | printf("@%x", ack); |
| 86 | flags = ti->ti_flags; |
| 87 | if (flags) { |
| 88 | #ifndef lint |
| 89 | char *cp = "<"; |
| 90 | #define pf(f) { if (ti->ti_flags&TH_/**/f) { printf("%s%s", cp, "f"); cp = ","; } } |
| 91 | pf(SYN); pf(ACK); pf(FIN); pf(RST); |
| 92 | #endif |
| 93 | printf(">"); |
| 94 | } |
| 95 | break; |
| 96 | |
| 97 | case TA_USER: |
| 98 | printf("%s", prurequests[req&0xff]); |
| 99 | if ((req & 0xff) == PRU_SLOWTIMO) |
| 100 | printf("<%s>", tcptimers[req>>8]); |
| 101 | break; |
| 102 | } |
| 103 | if (tp) |
| 104 | printf(" -> %s", tcpstates[tp->t_state]); |
| 105 | /* print out internal state of tp !?! */ |
| 106 | printf("\n"); |
| 107 | if (tp == 0) |
| 108 | return; |
| 109 | printf("\trcv_(nxt,wnd) (%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", |
| 110 | tp->rcv_nxt, tp->rcv_wnd, tp->snd_una, tp->snd_nxt, tp->snd_max); |
| 111 | printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", |
| 112 | tp->snd_wl1, tp->snd_wl2, tp->snd_wnd); |
| 113 | } |