[PATCH 2/2 conntrackd] conntrackd: add TCP flag support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Back in 2008, there was no TCP flags support in the kernel, hence the
workaround was to infer the flags from the TCP state.

This patch is implicitly fixing a problem, since the existing RETRANS
and UNACK TCP conntrack states plus the _CLOSE_INIT flag that is bogusly
infered (to be frank, it was correctly infered back in 2008, but after
adding new TCP states, it was not).

Let's just use the flags that we get via synchronization messages.

Signed-off-by: Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx>
---
 src/netlink.c | 56 +++++++++++++++++++-------------------------------------
 1 file changed, 19 insertions(+), 37 deletions(-)

diff --git a/src/netlink.c b/src/netlink.c
index 189f55a47efb..ddf4cf496f9a 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -216,12 +216,26 @@ int nl_get_conntrack(struct nfct_handle *h, const struct nf_conntrack *ct)
 	return ret;
 }
 
+static void ctd_force_tcp_be_liberal(struct nf_conntrack *ct)
+{
+	int attrs[4] = { ATTR_TCP_FLAGS_ORIG, ATTR_TCP_MASK_ORIG,
+			 ATTR_TCP_FLAGS_REPL, ATTR_TCP_MASK_REPL };
+	unsigned int i;
+	uint8_t flags;
+
+	for (i = 0; i < ARRAY_SIZE(attrs); i++) {
+		flags = nfct_get_attr_u8(ct, attrs[i]);
+		nfct_set_attr_u8(ct, attrs[i],
+				 flags | IP_CT_TCP_FLAG_BE_LIBERAL);
+	}
+}
+
 int nl_create_conntrack(struct nfct_handle *h, 
 			const struct nf_conntrack *orig,
 			int timeout)
 {
-	int ret;
 	struct nf_conntrack *ct;
+	int ret;
 
 	ct = nfct_clone(orig);
 	if (ct == NULL)
@@ -240,24 +254,8 @@ int nl_create_conntrack(struct nfct_handle *h,
 	nfct_setobjopt(ct, NFCT_SOPT_SETUP_REPLY);
 
 	/* disable TCP window tracking for recovered connections if required */
-	if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) {
-		uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM;
-
-		if (!CONFIG(sync).tcp_window_tracking)
-			flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
-		else
-			flags |= IP_CT_TCP_FLAG_WINDOW_SCALE;
-
-		/* FIXME: workaround, we should send TCP flags in updates */
-		if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >=
-						TCP_CONNTRACK_TIME_WAIT) {
-			flags |= IP_CT_TCP_FLAG_CLOSE_INIT;
-		}
-		nfct_set_attr_u8(ct, ATTR_TCP_FLAGS_ORIG, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_MASK_ORIG, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_FLAGS_REPL, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_MASK_REPL, flags);
-	}
+	if (!CONFIG(sync).tcp_window_tracking)
+		ctd_force_tcp_be_liberal(ct);
 
 	ret = nfct_query(h, NFCT_Q_CREATE, ct);
 	nfct_destroy(ct);
@@ -307,24 +305,8 @@ int nl_update_conntrack(struct nfct_handle *h,
 	}
 
 	/* disable TCP window tracking for recovered connections if required */
-	if (nfct_attr_is_set(ct, ATTR_TCP_STATE)) {
-		uint8_t flags = IP_CT_TCP_FLAG_SACK_PERM;
-
-		if (!CONFIG(sync).tcp_window_tracking)
-			flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
-		else
-			flags |= IP_CT_TCP_FLAG_WINDOW_SCALE;
-
-		/* FIXME: workaround, we should send TCP flags in updates */
-		if (nfct_get_attr_u8(ct, ATTR_TCP_STATE) >=
-						TCP_CONNTRACK_TIME_WAIT) {
-			flags |= IP_CT_TCP_FLAG_CLOSE_INIT;
-		}
-		nfct_set_attr_u8(ct, ATTR_TCP_FLAGS_ORIG, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_MASK_ORIG, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_FLAGS_REPL, flags);
-		nfct_set_attr_u8(ct, ATTR_TCP_MASK_REPL, flags);
-	}
+	if (!CONFIG(sync).tcp_window_tracking)
+		ctd_force_tcp_be_liberal(ct);
 
 	ret = nfct_query(h, NFCT_Q_UPDATE, ct);
 	nfct_destroy(ct);
-- 
2.11.0

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux