Changeset 004a5fe in mainline for uspace/srv/net/tl/tcp/conn.c


Ignore:
Timestamp:
2011-11-20T19:13:53Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
eea65f4
Parents:
854e79a6
Message:

Make active OPEN wait for connection establishment (or reset).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/conn.c

    r854e79a6 r004a5fe  
    111111        tqueue_inited = true;
    112112
     113        /* Connection state change signalling */
     114        fibril_mutex_initialize(&conn->cstate_lock);
     115        fibril_condvar_initialize(&conn->cstate_cv);
     116
    113117        conn->cstate = st_listen;
    114118        conn->fin_is_acked = false;
     
    152156}
    153157
     158static void tcp_conn_state_set(tcp_conn_t *conn, tcp_cstate_t nstate)
     159{
     160        fibril_mutex_lock(&conn->cstate_lock);
     161        conn->cstate = nstate;
     162        fibril_condvar_broadcast(&conn->cstate_cv);
     163        fibril_mutex_unlock(&conn->cstate_lock);
     164}
     165
    154166/** Synchronize connection.
    155167 *
     
    165177
    166178        tcp_tqueue_ctrl_seg(conn, CTL_SYN);
    167         conn->cstate = st_syn_sent;
     179        tcp_conn_state_set(conn, st_syn_sent);
    168180}
    169181
     
    179191        case st_established:
    180192                log_msg(LVL_DEBUG, "FIN sent -> Fin-Wait-1");
    181                 conn->cstate = st_fin_wait_1;
     193                tcp_conn_state_set(conn, st_fin_wait_1);
    182194                break;
    183195        case st_close_wait:
    184196                log_msg(LVL_DEBUG, "FIN sent -> Last-Ack");
    185                 conn->cstate = st_last_ack;
     197                tcp_conn_state_set(conn, st_last_ack);
    186198                break;
    187199        default:
     
    328340        conn->snd_wl2 = seg->seq;
    329341
    330         conn->cstate = st_syn_received;
     342        tcp_conn_state_set(conn, st_syn_received);
    331343
    332344        tcp_tqueue_ctrl_seg(conn, CTL_SYN | CTL_ACK /* XXX */);
     
    357369                log_msg(LVL_DEBUG, "Connection reset. -> Closed");
    358370                /* XXX Signal user error */
    359                 conn->cstate = st_closed;
     371                tcp_conn_state_set(conn, st_closed);
    360372                /* XXX delete connection */
    361373                return;
     
    397409        if (seq_no_syn_acked(conn)) {
    398410                log_msg(LVL_DEBUG, " syn acked -> Established");
    399                 conn->cstate = st_established;
     411                tcp_conn_state_set(conn, st_established);
    400412                tcp_tqueue_ctrl_seg(conn, CTL_ACK /* XXX */);
    401413        } else {
    402414                log_msg(LVL_DEBUG, " syn not acked -> Syn-Received");
    403                 conn->cstate = st_syn_received;
     415                tcp_conn_state_set(conn, st_syn_received);
    404416                tcp_tqueue_ctrl_seg(conn, CTL_SYN | CTL_ACK /* XXX */);
    405417        }
     
    517529        log_msg(LVL_DEBUG, "SYN ACKed -> Established");
    518530
    519         conn->cstate = st_established;
     531        tcp_conn_state_set(conn, st_established);
    520532
    521533        /* XXX Not mentioned in spec?! */
     
    590602        if (conn->fin_is_acked) {
    591603                log_msg(LVL_DEBUG, " FIN acked -> Fin-Wait-2");
    592                 conn->cstate = st_fin_wait_2;
     604                tcp_conn_state_set(conn, st_fin_wait_2);
    593605        }
    594606
     
    656668                log_msg(LVL_DEBUG, " FIN acked -> Closed");
    657669                tcp_conn_remove(conn);
    658                 conn->cstate = st_closed;
     670                tcp_conn_state_set(conn, st_closed);
    659671                return cp_done;
    660672        }
     
    844856                case st_established:
    845857                        log_msg(LVL_DEBUG, "FIN received -> Close-Wait");
    846                         conn->cstate = st_close_wait;
     858                        tcp_conn_state_set(conn, st_close_wait);
    847859                        break;
    848860                case st_fin_wait_1:
    849861                        log_msg(LVL_DEBUG, "FIN received -> Closing");
    850                         conn->cstate = st_closing;
     862                        tcp_conn_state_set(conn, st_closing);
    851863                        break;
    852864                case st_fin_wait_2:
    853865                        log_msg(LVL_DEBUG, "FIN received -> Time-Wait");
    854                         conn->cstate = st_time_wait;
     866                        tcp_conn_state_set(conn, st_time_wait);
    855867                        /* Start the Time-Wait timer */
    856868                        tcp_conn_tw_timer_set(conn);
     
    980992
    981993        tcp_conn_remove(conn);
    982         conn->cstate = st_closed;
     994        tcp_conn_state_set(conn, st_closed);
    983995}
    984996
Note: See TracChangeset for help on using the changeset viewer.