Changeset b243da3 in mainline


Ignore:
Timestamp:
2013-09-28T20:41:51Z (11 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
13be2583
Parents:
04ecc6d
Message:

Close listening TCP connections when socket is closed. Listening connections cannot be closed by sending a FIN.

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

Legend:

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

    r04ecc6d rb243da3  
    381381 * @param conn  Connection
    382382 */
    383 static void tcp_conn_reset(tcp_conn_t *conn)
     383void tcp_conn_reset(tcp_conn_t *conn)
    384384{
    385385        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_reset()", conn->name);
  • uspace/srv/net/tcp/conn.h

    r04ecc6d rb243da3  
    4343extern void tcp_conn_add(tcp_conn_t *);
    4444extern void tcp_conn_remove(tcp_conn_t *);
     45extern void tcp_conn_reset(tcp_conn_t *conn);
    4546extern void tcp_conn_sync(tcp_conn_t *);
    4647extern void tcp_conn_fin_sent(tcp_conn_t *);
  • uspace/srv/net/tcp/sock.c

    r04ecc6d rb243da3  
    882882        tcp_sockdata_t *socket;
    883883        tcp_error_t trc;
     884        int i;
    884885        int rc;
    885886
     
    897898
    898899        if (socket->conn != NULL) {
     900                /* Close connection */
    899901                trc = tcp_uc_close(socket->conn);
    900902                if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
     
    905907        }
    906908
     909        if (socket->lconn != NULL) {
     910                /* Close listening connections */
     911                for (i = 0; i < socket->backlog; i++) {
     912                        tcp_uc_set_cstate_cb(socket->lconn[i]->conn, NULL, NULL);
     913                        trc = tcp_uc_close(socket->lconn[i]->conn);
     914                        if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {
     915                                fibril_mutex_unlock(&socket->lock);
     916                                async_answer_0(callid, EBADF);
     917                                return;
     918                        }
     919
     920                        free(socket->lconn[i]);
     921                        socket->lconn[i] = NULL;
     922                }
     923        }
     924
    907925        /* Grab recv_buffer_lock because of CV wait in tcp_sock_recv_fibril() */
    908926        fibril_mutex_lock(&socket->recv_buffer_lock);
  • uspace/srv/net/tcp/ucall.c

    r04ecc6d rb243da3  
    8383
    8484        if (oflags == tcp_open_nonblock) {
     85                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open -> %p", nconn);
    8586                *conn = nconn;
    8687                return TCP_EOK;
     
    234235tcp_error_t tcp_uc_close(tcp_conn_t *conn)
    235236{
    236         log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close()", conn->name);
     237        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close(%p)", conn->name,
     238            conn);
    237239
    238240        fibril_mutex_lock(&conn->lock);
    239241
    240242        if (conn->cstate == st_closed) {
     243                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ENOTEXIST");
    241244                fibril_mutex_unlock(&conn->lock);
    242245                return TCP_ENOTEXIST;
    243246        }
    244247
     248        if (conn->cstate == st_listen || conn->cstate == st_syn_sent) {
     249                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent");
     250                tcp_conn_reset(conn);
     251                tcp_conn_remove(conn);
     252                return TCP_EOK;
     253        }
     254
    245255        if (conn->snd_buf_fin) {
     256                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ECLOSING");
    246257                fibril_mutex_unlock(&conn->lock);
    247258                return TCP_ECLOSING;
    248259        }
    249260
     261        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - set snd_buf_fin");
    250262        conn->snd_buf_fin = true;
    251263        tcp_tqueue_new_data(conn);
Note: See TracChangeset for help on using the changeset viewer.