]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
SNAT/DNAT: add support for persistent multi-range NAT mappings
authorPatrick McHardy <kaber@trash.net>
Fri, 17 Apr 2009 16:11:09 +0000 (18:11 +0200)
committerPatrick McHardy <kaber@trash.net>
Fri, 17 Apr 2009 16:11:09 +0000 (18:11 +0200)
Add support for persistent mappings (2.6.29-rc2+) as replacement for the
removed SAME target.

Signed-off-by: Patrick McHardy <kaber@trash.net>
extensions/libipt_DNAT.c
extensions/libipt_SNAT.c
include/net/netfilter/nf_nat.h

index b5f8028c8073d2b175a634d27bdaef3cd219a2f1..dc79b4461e86b301858720ebe32df6e0db3b539e 100644 (file)
@@ -27,12 +27,13 @@ static void DNAT_help(void)
 "DNAT target options:\n"
 " --to-destination <ipaddr>[-<ipaddr>][:port-port]\n"
 "                              Address to map destination to.\n"
-"[--random]\n");
+"[--random] [--persistent]\n");
 }
 
 static const struct option DNAT_opts[] = {
        { "to-destination", 1, NULL, '1' },
        { "random", 0, NULL, '2' },
+       { "persistent", 0, NULL, '3' },
        { .name = NULL }
 };
 
@@ -178,6 +179,11 @@ static int DNAT_parse(int c, char **argv, int invert, unsigned int *flags,
                } else
                        *flags |= IPT_DNAT_OPT_RANDOM;
                return 1;
+
+       case '3':
+               info->mr.range[0].flags |= IP_NAT_RANGE_PERSISTENT;
+               return 1;
+
        default:
                return 0;
        }
@@ -222,6 +228,8 @@ static void DNAT_print(const void *ip, const struct xt_entry_target *target,
                printf(" ");
                if (info->mr.range[i].flags & IP_NAT_RANGE_PROTO_RANDOM)
                        printf("random ");
+               if (info->mr.range[i].flags & IP_NAT_RANGE_PERSISTENT)
+                       printf("persistent ");
        }
 }
 
@@ -236,6 +244,8 @@ static void DNAT_save(const void *ip, const struct xt_entry_target *target)
                printf(" ");
                if (info->mr.range[i].flags & IP_NAT_RANGE_PROTO_RANDOM)
                        printf("--random ");
+               if (info->mr.range[i].flags & IP_NAT_RANGE_PERSISTENT)
+                       printf("--persistent ");
        }
 }
 
index 944fe677652e917e96f2484c4370a5d795bb3b13..9609ad9b5c94af0bf926caf322e42d2f6b5c03e0 100644 (file)
@@ -27,12 +27,13 @@ static void SNAT_help(void)
 "SNAT target options:\n"
 " --to-source <ipaddr>[-<ipaddr>][:port-port]\n"
 "                              Address to map source to.\n"
-"[--random]\n");
+"[--random] [--persistent]\n");
 }
 
 static const struct option SNAT_opts[] = {
        { "to-source", 1, NULL, '1' },
        { "random", 0, NULL, '2' },
+       { "persistent", 0, NULL, '3' },
        { .name = NULL }
 };
 
@@ -179,6 +180,10 @@ static int SNAT_parse(int c, char **argv, int invert, unsigned int *flags,
                        *flags |= IPT_SNAT_OPT_RANDOM;
                return 1;
 
+       case '3':
+               info->mr.range[0].flags |= IP_NAT_RANGE_PERSISTENT;
+               return 1;
+
        default:
                return 0;
        }
@@ -223,6 +228,8 @@ static void SNAT_print(const void *ip, const struct xt_entry_target *target,
                printf(" ");
                if (info->mr.range[i].flags & IP_NAT_RANGE_PROTO_RANDOM)
                        printf("random ");
+               if (info->mr.range[i].flags & IP_NAT_RANGE_PERSISTENT)
+                       printf("persistent ");
        }
 }
 
@@ -237,6 +244,8 @@ static void SNAT_save(const void *ip, const struct xt_entry_target *target)
                printf(" ");
                if (info->mr.range[i].flags & IP_NAT_RANGE_PROTO_RANDOM)
                        printf("--random ");
+               if (info->mr.range[i].flags & IP_NAT_RANGE_PERSISTENT)
+                       printf("--persistent ");
        }
 }
 
index 094473e4bf148f4ae7bb96dd9b3298561b41abb2..c3e2060c730546468fb012441393942001a47abd 100644 (file)
@@ -18,6 +18,7 @@ enum nf_nat_manip_type
 #define IP_NAT_RANGE_MAP_IPS 1
 #define IP_NAT_RANGE_PROTO_SPECIFIED 2
 #define IP_NAT_RANGE_PROTO_RANDOM 4
+#define IP_NAT_RANGE_PERSISTENT 8
 
 /* NAT sequence number modifications */
 struct nf_nat_seq {