Changeset 004a5fe in mainline


Ignore:
Timestamp:
2011-11-20T19:13:53Z (12 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).

Location:
uspace/srv/net/tl/tcp
Files:
4 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
  • uspace/srv/net/tl/tcp/state.c

    r854e79a6 r004a5fe  
    5858 * connection.
    5959 */
    60 void tcp_uc_open(uint16_t lport, tcp_sock_t *fsock, acpass_t acpass,
     60tcp_error_t tcp_uc_open(uint16_t lport, tcp_sock_t *fsock, acpass_t acpass,
    6161    tcp_conn_t **conn)
    6262{
     
    7777                /* Synchronize (initiate) connection */
    7878                tcp_conn_sync(nconn);
     79
     80                /* Wait for connection to be established or reset */
     81                log_msg(LVL_DEBUG, "tcp_uc_open: Wait for connection.");
     82                fibril_mutex_lock(&nconn->cstate_lock);
     83                while (nconn->cstate == st_syn_sent ||
     84                    nconn->cstate == st_syn_received) {
     85                        fibril_condvar_wait(&nconn->cstate_cv, &nconn->cstate_lock);
     86                }
     87                if (nconn->cstate != st_established) {
     88                        log_msg(LVL_DEBUG, "tcp_uc_open: Connection was reset.");
     89                        assert(nconn->cstate == st_closed);
     90                        fibril_mutex_unlock(&nconn->cstate_lock);
     91                        return TCP_ERESET;
     92                }
     93                fibril_mutex_unlock(&nconn->cstate_lock);
     94                log_msg(LVL_DEBUG, "tcp_uc_open: Connection was established.");
    7995        }
    8096
    8197        *conn = nconn;
     98        return TCP_EOK;
    8299}
    83100
  • uspace/srv/net/tl/tcp/state.h

    r854e79a6 r004a5fe  
    4242 * User calls
    4343 */
    44 extern void tcp_uc_open(uint16_t, tcp_sock_t *, acpass_t, tcp_conn_t **);
     44extern tcp_error_t tcp_uc_open(uint16_t, tcp_sock_t *, acpass_t, tcp_conn_t **);
    4545extern tcp_error_t tcp_uc_send(tcp_conn_t *, void *, size_t, xflags_t);
    4646extern tcp_error_t tcp_uc_receive(tcp_conn_t *, void *, size_t, size_t *, xflags_t *);
  • uspace/srv/net/tl/tcp/tcp_type.h

    r854e79a6 r004a5fe  
    146146        /** Connection state */
    147147        tcp_cstate_t cstate;
     148        /** Protects @c cstate */
     149        fibril_mutex_t cstate_lock;
     150        /** Signalled when @c cstate changes */
     151        fibril_condvar_t cstate_cv;
    148152
    149153        /** Set when FIN is removed from the retransmission queue */
Note: See TracChangeset for help on using the changeset viewer.