};
 
 enum nf_ct_tcp_action {
+       NFCT_TCP_IGNORE,
        NFCT_TCP_INVALID,
        NFCT_TCP_ACCEPT,
 };
              const struct nf_hook_state *hook_state)
 {
        struct ip_ct_tcp *state = &ct->proto.tcp;
-       struct net *net = nf_ct_net(ct);
-       struct nf_tcp_net *tn = nf_tcp_pernet(net);
        struct ip_ct_tcp_state *sender = &state->seen[dir];
        struct ip_ct_tcp_state *receiver = &state->seen[!dir];
        __u32 seq, ack, sack, end, win, swin;
                        sender->td_end = end;
                        sender->flags |= IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED;
 
-                       nf_ct_l4proto_log_invalid(skb, ct, hook_state,
+                       return nf_tcp_log_invalid(skb, ct, hook_state, sender, NFCT_TCP_IGNORE,
                                                  "%u bytes more than expected", overshot);
-                       return NFCT_TCP_ACCEPT;
                }
 
                return nf_tcp_log_invalid(skb, ct, hook_state, sender, NFCT_TCP_INVALID,
        /* Is the ending sequence in the receive window (if available)? */
        in_recv_win = !receiver->td_maxwin ||
                      after(end, sender->td_end - receiver->td_maxwin - 1);
-
-       if (in_recv_win &&
-           after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1)) {
+       if (!in_recv_win)
+               return nf_tcp_log_invalid(skb, ct, hook_state, sender, NFCT_TCP_IGNORE,
+                                         "SEQ is under lower bound %u (already ACKed data retransmitted)",
+                                         sender->td_end - receiver->td_maxwin - 1);
+       if (!after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1))
+               return nf_tcp_log_invalid(skb, ct, hook_state, sender, NFCT_TCP_IGNORE,
+                                         "ignored ACK under lower bound %u (possible overly delayed)",
+                                         receiver->td_end - MAXACKWINDOW(sender) - 1);
+       if (1) {
                /*
                 * Take into account window scaling (RFC 1323).
                 */
                                state->retrans = 0;
                        }
                }
-       } else {
-               if (sender->flags & IP_CT_TCP_FLAG_BE_LIBERAL ||
-                   tn->tcp_be_liberal)
-                       return NFCT_TCP_ACCEPT;
-
-               {
-                       nf_ct_l4proto_log_invalid(skb, ct, hook_state,
-                       "%s",
-                       before(seq, sender->td_maxend + 1) ?
-                       in_recv_win ?
-                       before(sack, receiver->td_end + 1) ?
-                       after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG"
-                       : "ACK is under the lower bound (possible overly delayed ACK)"
-                       : "ACK is over the upper bound (ACKed data not seen yet)"
-                       : "SEQ is under the lower bound (already ACKed data retransmitted)"
-                       : "SEQ is over the upper bound (over the window of the receiver)");
-               }
-
-               return NFCT_TCP_INVALID;
        }
 
        return NFCT_TCP_ACCEPT;
        struct nf_conntrack_tuple *tuple;
        enum tcp_conntrack new_state, old_state;
        unsigned int index, *timeouts;
+       enum nf_ct_tcp_action res;
        enum ip_conntrack_dir dir;
        const struct tcphdr *th;
        struct tcphdr _tcph;
                break;
        }
 
-       if (!tcp_in_window(ct, dir, index,
-                          skb, dataoff, th, state)) {
+       res = tcp_in_window(ct, dir, index,
+                           skb, dataoff, th, state);
+       switch (res) {
+       case NFCT_TCP_IGNORE:
+               spin_unlock_bh(&ct->lock);
+               return NF_ACCEPT;
+       case NFCT_TCP_INVALID:
                spin_unlock_bh(&ct->lock);
                return -NF_ACCEPT;
+       case NFCT_TCP_ACCEPT:
+               break;
        }
      in_window:
        /* From now on we have got in-window packets */