return 0;
}
-/**
- * \internal
- *
- * \brief Find the highest sequence number needed to consider all segments as ACK'd
- *
- * Used to treat all segments as ACK'd upon receiving a valid RST.
- *
- * \param stream stream to inspect the segments from
- * \param seq sequence number to check against
- *
- * \retval ack highest ack we need to set
- */
-static inline uint32_t StreamTcpResetGetMaxAck(TcpStream *stream, uint32_t seq)
-{
- uint32_t ack = seq;
-
- if (STREAM_HAS_SEEN_DATA(stream)) {
- const uint32_t tail_seq = STREAM_SEQ_RIGHT_EDGE(stream);
- if (SEQ_GT(tail_seq, ack)) {
- ack = tail_seq;
- }
- }
-
- SCReturnUInt(ack);
-}
-
static bool StreamTcpPacketIsZeroWindowProbeAck(const TcpSession *ssn, const Packet *p)
{
const TCPHdr *tcph = PacketGetTCP(p);
ssn->client.window = window << ssn->client.wscale;
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, window));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
ssn->server.window = window << ssn->server.wscale;
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
if (PKT_IS_TOSERVER(p)) {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->server, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);
StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
- StreamTcpUpdateLastAck(
- ssn, &ssn->client, StreamTcpResetGetMaxAck(&ssn->client, ack));
+ StreamTcpUpdateLastAck(ssn, &ssn->client, ack);
- StreamTcpUpdateLastAck(ssn, &ssn->server, StreamTcpResetGetMaxAck(&ssn->server, seq));
+ StreamTcpUpdateLastAck(ssn, &ssn->server, seq);
if (ssn->flags & STREAMTCP_FLAG_TIMESTAMP) {
StreamTcpHandleTimestamp(ssn, p);