1 diff -ruN xtables-addons-1.47.1/extensions/libxt_DNETMAP.c xtables-addons-2.0/extensions/libxt_DNETMAP.c
2 --- xtables-addons-1.47.1/extensions/libxt_DNETMAP.c 2012-10-15 21:29:22.000000000 +0200
3 +++ xtables-addons-2.0/extensions/libxt_DNETMAP.c 2012-11-12 19:03:51.000000000 +0100
8 -static void DNETMAP_init(struct xt_entry_target *t)
10 - struct xt_DNETMAP_tginfo *tginfo = (void *)&t->data;
11 - struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
13 - /* Actually, it's 0, but it's ignored at the moment. */
19 /* Parses network address */
20 -static void parse_prefix(char *arg, struct nf_nat_ipv4_range *range)
21 +static void parse_prefix(char *arg, struct nf_nat_range *range)
24 const struct in_addr *ip;
27 xtables_error(PARAMETER_PROBLEM, "Bad IP address \"%s\"\n",
29 - range->min_ip = ip->s_addr;
30 + range->min_addr.in = *ip;
32 if (strchr(slash + 1, '.')) {
33 ip = xtables_numeric_to_ipmask(slash + 1);
38 - if (range->min_ip & ~netmask) {
39 + if (range->min_addr.ip & ~netmask) {
42 xtables_error(PARAMETER_PROBLEM, "Bad network address \"%s\"\n",
45 - range->max_ip = range->min_ip | ~netmask;
46 + range->max_addr.ip = range->min_addr.ip | ~netmask;
49 static int DNETMAP_parse(int c, char **argv, int invert, unsigned int *flags,
50 const void *entry, struct xt_entry_target **target)
52 struct xt_DNETMAP_tginfo *tginfo = (void *)(*target)->data;
53 - struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
54 + struct nf_nat_range *mr = &tginfo->prefix;
61 /* TO-DO use xtables_ipparse_any instead? */
62 - parse_prefix(optarg, &mr->range[0]);
63 + parse_prefix(optarg, mr);
64 *flags |= XT_DNETMAP_PREFIX;
65 tginfo->flags |= XT_DNETMAP_PREFIX;
70 struct xt_DNETMAP_tginfo *tginfo = (void *)&target->data;
71 - const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
72 - const struct nf_nat_ipv4_range *r = &mr->range[0];
73 + const struct nf_nat_range *r = &tginfo->prefix;
77 - a.s_addr = r->min_ip;
79 printf("%s", xtables_ipaddr_to_numeric(&a));
80 - a.s_addr = ~(r->min_ip ^ r->max_ip);
81 + a.s_addr = ~(r->min_addr.ip ^ r->max_addr.ip);
82 bits = netmask2bits(a.s_addr);
84 printf("/%s", xtables_ipaddr_to_numeric(&a));
86 .size = XT_ALIGN(sizeof(struct xt_DNETMAP_tginfo)),
87 .userspacesize = XT_ALIGN(sizeof(struct xt_DNETMAP_tginfo)),
89 - .init = DNETMAP_init,
90 .parse = DNETMAP_parse,
91 .print = DNETMAP_print,
93 diff -ruN xtables-addons-1.47.1/extensions/xt_DNETMAP.c xtables-addons-2.0/extensions/xt_DNETMAP.c
94 --- xtables-addons-1.47.1/extensions/xt_DNETMAP.c 2012-10-15 21:29:22.000000000 +0200
95 +++ xtables-addons-2.0/extensions/xt_DNETMAP.c 2012-11-12 19:03:51.000000000 +0100
99 struct dnetmap_prefix {
100 - struct nf_nat_ipv4_multi_range_compat prefix;
101 + struct nf_nat_range prefix;
103 #ifdef CONFIG_PROC_FS
104 char proc_str_data[20];
107 static struct dnetmap_prefix *
108 dnetmap_prefix_lookup(struct dnetmap_net *dnetmap_net,
109 - const struct nf_nat_ipv4_multi_range_compat *mr)
110 + const struct nf_nat_range *mr)
112 struct dnetmap_prefix *p;
116 struct dnetmap_net *dnetmap_net = dnetmap_pernet(par->net);
117 const struct xt_DNETMAP_tginfo *tginfo = par->targinfo;
118 - const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
119 + const struct nf_nat_range *mr = &tginfo->prefix;
120 struct dnetmap_prefix *p;
121 struct dnetmap_entry *e;
122 #ifdef CONFIG_PROC_FS
123 @@ -274,14 +263,10 @@
127 - if (!(mr->range[0].flags & NF_NAT_RANGE_MAP_IPS)) {
128 + if (!(mr->flags & NF_NAT_RANGE_MAP_IPS)) {
129 pr_debug("DNETMAP:check: bad MAP_IPS.\n");
132 - if (mr->rangesize != 1) {
133 - pr_debug("DNETMAP:check: bad rangesize %u.\n", mr->rangesize);
137 mutex_lock(&dnetmap_mutex);
138 p = dnetmap_prefix_lookup(dnetmap_net, mr);
139 @@ -307,15 +292,15 @@
140 INIT_LIST_HEAD(&p->lru_list);
141 INIT_LIST_HEAD(&p->elist);
143 - ip_min = ntohl(mr->range[0].min_ip) + (whole_prefix == 0);
144 - ip_max = ntohl(mr->range[0].max_ip) - (whole_prefix == 0);
145 + ip_min = ntohl(mr->min_addr.ip) + (whole_prefix == 0);
146 + ip_max = ntohl(mr->max_addr.ip) - (whole_prefix == 0);
148 - sprintf(p->prefix_str, NIPQUAD_FMT "/%u", NIPQUAD(mr->range[0].min_ip),
149 + sprintf(p->prefix_str, NIPQUAD_FMT "/%u", NIPQUAD(mr->min_addr.ip),
150 33 - ffs(~(ip_min ^ ip_max)));
151 #ifdef CONFIG_PROC_FS
152 - sprintf(p->proc_str_data, NIPQUAD_FMT "_%u", NIPQUAD(mr->range[0].min_ip),
153 + sprintf(p->proc_str_data, NIPQUAD_FMT "_%u", NIPQUAD(mr->min_addr.ip),
154 33 - ffs(~(ip_min ^ ip_max)));
155 - sprintf(p->proc_str_stat, NIPQUAD_FMT "_%u_stat", NIPQUAD(mr->range[0].min_ip),
156 + sprintf(p->proc_str_stat, NIPQUAD_FMT "_%u_stat", NIPQUAD(mr->min_addr.ip),
157 33 - ffs(~(ip_min ^ ip_max)));
159 printk(KERN_INFO KBUILD_MODNAME ": new prefix %s\n", p->prefix_str);
161 enum ip_conntrack_info ctinfo;
162 __be32 prenat_ip, postnat_ip, prenat_ip_prev;
163 const struct xt_DNETMAP_tginfo *tginfo = par->targinfo;
164 - const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
165 - struct nf_nat_ipv4_range newrange;
166 + const struct nf_nat_range *mr = &tginfo->prefix;
167 + struct nf_nat_range newrange;
168 struct dnetmap_entry *e;
169 struct dnetmap_prefix *p;
171 @@ -419,15 +404,14 @@
173 spin_unlock_bh(&dnetmap_lock);
175 - newrange = ((struct nf_nat_ipv4_range) {
176 - mr->range[0].flags | NF_NAT_RANGE_MAP_IPS,
177 - e->prenat_addr, e->prenat_addr,
178 - mr->range[0].min, mr->range[0].max});
180 - /* Hand modified range to generic setup. */
181 + memset(&newrange, 0, sizeof(newrange));
182 + newrange.flags = mr->flags | NF_NAT_RANGE_MAP_IPS;
183 + newrange.min_addr.ip = e->prenat_addr;
184 + newrange.max_addr.ip = e->prenat_addr;
185 + newrange.min_proto = mr->min_proto;
186 + newrange.max_proto = mr->max_proto;
187 return nf_nat_setup_info(ct, &newrange,
188 HOOK2MANIP(par->hooknum));
192 prenat_ip = ip_hdr(skb)->saddr;
193 @@ -509,12 +493,12 @@
195 spin_unlock_bh(&dnetmap_lock);
197 - newrange = ((struct nf_nat_ipv4_range) {
198 - mr->range[0].flags | NF_NAT_RANGE_MAP_IPS,
199 - postnat_ip, postnat_ip,
200 - mr->range[0].min, mr->range[0].max});
202 - /* Hand modified range to generic setup. */
203 + memset(&newrange, 0, sizeof(newrange));
204 + newrange.flags = mr->flags | NF_NAT_RANGE_MAP_IPS;
205 + newrange.min_addr.ip = postnat_ip;
206 + newrange.max_addr.ip = postnat_ip;
207 + newrange.min_proto = mr->min_proto;
208 + newrange.max_proto = mr->max_proto;
209 return nf_nat_setup_info(ct, &newrange, HOOK2MANIP(par->hooknum));
214 struct dnetmap_net *dnetmap_net = dnetmap_pernet(par->net);
215 const struct xt_DNETMAP_tginfo *tginfo = par->targinfo;
216 - const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix;
217 + const struct nf_nat_range *mr = &tginfo->prefix;
218 struct dnetmap_prefix *p;
220 if (!(tginfo->flags & XT_DNETMAP_PREFIX))
221 diff -ruN xtables-addons-1.47.1/extensions/xt_DNETMAP.h xtables-addons-2.0/extensions/xt_DNETMAP.h
222 --- xtables-addons-1.47.1/extensions/xt_DNETMAP.h 2012-10-15 21:29:22.000000000 +0200
223 +++ xtables-addons-2.0/extensions/xt_DNETMAP.h 2012-11-12 19:03:51.000000000 +0100
227 struct xt_DNETMAP_tginfo {
228 - struct nf_nat_ipv4_multi_range_compat prefix;
229 + struct nf_nat_range prefix;
233 diff -ruN xtables-addons-1.47.1/include/linux/netfilter/nf_nat.h xtables-addons-2.0/include/linux/netfilter/nf_nat.h
234 --- xtables-addons-1.47.1/include/linux/netfilter/nf_nat.h 2012-10-15 21:29:22.000000000 +0200
235 +++ xtables-addons-2.0/include/linux/netfilter/nf_nat.h 2012-11-12 19:03:51.000000000 +0100
237 struct nf_nat_ipv4_range range[1];
240 +struct nf_nat_range {
241 + unsigned int flags;
242 + union nf_inet_addr min_addr;
243 + union nf_inet_addr max_addr;
244 + union nf_conntrack_man_proto min_proto;
245 + union nf_conntrack_man_proto max_proto;
248 #endif /* _NETFILTER_NF_NAT_H */
249 diff -ruN xtables-addons-1.47.1/mconfig xtables-addons-2.0/mconfig
250 --- xtables-addons-1.47.1/mconfig 2012-10-15 21:29:22.000000000 +0200
251 +++ xtables-addons-2.0/mconfig 2012-11-12 19:03:51.000000000 +0100