Changeset 048cd69 in mainline for uspace/srv/net/tcp/ucall.c


Ignore:
Timestamp:
2015-06-07T15:41:04Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
204ba47
Parents:
4d11204 (diff), c3f7d37 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge network transport layer API rewrite.

File:
1 edited

Legend:

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

    r4d11204 r048cd69  
    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
    7884        tcp_conn_lock(nconn);
    7985
     
    188194        /* Wait for data to become available */
    189195        while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) {
     196                tcp_conn_unlock(conn);
     197                return TCP_EAGAIN;
    190198                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data");
    191199                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock);
     
    250258                log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent");
    251259                tcp_conn_reset(conn);
    252                 tcp_conn_remove(conn);
    253260                tcp_conn_unlock(conn);
    254261                return TCP_EOK;
     
    294301}
    295302
    296 void 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)",
     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)",
    299306            conn, cb, arg);
    300307
    301         conn->cstate_cb = cb;
    302         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;
    303315}
    304316
     
    308320
    309321/** Segment arrived */
    310 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)
    311323{
    312324        tcp_conn_t *conn;
     
    314326        log_msg(LOG_DEFAULT, LVL_DEBUG,
    315327            "tcp_as_segment_arrived(f:(%u), l:(%u))",
    316             sp->foreign.port, sp->local.port);
    317 
    318         conn = tcp_conn_find_ref(sp);
     328            epp->remote.port, epp->local.port);
     329
     330        conn = tcp_conn_find_ref(epp);
    319331        if (conn == NULL) {
    320332                log_msg(LOG_DEFAULT, LVL_WARN, "No connection found.");
    321                 tcp_unexpected_segment(sp, seg);
     333                tcp_unexpected_segment(epp, seg);
    322334                return;
    323335        }
    324336
    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);
     337        tcp_conn_segment_arrived(conn, epp, seg);
    347338        tcp_conn_delref(conn);
    348339}
Note: See TracChangeset for help on using the changeset viewer.