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


Ignore:
Timestamp:
2011-12-09T16:06:28Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
03be171
Parents:
0ac2158
Message:

Implement RST processing.

File:
1 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
Note: See TracChangeset for help on using the changeset viewer.