Changeset 3819ce5 in mainline for uspace/srv


Ignore:
Timestamp:
2011-12-25T10:05:28Z (14 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ecf823a
Parents:
1440eae (diff), 7e1b130 (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 with mainline

Location:
uspace/srv/net/tl/tcp
Files:
3 edited

Legend:

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

    r1440eae r3819ce5  
    491491                    conn->snd_una, seg->ack, conn->snd_nxt);
    492492                if (!seq_no_ack_acceptable(conn, seg->ack)) {
    493                         log_msg(LVL_WARN, "ACK not acceptable, send RST.");
    494                         tcp_reply_rst(&conn->ident, seg);
     493                        if ((seg->ctrl & CTL_RST) == 0) {
     494                                log_msg(LVL_WARN, "ACK not acceptable, send RST");
     495                                tcp_reply_rst(&conn->ident, seg);
     496                        } else {
     497                                log_msg(LVL_WARN, "RST,ACK not acceptable, drop");
     498                        }
    495499                        return;
    496500                }
     
    498502
    499503        if ((seg->ctrl & CTL_RST) != 0) {
    500                 log_msg(LVL_DEBUG, "%s: Connection reset. -> Closed",
    501                     conn->name);
    502                 /* Reset connection */
    503                 tcp_conn_reset(conn);
    504                 /* XXX delete connection */
    505                 return;
     504                /* If we get here, we have either an acceptable ACK or no ACK */
     505                if ((seg->ctrl & CTL_ACK) != 0) {
     506                        log_msg(LVL_DEBUG, "%s: Connection reset. -> Closed",
     507                            conn->name);
     508                        /* Reset connection */
     509                        tcp_conn_reset(conn);
     510                        return;
     511                } else {
     512                        log_msg(LVL_DEBUG, "%s: RST without ACK, drop",
     513                            conn->name);
     514                        return;
     515                }
    506516        }
    507517
  • uspace/srv/net/tl/tcp/segment.c

    r1440eae r3819ce5  
    119119                return NULL;
    120120
    121         rseg->ctrl = CTL_RST;
    122         rseg->seq = seg->ack;
     121        if ((seg->ctrl & CTL_ACK) == 0) {
     122                rseg->ctrl = CTL_RST | CTL_ACK;
     123                rseg->seq = 0;
     124                rseg->ack = seg->seq + seg->len;
     125        } else {
     126                rseg->ctrl = CTL_RST;
     127                rseg->seq = seg->ack;
     128        }
    123129
    124130        return rseg;
  • uspace/srv/net/tl/tcp/tcp.c

    r1440eae r3819ce5  
    3636
    3737#include <async.h>
     38#include <bitops.h>
    3839#include <byteorder.h>
    3940#include <errno.h>
     
    191192        tcp_pdu_t *pdu;
    192193        size_t hdr_size;
    193 
    194         /* XXX Header options */
    195         hdr_size = sizeof(tcp_header_t);
     194        tcp_header_t *hdr;
     195        uint32_t data_offset;
     196
     197        if (pdu_raw_size < sizeof(tcp_header_t)) {
     198                log_msg(LVL_WARN, "pdu_raw_size = %zu < sizeof(tcp_header_t) = %zu",
     199                    pdu_raw_size, sizeof(tcp_header_t));
     200                pq_release_remote(net_sess, packet_get_id(packet));
     201                return EINVAL;
     202        }
     203
     204        hdr = (tcp_header_t *)pdu_raw;
     205        data_offset = BIT_RANGE_EXTRACT(uint32_t, DF_DATA_OFFSET_h, DF_DATA_OFFSET_l,
     206            uint16_t_be2host(hdr->doff_flags));
     207
     208        hdr_size = sizeof(uint32_t) * data_offset;
    196209
    197210        if (pdu_raw_size < hdr_size) {
    198211                log_msg(LVL_WARN, "pdu_raw_size = %zu < hdr_size = %zu",
    199212                    pdu_raw_size, hdr_size);
     213                pq_release_remote(net_sess, packet_get_id(packet));
     214                return EINVAL;
     215        }
     216
     217        if (hdr_size < sizeof(tcp_header_t)) {
     218                log_msg(LVL_WARN, "hdr_size = %zu < sizeof(tcp_header_t) = %zu",
     219                    hdr_size, sizeof(tcp_header_t));
    200220                pq_release_remote(net_sess, packet_get_id(packet));
    201221                return EINVAL;
Note: See TracChangeset for help on using the changeset viewer.