Ignore:
File:
1 edited

Legend:

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

    r8499160 rc0f3460  
    11/*
    2  * Copyright (c) 2015 Jiri Svoboda
     2 * Copyright (c) 2011 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3535 */
    3636
    37 #include <errno.h>
    3837#include <fibril_synch.h>
    3938#include <io/log.h>
     
    5150/** OPEN user call
    5251 *
    53  * @param epp           Endpoint pair
     52 * @param lsock         Local socket
     53 * @param fsock         Foreign socket
    5454 * @param acpass        Active/passive
    5555 * @param oflags        Open flags
     
    6565 * establishment.
    6666 */
    67 tcp_error_t tcp_uc_open(inet_ep2_t *epp, acpass_t acpass,
     67tcp_error_t tcp_uc_open(tcp_sock_t *lsock, tcp_sock_t *fsock, acpass_t acpass,
    6868    tcp_open_flags_t oflags, tcp_conn_t **conn)
    6969{
    7070        tcp_conn_t *nconn;
    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",
     71
     72        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %p, %s, %s, %p)",
     73            lsock, fsock, acpass == ap_active ? "active" : "passive",
    7574            oflags == tcp_open_nonblock ? "nonblock" : "none", conn);
    7675
    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);
     76        nconn = tcp_conn_new(lsock, fsock);
     77        tcp_conn_add(nconn);
    8578
    8679        if (acpass == ap_active) {
     
    9083
    9184        if (oflags == tcp_open_nonblock) {
    92                 tcp_conn_unlock(nconn);
    93                 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open -> %p", nconn);
    9485                *conn = nconn;
    9586                return TCP_EOK;
     
    9889        /* Wait for connection to be established or reset */
    9990        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Wait for connection.");
     91        fibril_mutex_lock(&nconn->lock);
    10092        while (nconn->cstate == st_listen ||
    10193            nconn->cstate == st_syn_sent ||
     
    10799                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Connection was reset.");
    108100                assert(nconn->cstate == st_closed);
    109                 tcp_conn_unlock(nconn);
     101                fibril_mutex_unlock(&nconn->lock);
    110102                return TCP_ERESET;
    111103        }
    112104
    113         tcp_conn_unlock(nconn);
     105        fibril_mutex_unlock(&nconn->lock);
    114106        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open: Connection was established.");
    115107
     
    128120        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_send()", conn->name);
    129121
    130         tcp_conn_lock(conn);
     122        fibril_mutex_lock(&conn->lock);
    131123
    132124        if (conn->cstate == st_closed) {
    133                 tcp_conn_unlock(conn);
     125                fibril_mutex_unlock(&conn->lock);
    134126                return TCP_ENOTEXIST;
    135127        }
     
    142134
    143135        if (conn->snd_buf_fin) {
    144                 tcp_conn_unlock(conn);
     136                fibril_mutex_unlock(&conn->lock);
    145137                return TCP_ECLOSING;
    146138        }
     
    156148
    157149                if (conn->reset) {
    158                         tcp_conn_unlock(conn);
     150                        fibril_mutex_unlock(&conn->lock);
    159151                        return TCP_ERESET;
    160152                }
     
    172164
    173165        tcp_tqueue_new_data(conn);
    174         tcp_conn_unlock(conn);
     166        fibril_mutex_unlock(&conn->lock);
    175167
    176168        return TCP_EOK;
     
    185177        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_receive()", conn->name);
    186178
    187         tcp_conn_lock(conn);
     179        fibril_mutex_lock(&conn->lock);
    188180
    189181        if (conn->cstate == st_closed) {
    190                 tcp_conn_unlock(conn);
     182                fibril_mutex_unlock(&conn->lock);
    191183                return TCP_ENOTEXIST;
    192184        }
     
    194186        /* Wait for data to become available */
    195187        while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) {
    196                 tcp_conn_unlock(conn);
    197                 return TCP_EAGAIN;
    198188                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data");
    199189                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock);
     
    206196                if (conn->rcv_buf_fin) {
    207197                        /* End of data, peer closed connection */
    208                         tcp_conn_unlock(conn);
     198                        fibril_mutex_unlock(&conn->lock);
    209199                        return TCP_ECLOSING;
    210200                } else {
    211201                        /* Connection was reset */
    212202                        assert(conn->reset);
    213                         tcp_conn_unlock(conn);
     203                        fibril_mutex_unlock(&conn->lock);
    214204                        return TCP_ERESET;
    215205                }
     
    236226            conn->name, xfer_size);
    237227
    238         tcp_conn_unlock(conn);
     228        fibril_mutex_unlock(&conn->lock);
    239229
    240230        return TCP_EOK;
     
    244234tcp_error_t tcp_uc_close(tcp_conn_t *conn)
    245235{
    246         log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close(%p)", conn->name,
    247             conn);
    248 
    249         tcp_conn_lock(conn);
     236        log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_uc_close()", conn->name);
     237
     238        fibril_mutex_lock(&conn->lock);
    250239
    251240        if (conn->cstate == st_closed) {
    252                 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ENOTEXIST");
    253                 tcp_conn_unlock(conn);
     241                fibril_mutex_unlock(&conn->lock);
    254242                return TCP_ENOTEXIST;
    255243        }
    256244
    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 
    264245        if (conn->snd_buf_fin) {
    265                 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - ECLOSING");
    266                 tcp_conn_unlock(conn);
     246                fibril_mutex_unlock(&conn->lock);
    267247                return TCP_ECLOSING;
    268248        }
    269249
    270         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - set snd_buf_fin");
    271250        conn->snd_buf_fin = true;
    272251        tcp_tqueue_new_data(conn);
    273252
    274         tcp_conn_unlock(conn);
     253        fibril_mutex_unlock(&conn->lock);
    275254        return TCP_EOK;
    276255}
     
    301280}
    302281
    303 void 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)",
     282void 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)",
    306285            conn, cb, arg);
    307286
    308         conn->cb = cb;
    309         conn->cb_arg = arg;
    310 }
    311 
    312 void *tcp_uc_get_userptr(tcp_conn_t *conn)
    313 {
    314         return conn->cb_arg;
     287        conn->cstate_cb = cb;
     288        conn->cstate_cb_arg = arg;
    315289}
    316290
     
    320294
    321295/** Segment arrived */
    322 void tcp_as_segment_arrived(inet_ep2_t *epp, tcp_segment_t *seg)
     296void tcp_as_segment_arrived(tcp_sockpair_t *sp, tcp_segment_t *seg)
    323297{
    324298        tcp_conn_t *conn;
     
    326300        log_msg(LOG_DEFAULT, LVL_DEBUG,
    327301            "tcp_as_segment_arrived(f:(%u), l:(%u))",
    328             epp->remote.port, epp->local.port);
    329 
    330         conn = tcp_conn_find_ref(epp);
     302            sp->foreign.port, sp->local.port);
     303
     304        conn = tcp_conn_find_ref(sp);
    331305        if (conn == NULL) {
    332306                log_msg(LOG_DEFAULT, LVL_WARN, "No connection found.");
    333                 tcp_unexpected_segment(epp, seg);
     307                tcp_unexpected_segment(sp, seg);
    334308                return;
    335309        }
    336310
    337         tcp_conn_segment_arrived(conn, epp, seg);
     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);
    338333        tcp_conn_delref(conn);
    339334}
Note: See TracChangeset for help on using the changeset viewer.