]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: place byteorder conversion after numgen for IP address datatypes
authorJorge Ortiz <jorge.ortiz.escribano@gmail.com>
Mon, 28 Aug 2023 19:09:10 +0000 (21:09 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 1 Sep 2023 09:01:14 +0000 (11:01 +0200)
The numgen extension generates numbers in little-endian.
This can be very tricky when trying to combine it with IP addresses, which use big endian.
This change adds a new byteorder operation to convert data type endianness.

Before this patch:
$ sudo nft -d netlink add rule nat snat_chain snat to numgen inc mod 7 offset 0x0a000001
ip nat snat_chain
  [ numgen reg 1 = inc mod 7 offset 167772161 ]
  [ nat snat ip addr_min reg 1 ]

After this patch:
$ sudo nft -d netlink add rule nat snat_chain snat to numgen inc mod 7 offset 0x0a000001
ip nat snat_chain
  [ numgen reg 1 = inc mod 7 offset 167772161 ]
  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
  [ nat snat ip addr_min reg 1 ]

Regression tests have been modified to include these new cases.

Signed-off-by: Jorge Ortiz Escribano <jorge.ortiz.escribano@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
tests/py/ip/numgen.t
tests/py/ip/numgen.t.json
tests/py/ip/numgen.t.json.output
tests/py/ip/numgen.t.payload

index 4c23bba3fdb3a395a5902eaff0be36c3b31b1dbb..a7725f4e4c96cda0d9c872e42fa0feb4fe694259 100644 (file)
@@ -2832,6 +2832,10 @@ static int __stmt_evaluate_arg(struct eval_ctx *ctx, struct stmt *stmt,
                return byteorder_conversion(ctx, expr, byteorder);
        case EXPR_PREFIX:
                return stmt_prefix_conversion(ctx, expr, byteorder);
+       case EXPR_NUMGEN:
+               if (dtype->type == TYPE_IPADDR)
+                       return byteorder_conversion(ctx, expr, byteorder);
+               break;
        default:
                break;
        }
index 29a6a105a0e0c3d8d93ad49162f8ae82cae52af9..2a881460863493287b33aa69d5f6b28aa8f1d72e 100644 (file)
@@ -5,3 +5,5 @@ ct mark set numgen inc mod 2;ok
 ct mark set numgen inc mod 2 offset 100;ok
 dnat to numgen inc mod 2 map { 0 : 192.168.10.100, 1 : 192.168.20.200 };ok
 dnat to numgen inc mod 10 map { 0-5 : 192.168.10.100, 6-9 : 192.168.20.200};ok
+dnat to numgen inc mod 7 offset 167772161;ok
+dnat to numgen inc mod 255 offset 167772161;ok
index 9902c2cf905ef7fb7bf8b4648f2fabc87023d7ea..6cf6604147e3cff25d681522a8213d7b835e752d 100644 (file)
     }
 ]
 
+# dnat to numgen inc mod 7 offset 167772161
+[
+    {
+        "dnat": {
+            "addr": {
+                "numgen": {
+                    "mod": 7,
+                    "mode": "inc",
+                    "offset": 167772161
+                }
+            }
+        }
+    }
+]
+
+# dnat to numgen inc mod 255 offset 167772161
+[
+    {
+        "dnat": {
+            "addr": {
+                "numgen": {
+                    "mod": 255,
+                    "mode": "inc",
+                    "offset": 167772161
+                }
+            }
+        }
+    }
+]
+
index b54121ca0f721d688dc3259d7bb1efbe807908c3..06ad1eccae5cf9cb6d0cbbe5b8afe1641afa270a 100644 (file)
     }
 ]
 
+# dnat to numgen inc mod 7 offset 167772161
+[
+    {
+        "dnat": {
+            "addr": {
+                "numgen": {
+                    "mod": 7,
+                    "mode": "inc",
+                    "offset": 167772161
+                }
+            }
+        }
+    }
+]
+
+# dnat to numgen inc mod 255 offset 167772161
+[
+    {
+        "dnat": {
+            "addr": {
+                "numgen": {
+                    "mod": 255,
+                    "mode": "inc",
+                    "offset": 167772161
+                }
+            }
+        }
+    }
+]
+
index 3349c68b1d3136534b1f91fbe2bacb92e0352f1c..b4eadf857d13d430974b8227e1b7040b96a76554 100644 (file)
@@ -27,3 +27,14 @@ ip test-ip4 pre
   [ numgen reg 1 = inc mod 2 offset 100 ]
   [ ct set mark with reg 1 ]
 
+# dnat to numgen inc mod 7 offset 167772161
+ip test-ip4 pre
+  [ numgen reg 1 = inc mod 7 offset 167772161 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ nat dnat ip addr_min reg 1 ]
+
+# dnat to numgen inc mod 255 offset 167772161
+ip test-ip4 pre
+  [ numgen reg 1 = inc mod 255 offset 167772161 ]
+  [ byteorder reg 1 = hton(reg 1, 4, 4) ]
+  [ nat dnat ip addr_min reg 1 ]