netfilter: nf_ct_tcp: fix flow recovery with TCP window tracking enabled
[pandora-kernel.git] / net / netfilter / nf_conntrack_proto_tcp.c
index 802dbff..c4c885d 100644 (file)
@@ -585,8 +585,16 @@ static bool tcp_in_window(const struct nf_conn *ct,
                         * Let's try to use the data from the packet.
                         */
                        sender->td_end = end;
+                       win <<= sender->td_scale;
                        sender->td_maxwin = (win == 0 ? 1 : win);
                        sender->td_maxend = end + sender->td_maxwin;
+                       /*
+                        * We haven't seen traffic in the other direction yet
+                        * but we have to tweak window tracking to pass III
+                        * and IV until that happens.
+                        */
+                       if (receiver->td_maxwin == 0)
+                               receiver->td_end = receiver->td_maxend = sack;
                }
        } else if (((state->state == TCP_CONNTRACK_SYN_SENT
                     && dir == IP_CT_DIR_ORIGINAL)
@@ -680,7 +688,7 @@ static bool tcp_in_window(const struct nf_conn *ct,
                /*
                 * Update receiver data.
                 */
-               if (after(end, sender->td_maxend))
+               if (receiver->td_maxwin != 0 && after(end, sender->td_maxend))
                        receiver->td_maxwin += end - sender->td_maxend;
                if (after(sack + win, receiver->td_maxend - 1)) {
                        receiver->td_maxend = sack + win;