Changeset 8c7a054 in mainline for uspace/srv/net/tl/tcp/tqueue.c


Ignore:
Timestamp:
2011-10-21T15:25:43Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
32aea9f4
Parents:
d9ce049
Message:

FIN processing (WIP).

File:
1 edited

Legend:

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

    rd9ce049 r8c7a054  
    9292{
    9393        size_t avail_wnd;
     94        size_t xfer_seqlen;
     95        size_t snd_buf_seqlen;
    9496        size_t data_size;
     97        tcp_control_t ctrl;
     98
    9599        tcp_segment_t *seg;
    96100
     
    99103        /* Number of free sequence numbers in send window */
    100104        avail_wnd = (conn->snd_una + conn->snd_wnd) - conn->snd_nxt;
     105        snd_buf_seqlen = conn->snd_buf_used + (conn->snd_buf_fin ? 1 : 0);
    101106
    102         data_size = min(conn->snd_buf_used, avail_wnd);
    103         log_msg(LVL_DEBUG, "conn->snd_buf_used = %zu, SND.WND = %zu, "
    104             "data_size = %zu", conn->snd_buf_used, conn->snd_wnd, data_size);
     107        xfer_seqlen = min(snd_buf_seqlen, avail_wnd);
     108        log_msg(LVL_DEBUG, "snd_buf_seqlen = %zu, SND.WND = %zu, "
     109            "xfer_seqlen = %zu", snd_buf_seqlen, conn->snd_wnd,
     110            xfer_seqlen);
    105111
    106         if (data_size == 0)
     112        if (xfer_seqlen == 0)
    107113                return;
    108114
    109115        /* XXX Do not always send immediately */
    110116
    111         seg = tcp_segment_make_data(0, conn->snd_buf, data_size);
     117        data_size = xfer_seqlen - (conn->snd_buf_fin ? 1 : 0);
     118        if (conn->snd_buf_fin && data_size + 1 == xfer_seqlen) {
     119                /* We are sending out FIN */
     120                ctrl = CTL_FIN;
     121        } else {
     122                ctrl = 0;
     123        }
     124
     125        seg = tcp_segment_make_data(ctrl, conn->snd_buf, data_size);
    112126        if (seg == NULL) {
    113127                log_msg(LVL_ERROR, "Memory allocation failure.");
     
    119133            conn->snd_buf_used - data_size);
    120134        conn->snd_buf_used -= data_size;
     135        conn->snd_buf_fin = false;
    121136
    122137        tcp_tqueue_seg(conn, seg);
Note: See TracChangeset for help on using the changeset viewer.