VirtualBox

Changeset 37738 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jul 3, 2011 11:41:17 AM (14 years ago)
Author:
vboxsync
Message:

NAT: tracing tcp machine state change.

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/debug.c

    r37724 r37738  
    3434void dump_packet(void *, int);
    3535#endif
     36
     37#ifndef STRINGIFY
     38# define STRINGIFY(x) #x
     39#endif
     40
     41static char *g_apszTcpStates[TCP_NSTATES] =
     42{
     43    STRINGIFY(TCPS_CLOSED),
     44    STRINGIFY(TCPS_LISTEN),
     45    STRINGIFY(TCPS_SYN_SENT),
     46    STRINGIFY(TCPS_SYN_RECEIVED),
     47    STRINGIFY(TCPS_ESTABLISHED),
     48    STRINGIFY(TCPS_CLOSE_WAIT),
     49    STRINGIFY(TCPS_FIN_WAIT_1),
     50    STRINGIFY(TCPS_CLOSING),
     51    STRINGIFY(TCPS_LAST_ACK),
     52    STRINGIFY(TCPS_FIN_WAIT_2),
     53    STRINGIFY(TCPS_TIME_WAIT)
     54};
    3655
    3756/*
     
    295314    cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "SEG[ACK: %x, SEQ: %x, LEN: %x, WND: %x, UP: %x]",
    296315                      ti->ti_ack, ti->ti_seq, ti->ti_len, ti->ti_win, ti->ti_urp);
     316    return cb;
     317}
     318
     319/*
     320 * Prints TCP state
     321 */
     322static DECLCALLBACK(size_t)
     323printTcpState(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
     324                 const char *pszType, void const *pvValue,
     325                 int cchWidth, int cchPrecision, unsigned fFlags,
     326                 void *pvUser)
     327{
     328    size_t cb = 0;
     329    const int idxTcpState = (int)pvValue;
     330    char *pszTcpStateName = (idxTcpState >= 0 && idxTcpState < TCP_NSTATES) ? g_apszTcpStates[idxTcpState] : "TCPS_INVALIDE_STATE";
     331    AssertReturn(RTStrCmp(pszType, "tcpstate") == 0, 0);
     332    cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s", pszTcpStateName);
    297333    return cb;
    298334}
     
    365401        rc = RTStrFormatTypeRegister("tcpseg793", printTcpSegmentRfc793, NULL);
    366402        AssertRC(rc);
     403        rc = RTStrFormatTypeRegister("tcpstate", printTcpState, NULL);
     404        AssertRC(rc);
    367405        g_fFormatRegistered = 1;
    368406    }
  • trunk/src/VBox/Devices/Network/slirp/debug.h

    r34103 r37738  
    4040void sockstats (PNATState);
    4141
     42#ifdef LOG_ENABLED
     43# define TCP_STATE_SWITCH_TO(tp, new_tcp_state)                                                                     \
     44do {                                                                                                                \
     45    Log2(("%R[tcpcb793] switch to %R[tcpstate] -> %R[tcpstate]\n", (tp), (tp), (tp->t_state) ,(new_tcp_state)));    \
     46    if ((tp)->t_socket)                                                                                             \
     47        Log2(("%R[tcpcb793] %R[natsock]\n", (tp), (tp)->t_socket));                                                 \
     48    (tp)->t_state = (new_tcp_state);                                                                                \
     49} while(0)
     50#else
     51# define TCP_STATE_SWITCH_TO(tp, new_tcp_state) (tp)->t_state = (new_tcp_state)
    4252#endif
     53#endif
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r37728 r37738  
    549549
    550550        tp = sototcpcb(so);
    551         tp->t_state = TCPS_LISTEN;
     551        TCP_STATE_SWITCH_TO(tp, TCPS_LISTEN);
    552552    }
    553553
     
    839839                so->so_ti = ti;
    840840                tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
    841                 tp->t_state = TCPS_SYN_RECEIVED;
     841                TCP_STATE_SWITCH_TO(tp, TCPS_SYN_RECEIVED);
    842842            }
    843843            SOCKET_UNLOCK(so);
     
    873873            tcp_rcvseqinit(tp);
    874874            tp->t_flags |= TF_ACKNOW;
    875             tp->t_state = TCPS_SYN_RECEIVED;
     875            TCP_STATE_SWITCH_TO(tp, TCPS_SYN_RECEIVED);
    876876            tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
    877877            tcpstat.tcps_accepts++;
     
    929929                tcpstat.tcps_connects++;
    930930                soisfconnected(so);
    931                 tp->t_state = TCPS_ESTABLISHED;
     931                TCP_STATE_SWITCH_TO(tp, TCPS_ESTABLISHED);
    932932
    933933                /* Do window scaling on this connection? */
     
    949949            }
    950950            else
    951                 tp->t_state = TCPS_SYN_RECEIVED;
     951                TCP_STATE_SWITCH_TO(tp, TCPS_SYN_RECEIVED);
    952952
    953953trimthenstep6:
     
    11711171close:
    11721172            LogFlowFunc(("close:\n"));
    1173             tp->t_state = TCPS_CLOSED;
     1173            TCP_STATE_SWITCH_TO(tp, TCPS_CLOSED);
    11741174            tcpstat.tcps_drops++;
    11751175            tp = tcp_close(pData, tp);
     
    12201220                goto dropwithreset;
    12211221            tcpstat.tcps_connects++;
    1222             tp->t_state = TCPS_ESTABLISHED;
     1222            TCP_STATE_SWITCH_TO(tp, TCPS_ESTABLISHED);
    12231223            /*
    12241224             * The sent SYN is ack'ed with our sequence number +1
     
    14451445                            tp->t_timer[TCPT_2MSL] = tcp_maxidle;
    14461446                        }
    1447                         tp->t_state = TCPS_FIN_WAIT_2;
     1447                        TCP_STATE_SWITCH_TO(tp, TCPS_FIN_WAIT_2);
    14481448                    }
    14491449                    break;
     
    14581458                    if (ourfinisacked)
    14591459                    {
    1460                         tp->t_state = TCPS_TIME_WAIT;
     1460                        TCP_STATE_SWITCH_TO(tp, TCPS_TIME_WAIT);
    14611461                        tcp_canceltimers(tp);
    14621462                        tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
     
    16611661            case TCPS_SYN_RECEIVED:
    16621662            case TCPS_ESTABLISHED:
    1663                 tp->t_state = TCPS_CLOSE_WAIT;
     1663                TCP_STATE_SWITCH_TO(tp, TCPS_CLOSE_WAIT);
    16641664                break;
    16651665
     
    16691669             */
    16701670            case TCPS_FIN_WAIT_1:
    1671                 tp->t_state = TCPS_CLOSING;
     1671                TCP_STATE_SWITCH_TO(tp, TCPS_CLOSING);
    16721672                break;
    16731673
     
    16781678             */
    16791679            case TCPS_FIN_WAIT_2:
    1680                 tp->t_state = TCPS_TIME_WAIT;
     1680                TCP_STATE_SWITCH_TO(tp, TCPS_TIME_WAIT);
    16811681                tcp_canceltimers(tp);
    16821682                tp->t_timer[TCPT_2MSL] = 2 * TCPTV_MSL;
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r34103 r37738  
    225225    tp->snd_cwnd = TCP_MAXWIN << TCP_MAX_WINSHIFT;
    226226    tp->snd_ssthresh = TCP_MAXWIN << TCP_MAX_WINSHIFT;
    227     tp->t_state = TCPS_CLOSED;
     227    TCP_STATE_SWITCH_TO(tp, TCPS_CLOSED);
    228228
    229229    so->so_tcpcb = tp;
     
    248248    if (TCPS_HAVERCVDSYN(tp->t_state))
    249249    {
    250         tp->t_state = TCPS_CLOSED;
     250        TCP_STATE_SWITCH_TO(tp, TCPS_CLOSED);
    251251        (void) tcp_output(pData, tp);
    252252        tcpstat.tcps_drops++;
     
    360360        case TCPS_LISTEN:
    361361        case TCPS_SYN_SENT:
    362             tp->t_state = TCPS_CLOSED;
     362            TCP_STATE_SWITCH_TO(tp, TCPS_CLOSED);
    363363            tp = tcp_close(pData, tp);
    364364            break;
     
    366366        case TCPS_SYN_RECEIVED:
    367367        case TCPS_ESTABLISHED:
    368             tp->t_state = TCPS_FIN_WAIT_1;
     368            TCP_STATE_SWITCH_TO(tp, TCPS_FIN_WAIT_1);
    369369            break;
    370370
    371371        case TCPS_CLOSE_WAIT:
    372             tp->t_state = TCPS_LAST_ACK;
     372            TCP_STATE_SWITCH_TO(tp, TCPS_LAST_ACK);
    373373            break;
    374374    }
     
    584584    tcpstat.tcps_connattempt++;
    585585
    586     tp->t_state = TCPS_SYN_SENT;
     586    TCP_STATE_SWITCH_TO(tp, TCPS_SYN_SENT);
    587587    tp->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT;
    588588    tp->iss = tcp_iss;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette