diff --git a/mtcp/src/tcp_in.c b/mtcp/src/tcp_in.c index 5d984a7e4..3c3079081 100644 --- a/mtcp/src/tcp_in.c +++ b/mtcp/src/tcp_in.c @@ -112,36 +112,31 @@ ValidateSequence(mtcp_manager_t mtcp, tcp_stream *cur_stream, uint32_t cur_ts, if (!tcph->rst && cur_stream->saw_timestamp) { struct tcp_timestamp ts; - if (!ParseTCPTimestamp(cur_stream, &ts, + if (ParseTCPTimestamp(cur_stream, &ts, (uint8_t *)tcph + TCP_HEADER_LEN, (tcph->doff << 2) - TCP_HEADER_LEN)) { - /* if there is no timestamp */ - /* TODO: implement here */ - TRACE_DBG("No timestamp found.\n"); - return FALSE; - } + /* RFC1323: if SEG.TSval < TS.Recent, drop and send ack */ + if (TCP_SEQ_LT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { + /* TODO: ts_recent should be invalidated + before timestamp wraparound for long idle flow */ + TRACE_DBG("PAWS Detect wrong timestamp. " + "seq: %u, ts_val: %u, prev: %u\n", + seq, ts.ts_val, cur_stream->rcvvar->ts_recent); + EnqueueACK(mtcp, cur_stream, cur_ts, ACK_OPT_NOW); + return FALSE; + } else { + /* valid timestamp */ + if (TCP_SEQ_GT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { + TRACE_TSTAMP("Timestamp update. cur: %u, prior: %u " + "(time diff: %uus)\n", + ts.ts_val, cur_stream->rcvvar->ts_recent, + TS_TO_USEC(cur_ts - cur_stream->rcvvar->ts_last_ts_upd)); + cur_stream->rcvvar->ts_last_ts_upd = cur_ts; + } - /* RFC1323: if SEG.TSval < TS.Recent, drop and send ack */ - if (TCP_SEQ_LT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { - /* TODO: ts_recent should be invalidated - before timestamp wraparound for long idle flow */ - TRACE_DBG("PAWS Detect wrong timestamp. " - "seq: %u, ts_val: %u, prev: %u\n", - seq, ts.ts_val, cur_stream->rcvvar->ts_recent); - EnqueueACK(mtcp, cur_stream, cur_ts, ACK_OPT_NOW); - return FALSE; - } else { - /* valid timestamp */ - if (TCP_SEQ_GT(ts.ts_val, cur_stream->rcvvar->ts_recent)) { - TRACE_TSTAMP("Timestamp update. cur: %u, prior: %u " - "(time diff: %uus)\n", - ts.ts_val, cur_stream->rcvvar->ts_recent, - TS_TO_USEC(cur_ts - cur_stream->rcvvar->ts_last_ts_upd)); - cur_stream->rcvvar->ts_last_ts_upd = cur_ts; + cur_stream->rcvvar->ts_recent = ts.ts_val; + cur_stream->rcvvar->ts_lastack_rcvd = ts.ts_ref; } - - cur_stream->rcvvar->ts_recent = ts.ts_val; - cur_stream->rcvvar->ts_lastack_rcvd = ts.ts_ref; } }