Ignore:
File:
1 edited

Legend:

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

    rc0f3460 r8499160  
    11/*
    2  * Copyright (c) 2011 Jiri Svoboda
     2 * Copyright (c) 2015 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3535 */
    3636
     37#include <errno.h>
    3738#include <fibril_synch.h>
    3839#include <io/log.h>
     
    5051/** OPEN user call
    5152 *
    52  * @param lsock         Local socket
    53  * @param fsock         Foreign socket
     53 * @param epp           Endpoint pair
    5454 * @param acpass        Active/passive
    5555 * @param oflags        Open flags
     
    6565 * establishment.
    6666 */
    67 tcp_error_t tcp_uc_open(tcp_sock_t *lsock, tcp_sock_t *fsock, acpass_t acpass,
     67tcp_error_t tcp_uc_open(inet_ep2_t *epp, acpass_t acpass,
    6868    tcp_open_flags_t oflags, tcp_conn_t **conn)
    6969{
    7070        tcp_conn_t *nconn;
    71 
    72         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %p, %s, %s, %p)",
    73             lsock, fsock, acpass == ap_active ? "active" : "passive",
     71        int rc;
     72
     73        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %s, %s, %p)",
     74            epp, acpass == ap_active ? "active" : "passive",
    7475            oflags == tcp_open_nonblock ? "nonblock" : "none", conn);
    7576
    76         nconn = tcp_conn_new(lsock, fsock);
    77         tcp_conn_add(nconn);
     77        nconn = tcp_conn_new(epp);
     78        rc = tcp_conn_add(nconn);
     79        if (rc != EOK) {
     80                tcp_conn_delete(nconn);
     81                return TCP_EEXISTS;
     82        }
     83
     84        tcp_conn_lock(nconn);
    7885
    7986        if (acpass == ap_active) {
     
    8390
    8491        if (oflags == tcp_open_nonblock) {
     92                tcp_conn_unlock(nconn);
     93                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open -> %p", nconn);
    8594                *conn = nconn;
    8695                return TCP_EOK;
     
    8998        /* Wait for connection to be established or reset */
    9099        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Wait for connection.");
    91         fibril_mutex_lock(&nconn->lock);
    92100        while (nconn->cstate == st_listen ||
    93101            nconn->cstate == st_syn_sent ||
     
    99107                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Connection was reset.");
    100108                assert(nconn->cstate == st_closed);
    101                 fibril_mutex_unlock(&nconn->lock);
     109                tcp_conn_unlock(nconn);
    102110                return TCP_ERESET;
    103111        }
    104112
    105         fibril_mutex_unlock(&nconn->lock);
     113        tcp_conn_unlock(nconn);
    106114        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Connection was established.");
    107115
     
    120128        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_send()", conn->name);
    121129
    122         fibril_mutex_lock(&conn->lock);
     130        tcp_conn_lock(conn);
    123131
    124132        if (conn->cstate == st_closed) {
    125                 fibril_mutex_unlock(&conn->lock);
     133                tcp_conn_unlock(conn);
    126134                return TCP_ENOTEXIST;
    127135        }
     
    134142
    135143        if (conn->snd_buf_fin) {
    136                 fibril_mutex_unlock(&conn->lock);
     144                tcp_conn_unlock(conn);
    137145                return TCP_ECLOSING;
    138146        }
     
    148156
    149157                if (conn->reset) {
    150                         fibril_mutex_unlock(&conn->lock);
     158                        tcp_conn_unlock(conn);
    151159                        return TCP_ERESET;
    152160                }
     
    164172
    165173        tcp_tqueue_new_data(conn);
    166         fibril_mutex_unlock(&conn->lock);
     174        tcp_conn_unlock(conn);
    167175
    168176        return TCP_EOK;
     
    177185        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_receive()", conn->name);
    178186
    179         fibril_mutex_lock(&conn->lock);
     187        tcp_conn_lock(conn);
    180188
    181189        if (conn->cstate == st_closed) {
    182                 fibril_mutex_unlock(&conn->lock);
     190                tcp_conn_unlock(conn);
    183191                return TCP_ENOTEXIST;
    184192        }
     
    186194        /* Wait for data to become available */
    187195        while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) {
     196                tcp_conn_unlock(conn);
     197                return TCP_EAGAIN;
    188198                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data");
    189199                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock);
     
    196206                if (conn->rcv_buf_fin) {
    197207                        /* End of data, peer closed connection */
    198                         fibril_mutex_unlock(&conn->lock);
     208                        tcp_conn_unlock(conn);
    199209                        return TCP_ECLOSING;
    200210                } else {
    201211                        /* Connection was reset */
    202212                        assert(conn->reset);
    203                         fibril_mutex_unlock(&conn->lock);
     213                        tcp_conn_unlock(conn);
    204214                        return TCP_ERESET;
    205215                }
     
    226236            conn->name, xfer_size);
    227237
    228         fibril_mutex_unlock(&conn->lock);
     238        tcp_conn_unlock(conn);
    229239
    230240        return TCP_EOK;
     
    234244tcp_error_t tcp_uc_close(tcp_conn_t *conn)
    235245{
    236         log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close()", conn->name);
    237 
    238         fibril_mutex_lock(&conn->lock);
     246        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close(%p)", conn->name,
     247            conn);
     248
     249        tcp_conn_lock(conn);
    239250
    240251        if (conn->cstate == st_closed) {
    241                 fibril_mutex_unlock(&conn->lock);
     252                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ENOTEXIST");
     253                tcp_conn_unlock(conn);
    242254                return TCP_ENOTEXIST;
    243255        }
    244256
     257        if (conn->cstate == st_listen || conn->cstate == st_syn_sent) {
     258                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent");
     259                tcp_conn_reset(conn);
     260                tcp_conn_unlock(conn);
     261                return TCP_EOK;
     262        }
     263
    245264        if (conn->snd_buf_fin) {
    246                 fibril_mutex_unlock(&conn->lock);
     265                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ECLOSING");
     266                tcp_conn_unlock(conn);
    247267                return TCP_ECLOSING;
    248268        }
    249269
     270        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - set snd_buf_fin");
    250271        conn->snd_buf_fin = true;
    251272        tcp_tqueue_new_data(conn);
    252273
    253         fibril_mutex_unlock(&conn->lock);
     274        tcp_conn_unlock(conn);
    254275        return TCP_EOK;
    255276}
     
    280301}
    281302
    282 void tcp_uc_set_cstate_cb(tcp_conn_t *conn, tcp_cstate_cb_t cb, void *arg)
    283 {
    284         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_ctate_cb(%p, %p, %p)",
     303void tcp_uc_set_cb(tcp_conn_t *conn, tcp_cb_t *cb, void *arg)
     304{
     305        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_cb(%p, %p, %p)",
    285306            conn, cb, arg);
    286307
    287         conn->cstate_cb = cb;
    288         conn->cstate_cb_arg = arg;
     308        conn->cb = cb;
     309        conn->cb_arg = arg;
     310}
     311
     312void *tcp_uc_get_userptr(tcp_conn_t *conn)
     313{
     314        return conn->cb_arg;
    289315}
    290316
     
    294320
    295321/** Segment arrived */
    296 void tcp_as_segment_arrived(tcp_sockpair_t *sp, tcp_segment_t *seg)
     322void tcp_as_segment_arrived(inet_ep2_t *epp, tcp_segment_t *seg)
    297323{
    298324        tcp_conn_t *conn;
     
    300326        log_msg(LOG_DEFAULT, LVL_DEBUG,
    301327            "tcp_as_segment_arrived(f:(%u), l:(%u))",
    302             sp->foreign.port, sp->local.port);
    303 
    304         conn = tcp_conn_find_ref(sp);
     328            epp->remote.port, epp->local.port);
     329
     330        conn = tcp_conn_find_ref(epp);
    305331        if (conn == NULL) {
    306332                log_msg(LOG_DEFAULT, LVL_WARN, "No connection found.");
    307                 tcp_unexpected_segment(sp, seg);
     333                tcp_unexpected_segment(epp, seg);
    308334                return;
    309335        }
    310336
    311         fibril_mutex_lock(&conn->lock);
    312 
    313         if (conn->cstate == st_closed) {
    314                 log_msg(LOG_DEFAULT, LVL_WARN, "Connection is closed.");
    315                 tcp_unexpected_segment(sp, seg);
    316                 fibril_mutex_unlock(&conn->lock);
    317                 tcp_conn_delref(conn);
    318                 return;
    319         }
    320 
    321         if (inet_addr_is_any(&conn->ident.foreign.addr))
    322                 conn->ident.foreign.addr = sp->foreign.addr;
    323        
    324         if (conn->ident.foreign.port == TCP_PORT_ANY)
    325                 conn->ident.foreign.port = sp->foreign.port;
    326        
    327         if (inet_addr_is_any(&conn->ident.local.addr))
    328                 conn->ident.local.addr = sp->local.addr;
    329 
    330         tcp_conn_segment_arrived(conn, seg);
    331 
    332         fibril_mutex_unlock(&conn->lock);
     337        tcp_conn_segment_arrived(conn, epp, seg);
    333338        tcp_conn_delref(conn);
    334339}
Note: See TracChangeset for help on using the changeset viewer.