SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to server: SEQ "
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
-
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->client, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
+ retransmission = 1;
}
if (TCP_GET_SEQ(p) != ssn->client.next_seq) {
return -1;
}
- StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
- SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
+ if (!retransmission) {
+ StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
+ SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
- ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->server, TCP_GET_ACK(p));
SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to client: SEQ "
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
-
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->server, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
+ retransmission = 1;
}
if (TCP_GET_SEQ(p) != ssn->server.next_seq) {
return -1;
}
- StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
- SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
+ if (!retransmission) {
+ StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
+ SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
- ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->client, TCP_GET_ACK(p));
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
- if (StreamTcpPacketIsRetransmission(&ssn->client, p)) {
+ int retransmission = 0;
+ if (StreamTcpPacketIsRetransmission(&ssn->client, p) == 1) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
+ retransmission = 1;
}
if (p->payload_len > 0 && (SEQ_LEQ((TCP_GET_SEQ(p) + p->payload_len), ssn->client.last_ack))) {
SCReturnInt(-1);
}
- ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ if (!retransmission) {
+ ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->server, TCP_GET_ACK(p));
SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to client: SEQ "
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
-
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->server, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
+ retransmission = 1;
}
if (p->payload_len > 0 && (SEQ_LEQ((TCP_GET_SEQ(p) + p->payload_len), ssn->server.last_ack))) {
SCReturnInt(-1);
}
- ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ if (!retransmission) {
+ ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->client, TCP_GET_ACK(p));
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->client, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
+ retransmission = 1;
}
if (TCP_GET_SEQ(p) != ssn->client.next_seq && TCP_GET_SEQ(p) != ssn->client.next_seq + 1) {
SCReturnInt(-1);
}
- StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
- SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
+ if (!retransmission) {
+ StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
+ SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
- ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->server, TCP_GET_ACK(p));
SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to server: SEQ "
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
-
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->client, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
- }
+ retransmission = 1;
- if (TCP_GET_SEQ(p) != ssn->client.next_seq && TCP_GET_SEQ(p) != ssn->client.next_seq+1) {
+ } else if (TCP_GET_SEQ(p) != ssn->client.next_seq && TCP_GET_SEQ(p) != ssn->client.next_seq+1) {
SCLogDebug("ssn %p: -> SEQ mismatch, packet SEQ %" PRIu32 ""
" != %" PRIu32 " from stream", ssn,
TCP_GET_SEQ(p), ssn->client.next_seq);
SCReturnInt(-1);
}
- StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
- SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
+ if (!retransmission) {
+ StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
+ SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
- ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->server, TCP_GET_ACK(p));
SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to client: SEQ "
"%" PRIu32 ", ACK %" PRIu32 "", ssn, p->payload_len,
TCP_GET_SEQ(p), TCP_GET_ACK(p));
-
+ int retransmission = 0;
if (StreamTcpPacketIsRetransmission(&ssn->server, p)) {
SCLogDebug("ssn %p: packet is retransmission", ssn);
- SCReturnInt(-1);
- }
-
- if (TCP_GET_SEQ(p) != ssn->server.next_seq && TCP_GET_SEQ(p) != ssn->server.next_seq+1) {
+ retransmission = 1;
+ } else if (TCP_GET_SEQ(p) != ssn->server.next_seq && TCP_GET_SEQ(p) != ssn->server.next_seq+1) {
if (p->payload_len > 0 && TCP_GET_SEQ(p) == ssn->server.last_ack) {
SCLogDebug("ssn %p: -> retransmission", ssn);
SCReturnInt(0);
SCReturnInt(-1);
}
- StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
- SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
+ if (!retransmission) {
+ StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
+ SCLogDebug("ssn %p: state changed to TCP_CLOSED", ssn);
- ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
+ }
StreamTcpUpdateLastAck(ssn, &ssn->client, TCP_GET_ACK(p));