]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: remove legacy iptables patches 23749/head
authorQingfang Deng <dqfext@gmail.com>
Fri, 12 Jun 2026 08:30:02 +0000 (16:30 +0800)
committerMarkus Stockhausen <markus.stockhausen@gmx.de>
Wed, 17 Jun 2026 20:17:32 +0000 (22:17 +0200)
These patches were introduced 15 years ago by commit 19eaf1c5f78a to
speed up iptables match. We have been using fw4 and nftables for a long
time, so they are obsolete.

Signed-off-by: Qingfang Deng <dqfext@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23749
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
target/linux/generic/pending-6.12/610-netfilter_match_bypass_default_checks.patch [deleted file]
target/linux/generic/pending-6.12/611-netfilter_match_bypass_default_table.patch [deleted file]
target/linux/generic/pending-6.12/612-netfilter_match_reduce_memory_access.patch [deleted file]
target/linux/generic/pending-6.18/610-netfilter_match_bypass_default_checks.patch [deleted file]
target/linux/generic/pending-6.18/611-netfilter_match_bypass_default_table.patch [deleted file]
target/linux/generic/pending-6.18/612-netfilter_match_reduce_memory_access.patch [deleted file]

diff --git a/target/linux/generic/pending-6.12/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-6.12/610-netfilter_match_bypass_default_checks.patch
deleted file mode 100644 (file)
index fd22200..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/netfilter_ipv4/ip_tables.h |  1 +
- net/ipv4/netfilter/ip_tables.c                | 37 +++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+)
-
---- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
-@@ -89,6 +89,7 @@ struct ipt_ip {
- #define IPT_F_FRAG            0x01    /* Set if rule is a fragment rule */
- #define IPT_F_GOTO            0x02    /* Set if jump is a goto */
- #define IPT_F_MASK            0x03    /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH    0x80    /* Internal: no default match rules present */
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN                0x01    /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -48,6 +48,9 @@ ip_packet_match(const struct iphdr *ip,
- {
-       unsigned long ret;
-+      if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+              return true;
-+
-       if (NF_INVF(ipinfo, IPT_INV_SRCIP,
-                   (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
-           NF_INVF(ipinfo, IPT_INV_DSTIP,
-@@ -78,6 +81,29 @@ ip_packet_match(const struct iphdr *ip,
-       return true;
- }
-+static void
-+ip_checkdefault(struct ipt_ip *ip)
-+{
-+      static const char iface_mask[IFNAMSIZ] = {};
-+
-+      if (ip->invflags || ip->flags & IPT_F_FRAG)
-+              return;
-+
-+      if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)
-+              return;
-+
-+      if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)
-+              return;
-+
-+      if (ip->smsk.s_addr || ip->dmsk.s_addr)
-+              return;
-+
-+      if (ip->proto)
-+              return;
-+
-+      ip->flags |= IPT_F_NO_DEF_MATCH;
-+}
-+
- static bool
- ip_checkentry(const struct ipt_ip *ip)
- {
-@@ -523,6 +549,8 @@ find_check_entry(struct ipt_entry *e, st
-       struct xt_mtchk_param mtpar;
-       struct xt_entry_match *ematch;
-+      ip_checkdefault(&e->ip);
-+
-       if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
-               return -ENOMEM;
-@@ -817,6 +845,7 @@ copy_entries_to_user(unsigned int total_
-       const struct xt_table_info *private = table->private;
-       int ret = 0;
-       const void *loc_cpu_entry;
-+      u8 flags;
-       counters = alloc_counters(table);
-       if (IS_ERR(counters))
-@@ -844,6 +873,14 @@ copy_entries_to_user(unsigned int total_
-                       goto free_counters;
-               }
-+              flags = e->ip.flags & IPT_F_MASK;
-+              if (copy_to_user(userptr + off
-+                               + offsetof(struct ipt_entry, ip.flags),
-+                               &flags, sizeof(flags)) != 0) {
-+                      ret = -EFAULT;
-+                      goto free_counters;
-+              }
-+
-               for (i = sizeof(struct ipt_entry);
-                    i < e->target_offset;
-                    i += m->u.match_size) {
-@@ -1225,12 +1262,15 @@ compat_copy_entry_to_user(struct ipt_ent
-       compat_uint_t origsize;
-       const struct xt_entry_match *ematch;
-       int ret = 0;
-+      u8 flags = e->ip.flags & IPT_F_MASK;
-       origsize = *size;
-       ce = *dstptr;
-       if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||
-           copy_to_user(&ce->counters, &counters[i],
--          sizeof(counters[i])) != 0)
-+          sizeof(counters[i])) != 0 ||
-+          copy_to_user(&ce->ip.flags, &flags,
-+          sizeof(flags)) != 0)
-               return -EFAULT;
-       *dstptr += sizeof(struct compat_ipt_entry);
diff --git a/target/linux/generic/pending-6.12/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-6.12/611-netfilter_match_bypass_default_table.patch
deleted file mode 100644 (file)
index 9f0efe4..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: match bypass default table
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------
- 1 file changed, 58 insertions(+), 21 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -244,6 +244,33 @@ struct ipt_entry *ipt_next_entry(const s
-       return (void *)entry + entry->next_offset;
- }
-+static bool
-+ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)
-+{
-+      struct xt_entry_target *t;
-+      struct xt_standard_target *st;
-+
-+      if (e->target_offset != sizeof(struct ipt_entry))
-+              return false;
-+
-+      if (!(e->ip.flags & IPT_F_NO_DEF_MATCH))
-+              return false;
-+
-+      t = ipt_get_target(e);
-+      if (t->u.kernel.target->target)
-+              return false;
-+
-+      st = (struct xt_standard_target *) t;
-+      if (st->verdict == XT_RETURN)
-+              return false;
-+
-+      if (st->verdict >= 0)
-+              return false;
-+
-+      *verdict = (unsigned)(-st->verdict) - 1;
-+      return true;
-+}
-+
- /* Returns one of the generic firewall policies, like NF_ACCEPT. */
- unsigned int
- ipt_do_table(void *priv,
-@@ -265,27 +292,28 @@ ipt_do_table(void *priv,
-       unsigned int addend;
-       /* Initialization */
-+      WARN_ON(!(table->valid_hooks & (1 << hook)));
-+      local_bh_disable();
-+      private = READ_ONCE(table->private); /* Address dependency. */
-+      cpu        = smp_processor_id();
-+      table_base = private->entries;
-+
-+      e = get_entry(table_base, private->hook_entry[hook]);
-+      if (ipt_handle_default_rule(e, &verdict)) {
-+              struct xt_counters *counter;
-+
-+              counter = xt_get_this_cpu_counter(&e->counters);
-+              ADD_COUNTER(*counter, skb->len, 1);
-+              local_bh_enable();
-+              return verdict;
-+      }
-+
-       stackidx = 0;
-       ip = ip_hdr(skb);
-       indev = state->in ? state->in->name : nulldevname;
-       outdev = state->out ? state->out->name : nulldevname;
--      /* We handle fragments by dealing with the first fragment as
--       * if it was a normal packet.  All other fragments are treated
--       * normally, except that they will NEVER match rules that ask
--       * things we don't know, ie. tcp syn flag or ports).  If the
--       * rule is also a fragment-specific rule, non-fragments won't
--       * match it. */
--      acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
--      acpar.thoff   = ip_hdrlen(skb);
--      acpar.hotdrop = false;
--      acpar.state   = state;
--      WARN_ON(!(table->valid_hooks & (1 << hook)));
--      local_bh_disable();
-       addend = xt_write_recseq_begin();
--      private = READ_ONCE(table->private); /* Address dependency. */
--      cpu        = smp_processor_id();
--      table_base = private->entries;
-       jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
-       /* Switch to alternate jumpstack if we're being invoked via TEE.
-@@ -298,7 +326,16 @@ ipt_do_table(void *priv,
-       if (static_key_false(&xt_tee_enabled))
-               jumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated);
--      e = get_entry(table_base, private->hook_entry[hook]);
-+      /* We handle fragments by dealing with the first fragment as
-+       * if it was a normal packet.  All other fragments are treated
-+       * normally, except that they will NEVER match rules that ask
-+       * things we don't know, ie. tcp syn flag or ports).  If the
-+       * rule is also a fragment-specific rule, non-fragments won't
-+       * match it. */
-+      acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
-+      acpar.thoff   = ip_hdrlen(skb);
-+      acpar.hotdrop = false;
-+      acpar.state   = state;
-       do {
-               const struct xt_entry_target *t;
diff --git a/target/linux/generic/pending-6.12/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-6.12/612-netfilter_match_reduce_memory_access.patch
deleted file mode 100644 (file)
index 7f291fc..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: reduce match memory access
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -51,9 +51,9 @@ ip_packet_match(const struct iphdr *ip,
-       if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-               return true;
--      if (NF_INVF(ipinfo, IPT_INV_SRCIP,
-+      if (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr &&
-                   (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
--          NF_INVF(ipinfo, IPT_INV_DSTIP,
-+          NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr &&
-                   (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))
-               return false;
diff --git a/target/linux/generic/pending-6.18/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-6.18/610-netfilter_match_bypass_default_checks.patch
deleted file mode 100644 (file)
index fd22200..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/uapi/linux/netfilter_ipv4/ip_tables.h |  1 +
- net/ipv4/netfilter/ip_tables.c                | 37 +++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+)
-
---- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
-+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
-@@ -89,6 +89,7 @@ struct ipt_ip {
- #define IPT_F_FRAG            0x01    /* Set if rule is a fragment rule */
- #define IPT_F_GOTO            0x02    /* Set if jump is a goto */
- #define IPT_F_MASK            0x03    /* All possible flag bits mask. */
-+#define IPT_F_NO_DEF_MATCH    0x80    /* Internal: no default match rules present */
- /* Values for "inv" field in struct ipt_ip. */
- #define IPT_INV_VIA_IN                0x01    /* Invert the sense of IN IFACE. */
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -48,6 +48,9 @@ ip_packet_match(const struct iphdr *ip,
- {
-       unsigned long ret;
-+      if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-+              return true;
-+
-       if (NF_INVF(ipinfo, IPT_INV_SRCIP,
-                   (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
-           NF_INVF(ipinfo, IPT_INV_DSTIP,
-@@ -78,6 +81,29 @@ ip_packet_match(const struct iphdr *ip,
-       return true;
- }
-+static void
-+ip_checkdefault(struct ipt_ip *ip)
-+{
-+      static const char iface_mask[IFNAMSIZ] = {};
-+
-+      if (ip->invflags || ip->flags & IPT_F_FRAG)
-+              return;
-+
-+      if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)
-+              return;
-+
-+      if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)
-+              return;
-+
-+      if (ip->smsk.s_addr || ip->dmsk.s_addr)
-+              return;
-+
-+      if (ip->proto)
-+              return;
-+
-+      ip->flags |= IPT_F_NO_DEF_MATCH;
-+}
-+
- static bool
- ip_checkentry(const struct ipt_ip *ip)
- {
-@@ -523,6 +549,8 @@ find_check_entry(struct ipt_entry *e, st
-       struct xt_mtchk_param mtpar;
-       struct xt_entry_match *ematch;
-+      ip_checkdefault(&e->ip);
-+
-       if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
-               return -ENOMEM;
-@@ -817,6 +845,7 @@ copy_entries_to_user(unsigned int total_
-       const struct xt_table_info *private = table->private;
-       int ret = 0;
-       const void *loc_cpu_entry;
-+      u8 flags;
-       counters = alloc_counters(table);
-       if (IS_ERR(counters))
-@@ -844,6 +873,14 @@ copy_entries_to_user(unsigned int total_
-                       goto free_counters;
-               }
-+              flags = e->ip.flags & IPT_F_MASK;
-+              if (copy_to_user(userptr + off
-+                               + offsetof(struct ipt_entry, ip.flags),
-+                               &flags, sizeof(flags)) != 0) {
-+                      ret = -EFAULT;
-+                      goto free_counters;
-+              }
-+
-               for (i = sizeof(struct ipt_entry);
-                    i < e->target_offset;
-                    i += m->u.match_size) {
-@@ -1225,12 +1262,15 @@ compat_copy_entry_to_user(struct ipt_ent
-       compat_uint_t origsize;
-       const struct xt_entry_match *ematch;
-       int ret = 0;
-+      u8 flags = e->ip.flags & IPT_F_MASK;
-       origsize = *size;
-       ce = *dstptr;
-       if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||
-           copy_to_user(&ce->counters, &counters[i],
--          sizeof(counters[i])) != 0)
-+          sizeof(counters[i])) != 0 ||
-+          copy_to_user(&ce->ip.flags, &flags,
-+          sizeof(flags)) != 0)
-               return -EFAULT;
-       *dstptr += sizeof(struct compat_ipt_entry);
diff --git a/target/linux/generic/pending-6.18/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-6.18/611-netfilter_match_bypass_default_table.patch
deleted file mode 100644 (file)
index 8185a8b..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: match bypass default table
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------
- 1 file changed, 58 insertions(+), 21 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -244,6 +244,33 @@ struct ipt_entry *ipt_next_entry(const s
-       return (void *)entry + entry->next_offset;
- }
-+static bool
-+ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)
-+{
-+      struct xt_entry_target *t;
-+      struct xt_standard_target *st;
-+
-+      if (e->target_offset != sizeof(struct ipt_entry))
-+              return false;
-+
-+      if (!(e->ip.flags & IPT_F_NO_DEF_MATCH))
-+              return false;
-+
-+      t = ipt_get_target(e);
-+      if (t->u.kernel.target->target)
-+              return false;
-+
-+      st = (struct xt_standard_target *) t;
-+      if (st->verdict == XT_RETURN)
-+              return false;
-+
-+      if (st->verdict >= 0)
-+              return false;
-+
-+      *verdict = (unsigned)(-st->verdict) - 1;
-+      return true;
-+}
-+
- /* Returns one of the generic firewall policies, like NF_ACCEPT. */
- unsigned int
- ipt_do_table(void *priv,
-@@ -265,27 +292,28 @@ ipt_do_table(void *priv,
-       unsigned int addend;
-       /* Initialization */
-+      WARN_ON(!(table->valid_hooks & (1 << hook)));
-+      local_bh_disable();
-+      private = READ_ONCE(table->private); /* Address dependency. */
-+      cpu        = smp_processor_id();
-+      table_base = private->entries;
-+
-+      e = get_entry(table_base, private->hook_entry[hook]);
-+      if (ipt_handle_default_rule(e, &verdict)) {
-+              struct xt_counters *counter;
-+
-+              counter = xt_get_this_cpu_counter(&e->counters);
-+              ADD_COUNTER(*counter, skb->len, 1);
-+              local_bh_enable();
-+              return verdict;
-+      }
-+
-       stackidx = 0;
-       ip = ip_hdr(skb);
-       indev = state->in ? state->in->name : nulldevname;
-       outdev = state->out ? state->out->name : nulldevname;
--      /* We handle fragments by dealing with the first fragment as
--       * if it was a normal packet.  All other fragments are treated
--       * normally, except that they will NEVER match rules that ask
--       * things we don't know, ie. tcp syn flag or ports).  If the
--       * rule is also a fragment-specific rule, non-fragments won't
--       * match it. */
--      acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
--      acpar.thoff   = ip_hdrlen(skb);
--      acpar.hotdrop = false;
--      acpar.state   = state;
--      WARN_ON(!(table->valid_hooks & (1 << hook)));
--      local_bh_disable();
-       addend = xt_write_recseq_begin();
--      private = READ_ONCE(table->private); /* Address dependency. */
--      cpu        = smp_processor_id();
--      table_base = private->entries;
-       jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
-       /* Switch to alternate jumpstack if we're being invoked via TEE.
-@@ -298,7 +326,16 @@ ipt_do_table(void *priv,
-       if (static_key_false(&xt_tee_enabled))
-               jumpstack += private->stacksize * current->in_nf_duplicate;
--      e = get_entry(table_base, private->hook_entry[hook]);
-+      /* We handle fragments by dealing with the first fragment as
-+       * if it was a normal packet.  All other fragments are treated
-+       * normally, except that they will NEVER match rules that ask
-+       * things we don't know, ie. tcp syn flag or ports).  If the
-+       * rule is also a fragment-specific rule, non-fragments won't
-+       * match it. */
-+      acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
-+      acpar.thoff   = ip_hdrlen(skb);
-+      acpar.hotdrop = false;
-+      acpar.state   = state;
-       do {
-               const struct xt_entry_target *t;
diff --git a/target/linux/generic/pending-6.18/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-6.18/612-netfilter_match_reduce_memory_access.patch
deleted file mode 100644 (file)
index 7f291fc..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Subject: netfilter: reduce match memory access
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- net/ipv4/netfilter/ip_tables.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -51,9 +51,9 @@ ip_packet_match(const struct iphdr *ip,
-       if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
-               return true;
--      if (NF_INVF(ipinfo, IPT_INV_SRCIP,
-+      if (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr &&
-                   (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
--          NF_INVF(ipinfo, IPT_INV_DSTIP,
-+          NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr &&
-                   (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))
-               return false;