Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset d9e14fa4 in mainline


Ignore:
Timestamp:
2011-12-09T16:06:28Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
03be171
Parents:
0ac2158
Message:

Implement RST processing.

Location:
uspace/srv/net/tl/tcp
Files:
4 edited

Legend:

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

    r0ac2158 rd9e14fa4  
    117117
    118118        conn->cstate = st_listen;
     119        conn->reset = false;
     120        conn->ap = ap_passive;
    119121        conn->fin_is_acked = false;
    120122        conn->ident.local = *lsock;
     
    176178        conn->snd_nxt = conn->iss;
    177179        conn->snd_una = conn->iss;
     180        conn->ap = ap_active;
    178181
    179182        tcp_tqueue_ctrl_seg(conn, CTL_SYN);
     
    278281        log_msg(LVL_DEBUG, "%s: tcp_conn_reset()", conn->name);
    279282        tcp_conn_state_set(conn, st_closed);
     283        conn->reset = true;
     284
    280285        tcp_conn_tw_timer_clear(conn);
    281286        tcp_tqueue_clear(&conn->retransmit);
     287
     288        fibril_condvar_broadcast(&conn->rcv_buf_cv);
     289}
     290
     291/** Signal to the user that connection has been reset.
     292 *
     293 * Send an out-of-band signal to the user.
     294 */
     295static void tcp_reset_signal(tcp_conn_t *conn)
     296{
     297        /* TODO */
     298        log_msg(LVL_DEBUG, "%s: tcp_reset_signal()", conn->name);
    282299}
    283300
     
    485502static cproc_t tcp_conn_seg_proc_rst(tcp_conn_t *conn, tcp_segment_t *seg)
    486503{
    487         /* TODO */
    488         return cp_continue;
     504        switch (conn->cstate) {
     505        case st_syn_received:
     506                /* XXX In case of passive open, revert to Listen state */
     507                if (conn->ap == ap_passive) {
     508                        tcp_conn_state_set(conn, st_listen);
     509                        /* XXX Revert conn->ident */
     510                        tcp_conn_tw_timer_clear(conn);
     511                        tcp_tqueue_clear(&conn->retransmit);
     512                } else {
     513                        tcp_conn_reset(conn);
     514                }
     515                break;
     516        case st_established:
     517        case st_fin_wait_1:
     518        case st_fin_wait_2:
     519        case st_close_wait:
     520                /* General "connection reset" signal */
     521                tcp_reset_signal(conn);
     522                tcp_conn_reset(conn);
     523                break;
     524        case st_closing:
     525        case st_last_ack:
     526        case st_time_wait:
     527                tcp_conn_reset(conn);
     528                break;
     529        case st_listen:
     530        case st_syn_sent:
     531        case st_closed:
     532                assert(false);
     533        }
     534
     535        return cp_done;
    489536}
    490537
  • uspace/srv/net/tl/tcp/sock.c

    r0ac2158 rd9e14fa4  
    451451                        rc = ENOTCONN;
    452452                        break;
     453                case TCP_ERESET:
     454                        rc = ECONNABORTED;
     455                        break;
    453456                default:
    454457                        assert(false);
     
    520523                rc = ENOTCONN;
    521524                break;
     525        case TCP_ERESET:
     526                rc = ECONNABORTED;
     527                break;
    522528        default:
    523529                assert(false);
  • uspace/srv/net/tl/tcp/tcp_type.h

    r0ac2158 rd9e14fa4  
    147147} tcp_tqueue_t;
    148148
     149typedef enum {
     150        ap_active,
     151        ap_passive
     152} acpass_t;
     153
    149154typedef struct tcp_conn {
    150155        char *name;
     
    154159        tcp_sockpair_t ident;
    155160
     161        /** Active or passive connection */
     162        acpass_t ap;
     163
    156164        /** Connection state */
    157165        tcp_cstate_t cstate;
     166        /** True if connection was reset */
     167        bool reset;
    158168        /** Protects @c cstate */
    159169        fibril_mutex_t cstate_lock;
     
    245255} tcp_segment_t;
    246256
    247 typedef enum {
    248         ap_active,
    249         ap_passive
    250 } acpass_t;
    251257
    252258typedef struct {
  • uspace/srv/net/tl/tcp/ucall.c

    r0ac2158 rd9e14fa4  
    126126        while (size > 0) {
    127127                buf_free = conn->snd_buf_size - conn->snd_buf_used;
    128                 while (buf_free == 0)
     128                while (buf_free == 0 && !conn->reset)
    129129                        tcp_tqueue_new_data(conn);
     130
     131                if (conn->reset)
     132                        return TCP_ERESET;
    130133
    131134                xfer_size = min(size, buf_free);
     
    157160
    158161        /* Wait for data to become available */
    159         while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin) {
     162        while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) {
    160163                log_msg(LVL_DEBUG, "tcp_uc_receive() - wait for data");
    161164                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->rcv_buf_lock);
     
    165168                fibril_mutex_unlock(&conn->rcv_buf_lock);
    166169
    167                 /* End of data, peer closed connection. */
    168                 assert(conn->rcv_buf_fin);
    169170                *rcvd = 0;
    170171                *xflags = 0;
    171                 return TCP_ECLOSING;
     172
     173                if (conn->rcv_buf_fin) {
     174                        /* End of data, peer closed connection */
     175                        return TCP_ECLOSING;
     176                } else {
     177                        /* Connection was reset */
     178                        assert(conn->reset);
     179                        return TCP_ERESET;
     180                }
    172181        }
    173182
Note: See TracChangeset for help on using the changeset viewer.