|
@@ -480,6 +480,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
|
|
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
|
|
struct ip_ct_tcp_state *receiver = &state->seen[!dir];
|
|
|
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
|
|
const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple;
|
|
|
__u32 seq, ack, sack, end, win, swin;
|
|
__u32 seq, ack, sack, end, win, swin;
|
|
|
|
|
+ u16 win_raw;
|
|
|
s32 receiver_offset;
|
|
s32 receiver_offset;
|
|
|
bool res, in_recv_win;
|
|
bool res, in_recv_win;
|
|
|
|
|
|
|
@@ -488,7 +489,8 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
|
|
*/
|
|
*/
|
|
|
seq = ntohl(tcph->seq);
|
|
seq = ntohl(tcph->seq);
|
|
|
ack = sack = ntohl(tcph->ack_seq);
|
|
ack = sack = ntohl(tcph->ack_seq);
|
|
|
- win = ntohs(tcph->window);
|
|
|
|
|
|
|
+ win_raw = ntohs(tcph->window);
|
|
|
|
|
+ win = win_raw;
|
|
|
end = segment_seq_plus_len(seq, skb->len, dataoff, tcph);
|
|
end = segment_seq_plus_len(seq, skb->len, dataoff, tcph);
|
|
|
|
|
|
|
|
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
|
|
if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
|
|
@@ -663,14 +665,14 @@ static bool tcp_in_window(const struct nf_conn *ct,
|
|
|
&& state->last_seq == seq
|
|
&& state->last_seq == seq
|
|
|
&& state->last_ack == ack
|
|
&& state->last_ack == ack
|
|
|
&& state->last_end == end
|
|
&& state->last_end == end
|
|
|
- && state->last_win == win)
|
|
|
|
|
|
|
+ && state->last_win == win_raw)
|
|
|
state->retrans++;
|
|
state->retrans++;
|
|
|
else {
|
|
else {
|
|
|
state->last_dir = dir;
|
|
state->last_dir = dir;
|
|
|
state->last_seq = seq;
|
|
state->last_seq = seq;
|
|
|
state->last_ack = ack;
|
|
state->last_ack = ack;
|
|
|
state->last_end = end;
|
|
state->last_end = end;
|
|
|
- state->last_win = win;
|
|
|
|
|
|
|
+ state->last_win = win_raw;
|
|
|
state->retrans = 0;
|
|
state->retrans = 0;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|