Changeset d9ce049 in mainline for uspace/srv/net/tl/tcp/state.c


Ignore:
Timestamp:
2011-10-04T20:40:05Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8c7a054
Parents:
32105348
Message:

Implement RECEIVE user call.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/state.c

    r32105348 rd9ce049  
    3535 */
    3636
     37#include <fibril_synch.h>
    3738#include <io/log.h>
    3839#include <macros.h>
     
    107108    xflags_t *xflags)
    108109{
     110        size_t xfer_size;
     111
    109112        log_msg(LVL_DEBUG, "tcp_uc_receive()");
     113
     114        fibril_mutex_lock(&conn->rcv_buf_lock);
     115
     116        /* Wait for data to become available */
     117        while (conn->rcv_buf_used == 0) {
     118                log_msg(LVL_DEBUG, "tcp_uc_receive() - wait for data");
     119                fibril_condvar_wait(&conn->rcv_buf_cv, &conn->rcv_buf_lock);
     120        }
     121
     122        /* Copy data from receive buffer to user buffer */
     123        xfer_size = min(size, conn->rcv_buf_used);
     124        memcpy(buf, conn->rcv_buf, xfer_size);
     125        *rcvd = xfer_size;
     126
     127        /* Remove data from receive buffer */
     128        memmove(conn->rcv_buf, conn->rcv_buf + xfer_size, conn->rcv_buf_used -
     129            xfer_size);
     130        conn->rcv_buf_used -= xfer_size;
     131        conn->rcv_wnd += xfer_size;
     132
     133        fibril_mutex_unlock(&conn->rcv_buf_lock);
     134
     135        /* TODO */
     136        *xflags = 0;
     137
     138        /* Send new size of receive window */
     139        tcp_tqueue_ctrl_seg(conn, CTL_ACK);
     140
     141        log_msg(LVL_DEBUG, "tcp_uc_receive() - returning %zu bytes",
     142            xfer_size);
    110143}
    111144
Note: See TracChangeset for help on using the changeset viewer.