Ignore:
File:
1 edited

Legend:

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

    r8499160 r5441670  
    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 
     76        nconn = tcp_conn_new(lsock, fsock);
     77        tcp_conn_add(nconn);
    8478        tcp_conn_lock(nconn);
    8579
     
    194188        /* Wait for data to become available */
    195189        while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) {
    196                 tcp_conn_unlock(conn);
    197                 return TCP_EAGAIN;
    198190                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data");
    199191                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock);
     
    258250                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent");
    259251                tcp_conn_reset(conn);
     252                tcp_conn_remove(conn);
    260253                tcp_conn_unlock(conn);
    261254                return TCP_EOK;
     
    301294}
    302295
    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)",
     296void tcp_uc_set_cstate_cb(tcp_conn_t *conn, tcp_cstate_cb_t cb, void *arg)
     297{
     298        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_ctate_cb(%p, %p, %p)",
    306299            conn, cb, arg);
    307300
    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;
     301        conn->cstate_cb = cb;
     302        conn->cstate_cb_arg = arg;
    315303}
    316304
     
    320308
    321309/** Segment arrived */
    322 void tcp_as_segment_arrived(inet_ep2_t *epp, tcp_segment_t *seg)
     310void tcp_as_segment_arrived(tcp_sockpair_t *sp, tcp_segment_t *seg)
    323311{
    324312        tcp_conn_t *conn;
     
    326314        log_msg(LOG_DEFAULT, LVL_DEBUG,
    327315            "tcp_as_segment_arrived(f:(%u), l:(%u))",
    328             epp->remote.port, epp->local.port);
    329 
    330         conn = tcp_conn_find_ref(epp);
     316            sp->foreign.port, sp->local.port);
     317
     318        conn = tcp_conn_find_ref(sp);
    331319        if (conn == NULL) {
    332320                log_msg(LOG_DEFAULT, LVL_WARN, "No connection found.");
    333                 tcp_unexpected_segment(epp, seg);
     321                tcp_unexpected_segment(sp, seg);
    334322                return;
    335323        }
    336324
    337         tcp_conn_segment_arrived(conn, epp, seg);
     325        tcp_conn_lock(conn);
     326
     327        if (conn->cstate == st_closed) {
     328                log_msg(LOG_DEFAULT, LVL_WARN, "Connection is closed.");
     329                tcp_unexpected_segment(sp, seg);
     330                tcp_conn_unlock(conn);
     331                tcp_conn_delref(conn);
     332                return;
     333        }
     334
     335        if (inet_addr_is_any(&conn->ident.foreign.addr))
     336                conn->ident.foreign.addr = sp->foreign.addr;
     337       
     338        if (conn->ident.foreign.port == TCP_PORT_ANY)
     339                conn->ident.foreign.port = sp->foreign.port;
     340       
     341        if (inet_addr_is_any(&conn->ident.local.addr))
     342                conn->ident.local.addr = sp->local.addr;
     343
     344        tcp_conn_segment_arrived(conn, seg);
     345
     346        tcp_conn_unlock(conn);
    338347        tcp_conn_delref(conn);
    339348}
Note: See TracChangeset for help on using the changeset viewer.