]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
nft: revert compat expressions in userdata
authorFlorian Westphal <fw@strlen.de>
Thu, 12 Feb 2026 17:03:54 +0000 (18:03 +0100)
committerFlorian Westphal <fw@strlen.de>
Fri, 13 Feb 2026 11:32:05 +0000 (12:32 +0100)
This reverts the following commits:

758cfe51968a ("configure: Auto-detect libz unless explicitly requested")
fdb541cddad0 ("tests: iptables-test: Add nft-compat variant")
7746fa0b1619 ("nft: Embed compat extensions in rule userdata")
ff5f6a208efc ("nft-ruleparse: Fallback to compat expressions in userdata")
f6f0f4f55794 ("nft: Introduce UDATA_TYPE_COMPAT_EXT")

The main intended user for '--compat' will likely go away. It is also
unlikely the 'iptables-only-emits-native-nft' will ever come to pass.

If there is ever a demand of iptables-to-native-nft that can list rules
even if decompilation step fails then we can always resurrect this again
if needed be.

Signed-off-by: Florian Westphal <fw@strlen.de>
19 files changed:
configure.ac
iptables-test.py
iptables/Makefile.am
iptables/arptables-nft.8
iptables/ebtables-nft.8
iptables/iptables-restore.8.in
iptables/iptables.8.in
iptables/nft-compat.c [deleted file]
iptables/nft-compat.h [deleted file]
iptables/nft-ruleparse.c
iptables/nft.c
iptables/nft.h
iptables/xshared.c
iptables/xshared.h
iptables/xtables-arp.c
iptables/xtables-eb.c
iptables/xtables-nft.8
iptables/xtables-restore.c
iptables/xtables.c

index 2a8abf21b98c5220c2741a5b6b1761e223fe5bfc..0106b3165a25c2a1eb410c54811d917cb10385cc 100644 (file)
@@ -77,15 +77,6 @@ AC_ARG_WITH([xt-lock-name], AS_HELP_STRING([--with-xt-lock-name=PATH],
 AC_ARG_ENABLE([profiling],
        AS_HELP_STRING([--enable-profiling], [build for use of gcov/gprof]),
        [enable_profiling="$enableval"], [enable_profiling="no"])
-AC_ARG_WITH([zlib], [AS_HELP_STRING([--without-zlib],
-           [Disable payload compression of rule compat expressions])],
-           [], [with_zlib=check])
-AS_IF([test "x$with_zlib" != xno], [
-       AC_CHECK_LIB([z], [compress], ,
-                   [if test "x$with_zlib" != xcheck; then
-                       AC_MSG_ERROR([No suitable version of zlib found])
-                    fi; with_zlib=no])
-])
 
 AC_MSG_CHECKING([whether $LD knows -Wl,--no-undefined])
 saved_LDFLAGS="$LDFLAGS";
@@ -298,7 +289,6 @@ Iptables Configuration:
   nftables support:                    ${enable_nftables}
   connlabel support:                   ${enable_connlabel}
   profiling support:                   ${enable_profiling}
-  compress rule compat expressions:    ${with_zlib/check/yes}
 
 Build parameters:
   Put plugins into executable (static):        ${enable_static}
index be47a6539965f97eb8d5fd32b4d641fa1d9c3920..66db552185bc348d6b7b315cf3857fb04ba7e2bf 100755 (executable)
@@ -613,8 +613,6 @@ def main():
                         help='Check for missing tests')
     parser.add_argument('-n', '--nftables', action='store_true',
                         help='Test iptables-over-nftables')
-    parser.add_argument('--compat', action='store_true',
-                        help='Test iptables-over-nftables in forced compat mode')
     parser.add_argument('-N', '--netns', action='store_const',
                         const='____iptables-container-test',
                         help='Test netnamespace path')
@@ -634,10 +632,8 @@ def main():
         variants.append("legacy")
     if args.nftables:
         variants.append("nft")
-    if args.compat:
-        variants.append("nft-compat")
     if len(variants) == 0:
-        variants = [ "legacy", "nft", "nft-compat" ]
+        variants = [ "legacy", "nft" ]
 
     if os.getuid() != 0:
         print("You need to be root to run this, sorry", file=sys.stderr)
@@ -656,14 +652,8 @@ def main():
     total_passed = 0
     total_tests = 0
     for variant in variants:
-
-        exec_infix = variant
-        if variant == "nft-compat":
-            os.putenv("XTABLES_COMPAT", "2")
-            exec_infix = "nft"
-
         global EXECUTABLE
-        EXECUTABLE = "xtables-" + exec_infix + "-multi"
+        EXECUTABLE = "xtables-" + variant + "-multi"
 
         test_files = 0
         tests = 0
index 4855c9a7c2911be173fcafb6f095eb73e935e058..2007cd10260bd7259bd0eec61f6c590732633853 100644 (file)
@@ -57,7 +57,6 @@ xtables_nft_multi_SOURCES += nft.c nft.h \
                             nft-ruleparse-arp.c nft-ruleparse-bridge.c \
                             nft-ruleparse-ipv4.c nft-ruleparse-ipv6.c \
                             nft-shared.c nft-shared.h \
-                            nft-compat.c nft-compat.h \
                             xtables-monitor.c \
                             xtables.c xtables-arp.c xtables-eb.c \
                             xtables-standalone.c xtables-eb-standalone.c \
index 8d1eb9fb651ed6c1c480d674c3bf3ba10d7c030f..c48a2cc2286baf2fb712fc124362eb31da9b2651 100644 (file)
@@ -234,18 +234,6 @@ counters of a rule (during
 .B APPEND,
 .B REPLACE
 operations).
-.TP
-.B --compat
-When creating a rule, attach compatibility data to the rule's userdata section
-for use as aid in parsing the rule by an older version of the program. The old
-version obviously needs to support this, though.
-Specifying this option a second time instructs the program to default to the
-rule's compatibility data when parsing, which is mostly useful for debugging or
-testing purposes.
-
-The \fBXTABLES_COMPAT\fP environment variable can be used to override the
-default setting. The expected value is a natural number representing the number
-of times \fB--compat\fP was specified.
 
 .SS RULE-SPECIFICATIONS
 The following command line arguments make up a rule specification (as used 
index 3088bb0cce36645dbfb441930f2e5d601645a1fb..8698165024de192cd9672706ccf7f1fa421924d1 100644 (file)
@@ -360,18 +360,6 @@ to try to automatically load missing kernel modules.
 .B --concurrent
 This would use a file lock to support concurrent scripts updating the ebtables
 kernel tables. It is not needed with \fBebtables-nft\fP though and thus ignored.
-.TP
-.B --compat
-When creating a rule, attach compatibility data to the rule's userdata section
-for use as aid in parsing the rule by an older version of the program. The old
-version obviously needs to support this, though.
-Specifying this option a second time instructs the program to default to the
-rule's compatibility data when parsing, which is mostly useful for debugging or
-testing purposes.
-
-The \fBXTABLES_COMPAT\fP environment variable can be used to override the
-default setting. The expected value is a natural number representing the number
-of times \fB--compat\fP was specified.
 
 .SS
 RULE SPECIFICATIONS
index abf8d6decc27531426689d7061394c05382f06d1..74ad3255b8e69b000978942bf1c462febfb58680 100644 (file)
@@ -88,18 +88,6 @@ determine the executable's path.
 .TP
 \fB\-T\fP, \fB\-\-table\fP \fIname\fP
 Restore only the named table even if the input stream contains other ones.
-.TP
-\fB\-\-compat\fP (nft-variants only)
-When creating a rule, attach compatibility data to the rule's userdata section
-for use as aid in parsing the rule by an older version of the program. The old
-version obviously needs to support this, though.
-Specifying this option a second time instructs the program to default to the
-rule's compatibility data when parsing, which is mostly useful for debugging or
-testing purposes.
-
-The \fBXTABLES_COMPAT\fP environment variable can be used to override the
-default setting. The expected value is a natural number representing the number
-of times \fB--compat\fP was specified.
 .SH BUGS
 None known as of iptables-1.2.1 release
 .SH AUTHORS
index 41c45a4a6e9918010b873d840d9b0e2879941854..21fb891dc6373fc1763f022a71c2d700165fae66 100644 (file)
@@ -397,18 +397,6 @@ corresponding to that rule's position in the chain.
 \fB\-\-modprobe=\fP\fIcommand\fP
 When adding or inserting rules into a chain, use \fIcommand\fP
 to load any necessary modules (targets, match extensions, etc).
-.TP
-\fB\-\-compat\fP (nft-variants only)
-When creating a rule, attach compatibility data to the rule's userdata section
-for use as aid in parsing the rule by an older version of the program. The old
-version obviously needs to support this, though.
-Specifying this option a second time instructs the program to default to the
-rule's compatibility data when parsing, which is mostly useful for debugging or
-testing purposes.
-
-The \fBXTABLES_COMPAT\fP environment variable can be used to override the
-default setting. The expected value is a natural number representing the number
-of times \fB--compat\fP was specified.
 
 .SH LOCK FILE
 iptables uses the \fI@XT_LOCK_NAME@\fP file to take an exclusive lock at
diff --git a/iptables/nft-compat.c b/iptables/nft-compat.c
deleted file mode 100644 (file)
index dfcc05b..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * (C) 2024 Red Hat GmbH
- * Author: Phil Sutter <phil@nwl.cc>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- */
-#include "config.h"
-#include "nft-compat.h"
-#include "nft-ruleparse.h"
-#include "nft.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <xtables.h>
-
-#ifdef HAVE_LIBZ
-#include <zlib.h>
-#endif
-
-#include <libnftnl/udata.h>
-
-int nftnl_rule_expr_count(const struct nftnl_rule *r)
-{
-       struct nftnl_expr_iter *iter = nftnl_expr_iter_create(r);
-       int cnt = 0;
-
-       if (!iter)
-               return -1;
-
-       while (nftnl_expr_iter_next(iter))
-               cnt++;
-
-       nftnl_expr_iter_destroy(iter);
-       return cnt;
-}
-
-static struct rule_udata_ext *
-rule_get_udata_ext(const struct nftnl_rule *r, uint32_t *outlen)
-{
-       const struct nftnl_udata *tb[UDATA_TYPE_MAX + 1] = {};
-       struct nftnl_udata_buf *udata;
-       uint32_t udatalen;
-
-       udata = (void *)nftnl_rule_get_data(r, NFTNL_RULE_USERDATA, &udatalen);
-       if (!udata)
-               return NULL;
-
-       if (nftnl_udata_parse(udata, udatalen, parse_udata_cb, tb) < 0)
-               return NULL;
-
-       if (!tb[UDATA_TYPE_COMPAT_EXT])
-               return NULL;
-
-       if (outlen)
-               *outlen = nftnl_udata_len(tb[UDATA_TYPE_COMPAT_EXT]);
-       return nftnl_udata_get(tb[UDATA_TYPE_COMPAT_EXT]);
-}
-
-static void
-pack_rule_udata_ext_data(struct rule_udata_ext *rue,
-                        const void *data, size_t datalen)
-{
-       size_t datalen_out = datalen;
-#ifdef HAVE_LIBZ
-       compress(rue->data, &datalen_out, data, datalen);
-       rue->flags |= RUE_FLAG_ZIP;
-#else
-       memcpy(rue->data, data, datalen);
-#endif
-       rue->size = datalen_out;
-}
-
-void rule_add_udata_ext(struct nft_handle *h, struct nftnl_rule *r,
-                       uint16_t start_idx, uint16_t end_idx,
-                       uint8_t flags, uint16_t size, const void *data)
-{
-       struct rule_udata_ext *ext = NULL;
-       uint32_t extlen = 0, newextlen;
-       char *newext;
-       void *udata;
-
-       if (!h->compat)
-               return;
-
-       ext = rule_get_udata_ext(r, &extlen);
-       if (!ext)
-               extlen = 0;
-
-       udata = nftnl_udata_buf_alloc(NFT_USERDATA_MAXLEN);
-       if (!udata)
-               xtables_error(OTHER_PROBLEM, "can't alloc memory!");
-
-       newextlen = sizeof(*ext) + size;
-       newext = xtables_malloc(extlen + newextlen);
-       if (extlen)
-               memcpy(newext, ext, extlen);
-       memset(newext + extlen, 0, newextlen);
-
-       ext = (struct rule_udata_ext *)(newext + extlen);
-       ext->start_idx  = start_idx;
-       ext->end_idx    = end_idx;
-       ext->flags      = flags;
-       ext->orig_size  = size;
-       pack_rule_udata_ext_data(ext, data, size);
-       newextlen = sizeof(*ext) + ext->size;
-
-       if (!nftnl_udata_put(udata, UDATA_TYPE_COMPAT_EXT,
-                            extlen + newextlen, newext) ||
-           nftnl_rule_set_data(r, NFTNL_RULE_USERDATA,
-                               nftnl_udata_buf_data(udata),
-                               nftnl_udata_buf_len(udata)))
-               xtables_error(OTHER_PROBLEM, "can't alloc memory!");
-
-       free(newext);
-       nftnl_udata_buf_free(udata);
-}
-
-static struct nftnl_expr *
-__nftnl_expr_from_udata_ext(struct rule_udata_ext *rue, const void *data)
-{
-       struct nftnl_expr *expr = NULL;
-
-       switch (rue->flags & RUE_FLAG_TYPE_BITS) {
-       case RUE_FLAG_MATCH_TYPE:
-               expr = nftnl_expr_alloc("match");
-               __add_match(expr, data);
-               break;
-       case RUE_FLAG_TARGET_TYPE:
-               expr = nftnl_expr_alloc("target");
-               __add_target(expr, data);
-               break;
-       default:
-               fprintf(stderr,
-                       "Warning: Unexpected udata extension type %d\n",
-                       rue->flags & RUE_FLAG_TYPE_BITS);
-       }
-
-       return expr;
-}
-
-static struct nftnl_expr *
-nftnl_expr_from_zipped_udata_ext(struct rule_udata_ext *rue)
-{
-#ifdef HAVE_LIBZ
-       uLongf datalen = rue->orig_size;
-       struct nftnl_expr *expr = NULL;
-       void *data;
-
-       data = xtables_malloc(datalen);
-       if (uncompress(data, &datalen, rue->data, rue->size) != Z_OK) {
-               fprintf(stderr, "Warning: Failed to uncompress rule udata extension\n");
-               goto out;
-       }
-
-       expr = __nftnl_expr_from_udata_ext(rue, data);
-out:
-       free(data);
-       return expr;
-#else
-       fprintf(stderr, "Warning: Zipped udata extensions are not supported.\n");
-       return NULL;
-#endif
-}
-
-static struct nftnl_expr *nftnl_expr_from_udata_ext(struct rule_udata_ext *rue)
-{
-       if (rue->flags & RUE_FLAG_ZIP)
-               return nftnl_expr_from_zipped_udata_ext(rue);
-       else
-               return __nftnl_expr_from_udata_ext(rue, rue->data);
-}
-
-bool rule_has_udata_ext(const struct nftnl_rule *r)
-{
-       return rule_get_udata_ext(r, NULL) != NULL;
-}
-
-#define rule_udata_ext_foreach(rue, ext, extlen)                       \
-       for (rue = (void *)(ext);                                       \
-            (char *)rue < (char *)(ext) + extlen;                      \
-            rue = (void *)((char *)rue + sizeof(*rue) + rue->size))
-
-bool rule_parse_udata_ext(struct nft_xt_ctx *ctx, const struct nftnl_rule *r)
-{
-       struct rule_udata_ext *rue;
-       struct nftnl_expr *expr;
-       uint32_t extlen;
-       bool ret = true;
-       int eidx = 0;
-       void *ext;
-
-       ext = rule_get_udata_ext(r, &extlen);
-       if (!ext)
-               return false;
-
-       rule_udata_ext_foreach(rue, ext, extlen) {
-               for (; eidx < rue->start_idx; eidx++) {
-                       expr = nftnl_expr_iter_next(ctx->iter);
-                       if (!nft_parse_rule_expr(ctx->h, expr, ctx))
-                               ret = false;
-               }
-
-               expr = nftnl_expr_from_udata_ext(rue);
-               if (!nft_parse_rule_expr(ctx->h, expr, ctx))
-                       ret = false;
-               nftnl_expr_free(expr);
-
-               for (; eidx < rue->end_idx; eidx++)
-                       nftnl_expr_iter_next(ctx->iter);
-       }
-       expr = nftnl_expr_iter_next(ctx->iter);
-       while (expr != NULL) {
-               if (!nft_parse_rule_expr(ctx->h, expr, ctx))
-                       ret = false;
-               expr = nftnl_expr_iter_next(ctx->iter);
-       }
-       return ret;
-}
-
diff --git a/iptables/nft-compat.h b/iptables/nft-compat.h
deleted file mode 100644 (file)
index 59b3c02..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef _NFT_COMPAT_H_
-#define _NFT_COMPAT_H_
-
-#include <libnftnl/rule.h>
-
-#include <linux/netfilter/x_tables.h>
-
-int nftnl_rule_expr_count(const struct nftnl_rule *r);
-
-enum rule_udata_ext_flags {
-       RUE_FLAG_MATCH_TYPE     = (1 << 0),
-       RUE_FLAG_TARGET_TYPE    = (1 << 1),
-       RUE_FLAG_ZIP            = (1 << 7),
-};
-#define RUE_FLAG_TYPE_BITS     (RUE_FLAG_MATCH_TYPE | RUE_FLAG_TARGET_TYPE)
-
-struct rule_udata_ext {
-       uint8_t start_idx;
-       uint8_t end_idx;
-       uint8_t flags;
-       uint16_t orig_size;
-       uint16_t size;
-       unsigned char data[];
-};
-
-struct nft_handle;
-
-void rule_add_udata_ext(struct nft_handle *h, struct nftnl_rule *r,
-                       uint16_t start_idx, uint16_t end_idx,
-                       uint8_t flags, uint16_t size, const void *data);
-static inline void
-rule_add_udata_match(struct nft_handle *h, struct nftnl_rule *r,
-                    uint16_t start_idx, uint16_t end_idx,
-                    const struct xt_entry_match *m)
-{
-       rule_add_udata_ext(h, r, start_idx, end_idx,
-                          RUE_FLAG_MATCH_TYPE, m->u.match_size, m);
-}
-
-static inline void
-rule_add_udata_target(struct nft_handle *h, struct nftnl_rule *r,
-                     uint16_t start_idx, uint16_t end_idx,
-                     const struct xt_entry_target *t)
-{
-       rule_add_udata_ext(h, r, start_idx, end_idx,
-                          RUE_FLAG_TARGET_TYPE, t->u.target_size, t);
-}
-
-struct nft_xt_ctx;
-
-bool rule_has_udata_ext(const struct nftnl_rule *r);
-bool rule_parse_udata_ext(struct nft_xt_ctx *ctx, const struct nftnl_rule *r);
-
-#endif /* _NFT_COMPAT_H_ */
index cdf1af4fab2774ddcebfebbb595a6c1d2974a728..757d3c29fc8166f2f14e320f80ae9445f4c07a24 100644 (file)
@@ -10,7 +10,6 @@
  * This code has been sponsored by Sophos Astaro <http://www.sophos.com>
  */
 
-#include "config.h"
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
@@ -28,7 +27,6 @@
 
 #include <xtables.h>
 
-#include "nft-compat.h"
 #include "nft-ruleparse.h"
 #include "nft.h"
 
@@ -950,21 +948,6 @@ bool nft_rule_to_iptables_command_state(struct nft_handle *h,
                        ret = false;
                expr = nftnl_expr_iter_next(ctx.iter);
        }
-       if ((!ret || h->compat > 1) && rule_has_udata_ext(r)) {
-               fprintf(stderr,
-                       "Warning: Rule parser failed, trying compat fallback\n");
-
-               h->ops->clear_cs(cs);
-               if (h->ops->init_cs)
-                       h->ops->init_cs(cs);
-
-               nftnl_expr_iter_destroy(ctx.iter);
-               ctx.iter = nftnl_expr_iter_create(r);
-               if (!ctx.iter)
-                       return false;
-
-               ret = rule_parse_udata_ext(&ctx, r);
-       }
 
        nftnl_expr_iter_destroy(ctx.iter);
 
index 85080a6dc9ba786282e5bfdaeba4038a6672d60b..220bd56dcf9ad60a66da9ad149dda4e75f440f3e 100644 (file)
@@ -9,7 +9,6 @@
  * This code has been sponsored by Sophos Astaro <http://www.sophos.com>
  */
 
-#include "config.h"
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/types.h>
@@ -61,7 +60,6 @@
 #include "nft-cache.h"
 #include "nft-shared.h"
 #include "nft-bridge.h" /* EBT_NOPROTO */
-#include "nft-compat.h"
 
 static void *nft_fn;
 
@@ -1048,11 +1046,9 @@ void __add_match(struct nftnl_expr *e, const struct xt_entry_match *m)
        nftnl_expr_set(e, NFTNL_EXPR_MT_INFO, info, m->u.match_size - sizeof(*m));
 }
 
-static int add_nft_limit(struct nft_handle *h, struct nftnl_rule *r,
-                        struct xt_entry_match *m)
+static int add_nft_limit(struct nftnl_rule *r, struct xt_entry_match *m)
 {
        struct xt_rateinfo *rinfo = (void *)m->data;
-       int i, ecnt = nftnl_rule_expr_count(r);
        static const uint32_t mult[] = {
                XT_LIMIT_SCALE*24*60*60,        /* day */
                XT_LIMIT_SCALE*60*60,           /* hour */
@@ -1060,8 +1056,7 @@ static int add_nft_limit(struct nft_handle *h, struct nftnl_rule *r,
                XT_LIMIT_SCALE,                 /* sec */
        };
        struct nftnl_expr *expr;
-
-       rule_add_udata_match(h, r, ecnt, ecnt + 1, m);
+       int i;
 
        expr = nftnl_expr_alloc("limit");
        if (!expr)
@@ -1376,7 +1371,6 @@ static bool udp_all_zero(const struct xt_udp *u)
 static int add_nft_udp(struct nft_handle *h, struct nftnl_rule *r,
                       struct xt_entry_match *m)
 {
-       int ret, ecnt = nftnl_rule_expr_count(r);
        struct xt_udp *udp = (void *)m->data;
 
        if (udp->invflags > XT_UDP_INV_MASK ||
@@ -1391,12 +1385,8 @@ static int add_nft_udp(struct nft_handle *h, struct nftnl_rule *r,
        if (nftnl_rule_get_u32(r, NFTNL_RULE_COMPAT_PROTO) != IPPROTO_UDP)
                xtables_error(PARAMETER_PROBLEM, "UDP match requires '-p udp'");
 
-       ret = add_nft_tcpudp(h, r, udp->spts, udp->invflags & XT_UDP_INV_SRCPT,
-                            udp->dpts, udp->invflags & XT_UDP_INV_DSTPT);
-
-       rule_add_udata_match(h, r, ecnt, nftnl_rule_expr_count(r), m);
-
-       return ret;
+       return add_nft_tcpudp(h, r, udp->spts, udp->invflags & XT_UDP_INV_SRCPT,
+                             udp->dpts, udp->invflags & XT_UDP_INV_DSTPT);
 }
 
 static int add_nft_tcpflags(struct nft_handle *h, struct nftnl_rule *r,
@@ -1433,7 +1423,6 @@ static int add_nft_tcp(struct nft_handle *h, struct nftnl_rule *r,
                       struct xt_entry_match *m)
 {
        static const uint8_t supported = XT_TCP_INV_SRCPT | XT_TCP_INV_DSTPT | XT_TCP_INV_FLAGS;
-       int ret, ecnt = nftnl_rule_expr_count(r);
        struct xt_tcp *tcp = (void *)m->data;
 
        if (tcp->invflags & ~supported || tcp->option ||
@@ -1449,27 +1438,23 @@ static int add_nft_tcp(struct nft_handle *h, struct nftnl_rule *r,
                xtables_error(PARAMETER_PROBLEM, "TCP match requires '-p tcp'");
 
        if (tcp->flg_mask) {
-               ret = add_nft_tcpflags(h, r, tcp->flg_cmp, tcp->flg_mask,
-                                      tcp->invflags & XT_TCP_INV_FLAGS);
+               int ret = add_nft_tcpflags(h, r, tcp->flg_cmp, tcp->flg_mask,
+                                          tcp->invflags & XT_TCP_INV_FLAGS);
 
                if (ret < 0)
                        return ret;
        }
 
-       ret = add_nft_tcpudp(h, r, tcp->spts, tcp->invflags & XT_TCP_INV_SRCPT,
-                            tcp->dpts, tcp->invflags & XT_TCP_INV_DSTPT);
-
-       rule_add_udata_match(h, r, ecnt, nftnl_rule_expr_count(r), m);
-
-       return ret;
+       return add_nft_tcpudp(h, r, tcp->spts, tcp->invflags & XT_TCP_INV_SRCPT,
+                             tcp->dpts, tcp->invflags & XT_TCP_INV_DSTPT);
 }
 
 static int add_nft_mark(struct nft_handle *h, struct nftnl_rule *r,
                        struct xt_entry_match *m)
 {
        struct xt_mark_mtinfo1 *mark = (void *)m->data;
-       int op, ecnt = nftnl_rule_expr_count(r);
        uint8_t reg;
+       int op;
 
        add_meta(h, r, NFT_META_MARK, &reg);
        if (mark->mask != 0xffffffff)
@@ -1482,8 +1467,6 @@ static int add_nft_mark(struct nft_handle *h, struct nftnl_rule *r,
 
        add_cmp_u32(r, mark->mark, op, reg);
 
-       rule_add_udata_match(h, r, ecnt, nftnl_rule_expr_count(r), m);
-
        return 0;
 }
 
@@ -1497,7 +1480,7 @@ int add_match(struct nft_handle *h, struct nft_rule_ctx *ctx,
        case NFT_COMPAT_RULE_INSERT:
        case NFT_COMPAT_RULE_REPLACE:
                if (!strcmp(m->u.user.name, "limit"))
-                       return add_nft_limit(h, r, m);
+                       return add_nft_limit(r, m);
                else if (!strcmp(m->u.user.name, "among"))
                        return add_nft_among(h, r, m);
                else if (!strcmp(m->u.user.name, "udp"))
@@ -1534,14 +1517,10 @@ void __add_target(struct nftnl_expr *e, const struct xt_entry_target *t)
        nftnl_expr_set(e, NFTNL_EXPR_TG_INFO, info, t->u.target_size - sizeof(*t));
 }
 
-static int add_meta_nftrace(struct nft_handle *h, struct nftnl_rule *r,
-                           struct xt_entry_target *t)
+static int add_meta_nftrace(struct nftnl_rule *r)
 {
-       int ecnt = nftnl_rule_expr_count(r);
        struct nftnl_expr *expr;
 
-       rule_add_udata_target(h, r, ecnt, ecnt + 2, t);
-
        expr = nftnl_expr_alloc("immediate");
        if (expr == NULL)
                return -ENOMEM;
@@ -1566,7 +1545,7 @@ int add_target(struct nft_handle *h, struct nftnl_rule *r,
        struct nftnl_expr *expr;
 
        if (strcmp(t->u.user.name, "TRACE") == 0)
-               return add_meta_nftrace(h, r, t);
+               return add_meta_nftrace(r);
 
        expr = nftnl_expr_alloc("target");
        if (expr == NULL)
@@ -1609,8 +1588,7 @@ int add_verdict(struct nftnl_rule *r, int verdict)
        return 0;
 }
 
-static int add_log(struct nft_handle *h, struct nftnl_rule *r,
-                  struct iptables_command_state *cs);
+static int add_log(struct nftnl_rule *r, struct iptables_command_state *cs);
 
 int add_action(struct nft_handle *h, struct nftnl_rule *r,
               struct iptables_command_state *cs, bool goto_set)
@@ -1627,7 +1605,7 @@ int add_action(struct nft_handle *h, struct nftnl_rule *r,
                else if (strcmp(cs->jumpto, XTC_LABEL_RETURN) == 0)
                        ret = add_verdict(r, NFT_RETURN);
                else if (strcmp(cs->jumpto, "NFLOG") == 0)
-                       ret = add_log(h, r, cs);
+                       ret = add_log(r, cs);
                else
                        ret = add_target(h, r, cs->target->t);
        } else if (strlen(cs->jumpto) > 0) {
@@ -1640,14 +1618,10 @@ int add_action(struct nft_handle *h, struct nftnl_rule *r,
        return ret;
 }
 
-static int add_log(struct nft_handle *h, struct nftnl_rule *r,
-                  struct iptables_command_state *cs)
+static int add_log(struct nftnl_rule *r, struct iptables_command_state *cs)
 {
        struct nftnl_expr *expr;
        struct xt_nflog_info *info = (struct xt_nflog_info *)cs->target->t->data;
-       int ecnt = nftnl_rule_expr_count(r);
-
-       rule_add_udata_target(h, r, ecnt, ecnt + 1, cs->target->t);
 
        expr = nftnl_expr_alloc("log");
        if (!expr)
@@ -1697,7 +1671,14 @@ int add_counters(struct nftnl_rule *r, uint64_t packets, uint64_t bytes)
        return 0;
 }
 
-int parse_udata_cb(const struct nftnl_udata *attr, void *data)
+enum udata_type {
+       UDATA_TYPE_COMMENT,
+       UDATA_TYPE_EBTABLES_POLICY,
+       __UDATA_TYPE_MAX,
+};
+#define UDATA_TYPE_MAX (__UDATA_TYPE_MAX - 1)
+
+static int parse_udata_cb(const struct nftnl_udata *attr, void *data)
 {
        unsigned char *value = nftnl_udata_get(attr);
        uint8_t type = nftnl_udata_type(attr);
@@ -1711,8 +1692,6 @@ int parse_udata_cb(const struct nftnl_udata *attr, void *data)
                break;
        case UDATA_TYPE_EBTABLES_POLICY:
                break;
-       case UDATA_TYPE_COMPAT_EXT:
-               break;
        default:
                return 0;
        }
@@ -4112,10 +4091,3 @@ void nft_assert_table_compatible(struct nft_handle *h,
                      "%s%s%stable `%s' is incompatible, use 'nft' tool.",
                      pfx, chain, sfx, table);
 }
-
-uint8_t compat_env_val(void)
-{
-       const char *val = getenv("XTABLES_COMPAT");
-
-       return val ? atoi(val) : 0;
-}
index 94d90bef44fb369504e8072798f9bab865e4bb36..9d648f15adf9287fa50d0d961afa7e4b480a4bae 100644 (file)
@@ -108,7 +108,6 @@ struct nft_handle {
        struct nft_cache_req    cache_req;
        bool                    restore;
        bool                    noflush;
-       uint8_t                 compat;
        int8_t                  config_done;
        struct list_head        cmd_list;
        bool                    cache_init;
@@ -278,18 +277,4 @@ void nft_assert_table_compatible(struct nft_handle *h,
 int ebt_set_user_chain_policy(struct nft_handle *h, const char *table,
                              const char *chain, const char *policy);
 
-struct nftnl_udata;
-
-enum udata_type {
-       UDATA_TYPE_COMMENT,
-       UDATA_TYPE_EBTABLES_POLICY,
-       UDATA_TYPE_COMPAT_EXT,
-       __UDATA_TYPE_MAX,
-};
-#define UDATA_TYPE_MAX (__UDATA_TYPE_MAX - 1)
-
-int parse_udata_cb(const struct nftnl_udata *attr, void *data);
-
-uint8_t compat_env_val(void);
-
 #endif
index fc61e0fd832bd9ee0b5f9cc2f8d98edff29f2873..b941b8dfd20f7c6105d29684ed1a81e1eabec83b 100644 (file)
@@ -1254,9 +1254,6 @@ void xtables_printhelp(struct iptables_command_state *cs)
                printf(
 "[!] --fragment        -f              match second or further fragments only\n");
 
-       if (strstr(xt_params->program_version, "nf_tables"))
-       printf(
-"  --compat                    append compatibility data to new rules\n");
        printf(
 "  --modprobe=<command>                try to insert modules using this command\n"
 "  --set-counters -c PKTS BYTES        set the counter during insert/append\n"
@@ -1921,10 +1918,6 @@ void do_parse(int argc, char *argv[],
 
                        exit_tryhelp(2, p->line);
 
-               case 20: /* --compat */
-                       p->compat++;
-                       break;
-
                case 1: /* non option */
                        if (optarg[0] == '!' && optarg[1] == '\0') {
                                if (invert)
index 9d2d6d9ffa29971ce90c144ab3f11af187a22707..af756738e7c440e4bf6ab3a7e98ab116c14d3a5e 100644 (file)
@@ -299,7 +299,6 @@ struct xt_cmd_parse {
        bool                            restore;
        int                             line;
        int                             verbose;
-       uint8_t                         compat;
        bool                            rule_ranges;
        struct xt_cmd_parse_ops         *ops;
 };
index fe45c370d21dbc2d93c31e621cc88cb587ebc786..71518a9cbdb6a14482f0772228fe93e1ffc3b75a 100644 (file)
@@ -78,7 +78,6 @@ static struct option original_opts[] = {
        { "line-numbers", 0, 0, '0' },
        { "modprobe", 1, 0, 'M' },
        { "set-counters", 1, 0, 'c' },
-       { "compat", 0, 0, 20 },
        { 0 }
 };
 
index 4beebfd68969ad3e3bf5736a8a2fdf31389de5ab..86c33b4e7dcb6600841fdaaf951f6cd7050c7944 100644 (file)
@@ -131,7 +131,6 @@ struct option ebt_original_options[] =
        { "init-table"     , no_argument      , 0, 11  },
        { "concurrent"     , no_argument      , 0, 13  },
        { "check"          , required_argument, 0, 14  },
-       { "compat"         , no_argument      , 0, 20  },
        { 0 }
 };
 
@@ -235,7 +234,6 @@ void nft_bridge_print_help(struct iptables_command_state *cs)
 "[!] --logical-out name[+]     : logical bridge output interface name\n"
 "--set-counters -c chain\n"
 "          pcnt bcnt           : set the counters of the to be added rule\n"
-"--compat                      : append compatibility data to new rules\n"
 "--modprobe -M program         : try to insert modules using this program\n"
 "--concurrent                  : use a file lock to support concurrent scripts\n"
 "--verbose -v                  : verbose mode\n"
@@ -564,7 +562,6 @@ int do_commandeb(struct nft_handle *h, int argc, char *argv[], char **table,
                .line           = line,
                .rule_ranges    = true,
                .ops            = &h->ops->cmd_parse,
-               .compat         = compat_env_val(),
        };
        int ret = 0;
 
@@ -574,7 +571,6 @@ int do_commandeb(struct nft_handle *h, int argc, char *argv[], char **table,
        do_parse(argc, argv, &p, &cs, &args);
 
        h->verbose      = p.verbose;
-       h->compat       = p.compat;
 
        t = nft_table_builtin_find(h, p.table);
        if (!t)
index 2ed67ba9d471c4c05d33c50756bb5f0e27105c29..ae54476c6cf87fb2c70f1d9da3626b5dcafd6f37 100644 (file)
@@ -100,17 +100,6 @@ When using \-j TRACE to debug packet traversal to the ruleset, note that you wil
 .B xtables\-monitor(8)
 in \-\-trace mode to obtain monitoring trace events.
 
-Some extensions are implemented via native nf_tables expressions instead of
-\fBnft_compat\fP module. This is transparent to the user as such parts of a
-rule are detected and parsed into an extension again before listing. Also,
-run-time behaviour is supposed to be identical. Implementing extensions this
-way is beneficial from a kernel maintainer's perspective as xtables extension
-modules may at some point become unused, so increasing extension conversion is
-to be expected. Since this may break older versions parsing the ruleset
-in-kernel (a possible scenario with containers sharing a network namespace),
-there is \fB--compat\fP flag which causes the replaced extensions to be
-appended to the rule in userdata storage for the parser to fall back to.
-
 .SH EXAMPLES
 One basic example is creating the skeleton ruleset in nf_tables from the
 xtables-nft tools, in a fresh machine:
index e7802b9e140bddb7199c1c6791837dcaf6ae42d5..23cd349819f4f5258054901c7a5807665beacbb7 100644 (file)
@@ -37,7 +37,6 @@ static const struct option options[] = {
        {.name = "ipv6",     .has_arg = false, .val = '6'},
        {.name = "wait",          .has_arg = 2, .val = 'w'},
        {.name = "wait-interval", .has_arg = 2, .val = 'W'},
-       {.name = "compat",   .has_arg = false, .val = 20 },
        {NULL},
 };
 
@@ -55,7 +54,6 @@ static void print_usage(const char *name, const char *version)
                        "          [ --noflush ]\n"
                        "          [ --table=<TABLE> ]\n"
                        "          [ --modprobe=<command> ]\n"
-                       "          [ --compat ]\n"
                        "          [ --ipv4 ]\n"
                        "          [ --ipv6 ]\n", name);
 }
@@ -286,7 +284,6 @@ void xtables_restore_parse(struct nft_handle *h,
 static int
 xtables_restore_main(int family, const char *progname, int argc, char *argv[])
 {
-       uint8_t compat = compat_env_val();
        struct nft_xt_restore_parse p = {
                .commit = true,
                .cb = &restore_cb,
@@ -340,9 +337,6 @@ xtables_restore_main(int family, const char *progname, int argc, char *argv[])
                                if (!optarg && xs_has_arg(argc, argv))
                                        optind++;
                                break;
-                       case 20:
-                               compat++;
-                               break;
                        default:
                                fprintf(stderr,
                                        "Try `%s -h' for more information.\n",
@@ -393,7 +387,6 @@ xtables_restore_main(int family, const char *progname, int argc, char *argv[])
        }
        h.noflush = noflush;
        h.restore = true;
-       h.compat  = compat;
 
        xtables_restore_parse(&h, &p);
 
@@ -426,13 +419,11 @@ static const struct nft_xt_restore_cb ebt_restore_cb = {
 static const struct option ebt_restore_options[] = {
        {.name = "noflush", .has_arg = 0, .val = 'n'},
        {.name = "verbose", .has_arg = 0, .val = 'v'},
-       {.name = "compat",  .has_arg = 0, .val = 20},
        { 0 }
 };
 
 int xtables_eb_restore_main(int argc, char *argv[])
 {
-       uint8_t compat = compat_env_val();
        struct nft_xt_restore_parse p = {
                .in = stdin,
                .cb = &ebt_restore_cb,
@@ -450,12 +441,9 @@ int xtables_eb_restore_main(int argc, char *argv[])
                case 'v':
                        verbose++;
                        break;
-               case 20: /* --compat */
-                       compat++;
-                       break;
                default:
                        fprintf(stderr,
-                               "Usage: ebtables-restore [ --verbose ] [ --noflush ] [ --compat ]\n");
+                               "Usage: ebtables-restore [ --verbose ] [ --noflush ]\n");
                        exit(1);
                        break;
                }
@@ -463,7 +451,6 @@ int xtables_eb_restore_main(int argc, char *argv[])
 
        nft_init_eb(&h, "ebtables-restore");
        h.noflush = noflush;
-       h.compat = compat;
        xtables_restore_parse(&h, &p);
        nft_fini_eb(&h);
 
index 7d540880da4710917faf029304aa4ebd9cee1ee0..5d73481c25761b1eaf2f329051d39bbff88c1929 100644 (file)
@@ -82,7 +82,6 @@ static struct option original_opts[] = {
        {.name = "goto",          .has_arg = 1, .val = 'g'},
        {.name = "ipv4",          .has_arg = 0, .val = '4'},
        {.name = "ipv6",          .has_arg = 0, .val = '6'},
-       {.name = "compat",        .has_arg = 0, .val = 20},
        {NULL},
 };
 
@@ -148,7 +147,6 @@ int do_commandx(struct nft_handle *h, int argc, char *argv[], char **table,
                .restore        = restore,
                .line           = line,
                .ops            = &h->ops->cmd_parse,
-               .compat         = compat_env_val(),
        };
        struct iptables_command_state cs = {
                .jumpto = "",
@@ -163,7 +161,6 @@ int do_commandx(struct nft_handle *h, int argc, char *argv[], char **table,
 
        do_parse(argc, argv, &p, &cs, &args);
        h->verbose = p.verbose;
-       h->compat  = p.compat;
 
        if (!nft_table_builtin_find(h, p.table))
                xtables_error(VERSION_PROBLEM,