Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2221008/?format=api
{ "id": 2221008, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2221008/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/patch/20260408170613.587902-5-aconole@redhat.com/", "project": { "id": 47, "url": "http://patchwork.ozlabs.org/api/1.1/projects/47/?format=api", "name": "Open vSwitch", "link_name": "openvswitch", "list_id": "ovs-dev.openvswitch.org", "list_email": "ovs-dev@openvswitch.org", "web_url": "http://openvswitch.org/", "scm_url": "git@github.com:openvswitch/ovs.git", "webscm_url": "https://github.com/openvswitch/ovs" }, "msgid": "<20260408170613.587902-5-aconole@redhat.com>", "date": "2026-04-08T17:06:00", "name": "[ovs-dev,RFC,04/12] conntrack-tcp: Convert to using the per-conn storage area.", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "e7a0b128b6f4f20e3bd0ef0a4d21bdb61c912de2", "submitter": { "id": 67184, "url": "http://patchwork.ozlabs.org/api/1.1/people/67184/?format=api", "name": "Aaron Conole", "email": "aconole@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/openvswitch/patch/20260408170613.587902-5-aconole@redhat.com/mbox/", "series": [ { "id": 499163, "url": "http://patchwork.ozlabs.org/api/1.1/series/499163/?format=api", "web_url": "http://patchwork.ozlabs.org/project/openvswitch/list/?series=499163", "date": "2026-04-08T17:05:56", "name": "ct-offload: Introduce a conntrack offload infrastructure.", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/499163/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2221008/comments/", "check": "success", "checks": "http://patchwork.ozlabs.org/api/patches/2221008/checks/", "tags": {}, "headers": { "Return-Path": "<ovs-dev-bounces@openvswitch.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "dev@openvswitch.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "ovs-dev@lists.linuxfoundation.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Xdj0rMAY;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)", "smtp2.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Xdj0rMAY", "smtp1.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com", "smtp1.osuosl.org;\n dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com\n header.a=rsa-sha256 header.s=mimecast20190719 header.b=Xdj0rMAY" ], "Received": [ "from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frTxx3GrGz1xv0\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 03:07:01 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id DAB1740833;\n\tWed, 8 Apr 2026 17:06:59 +0000 (UTC)", "from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id Ggpn__PnfCHW; Wed, 8 Apr 2026 17:06:58 +0000 (UTC)", "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp2.osuosl.org (Postfix) with ESMTPS id BD7FC40819;\n\tWed, 8 Apr 2026 17:06:58 +0000 (UTC)", "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id B1A82C054A;\n\tWed, 8 Apr 2026 17:06:58 +0000 (UTC)", "from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 1D488C054A\n for <dev@openvswitch.org>; Wed, 8 Apr 2026 17:06:57 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n by smtp1.osuosl.org (Postfix) with ESMTP id B5287825B9\n for <dev@openvswitch.org>; Wed, 8 Apr 2026 17:06:36 +0000 (UTC)", "from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id ecOcpzb0v1xf for <dev@openvswitch.org>;\n Wed, 8 Apr 2026 17:06:34 +0000 (UTC)", "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by smtp1.osuosl.org (Postfix) with ESMTPS id 92B2D826DF\n for <dev@openvswitch.org>; Wed, 8 Apr 2026 17:06:33 +0000 (UTC)", "from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-348-TaLT9Ev3Myu7KzF_XaZyHw-1; Wed,\n 08 Apr 2026 13:06:29 -0400", "from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 580D51956052; Wed, 8 Apr 2026 17:06:25 +0000 (UTC)", "from RHTRH0061144.redhat.com (unknown [10.22.89.172])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id B4FE43000203; Wed, 8 Apr 2026 17:06:23 +0000 (UTC)" ], "X-Virus-Scanned": [ "amavis at osuosl.org", "amavis at osuosl.org" ], "X-Comment": "SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ", "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 smtp2.osuosl.org BD7FC40819", "OpenDKIM Filter v2.11.0 smtp1.osuosl.org 92B2D826DF" ], "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=170.10.133.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=aconole@redhat.com;\n receiver=<UNKNOWN>", "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp1.osuosl.org 92B2D826DF", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775667992;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=0KZWW+/GJssnUCHrRkpga/1lhU2qSCopeBg5ghCippw=;\n b=Xdj0rMAYK1UHt0tghtIYNxUoDqCK09sN+xMWseD94HhO118AeUqqaRAHf7lHxQPpW0bUtF\n l6nZ98I8Z7gZtpOYM5sLwO+75xDp5OuR6SGyseoupJs486XMrRD7uekAT1E0tuTX7taV8X\n ArpLsPRyEi9oEs1gAWfde9Dp6bJAV5c=", "X-MC-Unique": "TaLT9Ev3Myu7KzF_XaZyHw-1", "X-Mimecast-MFC-AGG-ID": "TaLT9Ev3Myu7KzF_XaZyHw_1775667985", "To": "dev@openvswitch.org", "Date": "Wed, 8 Apr 2026 13:06:00 -0400", "Message-ID": "<20260408170613.587902-5-aconole@redhat.com>", "In-Reply-To": "<20260408170613.587902-1-aconole@redhat.com>", "References": "<20260408170613.587902-1-aconole@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.4", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "cdQQ7FsMJGObqCYNkGPmgDsjq88GP6UyhhtMvkS-oEg_1775667985", "X-Mimecast-Originator": "redhat.com", "Subject": "[ovs-dev] [RFC 04/12] conntrack-tcp: Convert to using the per-conn\n storage area.", "X-BeenThere": "ovs-dev@openvswitch.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "<ovs-dev.openvswitch.org>", "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>", "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>", "List-Post": "<mailto:ovs-dev@openvswitch.org>", "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>", "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>", "From": "Aaron Conole via dev <ovs-dev@openvswitch.org>", "Reply-To": "Aaron Conole <aconole@redhat.com>", "Cc": "Eli Britstein <elibr@nvidia.com>, Florian Westphal <fwestpha@redhat.com>,\n Flavio Leitner <fbl@redhat.com>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "ovs-dev-bounces@openvswitch.org", "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>" }, "content": "Refactored TCP module to use a new ct private storage area rather than\nan compatible extended conn struct so that future modules will have\naccess to the TCP state details. This will be needed when getting the\nactual tcp state of the connection for offload.\n\nSigned-off-by: Aaron Conole <aconole@redhat.com>\n---\n lib/automake.mk | 1 +\n lib/conntrack-tcp.c | 64 +++++++++++++++++++--------------------------\n lib/conntrack-tcp.h | 61 ++++++++++++++++++++++++++++++++++++++++++\n lib/conntrack.c | 2 ++\n 4 files changed, 91 insertions(+), 37 deletions(-)\n create mode 100644 lib/conntrack-tcp.h", "diff": "diff --git a/lib/automake.mk b/lib/automake.mk\nindex 933b71226b..027dd986ba 100644\n--- a/lib/automake.mk\n+++ b/lib/automake.mk\n@@ -90,6 +90,7 @@ lib_libopenvswitch_la_SOURCES = \\\n \tlib/conntrack-icmp.c \\\n \tlib/conntrack-private.h \\\n \tlib/conntrack-tcp.c \\\n+\tlib/conntrack-tcp.h \\\n \tlib/conntrack-tftp.c \\\n \tlib/conntrack-tp.c \\\n \tlib/conntrack-tp.h \\\ndiff --git a/lib/conntrack-tcp.c b/lib/conntrack-tcp.c\nindex 8a7c98cc45..696fd5c109 100644\n--- a/lib/conntrack-tcp.c\n+++ b/lib/conntrack-tcp.c\n@@ -3,6 +3,7 @@\n * Copyright (c) 2002 - 2008 Henning Brauer\n * Copyright (c) 2012 Gleb Smirnoff <glebius@FreeBSD.org>\n * Copyright (c) 2015, 2016 Nicira, Inc.\n+ * Copyright (c) 2026 Red Hat, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n@@ -39,6 +40,7 @@\n #include <config.h>\n \n #include \"conntrack-private.h\"\n+#include \"conntrack-tcp.h\"\n #include \"conntrack-tp.h\"\n #include \"coverage.h\"\n #include \"ct-dpif.h\"\n@@ -49,18 +51,7 @@ COVERAGE_DEFINE(conntrack_tcp_seq_chk_bypass);\n COVERAGE_DEFINE(conntrack_tcp_seq_chk_failed);\n COVERAGE_DEFINE(conntrack_invalid_tcp_flags);\n \n-struct tcp_peer {\n- uint32_t seqlo; /* Max sequence number sent */\n- uint32_t seqhi; /* Max the other end ACKd + win */\n- uint16_t max_win; /* largest window (pre scaling) */\n- uint8_t wscale; /* window scaling factor */\n- enum ct_dpif_tcp_state state;\n-};\n-\n-struct conn_tcp {\n- struct conn up;\n- struct tcp_peer peer[2]; /* 'conn' lock protected. */\n-};\n+ct_private_id_t conntrack_tcp_private_id = CT_PRIVATE_ID_INVALID;\n \n enum {\n TCPOPT_EOL,\n@@ -79,12 +70,6 @@ enum {\n #define SEQ_MIN(a, b) INT_MOD_MIN(a, b)\n #define SEQ_MAX(a, b) INT_MOD_MAX(a, b)\n \n-static struct conn_tcp*\n-conn_tcp_cast(const struct conn* conn)\n-{\n- return CONTAINER_OF(conn, struct conn_tcp, up);\n-}\n-\n /* pf does this in in pf_normalize_tcp(), and it is called only if scrub\n * is enabled. We're not scrubbing, but this check seems reasonable. */\n static bool\n@@ -113,9 +98,6 @@ tcp_invalid_flags(uint16_t flags)\n }\n \n #define TCP_MAX_WSCALE 14\n-#define CT_WSCALE_FLAG 0x80\n-#define CT_WSCALE_UNKNOWN 0x40\n-#define CT_WSCALE_MASK 0xf\n \n static uint8_t\n tcp_get_wscale(const struct tcp_header *tcp)\n@@ -164,7 +146,7 @@ static enum ct_update_res\n tcp_conn_update(struct conntrack *ct, struct conn *conn_,\n struct dp_packet *pkt, bool reply, long long now)\n {\n- struct conn_tcp *conn = conn_tcp_cast(conn_);\n+ struct conn_tcp_state *conn = conn_tcp_state_get(conn_);\n struct tcp_header *tcp = dp_packet_l4(pkt);\n /* The peer that sent 'pkt' */\n struct tcp_peer *src = &conn->peer[reply ? 1 : 0];\n@@ -189,7 +171,7 @@ tcp_conn_update(struct conntrack *ct, struct conn *conn_,\n return CT_UPDATE_NEW;\n } else if (src->state <= CT_DPIF_TCPS_SYN_SENT) {\n src->state = CT_DPIF_TCPS_SYN_SENT;\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_FIRST_PACKET, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_FIRST_PACKET, now);\n return CT_UPDATE_VALID_NEW;\n }\n }\n@@ -340,18 +322,18 @@ tcp_conn_update(struct conntrack *ct, struct conn *conn_,\n \n if (src->state >= CT_DPIF_TCPS_FIN_WAIT_2\n && dst->state >= CT_DPIF_TCPS_FIN_WAIT_2) {\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_CLOSED, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_CLOSED, now);\n } else if (src->state >= CT_DPIF_TCPS_CLOSING\n && dst->state >= CT_DPIF_TCPS_CLOSING) {\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_FIN_WAIT, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_FIN_WAIT, now);\n } else if (src->state < CT_DPIF_TCPS_ESTABLISHED\n || dst->state < CT_DPIF_TCPS_ESTABLISHED) {\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_OPENING, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_OPENING, now);\n } else if (src->state >= CT_DPIF_TCPS_CLOSING\n || dst->state >= CT_DPIF_TCPS_CLOSING) {\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_CLOSING, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_CLOSING, now);\n } else {\n- conn_update_expiration(ct, &conn->up, CT_TM_TCP_ESTABLISHED, now);\n+ conn_update_expiration(ct, conn_, CT_TM_TCP_ESTABLISHED, now);\n }\n } else if ((dst->state < CT_DPIF_TCPS_SYN_SENT\n || dst->state >= CT_DPIF_TCPS_FIN_WAIT_2\n@@ -439,15 +421,14 @@ static struct conn *\n tcp_new_conn(struct conntrack *ct, struct dp_packet *pkt, long long now,\n uint32_t tp_id)\n {\n- struct conn_tcp* newconn = NULL;\n struct tcp_header *tcp = dp_packet_l4(pkt);\n+ struct conn_tcp_state *tcp_state;\n struct tcp_peer *src, *dst;\n uint16_t tcp_flags = TCP_FLAGS(tcp->tcp_ctl);\n \n- newconn = xzalloc(sizeof *newconn);\n-\n- src = &newconn->peer[0];\n- dst = &newconn->peer[1];\n+ tcp_state = xzalloc(sizeof *tcp_state);\n+ src = &tcp_state->peer[0];\n+ dst = &tcp_state->peer[1];\n \n src->seqlo = ntohl(get_16aligned_be32(&tcp->tcp_seq));\n src->seqhi = src->seqlo + dp_packet_get_tcp_payload_length(pkt) + 1;\n@@ -473,10 +454,12 @@ tcp_new_conn(struct conntrack *ct, struct dp_packet *pkt, long long now,\n src->state = CT_DPIF_TCPS_SYN_SENT;\n dst->state = CT_DPIF_TCPS_CLOSED;\n \n- newconn->up.tp_id = tp_id;\n- conn_init_expiration(ct, &newconn->up, CT_TM_TCP_FIRST_PACKET, now);\n+ struct conn *newconn = xzalloc(sizeof *newconn);\n+ newconn->tp_id = tp_id;\n+ conn_private_set(newconn, conntrack_tcp_private_id, tcp_state);\n+ conn_init_expiration(ct, newconn, CT_TM_TCP_FIRST_PACKET, now);\n \n- return &newconn->up;\n+ return newconn;\n }\n \n static uint8_t\n@@ -499,7 +482,7 @@ static void\n tcp_conn_get_protoinfo(const struct conn *conn_,\n struct ct_dpif_protoinfo *protoinfo)\n {\n- const struct conn_tcp *conn = conn_tcp_cast(conn_);\n+ const struct conn_tcp_state *conn = conn_tcp_state_get(conn_);\n \n protoinfo->proto = IPPROTO_TCP;\n protoinfo->tcp.state_orig = conn->peer[0].state;\n@@ -518,3 +501,10 @@ struct ct_l4_proto ct_proto_tcp = {\n .conn_update = tcp_conn_update,\n .conn_get_protoinfo = tcp_conn_get_protoinfo,\n };\n+\n+\n+void\n+conntrack_tcp_init(void)\n+{\n+ conntrack_tcp_private_id = conn_private_id_alloc(free);\n+}\ndiff --git a/lib/conntrack-tcp.h b/lib/conntrack-tcp.h\nnew file mode 100644\nindex 0000000000..519993874c\n--- /dev/null\n+++ b/lib/conntrack-tcp.h\n@@ -0,0 +1,61 @@\n+/*\n+ * Copyright (c) 2026 Red Hat, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at:\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+#ifndef CONNTRACK_TCP_H\n+#define CONNTRACK_TCP_H\n+\n+#include \"conntrack.h\"\n+#include \"ct-dpif.h\"\n+\n+/* wscale field flags stored in tcp_peer.wscale. */\n+#define CT_WSCALE_FLAG 0x80 /* Negotiated window scaling is in use. */\n+#define CT_WSCALE_UNKNOWN 0x40 /* Scale factor not yet known. */\n+#define CT_WSCALE_MASK 0x0f /* Actual scale factor (0-14). */\n+\n+/* Per-direction TCP state tracked by the conntrack TCP module. */\n+struct tcp_peer {\n+ uint32_t seqlo; /* Max sequence number sent. */\n+ uint32_t seqhi; /* Max the other end ACKd + win. */\n+ uint16_t max_win; /* Largest window (pre-scaling). */\n+ uint8_t wscale; /* Window scaling factor + flags. */\n+ enum ct_dpif_tcp_state state;\n+};\n+\n+/* TCP-specific connection state stored in the conntrack private data slot.\n+ * Access via conn_tcp_state_get(). */\n+struct conn_tcp_state {\n+ struct tcp_peer peer[2]; /* peer[0]=original, peer[1]=reply. */\n+};\n+\n+/* Private slot ID for TCP state; valid after conntrack_tcp_init(). */\n+extern ct_private_id_t conntrack_tcp_private_id;\n+\n+/* Must be called once at module initialization before any connections are\n+ * created (called internally by conntrack_init()). */\n+void conntrack_tcp_init(void);\n+\n+/* Returns the TCP state for 'conn', or NULL if not a TCP connection or\n+ * conntrack_tcp_init() has not been called. */\n+static inline struct conn_tcp_state *\n+conn_tcp_state_get(const struct conn *conn)\n+{\n+ if (conntrack_tcp_private_id == CT_PRIVATE_ID_INVALID) {\n+ return NULL;\n+ }\n+ return conn_private_get(conn, conntrack_tcp_private_id);\n+}\n+\n+#endif /* CONNTRACK_TCP_H */\ndiff --git a/lib/conntrack.c b/lib/conntrack.c\nindex 462c0e0ad1..eab65e48f2 100644\n--- a/lib/conntrack.c\n+++ b/lib/conntrack.c\n@@ -24,6 +24,7 @@\n \n #include \"conntrack.h\"\n #include \"conntrack-private.h\"\n+#include \"conntrack-tcp.h\"\n #include \"conntrack-tp.h\"\n #include \"coverage.h\"\n #include \"crc32c.h\"\n@@ -223,6 +224,7 @@ conntrack_init(void)\n l4_protos[IPPROTO_ICMP] = &ct_proto_icmp4;\n l4_protos[IPPROTO_ICMPV6] = &ct_proto_icmp6;\n \n+ conntrack_tcp_init();\n conntrack_ftp_init();\n conntrack_tftp_init();\n \n", "prefixes": [ "ovs-dev", "RFC", "04/12" ] }