Changeset 1d4b815 in mainline for uspace/srv/net/tcp/service.c


Ignore:
Timestamp:
2015-05-09T19:05:48Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
309469de
Parents:
779541b
Message:

Properly wait for connection establishment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tcp/service.c

    r779541b r1d4b815  
    5656
    5757static void tcp_ev_data(tcp_cconn_t *);
    58 
    59 static void tcp_service_cstate_change(tcp_conn_t *, void *);
     58static void tcp_ev_connected(tcp_cconn_t *);
     59static void tcp_ev_conn_failed(tcp_cconn_t *);
     60static void tcp_ev_conn_reset(tcp_cconn_t *);
     61
     62static void tcp_service_cstate_change(tcp_conn_t *, void *, tcp_cstate_t);
    6063static void tcp_service_recv_data(tcp_conn_t *, void *);
    6164
     
    6568};
    6669
    67 static void tcp_service_cstate_change(tcp_conn_t *conn, void *arg)
    68 {
     70static void tcp_service_cstate_change(tcp_conn_t *conn, void *arg,
     71    tcp_cstate_t old_state)
     72{
     73        tcp_cstate_t nstate;
     74        tcp_cconn_t *cconn;
     75
     76        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_service_cstate_change()");
     77        nstate = conn->cstate;
     78        cconn = tcp_uc_get_userptr(conn);
     79
     80        if ((old_state == st_syn_sent || old_state == st_syn_received) &&
     81            (nstate == st_established)) {
     82                /* Connection established */
     83                tcp_ev_connected(cconn);
     84        }
     85
     86        if (old_state != st_closed && nstate == st_closed && conn->reset) {
     87                /* Connection reset */
     88                tcp_ev_conn_reset(cconn);
     89        }
     90
     91        /* XXX Failed to establish connection */
     92        if (0) tcp_ev_conn_failed(cconn);
    6993}
    7094
     
    87111        exch = async_exchange_begin(cconn->client->sess);
    88112        aid_t req = async_send_1(exch, TCP_EV_DATA, cconn->id, NULL);
     113        async_exchange_end(exch);
     114
     115        async_forget(req);
     116}
     117
     118static void tcp_ev_connected(tcp_cconn_t *cconn)
     119{
     120        async_exch_t *exch;
     121
     122        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_ev_connected()");
     123
     124        exch = async_exchange_begin(cconn->client->sess);
     125        aid_t req = async_send_1(exch, TCP_EV_CONNECTED, cconn->id, NULL);
     126        async_exchange_end(exch);
     127
     128        async_forget(req);
     129}
     130
     131static void tcp_ev_conn_failed(tcp_cconn_t *cconn)
     132{
     133        async_exch_t *exch;
     134
     135        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_ev_conn_failed()");
     136
     137        exch = async_exchange_begin(cconn->client->sess);
     138        aid_t req = async_send_1(exch, TCP_EV_CONN_FAILED, cconn->id, NULL);
     139        async_exchange_end(exch);
     140
     141        async_forget(req);
     142}
     143
     144static void tcp_ev_conn_reset(tcp_cconn_t *cconn)
     145{
     146        async_exch_t *exch;
     147
     148        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_ev_conn_reset()");
     149
     150        exch = async_exchange_begin(cconn->client->sess);
     151        aid_t req = async_send_1(exch, TCP_EV_CONN_RESET, cconn->id, NULL);
    89152        async_exchange_end(exch);
    90153
Note: See TracChangeset for help on using the changeset viewer.