From 0d8b39198edca49ba946fc7c83c97ec839d713e7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Wed, 19 Dec 2012 13:08:04 +0100 Subject: [PATCH] - updated to 1.47.1 with a fix for DNETMAP for linux 3.7 --- xtables-addons-DNETMAP.patch | 271 +++++++++++++++++++++++++++++++++++ xtables-addons.spec | 8 +- 2 files changed, 276 insertions(+), 3 deletions(-) create mode 100644 xtables-addons-DNETMAP.patch diff --git a/xtables-addons-DNETMAP.patch b/xtables-addons-DNETMAP.patch new file mode 100644 index 0000000..f64c20b --- /dev/null +++ b/xtables-addons-DNETMAP.patch @@ -0,0 +1,271 @@ +diff -ruN xtables-addons-1.47.1/extensions/libxt_DNETMAP.c xtables-addons-2.0/extensions/libxt_DNETMAP.c +--- xtables-addons-1.47.1/extensions/libxt_DNETMAP.c 2012-10-15 21:29:22.000000000 +0200 ++++ xtables-addons-2.0/extensions/libxt_DNETMAP.c 2012-11-12 19:03:51.000000000 +0100 +@@ -69,19 +69,8 @@ + return bits; + } + +-static void DNETMAP_init(struct xt_entry_target *t) +-{ +- struct xt_DNETMAP_tginfo *tginfo = (void *)&t->data; +- struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; +- +- /* Actually, it's 0, but it's ignored at the moment. */ +- mr->rangesize = 1; +- tginfo->ttl = 0; +- tginfo->flags = 0; +-} +- + /* Parses network address */ +-static void parse_prefix(char *arg, struct nf_nat_ipv4_range *range) ++static void parse_prefix(char *arg, struct nf_nat_range *range) + { + char *slash; + const struct in_addr *ip; +@@ -97,7 +86,7 @@ + if (ip == NULL) + xtables_error(PARAMETER_PROBLEM, "Bad IP address \"%s\"\n", + arg); +- range->min_ip = ip->s_addr; ++ range->min_addr.in = *ip; + if (slash) { + if (strchr(slash + 1, '.')) { + ip = xtables_numeric_to_ipmask(slash + 1); +@@ -123,20 +112,20 @@ + } else + netmask = ~0; + +- if (range->min_ip & ~netmask) { ++ if (range->min_addr.ip & ~netmask) { + if (slash) + *slash = '/'; + xtables_error(PARAMETER_PROBLEM, "Bad network address \"%s\"\n", + arg); + } +- range->max_ip = range->min_ip | ~netmask; ++ range->max_addr.ip = range->min_addr.ip | ~netmask; + } + + static int DNETMAP_parse(int c, char **argv, int invert, unsigned int *flags, + const void *entry, struct xt_entry_target **target) + { + struct xt_DNETMAP_tginfo *tginfo = (void *)(*target)->data; +- struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; ++ struct nf_nat_range *mr = &tginfo->prefix; + char *end; + + switch (c) { +@@ -147,7 +136,7 @@ + invert); + + /* TO-DO use xtables_ipparse_any instead? */ +- parse_prefix(optarg, &mr->range[0]); ++ parse_prefix(optarg, mr); + *flags |= XT_DNETMAP_PREFIX; + tginfo->flags |= XT_DNETMAP_PREFIX; + return 1; +@@ -192,14 +181,13 @@ + int numeric) + { + struct xt_DNETMAP_tginfo *tginfo = (void *)&target->data; +- const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; +- const struct nf_nat_ipv4_range *r = &mr->range[0]; ++ const struct nf_nat_range *r = &tginfo->prefix; + struct in_addr a; + int bits; + +- a.s_addr = r->min_ip; ++ a = r->min_addr.in; + printf("%s", xtables_ipaddr_to_numeric(&a)); +- a.s_addr = ~(r->min_ip ^ r->max_ip); ++ a.s_addr = ~(r->min_addr.ip ^ r->max_addr.ip); + bits = netmask2bits(a.s_addr); + if (bits < 0) + printf("/%s", xtables_ipaddr_to_numeric(&a)); +@@ -265,7 +253,6 @@ + .size = XT_ALIGN(sizeof(struct xt_DNETMAP_tginfo)), + .userspacesize = XT_ALIGN(sizeof(struct xt_DNETMAP_tginfo)), + .help = DNETMAP_help, +- .init = DNETMAP_init, + .parse = DNETMAP_parse, + .print = DNETMAP_print, + .save = DNETMAP_save, +diff -ruN xtables-addons-1.47.1/extensions/xt_DNETMAP.c xtables-addons-2.0/extensions/xt_DNETMAP.c +--- xtables-addons-1.47.1/extensions/xt_DNETMAP.c 2012-10-15 21:29:22.000000000 +0200 ++++ xtables-addons-2.0/extensions/xt_DNETMAP.c 2012-11-12 19:03:51.000000000 +0100 +@@ -84,7 +78,7 @@ + }; + + struct dnetmap_prefix { +- struct nf_nat_ipv4_multi_range_compat prefix; ++ struct nf_nat_range prefix; + char prefix_str[16]; + #ifdef CONFIG_PROC_FS + char proc_str_data[20]; +@@ -179,7 +168,7 @@ + + static struct dnetmap_prefix * + dnetmap_prefix_lookup(struct dnetmap_net *dnetmap_net, +- const struct nf_nat_ipv4_multi_range_compat *mr) ++ const struct nf_nat_range *mr) + { + struct dnetmap_prefix *p; + +@@ -258,7 +247,7 @@ + { + struct dnetmap_net *dnetmap_net = dnetmap_pernet(par->net); + const struct xt_DNETMAP_tginfo *tginfo = par->targinfo; +- const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; ++ const struct nf_nat_range *mr = &tginfo->prefix; + struct dnetmap_prefix *p; + struct dnetmap_entry *e; + #ifdef CONFIG_PROC_FS +@@ -274,14 +263,10 @@ + return ret; + } + +- if (!(mr->range[0].flags & NF_NAT_RANGE_MAP_IPS)) { ++ if (!(mr->flags & NF_NAT_RANGE_MAP_IPS)) { + pr_debug("DNETMAP:check: bad MAP_IPS.\n"); + return -EINVAL; + } +- if (mr->rangesize != 1) { +- pr_debug("DNETMAP:check: bad rangesize %u.\n", mr->rangesize); +- return -EINVAL; +- } + + mutex_lock(&dnetmap_mutex); + p = dnetmap_prefix_lookup(dnetmap_net, mr); +@@ -307,15 +292,15 @@ + INIT_LIST_HEAD(&p->lru_list); + INIT_LIST_HEAD(&p->elist); + +- ip_min = ntohl(mr->range[0].min_ip) + (whole_prefix == 0); +- ip_max = ntohl(mr->range[0].max_ip) - (whole_prefix == 0); ++ ip_min = ntohl(mr->min_addr.ip) + (whole_prefix == 0); ++ ip_max = ntohl(mr->max_addr.ip) - (whole_prefix == 0); + +- sprintf(p->prefix_str, NIPQUAD_FMT "/%u", NIPQUAD(mr->range[0].min_ip), ++ sprintf(p->prefix_str, NIPQUAD_FMT "/%u", NIPQUAD(mr->min_addr.ip), + 33 - ffs(~(ip_min ^ ip_max))); + #ifdef CONFIG_PROC_FS +- sprintf(p->proc_str_data, NIPQUAD_FMT "_%u", NIPQUAD(mr->range[0].min_ip), ++ sprintf(p->proc_str_data, NIPQUAD_FMT "_%u", NIPQUAD(mr->min_addr.ip), + 33 - ffs(~(ip_min ^ ip_max))); +- sprintf(p->proc_str_stat, NIPQUAD_FMT "_%u_stat", NIPQUAD(mr->range[0].min_ip), ++ sprintf(p->proc_str_stat, NIPQUAD_FMT "_%u_stat", NIPQUAD(mr->min_addr.ip), + 33 - ffs(~(ip_min ^ ip_max))); + #endif + printk(KERN_INFO KBUILD_MODNAME ": new prefix %s\n", p->prefix_str); +@@ -381,8 +366,8 @@ + enum ip_conntrack_info ctinfo; + __be32 prenat_ip, postnat_ip, prenat_ip_prev; + const struct xt_DNETMAP_tginfo *tginfo = par->targinfo; +- const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; +- struct nf_nat_ipv4_range newrange; ++ const struct nf_nat_range *mr = &tginfo->prefix; ++ struct nf_nat_range newrange; + struct dnetmap_entry *e; + struct dnetmap_prefix *p; + __s32 jttl; +@@ -419,15 +404,14 @@ + + spin_unlock_bh(&dnetmap_lock); + +- newrange = ((struct nf_nat_ipv4_range) { +- mr->range[0].flags | NF_NAT_RANGE_MAP_IPS, +- e->prenat_addr, e->prenat_addr, +- mr->range[0].min, mr->range[0].max}); +- +- /* Hand modified range to generic setup. */ ++ memset(&newrange, 0, sizeof(newrange)); ++ newrange.flags = mr->flags | NF_NAT_RANGE_MAP_IPS; ++ newrange.min_addr.ip = e->prenat_addr; ++ newrange.max_addr.ip = e->prenat_addr; ++ newrange.min_proto = mr->min_proto; ++ newrange.max_proto = mr->max_proto; + return nf_nat_setup_info(ct, &newrange, + HOOK2MANIP(par->hooknum)); +- + } + + prenat_ip = ip_hdr(skb)->saddr; +@@ -509,12 +493,12 @@ + + spin_unlock_bh(&dnetmap_lock); + +- newrange = ((struct nf_nat_ipv4_range) { +- mr->range[0].flags | NF_NAT_RANGE_MAP_IPS, +- postnat_ip, postnat_ip, +- mr->range[0].min, mr->range[0].max}); +- +- /* Hand modified range to generic setup. */ ++ memset(&newrange, 0, sizeof(newrange)); ++ newrange.flags = mr->flags | NF_NAT_RANGE_MAP_IPS; ++ newrange.min_addr.ip = postnat_ip; ++ newrange.max_addr.ip = postnat_ip; ++ newrange.min_proto = mr->min_proto; ++ newrange.max_proto = mr->max_proto; + return nf_nat_setup_info(ct, &newrange, HOOK2MANIP(par->hooknum)); + + no_rev_map: +@@ -528,7 +512,7 @@ + { + struct dnetmap_net *dnetmap_net = dnetmap_pernet(par->net); + const struct xt_DNETMAP_tginfo *tginfo = par->targinfo; +- const struct nf_nat_ipv4_multi_range_compat *mr = &tginfo->prefix; ++ const struct nf_nat_range *mr = &tginfo->prefix; + struct dnetmap_prefix *p; + + if (!(tginfo->flags & XT_DNETMAP_PREFIX)) +diff -ruN xtables-addons-1.47.1/extensions/xt_DNETMAP.h xtables-addons-2.0/extensions/xt_DNETMAP.h +--- xtables-addons-1.47.1/extensions/xt_DNETMAP.h 2012-10-15 21:29:22.000000000 +0200 ++++ xtables-addons-2.0/extensions/xt_DNETMAP.h 2012-11-12 19:03:51.000000000 +0100 +@@ -13,7 +13,7 @@ + }; + + struct xt_DNETMAP_tginfo { +- struct nf_nat_ipv4_multi_range_compat prefix; ++ struct nf_nat_range prefix; + __u8 flags; + __s32 ttl; + }; +diff -ruN xtables-addons-1.47.1/include/linux/netfilter/nf_nat.h xtables-addons-2.0/include/linux/netfilter/nf_nat.h +--- xtables-addons-1.47.1/include/linux/netfilter/nf_nat.h 2012-10-15 21:29:22.000000000 +0200 ++++ xtables-addons-2.0/include/linux/netfilter/nf_nat.h 2012-11-12 19:03:51.000000000 +0100 +@@ -22,4 +22,12 @@ + struct nf_nat_ipv4_range range[1]; + }; + ++struct nf_nat_range { ++ unsigned int flags; ++ union nf_inet_addr min_addr; ++ union nf_inet_addr max_addr; ++ union nf_conntrack_man_proto min_proto; ++ union nf_conntrack_man_proto max_proto; ++}; ++ + #endif /* _NETFILTER_NF_NAT_H */ +diff -ruN xtables-addons-1.47.1/mconfig xtables-addons-2.0/mconfig +--- xtables-addons-1.47.1/mconfig 2012-10-15 21:29:22.000000000 +0200 ++++ xtables-addons-2.0/mconfig 2012-11-12 19:03:51.000000000 +0100 +@@ -2,10 +2,9 @@ + # + build_ACCOUNT=m + build_CHAOS=m +-build_CHECKSUM= + build_DELUDE=m + build_DHCPMAC=m +-build_DNETMAP=m ++build_DNETMAP= + build_ECHO=m + build_IPMARK=m + build_LOGMARK=m +@@ -13,7 +12,6 @@ + build_STEAL=m + build_SYSRQ=m + build_TARPIT=m +-build_TEE= + build_condition=m + build_fuzzy=m + build_geoip=m diff --git a/xtables-addons.spec b/xtables-addons.spec index 0d2be48..2fe8852 100644 --- a/xtables-addons.spec +++ b/xtables-addons.spec @@ -15,17 +15,18 @@ %define _enable_debug_packages 0 %endif -%define rel 17 +%define rel 1 %define pname xtables-addons Summary: Additional extensions for xtables packet filtering system Summary(pl.UTF-8): Dodatkowe rozszerzenia do systemu filtrowania pakietów xtables Name: %{pname}%{_alt_kernel} -Version: 1.45 +Version: 1.47.1 Release: %{rel} License: GPL v2 Group: Networking/Admin Source0: http://downloads.sourceforge.net/xtables-addons/%{pname}-%{version}.tar.xz -# Source0-md5: 802d2f556a5e545f44e4b69937bf8490 +# Source0-md5: 92b9fc72980f9046622446d451296994 +Patch0: %{name}-DNETMAP.patch URL: http://xtables-addons.sourceforge.net/ BuildRequires: autoconf >= 2.65 BuildRequires: automake >= 1:1.11 @@ -79,6 +80,7 @@ Moduły jądra dla rozszerzeń z pakietu xtables-addons. %prep %setup -q -n %{pname}-%{version} +%patch0 -p1 %build %{__libtoolize} -- 2.43.0