: Netfilter update
Subsystems (4)
cover : Netfilter update
Hi Dave,
following is a rather large netfilter update for 2.6.25. The diffstat looks a bit worse than it is, most files are only touched due to __read_mostly and const annotations. The rough overview is:
- Some type consitency improvements for ip_tables compat support, doesn't actual change or fix anything, but the current code is rather inconsistent and only works for ip_tables, not the other copy-and-paste ports.
- Compat support for ip6_tables and arp_tables
- Resyncing of ip_tables, ip6_tables and arp_tables, not entirely completed yet, but I'll do that on top since its getting more and more complicated to do in proper order with this huge stack of patches.
- More const and __read_mostly annotations
- NAT API change to stop using hook numbers to indicate mapping types, which is a relict from before rusty-nat
- Conversion of multiple files to typeful netlink attribute helpers
- nfnetlink_log resyncing with the nfnetlink_queue changes (which are in most parts copies of each other). Also not completely done yet, will be completed on top.
- Eric's hashlimit optimizations
- Similar optimizations for the other non-power-of-two netfilter hashes
- ctnetlink updates from Pablo, adding better support for helpers, SCTP and secmark
- Some cleanups by Jan, mainly converting multiple IPv4/IPv6 address types to a single unified one
- Finally, the CONFIG_NETFILTER_ADVANCED patch. Its more intrusive than I hoped and the choices weren't really clear, so Its last in the series. Please have a look whether you think its useful like this, otherwise feel free to drop it.
Please apply, thanks.
include/linux/netfilter.h | 85 +-- include/linux/netfilter/nf_conntrack_common.h | 8 + include/linux/netfilter/nf_conntrack_h323.h | 6 +- include/linux/netfilter/nfnetlink_conntrack.h | 11 + include/linux/netfilter/nfnetlink_log.h | 1 + include/linux/netfilter/x_tables.h | 51 +- include/linux/netfilter/xt_connlimit.h | 9 +- include/linux/netfilter_arp/arp_tables.h | 50 +- include/linux/netfilter_ipv4/ip_tables.h | 76 +-- include/linux/netfilter_ipv6/ip6_tables.h | 73 +- include/net/netfilter/nf_conntrack_expect.h | 4 +- include/net/netfilter/nf_conntrack_tuple.h | 17 +- include/net/netfilter/nf_log.h | 59 ++ include/net/netfilter/nf_nat.h | 2 +- include/net/netfilter/nf_nat_protocol.h | 18 +- include/net/netlink.h | 12 + net/Kconfig | 12 + net/bridge/netfilter/Kconfig | 2 +- net/bridge/netfilter/ebt_log.c | 3 +- net/bridge/netfilter/ebt_ulog.c | 3 +- net/compat.c | 106 --- net/decnet/netfilter/Kconfig | 1 + net/ipv4/netfilter.c | 2 +- net/ipv4/netfilter/Kconfig | 26 +- net/ipv4/netfilter/arp_tables.c | 984 +++++++++++++++++---- net/ipv4/netfilter/ip_tables.c | 386 ++++----- net/ipv4/netfilter/ipt_CLUSTERIP.c | 4 +- net/ipv4/netfilter/ipt_LOG.c | 3 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 2 +- net/ipv4/netfilter/ipt_NETMAP.c | 2 +- net/ipv4/netfilter/ipt_REDIRECT.c | 2 +- net/ipv4/netfilter/ipt_ULOG.c | 1 + net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 10 +- net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 19 +- net/ipv4/netfilter/nf_nat_core.c | 58 +- net/ipv4/netfilter/nf_nat_h323.c | 26 +- net/ipv4/netfilter/nf_nat_helper.c | 9 +- net/ipv4/netfilter/nf_nat_pptp.c | 6 +- net/ipv4/netfilter/nf_nat_proto_gre.c | 3 +- net/ipv4/netfilter/nf_nat_proto_icmp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_tcp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_udp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_unknown.c | 2 +- net/ipv4/netfilter/nf_nat_rule.c | 8 +- net/ipv4/netfilter/nf_nat_sip.c | 6 +- net/ipv4/netfilter/nf_nat_snmp_basic.c | 2 +- net/ipv4/netfilter/nf_nat_standalone.c | 6 +- net/ipv6/netfilter.c | 2 +- net/ipv6/netfilter/Kconfig | 23 +- net/ipv6/netfilter/ip6_tables.c | 1157 +++++++++++++++++++----- net/ipv6/netfilter/ip6t_LOG.c | 3 +- net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 19 +- net/netfilter/Kconfig | 71 ++- net/netfilter/core.c | 6 +- net/netfilter/nf_conntrack_core.c | 12 +- net/netfilter/nf_conntrack_expect.c | 12 +- net/netfilter/nf_conntrack_ftp.c | 2 +- net/netfilter/nf_conntrack_h323_asn1.c | 8 +- net/netfilter/nf_conntrack_h323_main.c | 36 +- net/netfilter/nf_conntrack_netlink.c | 254 +++++- net/netfilter/nf_conntrack_proto_sctp.c | 18 +- net/netfilter/nf_conntrack_proto_tcp.c | 23 +- net/netfilter/nf_conntrack_proto_udp.c | 1 + net/netfilter/nf_conntrack_proto_udplite.c | 1 + net/netfilter/nf_conntrack_sip.c | 8 +- net/netfilter/nf_log.c | 12 +- net/netfilter/nf_queue.c | 4 +- net/netfilter/nfnetlink_log.c | 203 ++--- net/netfilter/nfnetlink_queue.c | 23 +- net/netfilter/x_tables.c | 63 ++- net/netfilter/xt_CONNMARK.c | 7 +- net/netfilter/xt_CONNSECMARK.c | 7 +- net/netfilter/xt_MARK.c | 55 +- net/netfilter/xt_NFLOG.c | 1 + net/netfilter/xt_TCPMSS.c | 7 +- net/netfilter/xt_connbytes.c | 2 +- net/netfilter/xt_connlimit.c | 25 +- net/netfilter/xt_connmark.c | 7 +- net/netfilter/xt_conntrack.c | 5 +- net/netfilter/xt_hashlimit.c | 31 +- net/netfilter/xt_helper.c | 2 +- net/netfilter/xt_limit.c | 5 + net/netfilter/xt_mark.c | 5 + net/netfilter/xt_policy.c | 2 +- net/netfilter/xt_state.c | 2 +- net/netfilter/xt_string.c | 2 +- 86 files changed, 2995 insertions(+), 1313 deletions(-) create mode 100644 include/net/netfilter/nf_log.h
Benjamin LaHaise (1):
[NETFILTER]: xt_TCPMSS: don't allow netfilter --setmss to increase mss
Eric Dumazet (2):
[NETFILTER]: xt_hashlimit: speedup hash_dst() [NETFILTER]: xt_hashlimit: reduce overhead without IPv6
Jan Engelhardt (4):
[NETFILTER]: x_tables: use %u format specifiers [NETFILTER]: Introduce nf_inet_address [NETFILTER]: Parenthesize macro parameters [NETFILTER]: xt_connlimit: use the new union nf_inet_addr
Pablo Neira Ayuso (4):
[NETFILTER]: ctnetlink: add support for NAT sequence adjustments [NETFILTER]: ctnetlink: add support for master tuple event notification and dumping [NETFILTER]: ctnetlink: add support for secmark
[NETFILTER]: nf_conntrack_sctp: add ctnetlink support
Patrick McHardy (53):
[NETFILTER]: ip_tables: kill useless wrapper
[NETFILTER]: ip_tables: reformat compat code
[NETFILTER]: x_tables: make xt_compat_match_from_user usable in iterator macros [NETFILTER]: {ip,ip6,arp}_tables: consolidate iterator macros [NETFILTER]: ip_tables: account for struct ipt_entry/struct compat_ipt_entry size diff [NETFILTER]: ip_tables: fix compat types
[NETFILTER]: ip_tables: move compat offset calculation to x_tables [NETFILTER]: ip6_tables: kill a few useless defines/forward declarations [NETFILTER]: ip6_tables: move entry, match and target checks to seperate functions [NETFILTER]: ip6_tables: use vmalloc_node()
[NETFILTER]: ip6_tables: move counter allocation to seperate function [NETFILTER]: ip6_tables: move IP6T_SO_GET_INFO handling to seperate function [NETFILTER]: ip6_tables: resync get_entries() with ip_tables [NETFILTER]: ip6_tables: add compat support
[NETFILTER]: x_tables: enable compat translation for IPv6 matches/targets [NETFILTER]: xt_MARK: support revision 1 for IPv6
[NETFILTER]: xt_MARK: add compat support for revision 0
[NETFILTER]: {ip,ip6}_tables: reformat to eliminate differences [NETFILTER]: {ip,ip6}_tables: fix format strings
[NETFILTER]: ip6_tables: fix stack leagage
[NETFILTER]: ip6_tables: use raw_smp_processor_id() in do_add_counters() [NETFILTER]: ip_tables: remove ipchains compatibility hack
[NETFILTER]: ip6_tables: use XT_ALIGN
[NETFILTER]: arp_tables: remove obsolete standard_check function [NETFILTER]: arp_tables: use XT_ALIGN
[NETFILTER]: arp_tables: use vmalloc_node()
[NETFILTER]: arp_tables: remove ipchains compat hack
[NETFILTER]: arp_tables: move entry and target checks to seperate functions [NETFILTER]: arp_tables: move counter allocation to seperate function [NETFILTER]: arp_tables: move ARPT_SO_GET_INFO handling to seperate function [NETFILTER]: arp_tables: resync get_entries() with ip_tables [NETFILTER]: arp_tables: add compat support
[NETLINK]: Add NLA_PUT_BE16/nla_get_be16()
[NETFILTER]: ctnetlink: use netlink attribute helpers
[NETFILTER]: ctnetlink: fix expectation timeout dumping
[NETFILTER]: nf_nat_proto_gre: add missing module reference [NETFILTER]: nf_nat: mark NAT protocols const
[NETFILTER]: nf_nat: sprinkle a few __read_mostlys
[NETFILTER]: nf_nat: pass manip type instead of hook to nf_nat_setup_info [NETFILTER]: nf_log: move logging stuff to seperate header
[NETFILTER]: nf_log: constify struct nf_logger and nf_log_packet loginfo arg [NETFILTER]: nf_log: remove incomprehensible comment
[NETFILTER]: nfnetlink_log: fix checks in nfulnl_recv_config [NETFILTER]: nfnetlink_{queue,log}: return ENOTSUPP for unknown cfg commands [NETFILTER]: nfnetlink_log: remove excessive debugging
[NETFILTER]: nfnetlink_{queue,log}: return proper error codes in instance_create [NETFILTER]: nfnetlink_log: use endianness-aware attribute functions [NETFILTER]: nfnetlink_log: include GID in netlink message
[NETFILTER]: Kill function prototype for non-existing function [NETFILTER]: constify nf_afinfo
[NETFILTER]: nf_nat: properly use RCU for ip_nat_decode_session [NETFILTER]: non-power-of-two jhash optimizations
[NETFILTER]: Add CONFIG_NETFILTER_ADVANCED option
PATCH 1/64 : ip_tables: kill useless wrapper
[NETFILTER]: ip_tables: kill useless wrapper
---
commit 6a19ffcd0ec70582290ae8277c9f1ef8acdb3c0e
tree bfa458d13babacd4906f10e9deea4947af2fea02
parent e75bf3477c0d63cdd1f49f91a90816e4360ffc23
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:33 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:33 +0100
net/ipv4/netfilter/ip_tables.c | 8 +------- 1 files changed, 1 insertions(+), 7 deletions(-)
net/ipv4/netfilter/ip_tables.c +1 -7
@@ -1479,12 +1479,6 @@ struct compat_ipt_replace {struct compat_ipt_entry entries[0 ]; }; -static inline int compat_copy_match_to_user (struct ipt_entry_match *m, -void __user **dstptr,compat_uint_t *size) -{ -return xt_compat_match_to_user (m, dstptr, size); -} - static int compat_copy_entry_to_user(struct ipt_entry *e, void __user **dstptr, compat_uint_t *size, struct xt_counters *counters,
@@ -1506,7 +1500,7 @@ compat_copy_entry_to_user(struct ipt_entry *e, void __user **dstptr, goto out; *dstptr +=sizeof (struct compat_ipt_entry ); - ret =IPT_MATCH_ITERATE (e, compat_copy_match_to_user, dstptr, size); + ret =IPT_MATCH_ITERATE (e, xt_compat_match_to_user, dstptr, size); target_offset = e->target_offset - (origsize - *size);if (ret) goto out;
PATCH 2/64 : ip_tables: reformat compat code
In reply to Patrick McHardy[NETFILTER]: ip_tables: reformat compat code
The compat code has some very odd formating, clean it up before porting it to ip6_tables.
---
commit 4cf89c9646b142291b7623c94daa8e61ab1b4766
tree c8e3889a2dd35b2fddd4329b0da90fdc5913d666
parent 6a19ffcd0ec70582290ae8277c9f1ef8acdb3c0e
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:34 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:34 +0100
net/ipv4/netfilter/ip_tables.c | 181 ++++++++++++++++++++-------------------- 1 files changed, 92 insertions(+), 89 deletions(-)
net/ipv4/netfilter/ip_tables.c +92 -89
@@ -600,8 +600,8 @@ check_entry(struct ipt_entry *e, const char *name) }static inline int check_match (struct ipt_entry_match *m,const char *name, -const struct ipt_ip *ip,unsigned int hookmask, -unsigned int *i) +const struct ipt_ip *ip, +unsigned int hookmask,unsigned int *i) {struct xt_match *match;int ret;
@@ -624,10 +624,10 @@ static inline int check_match(struct ipt_entry_match *m, const char *name,static inline int find_check_match (struct ipt_entry_match *m, -const char *name, -const struct ipt_ip *ip, -unsigned int hookmask, -unsigned int *i) +const char *name, +const struct ipt_ip *ip, +unsigned int hookmask, +unsigned int *i) {struct xt_match *match;int ret;
@@ -663,8 +663,8 @@ static inline int check_target(struct ipt_entry *e, const char *name) name, e->comefrom, e->ip.proto, e->ip.invflags & IPT_INV_PROTO);if (!ret && t->u.kernel.target->checkentry - && !t->u.kernel.target->checkentry (name, e, target, - t->data, e->comefrom)) { + && !t->u.kernel.target->checkentry (name, e, target, t->data, + e->comefrom)) {duprintf ("ip_tables: check failed for `%s'.\n" , t->u.kernel.target->name); ret = -EINVAL ;
@@ -674,7 +674,7 @@ static inline int check_target(struct ipt_entry *e, const char *name)static inline int find_check_entry (struct ipt_entry *e,const char *name,unsigned int size, -unsigned int *i) +unsigned int *i) {struct ipt_entry_target *t;struct xt_target *target;
@@ -687,14 +687,14 @@ find_check_entry(struct ipt_entry *e, const char *name, unsigned int size, j =0 ; ret =IPT_MATCH_ITERATE (e, find_check_match, name, &e->ip, - e->comefrom, &j); + e->comefrom, &j);if (ret !=0 ) goto cleanup_matches; t =ipt_get_target (e); target =try_then_request_module (xt_find_target (AF_INET , - t->u.user.name, - t->u.user.revision), + t->u.user.name, + t->u.user.revision),"ipt_%s" , t->u.user.name);if (IS_ERR (target) || !target) {duprintf ("find_check_entry: `%s' not found\n" , t->u.user.name);
@@ -1020,7 +1020,7 @@ struct compat_delta {short delta; }; -static struct compat_delta *compat_offsets =NULL ; +static struct compat_delta *compat_offsets;static int compat_add_offset (unsigned int offset,short delta) {
@@ -1046,7 +1046,7 @@ static void compat_flush_offsets(void)struct compat_delta *tmp, *next;if (compat_offsets) { -for (tmp = compat_offsets; tmp; tmp = next) { +for (tmp = compat_offsets; tmp; tmp = next) { next = tmp->next;kfree (tmp); }
@@ -1059,7 +1059,7 @@ static short compat_calc_jump(unsigned int offset)struct compat_delta *tmp;short delta; -for (tmp = compat_offsets, delta =0 ; tmp; tmp = tmp->next) +for (tmp = compat_offsets, delta =0 ; tmp; tmp = tmp->next)if (tmp->offset < offset) delta += tmp->delta;return delta;
@@ -1084,15 +1084,15 @@ static int compat_standard_to_user(void __user *dst, void *src) }static inline int -compat_calc_match (struct ipt_entry_match *m,int * size) +compat_calc_match (struct ipt_entry_match *m,int *size) { *size +=xt_compat_match_offset (m->u.kernel.match);return 0 ; }static int compat_calc_entry (struct ipt_entry *e, -const struct xt_table_info *info, -void *base,struct xt_table_info *newinfo) +const struct xt_table_info *info, +void *base,struct xt_table_info *newinfo) {struct ipt_entry_target *t;unsigned int entry_offset;
@@ -1109,18 +1109,18 @@ static int compat_calc_entry(struct ipt_entry *e,return ret;for (i =0 ; i <NF_INET_NUMHOOKS ; i++) { -if (info->hook_entry[i] && (e < (struct ipt_entry *) - (base + info->hook_entry[i]))) +if (info->hook_entry[i] && + (e < (struct ipt_entry *)(base + info->hook_entry[i]))) newinfo->hook_entry[i] -= off; -if (info->underflow[i] && (e < (struct ipt_entry *) - (base + info->underflow[i]))) +if (info->underflow[i] && + (e < (struct ipt_entry *)(base + info->underflow[i]))) newinfo->underflow[i] -= off; }return 0 ; }static int compat_table_info (const struct xt_table_info *info, -struct xt_table_info *newinfo) +struct xt_table_info *newinfo) {void *loc_cpu_entry;
@@ -1132,7 +1132,8 @@ static int compat_table_info(const struct xt_table_info *info, newinfo->initial_entries =0 ; loc_cpu_entry = info->entries[raw_smp_processor_id ()];return IPT_ENTRY_ITERATE (loc_cpu_entry, info->size, - compat_calc_entry, info, loc_cpu_entry, newinfo); + compat_calc_entry, info, loc_cpu_entry, + newinfo); }#endif
@@ -1157,7 +1158,7 @@ static int get_info(void __user *user, int *len, int compat)xt_compat_lock (AF_INET );#endif t =try_then_request_module (xt_find_table_lock (AF_INET , name), -"iptable_%s" , name); +"iptable_%s" , name);if (t && !IS_ERR (t)) {struct ipt_getinfo info;struct xt_table_info *private = t->private;
@@ -1167,14 +1168,14 @@ static int get_info(void __user *user, int *len, int compat)struct xt_table_info tmp; ret =compat_table_info (private, &tmp);compat_flush_offsets (); - private = &tmp; + private = &tmp; }#endif info.valid_hooks = t->valid_hooks;memcpy (info.hook_entry, private->hook_entry, -sizeof (info.hook_entry)); +sizeof (info.hook_entry));memcpy (info.underflow, private->underflow, -sizeof (info.underflow)); +sizeof (info.underflow)); info.num_entries = private->number; info.size = private->size;strcpy (info.name, name);
@@ -1240,8 +1241,8 @@ get_entries(struct ipt_get_entries __user *uptr, int *len)static int __do_replace (const char *name,unsigned int valid_hooks, -struct xt_table_info *newinfo,unsigned int num_counters, -void __user *counters_ptr) +struct xt_table_info *newinfo,unsigned int num_counters, +void __user *counters_ptr) {int ret;struct xt_table *t;
@@ -1289,7 +1290,8 @@ __do_replace(const char *name, unsigned int valid_hooks,get_counters (oldinfo, counters);/* Decrease module usage counts and free resource */ loc_cpu_old_entry = oldinfo->entries[raw_smp_processor_id ()]; -IPT_ENTRY_ITERATE (loc_cpu_old_entry, oldinfo->size, cleanup_entry,NULL ); +IPT_ENTRY_ITERATE (loc_cpu_old_entry, oldinfo->size, cleanup_entry, +NULL );xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters,sizeof (struct xt_counters ) * num_counters) !=0 )
@@ -1346,9 +1348,8 @@ do_replace(void __user *user, unsigned int len)duprintf ("ip_tables: Translated table\n" ); - ret =__do_replace (tmp.name, tmp.valid_hooks, - newinfo, tmp.num_counters, - tmp.counters); + ret =__do_replace (tmp.name, tmp.valid_hooks, newinfo, + tmp.num_counters, tmp.counters);if (ret) goto free_newinfo_untrans;return 0 ;
@@ -1523,19 +1524,19 @@ out:static inline int compat_find_calc_match (struct ipt_entry_match *m, -const char *name, -const struct ipt_ip *ip, -unsigned int hookmask, -int *size,int *i) +const char *name, +const struct ipt_ip *ip, +unsigned int hookmask, +int *size,int *i) {struct xt_match *match; match =try_then_request_module (xt_find_match (AF_INET , m->u.user.name, - m->u.user.revision), + m->u.user.revision),"ipt_%s" , m->u.user.name);if (IS_ERR (match) || !match) {duprintf ("compat_check_calc_match: `%s' not found\n" , - m->u.user.name); + m->u.user.name);return match ?PTR_ERR (match) : -ENOENT ; } m->u.kernel.match = match;
@@ -1572,14 +1573,14 @@ compat_release_entry(struct ipt_entry *e, unsigned int *i)static inline int check_compat_entry_size_and_hooks (struct ipt_entry *e, -struct xt_table_info *newinfo, -unsigned int *size, -unsigned char *base, -unsigned char *limit, -unsigned int *hook_entries, -unsigned int *underflows, -unsigned int *i, -const char *name) +struct xt_table_info *newinfo, +unsigned int *size, +unsigned char *base, +unsigned char *limit, +unsigned int *hook_entries, +unsigned int *underflows, +unsigned int *i, +const char *name) {struct ipt_entry_target *t;struct xt_target *target;
@@ -1594,7 +1595,7 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e, }if (e->next_offset <sizeof (struct compat_ipt_entry ) + -sizeof (struct compat_xt_entry_target )) { +sizeof (struct compat_xt_entry_target )) {duprintf ("checking: element %p size %u\n" , e, e->next_offset);return -EINVAL ;
@@ -1608,18 +1609,18 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e, entry_offset = (void *)e - (void *)base; j =0 ; ret =IPT_MATCH_ITERATE (e, compat_find_calc_match, name, &e->ip, - e->comefrom, &off, &j); + e->comefrom, &off, &j);if (ret !=0 ) goto release_matches; t =ipt_get_target (e); target =try_then_request_module (xt_find_target (AF_INET , - t->u.user.name, - t->u.user.revision), + t->u.user.name, + t->u.user.revision),"ipt_%s" , t->u.user.name);if (IS_ERR (target) || !target) {duprintf ("check_compat_entry_size_and_hooks: `%s' not found\n" , - t->u.user.name); + t->u.user.name); ret = target ?PTR_ERR (target) : -ENOENT ; goto release_matches; }
@@ -1653,17 +1654,20 @@ release_matches:return ret; } -static inline int compat_copy_match_from_user (struct ipt_entry_match *m, -void **dstptr,compat_uint_t *size,const char *name, -const struct ipt_ip *ip,unsigned int hookmask) +static inline int +compat_copy_match_from_user (struct ipt_entry_match *m, +void **dstptr,compat_uint_t *size, +const char *name,const struct ipt_ip *ip, +unsigned int hookmask) {xt_compat_match_from_user (m, dstptr, size);return 0 ; } -static int compat_copy_entry_from_user (struct ipt_entry *e,void **dstptr, -unsigned int *size,const char *name, -struct xt_table_info *newinfo,unsigned char *base) +static int +compat_copy_entry_from_user (struct ipt_entry *e,void **dstptr, +unsigned int *size,const char *name, +struct xt_table_info *newinfo,unsigned char *base) {struct ipt_entry_target *t;struct xt_target *target;
@@ -1678,7 +1682,7 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, *dstptr +=sizeof (struct compat_ipt_entry ); ret =IPT_MATCH_ITERATE (e, compat_copy_match_from_user, dstptr, size, - name, &de->ip, de->comefrom); + name, &de->ip, de->comefrom);if (ret)return ret; de->target_offset = e->target_offset - (origsize - *size);
@@ -1697,7 +1701,7 @@ static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, }static inline int compat_check_entry (struct ipt_entry *e,const char *name, -unsigned int *i) +unsigned int *i) {int j, ret;
@@ -1720,13 +1724,13 @@ static inline int compat_check_entry(struct ipt_entry *e, const char *name,static int translate_compat_table (const char *name, -unsigned int valid_hooks, -struct xt_table_info **pinfo, -void **pentry0, -unsigned int total_size, -unsigned int number, -unsigned int *hook_entries, -unsigned int *underflows) +unsigned int valid_hooks, +struct xt_table_info **pinfo, +void **pentry0, +unsigned int total_size, +unsigned int number, +unsigned int *hook_entries, +unsigned int *underflows) {unsigned int i, j;struct xt_table_info *newinfo, *info;
@@ -1793,10 +1797,10 @@ translate_compat_table(const char *name, } entry1 = newinfo->entries[raw_smp_processor_id ()]; pos = entry1; - size = total_size; + size = total_size; ret =IPT_ENTRY_ITERATE (entry0, total_size, - compat_copy_entry_from_user, &pos, &size, - name, newinfo, entry1); + compat_copy_entry_from_user, &pos, &size, + name, newinfo, entry1);compat_flush_offsets ();xt_compat_unlock (AF_INET );if (ret)
@@ -1808,11 +1812,11 @@ translate_compat_table(const char *name, i =0 ; ret =IPT_ENTRY_ITERATE (entry1, newinfo->size, compat_check_entry, - name, &i); + name, &i);if (ret) { j -= i;IPT_ENTRY_ITERATE_CONTINUE (entry1, newinfo->size, i, - compat_release_entry, &j); + compat_release_entry, &j);IPT_ENTRY_ITERATE (entry1, newinfo->size, cleanup_entry, &i);xt_free_table_info (newinfo);return ret;
@@ -1873,22 +1877,22 @@ compat_do_replace(void __user *user, unsigned int len) } ret =translate_compat_table (tmp.name, tmp.valid_hooks, - &newinfo, &loc_cpu_entry, tmp.size, - tmp.num_entries, tmp.hook_entry, tmp.underflow); + &newinfo, &loc_cpu_entry, tmp.size, + tmp.num_entries, tmp.hook_entry, + tmp.underflow);if (ret !=0 ) goto free_newinfo;duprintf ("compat_do_replace: Translated table\n" ); - ret =__do_replace (tmp.name, tmp.valid_hooks, - newinfo, tmp.num_counters, -compat_ptr (tmp.counters)); + ret =__do_replace (tmp.name, tmp.valid_hooks, newinfo, + tmp.num_counters,compat_ptr (tmp.counters));if (ret) goto free_newinfo_untrans;return 0 ; free_newinfo_untrans: -IPT_ENTRY_ITERATE (loc_cpu_entry, newinfo->size, cleanup_entry,NULL ); +IPT_ENTRY_ITERATE (loc_cpu_entry, newinfo->size, cleanup_entry,NULL ); free_newinfo:xt_free_table_info (newinfo);return ret;
@@ -1896,7 +1900,7 @@ compat_do_replace(void __user *user, unsigned int len)static int compat_do_ipt_set_ctl (struct sock *sk,int cmd,void __user *user, -unsigned int len) +unsigned int len) {int ret;
@@ -1920,15 +1924,15 @@ compat_do_ipt_set_ctl(struct sock *sk, int cmd, void __user *user,return ret; } -struct compat_ipt_get_entries -{ +struct compat_ipt_get_entries {char name[IPT_TABLE_MAXNAMELEN ];compat_uint_t size;struct compat_ipt_entry entrytable[0 ]; }; -static int compat_copy_entries_to_user (unsigned int total_size, -struct xt_table *table,void __user *userptr) +static int +compat_copy_entries_to_user (unsigned int total_size,struct xt_table *table, +void __user *userptr) {struct xt_counters *counters;struct xt_table_info *private = table->private;
@@ -1964,10 +1968,9 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)struct compat_ipt_get_entries get;struct xt_table *t; -if (*len <sizeof (get)) {duprintf ("compat_get_entries: %u < %u\n" , - *len, (unsigned int )sizeof (get)); + *len, (unsigned int )sizeof (get));return -EINVAL ; }
@@ -1976,8 +1979,8 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)if (*len !=sizeof (struct compat_ipt_get_entries ) + get.size) {duprintf ("compat_get_entries: %u != %u\n" , *len, - (unsigned int )(sizeof (struct compat_ipt_get_entries ) + - get.size)); + (unsigned int )(sizeof (struct compat_ipt_get_entries ) + + get.size));return -EINVAL ; }
@@ -1991,7 +1994,7 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len) ret =compat_table_info (private, &info);if (!ret && get.size == info.size) { ret =compat_copy_entries_to_user (private->size, - t, uptr->entrytable); + t, uptr->entrytable); }else if (!ret) { duprintf("compat_get_entries: I've got %u not %u!\n", private->size,
PATCH 3/64 : x_tables: make xt_compat_match_from_user usable in iterator macros
In reply to Patrick McHardy[NETFILTER]: x_tables: make xt_compat_match_from_user usable in iterator macros
Make xt_compat_match_from_user return an int to make it usable in the *tables iterator macros and kill a now unnecessary wrapper function.
---
commit 38d8a2e416379a76ad9feb3757b1c60e9573f675
tree afb49e3cc317698b9e51b982b5da239d06a39e15
parent 4cf89c9646b142291b7623c94daa8e61ab1b4766
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:36 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:36 +0100
include/linux/netfilter/x_tables.h | 4 ++-- net/ipv4/netfilter/ip_tables.c | 13 +------------ net/netfilter/x_tables.c | 5 +++-- 3 files changed, 6 insertions(+), 16 deletions(-)
include/linux/netfilter/x_tables.h +2 -2
@@ -382,8 +382,8 @@ extern void xt_compat_lock(int af);extern void xt_compat_unlock (int af);extern int xt_compat_match_offset (struct xt_match *match); -extern void xt_compat_match_from_user (struct xt_entry_match *m, -void **dstptr,int *size); +extern int xt_compat_match_from_user (struct xt_entry_match *m, +void **dstptr,int *size);extern int xt_compat_match_to_user (struct xt_entry_match *m,void __user **dstptr,int *size);
net/ipv4/netfilter/ip_tables.c +1 -12
@@ -1654,16 +1654,6 @@ release_matches:return ret; } -static inline int -compat_copy_match_from_user (struct ipt_entry_match *m, -void **dstptr,compat_uint_t *size, -const char *name,const struct ipt_ip *ip, -unsigned int hookmask) -{ -xt_compat_match_from_user (m, dstptr, size); -return 0 ; -} - static int compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr, unsigned int *size, const char *name,
@@ -1681,8 +1671,7 @@ compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,memcpy (de, e,sizeof (struct ipt_entry )); *dstptr +=sizeof (struct compat_ipt_entry ); - ret =IPT_MATCH_ITERATE (e, compat_copy_match_from_user, dstptr, size, - name, &de->ip, de->comefrom); + ret =IPT_MATCH_ITERATE (e, xt_compat_match_from_user, dstptr, size);if (ret)return ret; de->target_offset = e->target_offset - (origsize - *size);
net/netfilter/x_tables.c +3 -2
@@ -342,8 +342,8 @@ int xt_compat_match_offset(struct xt_match *match) }EXPORT_SYMBOL_GPL (xt_compat_match_offset); -void xt_compat_match_from_user (struct xt_entry_match *m,void **dstptr, -int *size) +int xt_compat_match_from_user (struct xt_entry_match *m,void **dstptr, +int *size) {struct xt_match *match = m->u.kernel.match;struct compat_xt_entry_match *cm = (struct compat_xt_entry_match *)m;
@@ -365,6 +365,7 @@ void xt_compat_match_from_user(struct xt_entry_match *m, void **dstptr, *size += off; *dstptr += msize; +return 0 ; }EXPORT_SYMBOL_GPL (xt_compat_match_from_user);
PATCH 4/64 : {ip,ip6,arp}_tables: consolidate iterator macros
In reply to Patrick McHardy[NETFILTER]: {ip,ip6,arp}_tables: consolidate iterator macros
---
commit ab9bc844e8aa064500496a0de876e1afe4466d9c
tree eec689e3f3bffcd8f8e33b03142994eb26a595bf
parent 38d8a2e416379a76ad9feb3757b1c60e9573f675
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:38 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:38 +0100
include/linux/netfilter/x_tables.h | 43 +++++++++++++++++++++++ include/linux/netfilter_arp/arp_tables.h | 17 +-------- include/linux/netfilter_ipv4/ip_tables.h | 55 +++-------------------------- include/linux/netfilter_ipv6/ip6_tables.h | 36 ++----------------- 4 files changed, 55 insertions(+), 96 deletions(-)
include/linux/netfilter/x_tables.h +43 -0
@@ -126,6 +126,49 @@ struct xt_counters_info#define XT_INV_PROTO 0x40/* Invert the sense of PROTO. */ +/* fn returns 0 to continue iteration */ +#define XT_MATCH_ITERATE(type, e, fn, args...) \ +({ \ + unsigned int __i; \ + int __ret = 0; \ + struct xt_entry_match *__m; \ + \ + for (__i = sizeof(type); \ + __i < (e)->target_offset; \ + __i += __m->u.match_size) { \ + __m = (void *)e + __i; \ + \ + __ret = fn(__m , ## args); \ + if (__ret != 0) \ + break; \ + } \ + __ret; \ +}) + +/* fn returns 0 to continue iteration */ +#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \ +({ \ + unsigned int __i, __n; \ + int __ret = 0; \ + type *__entry; \ + \ + for (__i = 0, __n = 0; __i < (size); \ + __i += __entry->next_offset, __n++) { \ + __entry = (void *)(entries) + __i; \ + if (__n < n) \ + continue; \ + \ + __ret = fn(__entry , ## args); \ + if (__ret != 0) \ + break; \ + } \ + __ret; \ +}) + +/* fn returns 0 to continue iteration */ +#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \ + XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args) +#ifdef __KERNEL__#include <linux/netdevice.h>
include/linux/netfilter_arp/arp_tables.h +2 -15
@@ -217,21 +217,8 @@ static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e }/* fn returns 0 to continue iteration */ -#define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ -({ \ - unsigned int __i; \ - int __ret = 0; \ - struct arpt_entry *__entry; \ - \ - for (__i = 0; __i < (size); __i += __entry->next_offset) { \ - __entry = (void *)(entries) + __i; \ - \ - __ret = fn(__entry , ## args); \ - if (__ret != 0) \ - break; \ - } \ - __ret; \ -}) +#define ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ + XT_ENTRY_ITERATE(struct arpt_entry, entries, size, fn, ## args)/* * Main firewall chains definitions and global var's definitions.
include/linux/netfilter_ipv4/ip_tables.h +6 -49
66 lines not on this page · raw message
include/linux/netfilter_ipv6/ip6_tables.h +4 -32
@@ -289,40 +289,12 @@ ip6t_get_target(struct ip6t_entry *e) }/* fn returns 0 to continue iteration */ -#define IP6T_MATCH_ITERATE(e, fn, args...) \ -({ \ - unsigned int __i; \ - int __ret = 0; \ - struct ip6t_entry_match *__m; \ - \ - for (__i = sizeof(struct ip6t_entry); \ - __i < (e)->target_offset; \ - __i += __m->u.match_size) { \ - __m = (void *)(e) + __i; \ - \ - __ret = fn(__m , ## args); \ - if (__ret != 0) \ - break; \ - } \ - __ret; \ -}) +#define IP6T_MATCH_ITERATE(e, fn, args...) \ + XT_MATCH_ITERATE(struct ip6t_entry, e, fn, ## args)/* fn returns 0 to continue iteration */ -#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ -({ \ - unsigned int __i; \ - int __ret = 0; \ - struct ip6t_entry *__e; \ - \ - for (__i = 0; __i < (size); __i += __e->next_offset) { \ - __e = (void *)(entries) + __i; \ - \ - __ret = fn(__e , ## args); \ - if (__ret != 0) \ - break; \ - } \ - __ret; \ -}) +#define IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ + XT_ENTRY_ITERATE(struct ip6t_entry, entries, size, fn, ## args)/* * Main firewall chains definitions and global var's definitions.
PATCH 5/64 : ip_tables: account for struct ipt_entry/struct compat_ipt_entry size diff
In reply to Patrick McHardy[NETFILTER]: ip_tables: account for struct ipt_entry/struct compat_ipt_entry size diff
Account for size differences when dumping entries or calculating the entry positions. This doesn't actually make any difference for IPv4 since the structures have the same size, but its logically correct and needed for IPv6.
---
commit cac25046b4856c4b88839f58149fa287a5067d55
tree 6cdebbd22200d853b7c87fc5bfebce598736a4b8
parent ab9bc844e8aa064500496a0de876e1afe4466d9c
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:39 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:39 +0100
net/ipv4/netfilter/ip_tables.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-)
net/ipv4/netfilter/ip_tables.c +6 -2
@@ -1098,7 +1098,7 @@ static int compat_calc_entry(struct ipt_entry *e,unsigned int entry_offset;int off, i, ret; - off =0 ; + off =sizeof (struct ipt_entry ) -sizeof (struct compat_ipt_entry ); entry_offset = (void *)e - base;IPT_MATCH_ITERATE (e, compat_calc_match, &off); t =ipt_get_target (e);
@@ -1501,6 +1501,8 @@ compat_copy_entry_to_user(struct ipt_entry *e, void __user **dstptr, goto out; *dstptr +=sizeof (struct compat_ipt_entry ); + *size -=sizeof (struct ipt_entry ) -sizeof (struct compat_ipt_entry ); + ret =IPT_MATCH_ITERATE (e, xt_compat_match_to_user, dstptr, size); target_offset = e->target_offset - (origsize - *size);if (ret)
@@ -1605,7 +1607,7 @@ check_compat_entry_size_and_hooks(struct ipt_entry *e,if (ret)return ret; - off =0 ; + off =sizeof (struct ipt_entry ) -sizeof (struct compat_ipt_entry ); entry_offset = (void *)e - (void *)base; j =0 ; ret = IPT_MATCH_ITERATE(e, compat_find_calc_match, name, &e->ip,
@@ -1671,6 +1673,8 @@ compat_copy_entry_from_user(struct ipt_entry *e, void **dstptr,memcpy (de, e,sizeof (struct ipt_entry )); *dstptr +=sizeof (struct compat_ipt_entry ); + *size +=sizeof (struct ipt_entry ) -sizeof (struct compat_ipt_entry ); + ret =IPT_MATCH_ITERATE (e, xt_compat_match_from_user, dstptr, size);if (ret)return ret;
PATCH 6/64 : ip_tables: fix compat types
In reply to Patrick McHardy[NETFILTER]: ip_tables: fix compat types
Use compat types and compat iterators when dealing with compat entries for clarity. This doesn't actually make a difference for ip_tables, but is needed for ip6_tables and arp_tables.
---
commit a1df013706dd1275e74a2baf9006853892c523ea
tree b441fd49848be77aa1622b9c375bdd49b4818eed
parent cac25046b4856c4b88839f58149fa287a5067d55
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:41 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 16:02:34 +0100
include/linux/netfilter_ipv4/ip_tables.h | 25 ++++++++++++--- net/ipv4/netfilter/ip_tables.c | 51 ++++++++++++++++-------------- 2 files changed, 47 insertions(+), 29 deletions(-)
include/linux/netfilter_ipv4/ip_tables.h +20 -5
@@ -236,11 +236,6 @@ ipt_get_target(struct ipt_entry *e) #define IPT_ENTRY_ITERATE(entries, size, fn, args...) \ XT_ENTRY_ITERATE(struct ipt_entry, entries, size, fn, ## args) -/* fn returns 0 to continue iteration */ -#define IPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ - XT_ENTRY_ITERATE_CONTINUE(struct ipt_entry, entries, size, n, fn, \ - ## args) -/* * Main firewall chains definitions and global var's definitions. */
@@ -316,8 +311,28 @@ struct compat_ipt_entryunsigned char elems[0 ]; }; +/* Helper functions */ +static inline struct ipt_entry_target * +compat_ipt_get_target (struct compat_ipt_entry *e) +{ +return (void *)e + e->target_offset; +} +#define COMPAT_IPT_ALIGN (s) COMPAT_XT_ALIGN(s) +/* fn returns 0 to continue iteration */ +#define COMPAT_IPT_MATCH_ITERATE(e, fn, args...) \ + XT_MATCH_ITERATE(struct compat_ipt_entry, e, fn, ## args) + +/* fn returns 0 to continue iteration */ +#define COMPAT_IPT_ENTRY_ITERATE(entries, size, fn, args...) \ + XT_ENTRY_ITERATE(struct compat_ipt_entry, entries, size, fn, ## args) + +/* fn returns 0 to continue iteration */ +#define COMPAT_IPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ + XT_ENTRY_ITERATE_CONTINUE(struct compat_ipt_entry, entries, size, n, \ + fn, ## args) +#endif /* CONFIG_COMPAT */ #endif /*__KERNEL__*/ #endif /* _IPTABLES_H */
net/ipv4/netfilter/ip_tables.c +27 -24
131 lines not on this page · raw message
PATCH 7/64 : ip_tables: move compat offset calculation to x_tables
In reply to Patrick McHardy[NETFILTER]: ip_tables: move compat offset calculation to x_tables
Its needed by ip6_tables and arp_tables as well.
---
commit 8803d89ba96c5169a1183647f2753822f36faeff
tree 5ae2a9b3219825357046b5616cd4c8632a7f0e51
parent a1df013706dd1275e74a2baf9006853892c523ea
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:42 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 16:04:32 +0100
include/linux/netfilter/x_tables.h | 4 ++ net/ipv4/netfilter/ip_tables.c | 67 ++++-------------------------------- net/netfilter/x_tables.c | 58 +++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 59 deletions(-)
include/linux/netfilter/x_tables.h +4 -0
@@ -424,6 +424,10 @@ struct compat_xt_counters_infoextern void xt_compat_lock (int af);extern void xt_compat_unlock (int af); +extern int xt_compat_add_offset (int af,unsigned int offset,short delta); +extern void xt_compat_flush_offsets (int af); +extern short xt_compat_calc_jump (int af,unsigned int offset); +extern int xt_compat_match_offset (struct xt_match *match);extern int xt_compat_match_from_user (struct xt_entry_match *m,void **dstptr,int *size);
net/ipv4/netfilter/ip_tables.c +8 -59
120 lines not on this page · raw message
net/netfilter/x_tables.c +58 -0
82 lines not on this page · raw message
PATCH 8/64 : ip6_tables: kill a few useless defines/forward declarations
In reply to Patrick McHardy[NETFILTER]: ip6_tables: kill a few useless defines/forward declarations
---
commit de6db21852632a229cad718da30eb526b6b46da9
tree 126da5bbf294091699aada9feff9b0286a59d04f
parent 8803d89ba96c5169a1183647f2753822f36faeff
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:43 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 16:05:13 +0100
net/ipv6/netfilter/ip6_tables.c | 16 ++-------------- 1 files changed, 2 insertions(+), 14 deletions(-)
net/ipv6/netfilter/ip6_tables.c +2 -14
@@ -31,9 +31,6 @@ MODULE_LICENSE("GPL");MODULE_AUTHOR ("Netfilter Core Team <[email protected]>" );MODULE_DESCRIPTION ("IPv6 packet filter" ); -#define IPV6_HDR_LEN (sizeof(struct ipv6hdr)) -#define IPV6_OPTHDR_LEN (sizeof(struct ipv6_opt_hdr)) -/*#define DEBUG_IP_FIREWALL*/ /*#define DEBUG_ALLOW_ALL*/ /* Useful for remote debugging */ /*#define DEBUG_IP_FIREWALL_USER*/
@@ -76,12 +73,6 @@ do { \Hence the start of any table is given by get_table() below. */ -#if 0 -#define down (x) do { printk("DOWN:%u:" #x "\n", __LINE__); down(x); } while(0) -#define down_interruptible (x) ({ int __r; printk("DOWNi:%u:" #x "\n", __LINE__); __r = down_interruptible(x); if (__r != 0) printk("ABORT-DOWNi:%u\n", __LINE__); __r; }) -#define up (x) do { printk("UP:%u:" #x "\n", __LINE__); up(x); } while(0) -#endif -/* Check for an extension */ int ip6t_ext_hdr (u8 nexthdr)
@@ -399,9 +390,8 @@ ip6t_do_table(struct sk_buff *skb, goto no_match;ADD_COUNTER (e->counters, -ntohs (ipv6_hdr (skb)->payload_len) - +IPV6_HDR_LEN , -1 ); +ntohs (ipv6_hdr (skb)->payload_len) + +sizeof (struct ipv6hdr ),1 ); t =ip6t_get_target (e);IP_NF_ASSERT (t->u.kernel.target);
@@ -657,8 +647,6 @@ err:return ret; } -static struct xt_target ip6t_standard_target; -static inline int check_entry (struct ip6t_entry *e,const char *name,unsigned int size,unsigned int *i)
PATCH 9/64 : ip6_tables: move entry, match and target checks to seperate functions
In reply to Patrick McHardy[NETFILTER]: ip6_tables: move entry, match and target checks to seperate functions
Resync with ip_tables.c as preparation for compat support.
---
commit e3dd889d718409e2ebd6010d6db111c5ee304804
tree c654332f845415a4ce63e5fe7220c674ca3eb330
parent de6db21852632a229cad718da30eb526b6b46da9
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:45 +0100 committer Patrick McHardy <[email protected]> Mon, 17 Dec 2007 16:05:28 +0100
net/ipv6/netfilter/ip6_tables.c | 129 +++++++++++++++++++++++++-------------- 1 files changed, 82 insertions(+), 47 deletions(-)
net/ipv6/netfilter/ip6_tables.c +82 -47
@@ -607,11 +607,55 @@ cleanup_match(struct ip6t_entry_match *m, unsigned int *i) }static inline int -check_match (struct ip6t_entry_match *m, -const char *name, -const struct ip6t_ip6 *ipv6, -unsigned int hookmask, -unsigned int *i) +check_entry (struct ip6t_entry *e,const char *name) +{ +struct ip6t_entry_target *t; + +if (!ip6_checkentry (&e->ipv6)) { +duprintf ("ip_tables: ip check failed %p %s.\n" , e, name); +return -EINVAL ; + } + +if (e->target_offset +sizeof (struct ip6t_entry_target ) > + e->next_offset) +return -EINVAL ; + + t =ip6t_get_target (e); +if (e->target_offset + t->u.target_size > e->next_offset) +return -EINVAL ; + +return 0 ; +} + +static inline int check_match (struct ip6t_entry_match *m,const char *name, +const struct ip6t_ip6 *ipv6, +unsigned int hookmask,unsigned int *i) +{ +struct xt_match *match; +int ret; + + match = m->u.kernel.match; + ret =xt_check_match (match,AF_INET6 , m->u.match_size -sizeof (*m), + name, hookmask, ipv6->proto, + ipv6->invflags &IP6T_INV_PROTO ); +if (!ret && m->u.kernel.match->checkentry + && !m->u.kernel.match->checkentry (name, ipv6, match, m->data, + hookmask)) { +duprintf ("ip_tables: check failed for `%s'.\n" , + m->u.kernel.match->name); + ret = -EINVAL ; + } +if (!ret) + (*i)++; +return ret; +} + +static inline int +find_check_match (struct ip6t_entry_match *m, +const char *name, +const struct ip6t_ip6 *ipv6, +unsigned int hookmask, +unsigned int *i) {struct xt_match *match;int ret;
@@ -620,86 +664,77 @@ check_match(struct ip6t_entry_match *m, m->u.user.revision), "ip6t_%s", m->u.user.name);if (IS_ERR (match) || !match) { -duprintf ("check_match: `%s' not found\n" , m->u.user.name); +duprintf ("find_check_match: `%s' not found\n" , m->u.user.name);return match ?PTR_ERR (match) : -ENOENT ; } m->u.kernel.match = match; - ret =xt_check_match (match,AF_INET6 , m->u.match_size -sizeof (*m), - name, hookmask, ipv6->proto, - ipv6->invflags &IP6T_INV_PROTO ); + ret =check_match (m, name, ipv6, hookmask, i);if (ret) goto err; -if (m->u.kernel.match->checkentry - && !m->u.kernel.match->checkentry (name, ipv6, match, m->data, - hookmask)) { -duprintf ("ip_tables: check failed for `%s'.\n" , - m->u.kernel.match->name); - ret = -EINVAL ; - goto err; - } - - (*i)++;return 0 ; err:module_put (m->u.kernel.match->me);return ret; } -static inline int -check_entry (struct ip6t_entry *e,const char *name,unsigned int size, -unsigned int *i) +static inline int check_target (struct ip6t_entry *e,const char *name) {struct ip6t_entry_target *t;struct xt_target *target;int ret; -unsigned int j; -if (!ip6_checkentry (&e->ipv6)) { -duprintf ("ip_tables: ip check failed %p %s.\n" , e, name); -return -EINVAL ; + t =ip6t_get_target (e); + target = t->u.kernel.target; + ret =xt_check_target (target,AF_INET6 , t->u.target_size -sizeof (*t), + name, e->comefrom, e->ipv6.proto, + e->ipv6.invflags &IP6T_INV_PROTO ); +if (!ret && t->u.kernel.target->checkentry + && !t->u.kernel.target->checkentry (name, e, target, t->data, + e->comefrom)) { +duprintf ("ip_tables: check failed for `%s'.\n" , + t->u.kernel.target->name); + ret = -EINVAL ; } +return ret; +} -if (e->target_offset +sizeof (struct ip6t_entry_target ) > - e->next_offset) -return -EINVAL ; +static inline int +find_check_entry (struct ip6t_entry *e,const char *name,unsigned int size, +unsigned int *i) +{ +struct ip6t_entry_target *t; +struct xt_target *target; +int ret; +unsigned int j; + + ret =check_entry (e, name); +if (ret) +return ret; j =0 ; - ret =IP6T_MATCH_ITERATE (e, check_match, name, &e->ipv6, e->comefrom, &j); + ret =IP6T_MATCH_ITERATE (e, find_check_match, name, &e->ipv6, + e->comefrom, &j);if (ret !=0 ) goto cleanup_matches; t =ip6t_get_target (e); - ret = -EINVAL ; -if (e->target_offset + t->u.target_size > e->next_offset) - goto cleanup_matches; target =try_then_request_module (xt_find_target (AF_INET6 , t->u.user.name, t->u.user.revision),"ip6t_%s" , t->u.user.name);if (IS_ERR (target) || !target) { -duprintf ("check_entry: `%s' not found\n" , t->u.user.name); +duprintf ("find_check_entry: `%s' not found\n" , t->u.user.name); ret = target ?PTR_ERR (target) : -ENOENT ; goto cleanup_matches; } t->u.kernel.target = target; - ret =xt_check_target (target,AF_INET6 , t->u.target_size -sizeof (*t), - name, e->comefrom, e->ipv6.proto, - e->ipv6.invflags &IP6T_INV_PROTO ); + ret =check_target (e, name);if (ret) goto err; -if (t->u.kernel.target->checkentry - && !t->u.kernel.target->checkentry (name, e, target, t->data, - e->comefrom)) { -duprintf ("ip_tables: check failed for `%s'.\n" , - t->u.kernel.target->name); - ret = -EINVAL ; - goto err; - } - (*i)++;return 0 ; err:
@@ -834,7 +869,7 @@ translate_table(const char *name,/* Finally, each sanity check must pass */ i =0 ; ret =IP6T_ENTRY_ITERATE (entry0, newinfo->size, - check_entry, name, size, &i); + find_check_entry, name, size, &i);if (ret !=0 ) { IP6T_ENTRY_ITERATE(entry0, newinfo->size,
PATCH 10/64 : ip6_tables: use vmalloc_node()
In reply to Patrick McHardy[NETFILTER]: ip6_tables: use vmalloc_node()
Consistently use vmalloc_node for all counter allocations.
---
commit 125dae23b2336fed2aa57e04b0afc4b185610789
tree ae3efff9f9539a13155ed54bf63d7e0f6fbbafa1
parent e3dd889d718409e2ebd6010d6db111c5ee304804
author Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:09 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:09 +0100
net/ipv6/netfilter/ip6_tables.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)
net/ipv6/netfilter/ip6_tables.c +4 -3
@@ -959,7 +959,7 @@ copy_entries_to_user(unsigned int total_size,(other than comefrom, which userspace doesn't care about). */ countersize =sizeof (struct xt_counters ) * private->number; - counters =vmalloc (countersize); + counters =vmalloc_node (countersize,numa_node_id ());if (counters ==NULL )return -ENOMEM ;
@@ -1080,7 +1080,8 @@ do_replace(void __user *user, unsigned int len) goto free_newinfo; } - counters =vmalloc (tmp.num_counters *sizeof (struct xt_counters )); + counters =vmalloc_node (tmp.num_counters *sizeof (struct xt_counters ), +numa_node_id ());if (!counters) { ret = -ENOMEM ; goto free_newinfo;
@@ -1186,7 +1187,7 @@ do_add_counters(void __user *user, unsigned int len)if (len !=sizeof (tmp) + tmp.num_counters*sizeof (struct xt_counters ))return -EINVAL ; - paddc =vmalloc (len); + paddc =vmalloc_node (len,numa_node_id ());if (!paddc)return -ENOMEM ;
PATCH 11/64 : ip6_tables: move counter allocation to seperate function
In reply to Patrick McHardy[NETFILTER]: ip6_tables: move counter allocation to seperate function
More resyncing with ip_tables.c as preparation for compat support.
---
commit 0d3ec012848cbfbdce1903f38af6991c81651ba8
tree 587a1824676535bbb9a698072a932f2d5726b4e3
parent 125dae23b2336fed2aa57e04b0afc4b185610789
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:46 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:19 +0100
net/ipv6/netfilter/ip6_tables.c | 31 ++++++++++++++++++++++--------- 1 files changed, 22 insertions(+), 9 deletions(-)
net/ipv6/netfilter/ip6_tables.c +22 -9
@@ -943,17 +943,11 @@ get_counters(const struct xt_table_info *t, } } -static int -copy_entries_to_user (unsigned int total_size, -struct xt_table *table, -void __user *userptr) +static inline struct xt_counters *alloc_counters (struct xt_table *table) { -unsigned int off, num, countersize; -struct ip6t_entry *e; +unsigned int countersize;struct xt_counters *counters;struct xt_table_info *private = table->private; -int ret =0 ; -void *loc_cpu_entry;/* We need atomic snapshot of counters: rest doesn't change (other than comefrom, which userspace doesn't care
@@ -962,13 +956,32 @@ copy_entries_to_user(unsigned int total_size, counters =vmalloc_node (countersize,numa_node_id ());if (counters ==NULL ) -return -ENOMEM ; +return ERR_PTR (-ENOMEM );/* First, sum counters... */ write_lock_bh (&table->lock);get_counters (private, counters);write_unlock_bh (&table->lock); +return counters; +} + +static int +copy_entries_to_user (unsigned int total_size, +struct xt_table *table, +void __user *userptr) +{ +unsigned int off, num; +struct ip6t_entry *e; +struct xt_counters *counters; +struct xt_table_info *private = table->private; +int ret =0 ; +void *loc_cpu_entry; + + counters =alloc_counters (table); +if (IS_ERR (counters)) +return PTR_ERR (counters); +/* choose the copy that is on ourc node/cpu */ loc_cpu_entry = private->entries[raw_smp_processor_id ()];if (copy_to_user (userptr, loc_cpu_entry, total_size) !=0 ) {
PATCH 12/64 : ip6_tables: move IP6T_SO_GET_INFO handling to seperate function
In reply to Patrick McHardy[NETFILTER]: ip6_tables: move IP6T_SO_GET_INFO handling to seperate function
---
commit 979e9b44e40aa3a26a174d3ccbdac4941e100287
tree 79544ffd7f1159026d47b9a32b2760e7735cd198
parent 0d3ec012848cbfbdce1903f38af6991c81651ba8
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:47 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:20 +0100
net/ipv6/netfilter/ip6_tables.c | 89 +++++++++++++++++++++------------------ 1 files changed, 47 insertions(+), 42 deletions(-)
net/ipv6/netfilter/ip6_tables.c +47 -42
@@ -1037,6 +1037,50 @@ copy_entries_to_user(unsigned int total_size,return ret; } +static int get_info (void __user *user,int *len) +{ +char name[IP6T_TABLE_MAXNAMELEN ]; +struct xt_table *t; +int ret; + +if (*len !=sizeof (struct ip6t_getinfo )) { +duprintf ("length %u != %u\n" , *len, +sizeof (struct ip6t_getinfo )); +return -EINVAL ; + } + +if (copy_from_user (name, user,sizeof (name)) !=0 ) +return -EFAULT ; + + name[IP6T_TABLE_MAXNAMELEN -1 ] ='\0' ; + + t =try_then_request_module (xt_find_table_lock (AF_INET6 , name), +"ip6table_%s" , name); +if (t && !IS_ERR (t)) { +struct ip6t_getinfo info; +struct xt_table_info *private = t->private; + + info.valid_hooks = t->valid_hooks; +memcpy (info.hook_entry, private->hook_entry, +sizeof (info.hook_entry)); +memcpy (info.underflow, private->underflow, +sizeof (info.underflow)); + info.num_entries = private->number; + info.size = private->size; +memcpy (info.name, name,sizeof (info.name)); + +if (copy_to_user (user, &info, *len) !=0 ) + ret = -EFAULT ; +else + ret =0 ; + +xt_table_unlock (t); +module_put (t->me); + }else + ret = t ?PTR_ERR (t) : -ENOENT ; +return ret; +} +static int get_entries (const struct ip6t_get_entries *entries,struct ip6t_get_entries __user *uptr)
@@ -1274,48 +1318,9 @@ do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)return -EPERM ;switch (cmd) { -case IP6T_SO_GET_INFO : { -char name[IP6T_TABLE_MAXNAMELEN ]; -struct xt_table *t; - -if (*len !=sizeof (struct ip6t_getinfo )) { -duprintf ("length %u != %u\n" , *len, -sizeof (struct ip6t_getinfo )); - ret = -EINVAL ; -break ; - } - -if (copy_from_user (name, user,sizeof (name)) !=0 ) { - ret = -EFAULT ; -break ; - } - name[IP6T_TABLE_MAXNAMELEN -1 ] ='\0' ; - - t =try_then_request_module (xt_find_table_lock (AF_INET6 , name), -"ip6table_%s" , name); -if (t && !IS_ERR (t)) { -struct ip6t_getinfo info; -struct xt_table_info *private = t->private; - - info.valid_hooks = t->valid_hooks; -memcpy (info.hook_entry, private->hook_entry, -sizeof (info.hook_entry)); -memcpy (info.underflow, private->underflow, -sizeof (info.underflow)); - info.num_entries = private->number; - info.size = private->size; -memcpy (info.name, name,sizeof (info.name)); - -if (copy_to_user (user, &info, *len) !=0 ) - ret = -EFAULT ; -else - ret =0 ; -xt_table_unlock (t); -module_put (t->me); - }else - ret = t ?PTR_ERR (t) : -ENOENT ; - } -break ; +case IP6T_SO_GET_INFO : + ret =get_info (user, len); +break ;case IP6T_SO_GET_ENTRIES : {struct ip6t_get_entries get;
PATCH 13/64 : ip6_tables: resync get_entries() with ip_tables
In reply to Patrick McHardy[NETFILTER]: ip6_tables: resync get_entries() with ip_tables
Resync get_entries() with ip_tables.c by moving the checks from the setsockopt handler to the function itself.
---
commit 740665f37ee927ca922fc0d978c3b3ba354ee220
tree b9bdc111631299d98599c096053423206f7936a0
parent 979e9b44e40aa3a26a174d3ccbdac4941e100287
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:49 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:21 +0100
net/ipv6/netfilter/ip6_tables.c | 37 ++++++++++++++++++------------------- 1 files changed, 18 insertions(+), 19 deletions(-)
net/ipv6/netfilter/ip6_tables.c +18 -19
@@ -1082,17 +1082,29 @@ static int get_info(void __user *user, int *len) }static int -get_entries (const struct ip6t_get_entries *entries, -struct ip6t_get_entries __user *uptr) +get_entries (struct ip6t_get_entries __user *uptr,int *len) {int ret; +struct ip6t_get_entries get;struct xt_table *t; - t =xt_find_table_lock (AF_INET6 , entries->name); +if (*len <sizeof (get)) { +duprintf ("get_entries: %u < %u\n" , *len,sizeof (get)); +return -EINVAL ; + } +if (copy_from_user (&get, uptr,sizeof (get)) !=0 ) +return -EFAULT ; +if (*len !=sizeof (struct ip6t_get_entries ) + get.size) { +duprintf ("get_entries: %u != %u\n" , *len, +sizeof (struct ip6t_get_entries ) + get.size); +return -EINVAL ; + } + + t =xt_find_table_lock (AF_INET6 , get.name);if (t && !IS_ERR (t)) {struct xt_table_info *private = t->private;duprintf ("t->private->number = %u\n" , private->number); -if (entries->size == private->size) +if (get.size == private->size) ret =copy_entries_to_user (private->size, t, uptr->entrytable);else {
@@ -1322,22 +1334,9 @@ do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) ret =get_info (user, len);break ; -case IP6T_SO_GET_ENTRIES : { -struct ip6t_get_entries get; - -if (*len <sizeof (get)) { -duprintf ("get_entries: %u < %u\n" , *len,sizeof (get)); - ret = -EINVAL ; - }else if (copy_from_user (&get, user,sizeof (get)) !=0 ) { - ret = -EFAULT ; - }else if (*len !=sizeof (struct ip6t_get_entries ) + get.size) { -duprintf ("get_entries: %u != %u\n" , *len, -sizeof (struct ip6t_get_entries ) + get.size); - ret = -EINVAL ; - }else - ret =get_entries (&get, user); +case IP6T_SO_GET_ENTRIES : + ret =get_entries (user, len);break ; - }case IP6T_SO_GET_REVISION_MATCH :case IP6T_SO_GET_REVISION_TARGET : {
PATCH 14/64 : ip6_tables: add compat support
In reply to Patrick McHardy[NETFILTER]: ip6_tables: add compat support
---
commit 8a27d7d8dbfa0a27714e8b05d3c51786ebdb42e7
tree ba41312d5c6cfcbb3070c08b9e20885740f83d66
parent 740665f37ee927ca922fc0d978c3b3ba354ee220
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:52 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
include/linux/netfilter_ipv6/ip6_tables.h | 35 + net/compat.c | 106 ---- net/ipv6/netfilter/ip6_tables.c | 823 +++++++++++++++++++++++++++-- 3 files changed, 802 insertions(+), 162 deletions(-)
include/linux/netfilter_ipv6/ip6_tables.h +35 -0
@@ -326,5 +326,40 @@ extern int ip6_masked_addrcmp(const struct in6_addr *addr1,#define IP6T_ALIGN (s) (((s) + (__alignof__(struct ip6t_entry)-1)) & ~(__alignof__(struct ip6t_entry)-1)) +#ifdef CONFIG_COMPAT +#include <net/compat.h> + +struct compat_ip6t_entry +{ +struct ip6t_ip6 ipv6; +compat_uint_t nfcache; +u_int16_t target_offset; +u_int16_t next_offset; +compat_uint_t comefrom; +struct compat_xt_counters counters; +unsigned char elems[0 ]; +}; + +static inline struct ip6t_entry_target * +compat_ip6t_get_target (struct compat_ip6t_entry *e) +{ +return (void *)e + e->target_offset; +} + +#define COMPAT_IP6T_ALIGN (s) COMPAT_XT_ALIGN(s) + +/* fn returns 0 to continue iteration */ +#define COMPAT_IP6T_MATCH_ITERATE(e, fn, args...) \ + XT_MATCH_ITERATE(struct compat_ip6t_entry, e, fn, ## args) + +/* fn returns 0 to continue iteration */ +#define COMPAT_IP6T_ENTRY_ITERATE(entries, size, fn, args...) \ + XT_ENTRY_ITERATE(struct compat_ip6t_entry, entries, size, fn, ## args) + +#define COMPAT_IP6T_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ + XT_ENTRY_ITERATE_CONTINUE(struct compat_ip6t_entry, entries, size, n, \ + fn, ## args) + +#endif /* CONFIG_COMPAT */ #endif /*__KERNEL__*/ #endif /* _IP6_TABLES_H */
net/compat.c +0 -106
124 lines not on this page · raw message
net/ipv6/netfilter/ip6_tables.c +767 -56
966 lines not on this page · raw message
PATCH 15/64 : x_tables: enable compat translation for IPv6 matches/targets
In reply to Patrick McHardy[NETFILTER]: x_tables: enable compat translation for IPv6 matches/targets
---
commit ec56030835b00ac701a64db9b979edcae05c98b0
tree ca41368de9f7505d7f2ac435f88d32168a5ee1af
parent 8a27d7d8dbfa0a27714e8b05d3c51786ebdb42e7
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:53 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
net/netfilter/xt_CONNMARK.c | 5 +++++ net/netfilter/xt_connmark.c | 5 +++++ net/netfilter/xt_limit.c | 5 +++++ net/netfilter/xt_mark.c | 5 +++++ 4 files changed, 20 insertions(+), 0 deletions(-)
net/netfilter/xt_CONNMARK.c +5 -0
@@ -160,6 +160,11 @@ static struct xt_target connmark_tg_reg[] __read_mostly = { .destroy = connmark_tg_destroy, .target = connmark_tg, .targetsize = sizeof(struct xt_connmark_target_info), +#ifdef CONFIG_COMPAT + .compatsize = sizeof(struct compat_xt_connmark_target_info), + .compat_from_user = connmark_tg_compat_from_user, + .compat_to_user = connmark_tg_compat_to_user, +#endif .me =THIS_MODULE }, };
net/netfilter/xt_connmark.c +5 -0
@@ -126,6 +126,11 @@ static struct xt_match connmark_mt_reg[] __read_mostly = { .match = connmark_mt, .destroy = connmark_mt_destroy, .matchsize = sizeof(struct xt_connmark_info), +#ifdef CONFIG_COMPAT + .compatsize = sizeof(struct compat_xt_connmark_info), + .compat_from_user = connmark_mt_compat_from_user, + .compat_to_user = connmark_mt_compat_to_user, +#endif .me =THIS_MODULE }, };
net/netfilter/xt_limit.c +5 -0
@@ -187,6 +187,11 @@ static struct xt_match limit_mt_reg[] __read_mostly = { .checkentry = limit_mt_check, .match = limit_mt, .matchsize = sizeof(struct xt_rateinfo), +#ifdef CONFIG_COMPAT + .compatsize = sizeof(struct compat_xt_rateinfo), + .compat_from_user = limit_mt_compat_from_user, + .compat_to_user = limit_mt_compat_to_user, +#endif .me = THIS_MODULE, }, };
net/netfilter/xt_mark.c +5 -0
@@ -94,6 +94,11 @@ static struct xt_match mark_mt_reg[] __read_mostly = { .checkentry = mark_mt_check, .match = mark_mt, .matchsize = sizeof(struct xt_mark_info), +#ifdef CONFIG_COMPAT + .compatsize = sizeof(struct compat_xt_mark_info), + .compat_from_user = mark_mt_compat_from_user, + .compat_to_user = mark_mt_compat_to_user, +#endif .me = THIS_MODULE, }, };
PATCH 16/64 : xt_MARK: support revision 1 for IPv6
In reply to Patrick McHardy[NETFILTER]: xt_MARK: support revision 1 for IPv6
The current netfilter SVN version includes support for this, so enable it in the kernel as well.
---
commit e0b1699a604d191d46470fa8af7f211cd905bd78
tree 05cd8924da71e9e73ac17e45af7cb2df464bf266
parent ec56030835b00ac701a64db9b979edcae05c98b0
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:54 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
net/netfilter/xt_MARK.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
net/netfilter/xt_MARK.c +15 -0
@@ -158,6 +158,21 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .table = "mangle", .me = THIS_MODULE, }, + { + .name = "MARK", + .family = AF_INET6, + .revision = 1, + .checkentry = mark_tg_check, + .target = mark_tg, + .targetsize =sizeof (struct xt_mark_target_info_v1 ), +#ifdef CONFIG_COMPAT + .compatsize =sizeof (struct compat_xt_mark_target_info_v1 ), + .compat_from_user = mark_tg_compat_from_user, + .compat_to_user = mark_tg_compat_to_user, +#endif + .table ="mangle" , + .me = THIS_MODULE, + }, };static int __init mark_tg_init (void )
PATCH 17/64 : xt_MARK: add compat support for revision 0
In reply to Patrick McHardy[NETFILTER]: xt_MARK: add compat support for revision 0
Old userspace doesn't support revision 1, especially for IPv6, which is only available in the SVN snapshot.
Add compat support for revision 0.
---
commit 1d1b0c11ae4ac0beacfc129f003ddeb8c5b6f691
tree a02922b3ad4618c980db9759e4d04ea5df191107
parent e0b1699a604d191d46470fa8af7f211cd905bd78
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:56 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
net/netfilter/xt_MARK.c | 44 ++++++++++++++++++++++++++++++++++++++------ 1 files changed, 38 insertions(+), 6 deletions(-)
net/netfilter/xt_MARK.c +38 -6
@@ -94,6 +94,28 @@ mark_tg_check(const char *tablename, const void *entry, } #ifdef CONFIG_COMPAT +struct compat_xt_mark_target_info { + compat_ulong_t mark; +}; + +static void mark_tg_compat_from_user(void *dst, void *src) +{ + const struct compat_xt_mark_target_info *cm = src; + struct xt_mark_target_info m = { + .mark = cm->mark, + }; + memcpy(dst, &m, sizeof(m)); +} + +static int mark_tg_compat_to_user(void __user *dst, void *src) +{ + const struct xt_mark_target_info *m = src; + struct compat_xt_mark_target_info cm = { + .mark = m->mark, + }; + return copy_to_user(dst, &cm, sizeof(cm)) ? -EFAULT : 0; +} + struct compat_xt_mark_target_info_v1 { compat_ulong_t mark; u_int8_t mode;
@@ -101,7 +123,7 @@ struct compat_xt_mark_target_info_v1 {u_int16_t __pad2; }; -static void mark_tg_compat_from_user (void *dst,void *src) +static void mark_tg_compat_from_user_v1 (void *dst,void *src) {const struct compat_xt_mark_target_info_v1 *cm = src;struct xt_mark_target_info_v1 m = {
@@ -111,7 +133,7 @@ static void mark_tg_compat_from_user(void *dst, void *src)memcpy (dst, &m,sizeof (m)); } -static int mark_tg_compat_to_user (void __user *dst,void *src) +static int mark_tg_compat_to_user_v1 (void __user *dst,void *src) {const struct xt_mark_target_info_v1 *m = src;struct compat_xt_mark_target_info_v1 cm = {
@@ -130,6 +152,11 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .checkentry = mark_tg_check_v0, .target = mark_tg_v0, .targetsize =sizeof (struct xt_mark_target_info ), +#ifdef CONFIG_COMPAT + .compatsize =sizeof (struct compat_xt_mark_target_info ), + .compat_from_user = mark_tg_compat_from_user, + .compat_to_user = mark_tg_compat_to_user, +#endif .table ="mangle" , .me = THIS_MODULE, },
@@ -142,8 +169,8 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .targetsize = sizeof(struct xt_mark_target_info_v1), #ifdef CONFIG_COMPAT .compatsize =sizeof (struct compat_xt_mark_target_info_v1 ), - .compat_from_user = mark_tg_compat_from_user, - .compat_to_user = mark_tg_compat_to_user, + .compat_from_user = mark_tg_compat_from_user_v1, + .compat_to_user = mark_tg_compat_to_user_v1, #endif .table ="mangle" , .me = THIS_MODULE,
@@ -155,6 +182,11 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .checkentry = mark_tg_check_v0, .target = mark_tg_v0, .targetsize =sizeof (struct xt_mark_target_info ), +#ifdef CONFIG_COMPAT + .compatsize =sizeof (struct compat_xt_mark_target_info ), + .compat_from_user = mark_tg_compat_from_user, + .compat_to_user = mark_tg_compat_to_user, +#endif .table ="mangle" , .me = THIS_MODULE, },
@@ -167,8 +199,8 @@ static struct xt_target mark_tg_reg[] __read_mostly = { .targetsize = sizeof(struct xt_mark_target_info_v1), #ifdef CONFIG_COMPAT .compatsize =sizeof (struct compat_xt_mark_target_info_v1 ), - .compat_from_user = mark_tg_compat_from_user, - .compat_to_user = mark_tg_compat_to_user, + .compat_from_user = mark_tg_compat_from_user_v1, + .compat_to_user = mark_tg_compat_to_user_v1, #endif .table ="mangle" , .me = THIS_MODULE,
PATCH 18/64 : {ip,ip6}_tables: reformat to eliminate differences
In reply to Patrick McHardy[NETFILTER]: {ip,ip6}_tables: reformat to eliminate differences
Reformat ip_tables.c and ip6_tables.c in order to eliminate non-functional differences and minimize diff output.
This allows to get a view of the real differences using:
sed -e 's/IP6T/IPT/g' \
-e 's/IP6/IP/g' \
-e 's/INET6/INET/g' \
-e 's/ip6t/ipt/g' \
-e 's/ip6/ip/g' \
-e 's/ipv6/ip/g' \
-e 's/icmp6/icmp/g' \
net/ipv6/netfilter/ip6_tables.c |diff -wup /dev/stdin net/ipv4/netfilter/ip_tables.c
---
commit 78122604ad05f50a11447c798605d985a4357843
tree 11cc6bcc105e7b9cd125a0b99a99954f51daeb43
parent 1d1b0c11ae4ac0beacfc129f003ddeb8c5b6f691
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:57 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
net/ipv4/netfilter/ip_tables.c | 66 ++++++++++++++++++--------------------- net/ipv6/netfilter/ip6_tables.c | 46 ++++++++++++++------------- 2 files changed, 53 insertions(+), 59 deletions(-)
net/ipv4/netfilter/ip_tables.c +30 -36
@@ -74,7 +74,7 @@ do { \Hence the start of any table is given by get_table() below. */ /* Returns whether matches rule or not. */ -static inline int +static inline bool ip_packet_match(const struct iphdr *ip, const char *indev, const char *outdev,
@@ -102,7 +102,7 @@ ip_packet_match(const struct iphdr *ip,NIPQUAD (ipinfo->dmsk.s_addr),NIPQUAD (ipinfo->dst.s_addr), ipinfo->invflags & IPT_INV_DSTIP ? " (INV)" : ""); -return 0 ; +return false; }/* Look for ifname matches; this should unroll nicely. */
@@ -116,7 +116,7 @@ ip_packet_match(const struct iphdr *ip,dprintf ("VIA in mismatch (%s vs %s).%s\n" , indev, ipinfo->iniface, ipinfo->invflags&IPT_INV_VIA_IN ?" (INV)" :"" ); -return 0 ; +return false; }for (i =0 , ret =0 ; i <IFNAMSIZ /sizeof (unsigned long ); i++) {
@@ -129,7 +129,7 @@ ip_packet_match(const struct iphdr *ip,dprintf ("VIA out mismatch (%s vs %s).%s\n" , outdev, ipinfo->outiface, ipinfo->invflags&IPT_INV_VIA_OUT ?" (INV)" :"" ); -return 0 ; +return false; }/* Check specific protocol */
@@ -138,7 +138,7 @@ ip_packet_match(const struct iphdr *ip,dprintf ("Packet protocol %hi does not match %hi.%s\n" , ip->protocol, ipinfo->proto, ipinfo->invflags&IPT_INV_PROTO ?" (INV)" :"" ); -return 0 ; +return false; }/* If we have a fragment rule but the packet is not a fragment
@@ -146,10 +146,10 @@ ip_packet_match(const struct iphdr *ip,if (FWINV ((ipinfo->flags&IPT_F_FRAG ) && !isfrag,IPT_INV_FRAG )) {dprintf ("Fragment rule but not fragment.%s\n" , ipinfo->invflags &IPT_INV_FRAG ?" (INV)" :"" ); -return 0 ; +return false; } -return 1 ; +return true; } static inline bool
@@ -222,7 +222,7 @@ unconditional(const struct ipt_ip *ip)static const char *hooknames[] = { [NF_INET_PRE_ROUTING ] ="PREROUTING" , [NF_INET_LOCAL_IN ] ="INPUT" , - [NF_INET_FORWARD ] ="FORWARD" , + [NF_INET_FORWARD ] ="FORWARD" , [NF_INET_LOCAL_OUT ] ="OUTPUT" , [NF_INET_POST_ROUTING ] ="POSTROUTING" , };
@@ -467,8 +467,7 @@ mark_source_chains(struct xt_table_info *newinfo,to 0 as we leave), and comefrom to save source hook bitmask */ for (hook =0 ; hook <NF_INET_NUMHOOKS ; hook++) {unsigned int pos = newinfo->hook_entry[hook]; -struct ipt_entry *e - = (struct ipt_entry *)(entry0 + pos); +struct ipt_entry *e = (struct ipt_entry *)(entry0 + pos);if (!(valid_hooks & (1 << hook)))continue ;
@@ -486,8 +485,7 @@ mark_source_chains(struct xt_table_info *newinfo, hook, pos, e->comefrom);return 0 ; } - e->comefrom - |= ((1 << hook) | (1 <<NF_INET_NUMHOOKS )); + e->comefrom |= ((1 << hook) | (1 <<NF_INET_NUMHOOKS ));/* Unconditional return/END. */ if ((e->target_offset == sizeof(struct ipt_entry)
@@ -589,7 +587,8 @@ check_entry(struct ipt_entry *e, const char *name)return -EINVAL ; } -if (e->target_offset +sizeof (struct ipt_entry_target ) > e->next_offset) +if (e->target_offset +sizeof (struct ipt_entry_target ) > + e->next_offset)return -EINVAL ; t =ipt_get_target (e);
@@ -633,7 +632,7 @@ find_check_match(struct ipt_entry_match *m,int ret; match =try_then_request_module (xt_find_match (AF_INET , m->u.user.name, - m->u.user.revision), + m->u.user.revision),"ipt_%s" , m->u.user.name);if (IS_ERR (match) || !match) {duprintf ("find_check_match: `%s' not found\n" , m->u.user.name);
@@ -959,7 +958,6 @@ copy_entries_to_user(unsigned int total_size,* allowed to migrate to another cpu) */ loc_cpu_entry = private->entries[raw_smp_processor_id ()]; -/* ... then copy entire thing ... */ if (copy_to_user (userptr, loc_cpu_entry, total_size) !=0 ) { ret = -EFAULT ; goto free_counters;
@@ -1169,15 +1167,13 @@ get_entries(struct ipt_get_entries __user *uptr, int *len) t =xt_find_table_lock (AF_INET , get.name);if (t && !IS_ERR (t)) {struct xt_table_info *private = t->private; -duprintf ("t->private->number = %u\n" , - private->number); +duprintf ("t->private->number = %u\n" , private->number);if (get.size == private->size) ret =copy_entries_to_user (private->size, t, uptr->entrytable);else {duprintf ("get_entries: I've got %u not %u!\n" , - private->size, - get.size); + private->size, get.size); ret = -EINVAL ; }module_put (t->me);
@@ -1281,7 +1277,7 @@ do_replace(void __user *user, unsigned int len)if (!newinfo)return -ENOMEM ; -/* choose the copy that is our node/cpu */ +/* choose the copy that is on our node/cpu */ loc_cpu_entry = newinfo->entries[raw_smp_processor_id ()];if (copy_from_user (loc_cpu_entry, user +sizeof (tmp), tmp.size) !=0 ) {
@@ -1304,7 +1300,7 @@ do_replace(void __user *user, unsigned int len)return 0 ; free_newinfo_untrans: -IPT_ENTRY_ITERATE (loc_cpu_entry, newinfo->size, cleanup_entry,NULL ); +IPT_ENTRY_ITERATE (loc_cpu_entry, newinfo->size, cleanup_entry,NULL ); free_newinfo:xt_free_table_info (newinfo);return ret;
@@ -1651,7 +1647,8 @@ static inline int compat_check_entry(struct ipt_entry *e, const char *name,int j, ret; j =0 ; - ret =IPT_MATCH_ITERATE (e, check_match, name, &e->ip, e->comefrom, &j); + ret =IPT_MATCH_ITERATE (e, check_match, name, &e->ip, + e->comefrom, &j);if (ret) goto cleanup_matches;
@@ -1744,8 +1741,8 @@ translate_compat_table(const char *name, pos = entry1; size = total_size; ret =COMPAT_IPT_ENTRY_ITERATE (entry0, total_size, - compat_copy_entry_from_user, &pos, &size, - name, newinfo, entry1); + compat_copy_entry_from_user, + &pos, &size, name, newinfo, entry1);xt_compat_flush_offsets (AF_INET );xt_compat_unlock (AF_INET );if (ret)
@@ -1813,7 +1810,7 @@ compat_do_replace(void __user *user, unsigned int len)if (!newinfo)return -ENOMEM ; -/* choose the copy that is our node/cpu */ +/* choose the copy that is on our node/cpu */ loc_cpu_entry = newinfo->entries[raw_smp_processor_id ()];if (copy_from_user (loc_cpu_entry, user +sizeof (tmp), tmp.size) !=0 ) {
@@ -1934,16 +1931,14 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)if (t && !IS_ERR (t)) {struct xt_table_info *private = t->private;struct xt_table_info info; -duprintf ("t->private->number = %u\n" , - private->number); +duprintf ("t->private->number = %u\n" , private->number); ret =compat_table_info (private, &info);if (!ret && get.size == info.size) { ret =compat_copy_entries_to_user (private->size, t, uptr->entrytable); }else if (!ret) {duprintf ("compat_get_entries: I've got %u not %u!\n" , - private->size, - get.size); + private->size, get.size); ret = -EINVAL ; }xt_compat_flush_offsets (AF_INET );
@@ -1981,7 +1976,7 @@ compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)#endif static int -do_ipt_set_ctl (struct sock *sk,int cmd,void __user *user,unsigned int len) +do_ipt_set_ctl (struct sock *sk,int cmd,void __user *user,unsigned int len) {int ret;
@@ -2068,9 +2063,7 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl)if (!newinfo)return -ENOMEM ; -/* choose the copy on our node/cpu -* but dont care of preemption -*/ +/* choose the copy on our node/cpu, but dont care about preemption */ loc_cpu_entry = newinfo->entries[raw_smp_processor_id ()];memcpy (loc_cpu_entry, repl->entries, repl->size);
@@ -2112,7 +2105,8 @@ icmp_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code, u_int8_t type, u_int8_t code, bool invert) { - return ((test_type == 0xFF) || (type == test_type && code >= min_code && code <= max_code)) + return ((test_type == 0xFF) || + (type == test_type && code >= min_code && code <= max_code)) ^ invert; }
@@ -2153,7 +2147,7 @@ icmp_match(const struct sk_buff *skb,/* Called when user tries to insert an entry of this type. */ static bool icmp_checkentry (const char *tablename, -const void *info, +const void *entry,const struct xt_match *match,void *matchinfo,unsigned int hook_mask)
@@ -2204,9 +2198,9 @@ static struct xt_match icmp_matchstruct __read_mostly = { .name = "icmp", .match = icmp_match, .matchsize = sizeof(struct ipt_icmp), + .checkentry = icmp_checkentry, .proto = IPPROTO_ICMP, .family = AF_INET, - .checkentry = icmp_checkentry, };static int __init ip_tables_init (void )
net/ipv6/netfilter/ip6_tables.c +23 -23
158 lines not on this page · raw message
PATCH 19/64 : {ip,ip6}_tables: fix format strings
In reply to Patrick McHardy[NETFILTER]: {ip,ip6}_tables: fix format strings
Use %zu for sizeof() and remove casts.
---
commit f6ef0d462fc82cabb301c055e35617fbe91e062d
tree 3c02133f043d0c239e6cb731adeaeb5d732b8f19
parent 78122604ad05f50a11447c798605d985a4357843
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:57:58 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:53 +0100
net/ipv4/netfilter/ip_tables.c | 20 ++++++++------------ net/ipv6/netfilter/ip6_tables.c | 16 +++++++--------- 2 files changed, 15 insertions(+), 21 deletions(-)
net/ipv4/netfilter/ip_tables.c +8 -12
@@ -1091,8 +1091,8 @@ static int get_info(void __user *user, int *len, int compat)int ret;if (*len !=sizeof (struct ipt_getinfo )) { -duprintf ("length %u != %u\n" , *len, - (unsigned int )sizeof (struct ipt_getinfo )); +duprintf ("length %u != %zu\n" , *len, +sizeof (struct ipt_getinfo ));return -EINVAL ; }
@@ -1151,16 +1151,14 @@ get_entries(struct ipt_get_entries __user *uptr, int *len)struct xt_table *t;if (*len <sizeof (get)) { -duprintf ("get_entries: %u < %d\n" , *len, - (unsigned int )sizeof (get)); +duprintf ("get_entries: %u < %zu\n" , *len,sizeof (get));return -EINVAL ; }if (copy_from_user (&get, uptr,sizeof (get)) !=0 )return -EFAULT ;if (*len !=sizeof (struct ipt_get_entries ) + get.size) { -duprintf ("get_entries: %u != %u\n" , *len, - (unsigned int )(sizeof (struct ipt_get_entries ) + - get.size)); +duprintf ("get_entries: %u != %zu\n" , + *len,sizeof (get) + get.size);return -EINVAL ; }
@@ -1911,8 +1909,7 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)struct xt_table *t;if (*len <sizeof (get)) { -duprintf ("compat_get_entries: %u < %u\n" , - *len, (unsigned int )sizeof (get)); +duprintf ("compat_get_entries: %u < %zu\n" , *len,sizeof (get));return -EINVAL ; }
@@ -1920,9 +1917,8 @@ compat_get_entries(struct compat_ipt_get_entries __user *uptr, int *len)return -EFAULT ;if (*len !=sizeof (struct compat_ipt_get_entries ) + get.size) { -duprintf ("compat_get_entries: %u != %u\n" , *len, - (unsigned int )(sizeof (struct compat_ipt_get_entries ) + - get.size)); +duprintf ("compat_get_entries: %u != %zu\n" , + *len,sizeof (get) + get.size);return -EINVAL ; }
net/ipv6/netfilter/ip6_tables.c +7 -9
@@ -1120,7 +1120,7 @@ static int get_info(void __user *user, int *len, int compat)int ret;if (*len !=sizeof (struct ip6t_getinfo )) { -duprintf ("length %u != %u\n" , *len, +duprintf ("length %u != %zu\n" , *len,sizeof (struct ip6t_getinfo ));return -EINVAL ; }
@@ -1180,14 +1180,14 @@ get_entries(struct ip6t_get_entries __user *uptr, int *len)struct xt_table *t;if (*len <sizeof (get)) { -duprintf ("get_entries: %u < %u\n" , *len,sizeof (get)); +duprintf ("get_entries: %u < %zu\n" , *len,sizeof (get));return -EINVAL ; }if (copy_from_user (&get, uptr,sizeof (get)) !=0 )return -EFAULT ;if (*len !=sizeof (struct ip6t_get_entries ) + get.size) { -duprintf ("get_entries: %u != %u\n" , *len, -sizeof (struct ip6t_get_entries ) + get.size); +duprintf ("get_entries: %u != %zu\n" , + *len,sizeof (get) + get.size);return -EINVAL ; }
@@ -1931,8 +1931,7 @@ compat_get_entries(struct compat_ip6t_get_entries __user *uptr, int *len)struct xt_table *t;if (*len <sizeof (get)) { -duprintf ("compat_get_entries: %u < %u\n" , - *len, (unsigned int )sizeof (get)); +duprintf ("compat_get_entries: %u < %zu\n" , *len,sizeof (get));return -EINVAL ; }
@@ -1940,9 +1939,8 @@ compat_get_entries(struct compat_ip6t_get_entries __user *uptr, int *len)return -EFAULT ;if (*len !=sizeof (struct compat_ip6t_get_entries ) + get.size) { -duprintf ("compat_get_entries: %u != %u\n" , *len, - (unsigned int )(sizeof (struct compat_ip6t_get_entries ) + - get.size)); +duprintf ("compat_get_entries: %u != %zu\n" , + *len,sizeof (get) + get.size);return -EINVAL ; }
PATCH 20/64 : ip6_tables: fix stack leagage
In reply to Patrick McHardy[NETFILTER]: ip6_tables: fix stack leagage
Fix leakage of local variable on stack. This already got fixed in ip_tables silently by the compat patches.
---
commit 1b0a8a3ff781362fdb71d2f5003b74f3c171566e
tree ed4d0be3a25d0b1892519c03fda7128dbff13d38
parent f6ef0d462fc82cabb301c055e35617fbe91e062d
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:00 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:54 +0100
net/ipv6/netfilter/ip6_tables.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
net/ipv6/netfilter/ip6_tables.c +1 -1
@@ -1154,7 +1154,7 @@ static int get_info(void __user *user, int *len, int compat) sizeof(info.underflow)); info.num_entries = private->number; info.size = private->size; -memcpy (info.name, name,sizeof (info.name)); +strcpy (info.name, name);if (copy_to_user (user, &info, *len) !=0 ) ret = -EFAULT ;
PATCH 21/64 : ip6_tables: use raw_smp_processor_id() in do_add_counters()
In reply to Patrick McHardy[NETFILTER]: ip6_tables: use raw_smp_processor_id() in do_add_counters()
Use raw_smp_processor_id() in do_add_counters() as in ip_tables.c.
---
commit d9026f418b057074d1c9b26df8197b7e5c3f222d
tree 422de5bfc8fda5e7c1dc68a82ffe691350cb2ba9
parent 1b0a8a3ff781362fdb71d2f5003b74f3c171566e
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:01 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:54 +0100
net/ipv6/netfilter/ip6_tables.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
net/ipv6/netfilter/ip6_tables.c +1 -1
@@ -1420,7 +1420,7 @@ do_add_counters(void __user *user, unsigned int len, int compat) i =0 ;/* Choose the copy that is on our node */ - loc_cpu_entry = private->entries[smp_processor_id ()]; + loc_cpu_entry = private->entries[raw_smp_processor_id ()]; IP6T_ENTRY_ITERATE(loc_cpu_entry, private->size, add_counter_to_entry,
PATCH 22/64 : ip_tables: remove ipchains compatibility hack
In reply to Patrick McHardy[NETFILTER]: ip_tables: remove ipchains compatibility hack
ipchains support has been removed years ago. kill last remains.
---
commit 78451d30484f913d2c570148d8638ee7f17c5446
tree 50647d7d3fa3fedec40ab770ced858b7b764ef99
parent d9026f418b057074d1c9b26df8197b7e5c3f222d
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:02 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:54 +0100
net/ipv4/netfilter/ip_tables.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-)
net/ipv4/netfilter/ip_tables.c +0 -8
@@ -1263,10 +1263,6 @@ do_replace(void __user *user, unsigned int len)if (copy_from_user (&tmp, user,sizeof (tmp)) !=0 )return -EFAULT ; -/* Hack: Causes ipchains to give correct error msg --RR */ -if (len !=sizeof (tmp) + tmp.size) -return -ENOPROTOOPT ; -/* overflow check */ if (tmp.num_counters >=INT_MAX /sizeof (struct xt_counters ))return -ENOMEM ;
@@ -1794,10 +1790,6 @@ compat_do_replace(void __user *user, unsigned int len)if (copy_from_user (&tmp, user,sizeof (tmp)) !=0 )return -EFAULT ; -/* Hack: Causes ipchains to give correct error msg --RR */ -if (len !=sizeof (tmp) + tmp.size) -return -ENOPROTOOPT ; -/* overflow check */ if (tmp.size >=INT_MAX /num_possible_cpus ())return -ENOMEM ;
PATCH 23/64 : ip6_tables: use XT_ALIGN
In reply to Patrick McHardy[NETFILTER]: ip6_tables: use XT_ALIGN
---
commit 04ec98b3abcf42330ae733de42af96e97128f083
tree 98332c18f03499782daefb03c578932ef033d4f0
parent 78451d30484f913d2c570148d8638ee7f17c5446
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:04 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:54 +0100
include/linux/netfilter_ipv6/ip6_tables.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/linux/netfilter_ipv6/ip6_tables.h +1 -1
@@ -324,7 +324,7 @@ extern int ip6_masked_addrcmp(const struct in6_addr *addr1,const struct in6_addr *mask, const struct in6_addr *addr2); -#define IP6T_ALIGN (s) (((s) + (__alignof__(struct ip6t_entry)-1)) & ~(__alignof__(struct ip6t_entry)-1)) +#define IP6T_ALIGN (s) XT_ALIGN(s)#ifdef CONFIG_COMPAT #include <net/compat.h>
PATCH 24/64 : arp_tables: remove obsolete standard_check function
In reply to Patrick McHardy[NETFILTER]: arp_tables: remove obsolete standard_check function
The size check is already performed by xt_check_target, no need to do it again.
---
commit 66239de91b46299cad80509607b1793dd6131925
tree 33383232c04cbdfab157a244bfdc96f66b1a2ae3
parent 04ec98b3abcf42330ae733de42af96e97128f083
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:05 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:54 +0100
net/ipv4/netfilter/arp_tables.c | 28 +++------------------------- 1 files changed, 3 insertions(+), 25 deletions(-)
net/ipv4/netfilter/arp_tables.c +3 -25
@@ -435,23 +435,6 @@ static int mark_source_chains(struct xt_table_info *newinfo,return 1 ; } -static inline int standard_check (const struct arpt_entry_target *t, -unsigned int max_offset) -{ -/* Check standard info. */ -if (t->u.target_size - !=ARPT_ALIGN (sizeof (struct arpt_standard_target ))) { -duprintf ("arpt_standard_check: target size %u != %Zu\n" , - t->u.target_size, -ARPT_ALIGN (sizeof (struct arpt_standard_target ))); -return 0 ; - } - -return 1 ; -} - -static struct arpt_target arpt_standard_target; -static inline int check_entry (struct arpt_entry *e,const char *name,unsigned int size,unsigned int *i) {
@@ -486,14 +469,9 @@ static inline int check_entry(struct arpt_entry *e, const char *name, unsigned iif (ret) goto err; -if (t->u.kernel.target == &arpt_standard_target) { -if (!standard_check (t, size)) { - ret = -EINVAL ; - goto err; - } - }else if (t->u.kernel.target->checkentry - && !t->u.kernel.target->checkentry (name, e, target, t->data, - e->comefrom)) { +if (t->u.kernel.target->checkentry + && !t->u.kernel.target->checkentry (name, e, target, t->data, + e->comefrom)) {duprintf ("arp_tables: check failed for `%s'.\n" , t->u.kernel.target->name); ret = -EINVAL ;
PATCH 25/64 : arp_tables: use XT_ALIGN
In reply to Patrick McHardy[NETFILTER]: arp_tables: use XT_ALIGN
---
commit 9cd44c2375b2d30c90e0bef6d8a61b49f986ee17
tree 0b850ca7bf96413e762a8b4ac30cc69b96757f13
parent 66239de91b46299cad80509607b1793dd6131925
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:07 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:55 +0100
include/linux/netfilter_arp/arp_tables.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/linux/netfilter_arp/arp_tables.h +1 -1
@@ -280,6 +280,6 @@ extern unsigned int arpt_do_table(struct sk_buff *skb,const struct net_device *out, struct arpt_table *table); -#define ARPT_ALIGN (s) (((s) + (__alignof__(struct arpt_entry)-1)) & ~(__alignof__(struct arpt_entry)-1)) +#define ARPT_ALIGN (s) XT_ALIGN(s)#endif /*__KERNEL__*/ #endif /* _ARPTABLES_H */
PATCH 26/64 : arp_tables: use vmalloc_node()
In reply to Patrick McHardy[NETFILTER]: arp_tables: use vmalloc_node()
Use vmalloc_node() as in ip_tables.c.
---
commit 5f2cccb0c367783a5207f378237c5e84c1654343
tree a85b8dfd23743d56b2bddcd396c5d32db0c6d176
parent 9cd44c2375b2d30c90e0bef6d8a61b49f986ee17
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:08 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:55 +0100
net/ipv4/netfilter/arp_tables.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
net/ipv4/netfilter/arp_tables.c +3 -2
@@ -804,7 +804,8 @@ static int do_replace(void __user *user, unsigned int len) goto free_newinfo; } - counters =vmalloc (tmp.num_counters *sizeof (struct xt_counters )); + counters =vmalloc_node (tmp.num_counters *sizeof (struct xt_counters ), +numa_node_id ());if (!counters) { ret = -ENOMEM ; goto free_newinfo;
@@ -902,7 +903,7 @@ static int do_add_counters(void __user *user, unsigned int len)if (len !=sizeof (tmp) + tmp.num_counters*sizeof (struct xt_counters ))return -EINVAL ; - paddc =vmalloc (len); + paddc =vmalloc_node (len,numa_node_id ());if (!paddc)return -ENOMEM ;
PATCH 27/64 : arp_tables: remove ipchains compat hack
In reply to Patrick McHardy[NETFILTER]: arp_tables: remove ipchains compat hack
Remove compatiblity hack copied from ip_tables.c - ipchains didn't even support arp_tables :)
---
commit 23afc470858634c807b97379e0a7e8447463be27
tree 75d6b5ae77b5a6be5ee4c9fbd57891521feb5632
parent 5f2cccb0c367783a5207f378237c5e84c1654343
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:09 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:55 +0100
net/ipv4/netfilter/arp_tables.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-)
net/ipv4/netfilter/arp_tables.c +0 -4
@@ -784,10 +784,6 @@ static int do_replace(void __user *user, unsigned int len)if (copy_from_user (&tmp, user,sizeof (tmp)) !=0 )return -EFAULT ; -/* Hack: Causes ipchains to give correct error msg --RR */ -if (len !=sizeof (tmp) + tmp.size) -return -ENOPROTOOPT ; -/* overflow check */ if (tmp.num_counters >=INT_MAX /sizeof (struct xt_counters ))return -ENOMEM ;
PATCH 28/64 : arp_tables: move entry and target checks to seperate functions
In reply to Patrick McHardy[NETFILTER]: arp_tables: move entry and target checks to seperate functions
Resync with ip_tables.c as preparation for compat support.
---
commit d0ccbefbca69eff49883e5ad964a5f13172aef0d
tree 2d3a2747325bc8b92b4e670031aef881bc056424
parent 23afc470858634c807b97379e0a7e8447463be27
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:11 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:55 +0100
net/ipv4/netfilter/arp_tables.c | 58 ++++++++++++++++++++++++++++----------- 1 files changed, 41 insertions(+), 17 deletions(-)
net/ipv4/netfilter/arp_tables.c +41 -17
@@ -435,12 +435,9 @@ static int mark_source_chains(struct xt_table_info *newinfo,return 1 ; } -static inline int check_entry (struct arpt_entry *e,const char *name,unsigned int size, -unsigned int *i) +static inline int check_entry (struct arpt_entry *e,const char *name) {struct arpt_entry_target *t; -struct arpt_target *target; -int ret;if (!arp_checkentry (&e->arp)) {duprintf ("arp_tables: arp check failed %p %s.\n" , e, name);
@@ -454,30 +451,57 @@ static inline int check_entry(struct arpt_entry *e, const char *name, unsigned iif (e->target_offset + t->u.target_size > e->next_offset)return -EINVAL ; +return 0 ; +} + +static inline int check_target (struct arpt_entry *e,const char *name) +{ +struct arpt_entry_target *t; +struct arpt_target *target; +int ret; + + t =arpt_get_target (e); + target = t->u.kernel.target; + + ret =xt_check_target (target,NF_ARP , t->u.target_size -sizeof (*t), + name, e->comefrom,0 ,0 ); +if (!ret && t->u.kernel.target->checkentry + && !t->u.kernel.target->checkentry (name, e, target, t->data, + e->comefrom)) { +duprintf ("arp_tables: check failed for `%s'.\n" , + t->u.kernel.target->name); + ret = -EINVAL ; + } +return ret; +} + +static inline int +find_check_entry (struct arpt_entry *e,const char *name,unsigned int size, +unsigned int *i) +{ +struct arpt_entry_target *t; +struct arpt_target *target; +int ret; + + ret =check_entry (e, name); +if (ret) +return ret; + + t =arpt_get_target (e); target =try_then_request_module (xt_find_target (NF_ARP , t->u.user.name, t->u.user.revision),"arpt_%s" , t->u.user.name);if (IS_ERR (target) || !target) { -duprintf ("check_entry: `%s' not found\n" , t->u.user.name); +duprintf ("find_check_entry: `%s' not found\n" , t->u.user.name); ret = target ?PTR_ERR (target) : -ENOENT ; goto out; } t->u.kernel.target = target; - ret =xt_check_target (target,NF_ARP , t->u.target_size -sizeof (*t), - name, e->comefrom,0 ,0 ); + ret =check_target (e, name);if (ret) goto err; -if (t->u.kernel.target->checkentry - && !t->u.kernel.target->checkentry (name, e, target, t->data, - e->comefrom)) { -duprintf ("arp_tables: check failed for `%s'.\n" , - t->u.kernel.target->name); - ret = -EINVAL ; - goto err; - } - (*i)++;return 0 ; err:
@@ -611,7 +635,7 @@ static int translate_table(const char *name,/* Finally, each sanity check must pass */ i =0 ; ret =ARPT_ENTRY_ITERATE (entry0, newinfo->size, - check_entry, name, size, &i); + find_check_entry, name, size, &i);if (ret !=0 ) { ARPT_ENTRY_ITERATE(entry0, newinfo->size,
PATCH 29/64 : arp_tables: move counter allocation to seperate function
In reply to Patrick McHardy[NETFILTER]: arp_tables: move counter allocation to seperate function
More resyncing with ip_tables.c as preparation for compat support.
---
commit f858d36b5f774655b3dd9a08a6502a8e2df1bb63
tree 0cc2b6613b2c3aeff5c1881f2a7729781ba69fd6
parent d0ccbefbca69eff49883e5ad964a5f13172aef0d
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:12 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:55 +0100
net/ipv4/netfilter/arp_tables.c | 29 +++++++++++++++++++++-------- 1 files changed, 21 insertions(+), 8 deletions(-)
net/ipv4/netfilter/arp_tables.c +21 -8
@@ -706,16 +706,11 @@ static void get_counters(const struct xt_table_info *t, } } -static int copy_entries_to_user (unsigned int total_size, -struct arpt_table *table, -void __user *userptr) +static inline struct xt_counters *alloc_counters (struct arpt_table *table) { -unsigned int off, num, countersize; -struct arpt_entry *e; +unsigned int countersize;struct xt_counters *counters;struct xt_table_info *private = table->private; -int ret =0 ; -void *loc_cpu_entry;/* We need atomic snapshot of counters: rest doesn't change * (other than comefrom, which userspace doesn't care
@@ -725,13 +720,31 @@ static int copy_entries_to_user(unsigned int total_size, counters =vmalloc_node (countersize,numa_node_id ());if (counters ==NULL ) -return -ENOMEM ; +return ERR_PTR (-ENOMEM );/* First, sum counters... */ write_lock_bh (&table->lock);get_counters (private, counters);write_unlock_bh (&table->lock); +return counters; +} + +static int copy_entries_to_user (unsigned int total_size, +struct arpt_table *table, +void __user *userptr) +{ +unsigned int off, num; +struct arpt_entry *e; +struct xt_counters *counters; +struct xt_table_info *private = table->private; +int ret =0 ; +void *loc_cpu_entry; + + counters =alloc_counters (table); +if (IS_ERR (counters)) +return PTR_ERR (counters); + loc_cpu_entry = private->entries[raw_smp_processor_id ()];/* ... then copy entire thing ... */ if (copy_to_user (userptr, loc_cpu_entry, total_size) !=0 ) {
PATCH 30/64 : arp_tables: move ARPT_SO_GET_INFO handling to seperate function
In reply to Patrick McHardy[NETFILTER]: arp_tables: move ARPT_SO_GET_INFO handling to seperate function
---
commit e6ccb061713d8286be8f9c885268d8c4cdbfb07e
tree 98ea964ea959e134a83e14d6c7a816d335a34781
parent f858d36b5f774655b3dd9a08a6502a8e2df1bb63
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:13 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
net/ipv4/netfilter/arp_tables.c | 88 ++++++++++++++++++++------------------- 1 files changed, 46 insertions(+), 42 deletions(-)
net/ipv4/netfilter/arp_tables.c +46 -42
@@ -782,6 +782,49 @@ static int copy_entries_to_user(unsigned int total_size,return ret; } +static int get_info (void __user *user,int *len) +{ +char name[ARPT_TABLE_MAXNAMELEN ]; +struct arpt_table *t; +int ret; + +if (*len !=sizeof (struct arpt_getinfo )) { +duprintf ("length %u != %Zu\n" , *len, +sizeof (struct arpt_getinfo )); +return -EINVAL ; + } + +if (copy_from_user (name, user,sizeof (name)) !=0 ) +return -EFAULT ; + + name[ARPT_TABLE_MAXNAMELEN -1 ] ='\0' ; + + t =try_then_request_module (xt_find_table_lock (NF_ARP , name), +"arptable_%s" , name); +if (t && !IS_ERR (t)) { +struct arpt_getinfo info; +struct xt_table_info *private = t->private; + + info.valid_hooks = t->valid_hooks; +memcpy (info.hook_entry, private->hook_entry, +sizeof (info.hook_entry)); +memcpy (info.underflow, private->underflow, +sizeof (info.underflow)); + info.num_entries = private->number; + info.size = private->size; +strcpy (info.name, name); + +if (copy_to_user (user, &info, *len) !=0 ) + ret = -EFAULT ; +else + ret =0 ; +xt_table_unlock (t); +module_put (t->me); + }else + ret = t ?PTR_ERR (t) : -ENOENT ; +return ret; +} +static int get_entries (const struct arpt_get_entries *entries,struct arpt_get_entries __user *uptr) {
@@ -1008,48 +1051,9 @@ static int do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, int *lenreturn -EPERM ;switch (cmd) { -case ARPT_SO_GET_INFO : { -char name[ARPT_TABLE_MAXNAMELEN ]; -struct arpt_table *t; - -if (*len !=sizeof (struct arpt_getinfo )) { -duprintf ("length %u != %Zu\n" , *len, -sizeof (struct arpt_getinfo )); - ret = -EINVAL ; -break ; - } - -if (copy_from_user (name, user,sizeof (name)) !=0 ) { - ret = -EFAULT ; -break ; - } - name[ARPT_TABLE_MAXNAMELEN -1 ] ='\0' ; - - t =try_then_request_module (xt_find_table_lock (NF_ARP , name), -"arptable_%s" , name); -if (t && !IS_ERR (t)) { -struct arpt_getinfo info; -struct xt_table_info *private = t->private; - - info.valid_hooks = t->valid_hooks; -memcpy (info.hook_entry, private->hook_entry, -sizeof (info.hook_entry)); -memcpy (info.underflow, private->underflow, -sizeof (info.underflow)); - info.num_entries = private->number; - info.size = private->size; -strcpy (info.name, name); - -if (copy_to_user (user, &info, *len) !=0 ) - ret = -EFAULT ; -else - ret =0 ; -xt_table_unlock (t); -module_put (t->me); - }else - ret = t ?PTR_ERR (t) : -ENOENT ; - } -break ; +case ARPT_SO_GET_INFO : + ret =get_info (user, len); +break ;case ARPT_SO_GET_ENTRIES : {struct arpt_get_entries get;
PATCH 31/64 : arp_tables: resync get_entries() with ip_tables
In reply to Patrick McHardy[NETFILTER]: arp_tables: resync get_entries() with ip_tables
Resync get_entries() with ip_tables.c by moving the checks from the setsockopt handler to the function itself.
---
commit 283dfad814dcb078afba8a6048feb4701d78bdfc
tree 9da46687ff88924c0b1afb8eae6802f3579f2644
parent e6ccb061713d8286be8f9c885268d8c4cdbfb07e
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:15 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
net/ipv4/netfilter/arp_tables.c | 39 +++++++++++++++++++-------------------- 1 files changed, 19 insertions(+), 20 deletions(-)
net/ipv4/netfilter/arp_tables.c +19 -20
@@ -825,23 +825,35 @@ static int get_info(void __user *user, int *len)return ret; } -static int get_entries (const struct arpt_get_entries *entries, -struct arpt_get_entries __user *uptr) +static int get_entries (struct arpt_get_entries __user *uptr,int *len) {int ret; +struct arpt_get_entries get;struct arpt_table *t; - t =xt_find_table_lock (NF_ARP , entries->name); +if (*len <sizeof (get)) { +duprintf ("get_entries: %u < %Zu\n" , *len,sizeof (get)); +return -EINVAL ; + } +if (copy_from_user (&get, uptr,sizeof (get)) !=0 ) +return -EFAULT ; +if (*len !=sizeof (struct arpt_get_entries ) + get.size) { +duprintf ("get_entries: %u != %Zu\n" , *len, +sizeof (struct arpt_get_entries ) + get.size); +return -EINVAL ; + } + + t =xt_find_table_lock (NF_ARP , get.name);if (t && !IS_ERR (t)) {struct xt_table_info *private = t->private;duprintf ("t->private->number = %u\n" , private->number); -if (entries->size == private->size) +if (get.size == private->size) ret =copy_entries_to_user (private->size, t, uptr->entrytable);else {duprintf ("get_entries: I've got %u not %u!\n" , - private->size, entries->size); + private->size, get.size); ret = -EINVAL ; }module_put (t->me);
@@ -1055,22 +1067,9 @@ static int do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len ret =get_info (user, len);break ; -case ARPT_SO_GET_ENTRIES : { -struct arpt_get_entries get; - -if (*len <sizeof (get)) { -duprintf ("get_entries: %u < %Zu\n" , *len,sizeof (get)); - ret = -EINVAL ; - }else if (copy_from_user (&get, user,sizeof (get)) !=0 ) { - ret = -EFAULT ; - }else if (*len !=sizeof (struct arpt_get_entries ) + get.size) { -duprintf ("get_entries: %u != %Zu\n" , *len, -sizeof (struct arpt_get_entries ) + get.size); - ret = -EINVAL ; - }else - ret =get_entries (&get, user); +case ARPT_SO_GET_ENTRIES : + ret =get_entries (user, len);break ; - }case ARPT_SO_GET_REVISION_TARGET : {struct xt_get_revision rev;
PATCH 32/64 : arp_tables: add compat support
In reply to Patrick McHardy[NETFILTER]: arp_tables: add compat support
---
commit 0e08f9705361e4b662dad414c2c4a20c30f92d31
tree 411ce7f0128fff3d0f96a69ced434a4277e490fc
parent 283dfad814dcb078afba8a6048feb4701d78bdfc
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:16 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
include/linux/netfilter_arp/arp_tables.h | 31 + net/ipv4/netfilter/arp_tables.c | 748 ++++++++++++++++++++++++++++-- 2 files changed, 721 insertions(+), 58 deletions(-)
include/linux/netfilter_arp/arp_tables.h +31 -0
@@ -281,5 +281,36 @@ extern unsigned int arpt_do_table(struct sk_buff *skb, struct arpt_table *table);#define ARPT_ALIGN (s) XT_ALIGN(s) + +#ifdef CONFIG_COMPAT +#include <net/compat.h> + +struct compat_arpt_entry +{ +struct arpt_arp arp; +u_int16_t target_offset; +u_int16_t next_offset; +compat_uint_t comefrom; +struct compat_xt_counters counters; +unsigned char elems[0 ]; +}; + +static inline struct arpt_entry_target * +compat_arpt_get_target (struct compat_arpt_entry *e) +{ +return (void *)e + e->target_offset; +} + +#define COMPAT_ARPT_ALIGN (s) COMPAT_XT_ALIGN(s) + +/* fn returns 0 to continue iteration */ +#define COMPAT_ARPT_ENTRY_ITERATE(entries, size, fn, args...) \ + XT_ENTRY_ITERATE(struct compat_arpt_entry, entries, size, fn, ## args) + +#define COMPAT_ARPT_ENTRY_ITERATE_CONTINUE(entries, size, n, fn, args...) \ + XT_ENTRY_ITERATE_CONTINUE(struct compat_arpt_entry, entries, size, n, \ + fn, ## args) + +#endif /* CONFIG_COMPAT */ #endif /*__KERNEL__*/ #endif /* _ARPTABLES_H */
net/ipv4/netfilter/arp_tables.c +690 -58
890 lines not on this page · raw message
PATCH 33/64 : xt_TCPMSS: don't allow netfilter --setmss to increase mss
In reply to Patrick McHardy[NETFILTER]: xt_TCPMSS: don't allow netfilter --setmss to increase mss
When terminating DSL connections for an assortment of random customers, I've found it necessary to use iptables to clamp the MSS used for connections to work around the various ICMP blackholes in the greater net. Unfortunately, the current behaviour in Linux is imperfect and actually make things worse, so I'm proposing the following: increasing the MSS in a packet can never be a good thing, so make --set-mss only lower the MSS in a packet.
Yes, I am aware of --clamp-mss-to-pmtu, but it doesn't work for outgoing connections from clients (ie web traffic), as it only looks at the PMTU on the destination route, not the source of the packet (the DSL interfaces in question have a 1442 byte MTU while the destination ethernet interface is 1500 -- there are problematic hosts which use a 1300 byte MTU). Reworking that is probably a good idea at some point, but it's more work than this is.
---
commit 9e9b510cb6ca4fd63e7dea2ded5ff87f84897498
tree 4103474d644ca4cc684a40fd8a042e52cc14df23
parent 0e08f9705361e4b662dad414c2c4a20c30f92d31
author Benjamin LaHaise <[email protected]> Mon, 17 Dec 2007 14:58:17 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
net/netfilter/xt_TCPMSS.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-)
net/netfilter/xt_TCPMSS.c +5 -2
@@ -88,8 +88,11 @@ tcpmss_mangle_packet(struct sk_buff *skb, oldmss = (opt[i+2 ] <<8 ) | opt[i+3 ]; -if (info->mss ==XT_TCPMSS_CLAMP_PMTU && - oldmss <= newmss) +/* Never increase MSS, even when setting it, as +* doing so results in problems for hosts that rely +* on MSS being set correctly. +*/ +if (oldmss <= newmss)return 0 ; opt[i+2 ] = (newmss &0xff00 ) >>8 ;
PATCH 34/64 : ctnetlink: add support for NAT sequence adjustments
In reply to Patrick McHardy[NETFILTER]: ctnetlink: add support for NAT sequence adjustments
The combination of NAT and helpers may produce TCP sequence adjustments. In failover setups, this information needs to be replicated in order to achieve a successful recovery of mangled, related connections. This patch is particularly useful for conntrackd, see:
http://people.netfilter.org/pablo/conntrack-tools/
---
commit f76c1f6a5f4bdbcb8ac6bf4d5e3c0c3df06c935d
tree 91b7c08d1ff208087d9aa9893aaefddde3f019a6
parent 9e9b510cb6ca4fd63e7dea2ded5ff87f84897498
author Pablo Neira Ayuso <[email protected]> Mon, 17 Dec 2007 14:58:19 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
include/linux/netfilter/nf_conntrack_common.h | 4 + include/linux/netfilter/nfnetlink_conntrack.h | 10 ++ net/ipv4/netfilter/nf_nat_helper.c | 3 + net/netfilter/nf_conntrack_netlink.c | 124 +++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 1 deletions(-)
include/linux/netfilter/nf_conntrack_common.h +4 -0
@@ -129,6 +129,10 @@ enum ip_conntrack_events/* Mark is set */ IPCT_MARK_BIT =12 ,IPCT_MARK = (1 <<IPCT_MARK_BIT ), + +/* NAT sequence adjustment */ +IPCT_NATSEQADJ_BIT =13 , + IPCT_NATSEQADJ = (1 << IPCT_NATSEQADJ_BIT), }; enum ip_conntrack_expect_events {
include/linux/netfilter/nfnetlink_conntrack.h +10 -0
@@ -37,6 +37,8 @@ enum ctattr_type {CTA_ID ,CTA_NAT_DST ,CTA_TUPLE_MASTER , +CTA_NAT_SEQ_ADJ_ORIG , +CTA_NAT_SEQ_ADJ_REPLY , __CTA_MAX };#define CTA_MAX (__CTA_MAX - 1)
@@ -119,6 +121,14 @@ enum ctattr_protonat { };#define CTA_PROTONAT_MAX (__CTA_PROTONAT_MAX - 1) +enum ctattr_natseq { +CTA_NAT_SEQ_CORRECTION_POS , +CTA_NAT_SEQ_OFFSET_BEFORE , +CTA_NAT_SEQ_OFFSET_AFTER , + __CTA_NAT_SEQ_MAX +}; +#define CTA_NAT_SEQ_MAX (__CTA_NAT_SEQ_MAX - 1) +enum ctattr_expect {CTA_EXPECT_UNSPEC ,CTA_EXPECT_MASTER ,
net/ipv4/netfilter/nf_nat_helper.c +3 -0
@@ -20,6 +20,7 @@#include <linux/netfilter_ipv4.h> #include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack_helper.h> +#include <net/netfilter/nf_conntrack_ecache.h> #include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_protocol.h>
@@ -191,6 +192,8 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb,/* Tell TCP window tracking about seq change */ nf_conntrack_tcp_update (skb,ip_hdrlen (skb), ct,CTINFO2DIR (ctinfo)); + +nf_conntrack_event_cache (IPCT_NATSEQADJ , skb); }return 1 ; }
net/netfilter/nf_conntrack_netlink.c +123 -1
154 lines not on this page · raw message
PATCH 35/64 : ctnetlink: add support for master tuple event notification and dumping
In reply to Patrick McHardy[NETFILTER]: ctnetlink: add support for master tuple event notification and dumping
This patch adds support for master tuple event notification and dumping. Conntrackd needs this information to recover related connections appropriately.
---
commit 511b7ee38fc06fe1a18ae3f4872f318ecb9301c6
tree fb1d55c475e0598964d73047decc5a52893f666b
parent f76c1f6a5f4bdbcb8ac6bf4d5e3c0c3df06c935d
author Pablo Neira Ayuso <[email protected]> Mon, 17 Dec 2007 14:58:20 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
net/netfilter/nf_conntrack_netlink.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
net/netfilter/nf_conntrack_netlink.c +28 -0
@@ -254,6 +254,29 @@ nla_put_failure:#define ctnetlink_dump_mark (a, b) (0)#endif +#define master_tuple (ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple) + +static inline int +ctnetlink_dump_master (struct sk_buff *skb,const struct nf_conn *ct) +{ +struct nlattr *nest_parms; + +if (!(ct->status &IPS_EXPECTED )) +return 0 ; + + nest_parms =nla_nest_start (skb,CTA_TUPLE_MASTER |NLA_F_NESTED ); +if (!nest_parms) + goto nla_put_failure; +if (ctnetlink_dump_tuples (skb,master_tuple (ct)) <0 ) + goto nla_put_failure; +nla_nest_end (skb, nest_parms); + +return 0 ; + +nla_put_failure: +return -1 ; +} +#ifdef CONFIG_NF_NAT_NEEDED static inline int dump_nat_seq_adj (struct sk_buff *skb,const struct nf_nat_seq *natseq,int type)
@@ -371,6 +394,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,ctnetlink_dump_mark (skb, ct) <0 ||ctnetlink_dump_id (skb, ct) <0 ||ctnetlink_dump_use (skb, ct) <0 || +ctnetlink_dump_master (skb, ct) <0 || ctnetlink_dump_nat_seq_adj(skb, ct) < 0) goto nla_put_failure;
@@ -475,6 +499,10 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)) goto nla_put_failure; +if (events &IPCT_RELATED && +ctnetlink_dump_master (skb, ct) <0 ) + goto nla_put_failure; +if (events &IPCT_NATSEQADJ &&ctnetlink_dump_nat_seq_adj (skb, ct) <0 ) goto nla_put_failure;
PATCH 36/64 : ctnetlink: add support for secmark
In reply to Patrick McHardy[NETFILTER]: ctnetlink: add support for secmark
This patch adds support for James Morris' connsecmark.
---
commit 458ec48bd83fa935e90880fe2e45b190c9e3d075
tree d5afc919de8252d88f38cfe3cdceb43966f6c035
parent 511b7ee38fc06fe1a18ae3f4872f318ecb9301c6
author Pablo Neira Ayuso <[email protected]> Mon, 17 Dec 2007 14:58:22 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:56 +0100
include/linux/netfilter/nf_conntrack_common.h | 4 ++++ include/linux/netfilter/nfnetlink_conntrack.h | 1 + net/netfilter/nf_conntrack_netlink.c | 22 ++++++++++++++++++++++ net/netfilter/xt_CONNSECMARK.c | 5 ++++- 4 files changed, 31 insertions(+), 1 deletions(-)
include/linux/netfilter/nf_conntrack_common.h +4 -0
@@ -133,6 +133,10 @@ enum ip_conntrack_events/* NAT sequence adjustment */ IPCT_NATSEQADJ_BIT =13 ,IPCT_NATSEQADJ = (1 <<IPCT_NATSEQADJ_BIT ), + +/* Secmark is set */ +IPCT_SECMARK_BIT =14 , + IPCT_SECMARK = (1 << IPCT_SECMARK_BIT), }; enum ip_conntrack_expect_events {
include/linux/netfilter/nfnetlink_conntrack.h +1 -0
@@ -39,6 +39,7 @@ enum ctattr_type {CTA_TUPLE_MASTER ,CTA_NAT_SEQ_ADJ_ORIG ,CTA_NAT_SEQ_ADJ_REPLY , +CTA_SECMARK , __CTA_MAX };#define CTA_MAX (__CTA_MAX - 1)
net/netfilter/nf_conntrack_netlink.c +22 -0
@@ -254,6 +254,22 @@ nla_put_failure:#define ctnetlink_dump_mark (a, b) (0)#endif +#ifdef CONFIG_NF_CONNTRACK_SECMARK +static inline int +ctnetlink_dump_secmark (struct sk_buff *skb,const struct nf_conn *ct) +{ +__be32 mark =htonl (ct->secmark); + +NLA_PUT (skb,CTA_SECMARK ,sizeof (u_int32_t), &mark); +return 0 ; + +nla_put_failure: +return -1 ; +} +#else +#define ctnetlink_dump_secmark (a, b) (0) +#endif +#define master_tuple (ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple) static inline int
@@ -392,6 +408,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,ctnetlink_dump_protoinfo (skb, ct) <0 ||ctnetlink_dump_helpinfo (skb, ct) <0 ||ctnetlink_dump_mark (skb, ct) <0 || +ctnetlink_dump_secmark (skb, ct) <0 ||ctnetlink_dump_id (skb, ct) <0 ||ctnetlink_dump_use (skb, ct) <0 || ctnetlink_dump_master(skb, ct) < 0 ||
@@ -493,6 +510,11 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, && ctnetlink_dump_mark(skb, ct) < 0) goto nla_put_failure;#endif +#ifdef CONFIG_NF_CONNTRACK_SECMARK +if ((events &IPCT_SECMARK || ct->secmark) + &&ctnetlink_dump_secmark (skb, ct) <0 ) + goto nla_put_failure; +#endif if (events & IPCT_COUNTER_FILLING && (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 ||
net/netfilter/xt_CONNSECMARK.c +4 -1
@@ -20,6 +20,7 @@#include <linux/netfilter/x_tables.h> #include <linux/netfilter/xt_CONNSECMARK.h> #include <net/netfilter/nf_conntrack.h> +#include <net/netfilter/nf_conntrack_ecache.h> #define PFX "CONNSECMARK: "
@@ -40,8 +41,10 @@ static void secmark_save(const struct sk_buff *skb)enum ip_conntrack_info ctinfo; ct =nf_ct_get (skb, &ctinfo); -if (ct && !ct->secmark) +if (ct && !ct->secmark) { ct->secmark = skb->secmark; +nf_conntrack_event_cache (IPCT_SECMARK , skb); + } } }
PATCH 37/64 : nf_conntrack_sctp: add ctnetlink support
In reply to Patrick McHardy[NETFILTER]: nf_conntrack_sctp: add ctnetlink support
This patch adds support for SCTP to ctnetlink.
---
commit b44099f1aeaa1b0b60ce3bbc9ec647f42fb2fc77
tree c444f208e73fbff8e9318c2537e64d1a468138f0
parent 458ec48bd83fa935e90880fe2e45b190c9e3d075
author Pablo Neira Ayuso <[email protected]> Mon, 17 Dec 2007 14:58:23 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
net/netfilter/nf_conntrack_proto_sctp.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)
net/netfilter/nf_conntrack_proto_sctp.c +10 -0
@@ -598,6 +598,11 @@ static struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp4 __read_mostly = { .packet = sctp_packet, .new = sctp_new, .me = THIS_MODULE, +#if defined(CONFIG_NF_CT_NETLINK ) || defined(CONFIG_NF_CT_NETLINK_MODULE ) + .tuple_to_nlattr = nf_ct_port_tuple_to_nlattr, + .nlattr_to_tuple = nf_ct_port_nlattr_to_tuple, + .nla_policy = nf_ct_port_nla_policy, +#endif #ifdef CONFIG_SYSCTL .ctl_table_users = &sctp_sysctl_table_users, .ctl_table_header = &sctp_sysctl_header,
@@ -619,6 +624,11 @@ static struct nf_conntrack_l4proto nf_conntrack_l4proto_sctp6 __read_mostly = { .packet = sctp_packet, .new = sctp_new, .me = THIS_MODULE, +#if defined(CONFIG_NF_CT_NETLINK ) || defined(CONFIG_NF_CT_NETLINK_MODULE ) + .tuple_to_nlattr = nf_ct_port_tuple_to_nlattr, + .nlattr_to_tuple = nf_ct_port_nlattr_to_tuple, + .nla_policy = nf_ct_port_nla_policy, +#endif #ifdef CONFIG_SYSCTL .ctl_table_users = &sctp_sysctl_table_users, .ctl_table_header = &sctp_sysctl_header,
PATCH 38/64 : Add NLA_PUT_BE16/nla_get_be16()
In reply to Patrick McHardy[NETLINK]: Add NLA_PUT_BE16/nla_get_be16()
---
commit 114dd2440180d6f7ffc861b75ea0b0f09441b7e2
tree 4d5074a1840ba8244f196a62708ea31441a2dace
parent b44099f1aeaa1b0b60ce3bbc9ec647f42fb2fc77
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:24 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
include/net/netlink.h | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-)
include/net/netlink.h +12 -0
@@ -881,6 +881,9 @@ static inline int nla_put_msecs(struct sk_buff *skb, int attrtype,#define NLA_PUT_LE16 (skb, attrtype, value) \ NLA_PUT_TYPE(skb, __le16, attrtype, value) +#define NLA_PUT_BE16 (skb, attrtype, value) \ + NLA_PUT_TYPE(skb, __be16, attrtype, value) +#define NLA_PUT_U32 (skb, attrtype, value) \ NLA_PUT_TYPE(skb, u32, attrtype, value)
@@ -927,6 +930,15 @@ static inline u16 nla_get_u16(struct nlattr *nla) }/** +* nla_get_be16 - return payload of __be16 attribute +* @nla: __be16 netlink attribute +*/ +static inline __be16 nla_get_be16 (struct nlattr *nla) +{ +return *(__be16 *)nla_data (nla); +} + +/** * nla_get_le16 - return payload of __le16 attribute * @nla: __le16 netlink attribute */
PATCH 39/64 : ctnetlink: use netlink attribute helpers
In reply to Patrick McHardy[NETFILTER]: ctnetlink: use netlink attribute helpers
Use NLA_PUT_BE32, nla_get_be32() etc.
---
commit 94c79530c678600dc80eb1ce09df60e6b059cddd
tree 00fd8691b85bf6f35808159b7bffc2f4e35ae22a
parent 114dd2440180d6f7ffc861b75ea0b0f09441b7e2
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:26 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 10 +-- net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 18 ++--- net/ipv4/netfilter/nf_nat_core.c | 12 +-- net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 18 ++--- net/netfilter/nf_conntrack_core.c | 10 +-- net/netfilter/nf_conntrack_netlink.c | 87 ++++++++++-------------- net/netfilter/nf_conntrack_proto_tcp.c | 22 +++--- 7 files changed, 70 insertions(+), 107 deletions(-)
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +4 -6
@@ -363,10 +363,8 @@ getorigdst(struct sock *sk, int optval, void __user *user, int *len)static int ipv4_tuple_to_nlattr (struct sk_buff *skb,const struct nf_conntrack_tuple *tuple) { -NLA_PUT (skb,CTA_IP_V4_SRC ,sizeof (u_int32_t), - &tuple->src.u3.ip); -NLA_PUT (skb,CTA_IP_V4_DST ,sizeof (u_int32_t), - &tuple->dst.u3.ip); +NLA_PUT_BE32 (skb,CTA_IP_V4_SRC , tuple->src.u3.ip); +NLA_PUT_BE32 (skb,CTA_IP_V4_DST , tuple->dst.u3.ip);return 0 ; nla_put_failure:
@@ -384,8 +382,8 @@ static int ipv4_nlattr_to_tuple(struct nlattr *tb[],if (!tb[CTA_IP_V4_SRC ] || !tb[CTA_IP_V4_DST ])return -EINVAL ; - t->src.u3.ip = *(__be32 *)nla_data (tb[CTA_IP_V4_SRC ]); - t->dst.u3.ip = *(__be32 *)nla_data (tb[CTA_IP_V4_DST ]); + t->src.u3.ip =nla_get_be32 (tb[CTA_IP_V4_SRC ]); + t->dst.u3.ip =nla_get_be32 (tb[CTA_IP_V4_DST ]);return 0 ; }
net/ipv4/netfilter/nf_conntrack_proto_icmp.c +6 -12
@@ -234,12 +234,9 @@ icmp_error(struct sk_buff *skb, unsigned int dataoff,static int icmp_tuple_to_nlattr (struct sk_buff *skb,const struct nf_conntrack_tuple *t) { -NLA_PUT (skb,CTA_PROTO_ICMP_ID ,sizeof (u_int16_t), - &t->src.u.icmp.id); -NLA_PUT (skb,CTA_PROTO_ICMP_TYPE ,sizeof (u_int8_t), - &t->dst.u.icmp.type); -NLA_PUT (skb,CTA_PROTO_ICMP_CODE ,sizeof (u_int8_t), - &t->dst.u.icmp.code); +NLA_PUT_BE16 (skb,CTA_PROTO_ICMP_ID , t->src.u.icmp.id); +NLA_PUT_U8 (skb,CTA_PROTO_ICMP_TYPE , t->dst.u.icmp.type); +NLA_PUT_U8 (skb,CTA_PROTO_ICMP_CODE , t->dst.u.icmp.code);return 0 ;
@@ -261,12 +258,9 @@ static int icmp_nlattr_to_tuple(struct nlattr *tb[], || !tb[CTA_PROTO_ICMP_ID])return -EINVAL ; - tuple->dst.u.icmp.type = - *(u_int8_t *)nla_data (tb[CTA_PROTO_ICMP_TYPE ]); - tuple->dst.u.icmp.code = - *(u_int8_t *)nla_data (tb[CTA_PROTO_ICMP_CODE ]); - tuple->src.u.icmp.id = - *(__be16 *)nla_data (tb[CTA_PROTO_ICMP_ID ]); + tuple->dst.u.icmp.type =nla_get_u8 (tb[CTA_PROTO_ICMP_TYPE ]); + tuple->dst.u.icmp.code =nla_get_u8 (tb[CTA_PROTO_ICMP_CODE ]); + tuple->src.u.icmp.id =nla_get_be16 (tb[CTA_PROTO_ICMP_ID ]);if (tuple->dst.u.icmp.type >=sizeof (invmap) || !invmap[tuple->dst.u.icmp.type])
net/ipv4/netfilter/nf_nat_core.c +4 -8
@@ -547,10 +547,8 @@ int nf_nat_port_range_to_nlattr(struct sk_buff *skb, const struct nf_nat_range *range) { -NLA_PUT (skb, CTA_PROTONAT_PORT_MIN, sizeof(__be16 ), - &range->min.tcp.port); -NLA_PUT (skb,CTA_PROTONAT_PORT_MAX ,sizeof (__be16), - &range->max.tcp.port); + NLA_PUT_BE16(skb, CTA_PROTONAT_PORT_MIN, range->min.tcp.port); +NLA_PUT_BE16 (skb,CTA_PROTONAT_PORT_MAX , range->max.tcp.port);return 0 ;
@@ -568,8 +566,7 @@ nf_nat_port_nlattr_to_range(struct nlattr *tb[], struct nf_nat_range *range)if (tb[CTA_PROTONAT_PORT_MIN ]) { ret =1 ; - range->min.tcp.port = - *(__be16 *)nla_data (tb[CTA_PROTONAT_PORT_MIN ]); + range->min.tcp.port =nla_get_be16 (tb[CTA_PROTONAT_PORT_MIN ]); }if (!tb[CTA_PROTONAT_PORT_MAX ]) {
@@ -577,8 +574,7 @@ nf_nat_port_nlattr_to_range(struct nlattr *tb[], struct nf_nat_range *range) range->max.tcp.port = range->min.tcp.port; }else { ret =1 ; - range->max.tcp.port = - *(__be16 *)nla_data (tb[CTA_PROTONAT_PORT_MAX ]); + range->max.tcp.port =nla_get_be16 (tb[CTA_PROTONAT_PORT_MAX ]); }return ret;
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +6 -12
@@ -213,12 +213,9 @@ icmpv6_error(struct sk_buff *skb, unsigned int dataoff,static int icmpv6_tuple_to_nlattr (struct sk_buff *skb,const struct nf_conntrack_tuple *t) { -NLA_PUT (skb,CTA_PROTO_ICMPV6_ID ,sizeof (u_int16_t), - &t->src.u.icmp.id); -NLA_PUT (skb,CTA_PROTO_ICMPV6_TYPE ,sizeof (u_int8_t), - &t->dst.u.icmp.type); -NLA_PUT (skb,CTA_PROTO_ICMPV6_CODE ,sizeof (u_int8_t), - &t->dst.u.icmp.code); +NLA_PUT_BE16 (skb,CTA_PROTO_ICMPV6_ID , t->src.u.icmp.id); +NLA_PUT_U8 (skb,CTA_PROTO_ICMPV6_TYPE , t->dst.u.icmp.type); +NLA_PUT_U8 (skb,CTA_PROTO_ICMPV6_CODE , t->dst.u.icmp.code);return 0 ;
@@ -240,12 +237,9 @@ static int icmpv6_nlattr_to_tuple(struct nlattr *tb[], || !tb[CTA_PROTO_ICMPV6_ID])return -EINVAL ; - tuple->dst.u.icmp.type = - *(u_int8_t *)nla_data (tb[CTA_PROTO_ICMPV6_TYPE ]); - tuple->dst.u.icmp.code = - *(u_int8_t *)nla_data (tb[CTA_PROTO_ICMPV6_CODE ]); - tuple->src.u.icmp.id = - *(__be16 *)nla_data (tb[CTA_PROTO_ICMPV6_ID ]); + tuple->dst.u.icmp.type =nla_get_u8 (tb[CTA_PROTO_ICMPV6_TYPE ]); + tuple->dst.u.icmp.code =nla_get_u8 (tb[CTA_PROTO_ICMPV6_CODE ]); + tuple->src.u.icmp.id =nla_get_be16 (tb[CTA_PROTO_ICMPV6_ID ]);if (tuple->dst.u.icmp.type <128 || tuple->dst.u.icmp.type - 128 >= sizeof(invmap)
net/netfilter/nf_conntrack_core.c +4 -6
@@ -831,10 +831,8 @@ EXPORT_SYMBOL_GPL(__nf_ct_refresh_acct);int nf_ct_port_tuple_to_nlattr (struct sk_buff *skb,const struct nf_conntrack_tuple *tuple) { -NLA_PUT (skb,CTA_PROTO_SRC_PORT ,sizeof (u_int16_t), - &tuple->src.u.tcp.port); -NLA_PUT (skb,CTA_PROTO_DST_PORT ,sizeof (u_int16_t), - &tuple->dst.u.tcp.port); +NLA_PUT_BE16 (skb,CTA_PROTO_SRC_PORT , tuple->src.u.tcp.port); +NLA_PUT_BE16 (skb,CTA_PROTO_DST_PORT , tuple->dst.u.tcp.port);return 0 ; nla_put_failure:
@@ -854,8 +852,8 @@ int nf_ct_port_nlattr_to_tuple(struct nlattr *tb[],if (!tb[CTA_PROTO_SRC_PORT ] || !tb[CTA_PROTO_DST_PORT ])return -EINVAL ; - t->src.u.tcp.port = *(__be16 *)nla_data (tb[CTA_PROTO_SRC_PORT ]); - t->dst.u.tcp.port = *(__be16 *)nla_data (tb[CTA_PROTO_DST_PORT ]); + t->src.u.tcp.port =nla_get_be16 (tb[CTA_PROTO_SRC_PORT ]); + t->dst.u.tcp.port =nla_get_be16 (tb[CTA_PROTO_DST_PORT ]);return 0 ; }
net/netfilter/nf_conntrack_netlink.c +36 -51
253 lines not on this page · raw message
net/netfilter/nf_conntrack_proto_tcp.c +10 -12
@@ -1072,14 +1072,13 @@ static int tcp_to_nlattr(struct sk_buff *skb, struct nlattr *nla,if (!nest_parms) goto nla_put_failure; -NLA_PUT (skb,CTA_PROTOINFO_TCP_STATE ,sizeof (u_int8_t), - &ct->proto.tcp.state); +NLA_PUT_U8 (skb,CTA_PROTOINFO_TCP_STATE , ct->proto.tcp.state); -NLA_PUT (skb,CTA_PROTOINFO_TCP_WSCALE_ORIGINAL ,sizeof (u_int8_t), - &ct->proto.tcp.seen[0 ].td_scale); +NLA_PUT_U8 (skb,CTA_PROTOINFO_TCP_WSCALE_ORIGINAL , + ct->proto.tcp.seen[0 ].td_scale); -NLA_PUT (skb,CTA_PROTOINFO_TCP_WSCALE_REPLY ,sizeof (u_int8_t), - &ct->proto.tcp.seen[1 ].td_scale); +NLA_PUT_U8 (skb,CTA_PROTOINFO_TCP_WSCALE_REPLY , + ct->proto.tcp.seen[1 ].td_scale); tmp.flags = ct->proto.tcp.seen[0 ].flags; NLA_PUT(skb, CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
@@ -1126,8 +1125,7 @@ static int nlattr_to_tcp(struct nlattr *cda[], struct nf_conn *ct)return -EINVAL ;write_lock_bh (&tcp_lock); - ct->proto.tcp.state = - *(u_int8_t *)nla_data (tb[CTA_PROTOINFO_TCP_STATE ]); + ct->proto.tcp.state =nla_get_u8 (tb[CTA_PROTOINFO_TCP_STATE ]);if (tb[CTA_PROTOINFO_TCP_FLAGS_ORIGINAL ]) { struct nf_ct_tcp_flags *attr =
@@ -1147,10 +1145,10 @@ static int nlattr_to_tcp(struct nlattr *cda[], struct nf_conn *ct) tb[CTA_PROTOINFO_TCP_WSCALE_REPLY ] && ct->proto.tcp.seen[0 ].flags &IP_CT_TCP_FLAG_WINDOW_SCALE && ct->proto.tcp.seen[1].flags & IP_CT_TCP_FLAG_WINDOW_SCALE) { - ct->proto.tcp.seen[0].td_scale = *(u_int8_t *) -nla_data (tb[CTA_PROTOINFO_TCP_WSCALE_ORIGINAL ]); - ct->proto.tcp.seen[1 ].td_scale = *(u_int8_t *) -nla_data (tb[CTA_PROTOINFO_TCP_WSCALE_REPLY ]); + ct->proto.tcp.seen[0].td_scale = +nla_get_u8 (tb[CTA_PROTOINFO_TCP_WSCALE_ORIGINAL ]); + ct->proto.tcp.seen[1 ].td_scale = +nla_get_u8 (tb[CTA_PROTOINFO_TCP_WSCALE_REPLY ]); }write_unlock_bh (&tcp_lock);
PATCH 40/64 : ctnetlink: fix expectation timeout dumping
In reply to Patrick McHardy[NETFILTER]: ctnetlink: fix expectation timeout dumping
When the timer is late its timeout might be before the current time, in which case a very large value is dumped.
---
commit 56ffe07f8708058c5aab185ea4658257a5b9f709
tree 18f33542fe1a7ef7ac0ea0840b9686264ed5655b
parent 94c79530c678600dc80eb1ce09df60e6b059cddd
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:27 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
net/netfilter/nf_conntrack_netlink.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-)
net/netfilter/nf_conntrack_netlink.c +5 -2
@@ -1356,7 +1356,10 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb, const struct nf_conntrack_expect *exp) {struct nf_conn *master = exp->master; -__be32 timeout =htonl ((exp->timeout.expires - jiffies) /HZ ); +long timeout = (exp->timeout.expires - jiffies) /HZ ; + +if (timeout <0 ) + timeout =0 ;if (ctnetlink_exp_dump_tuple (skb, &exp->tuple,CTA_EXPECT_TUPLE ) <0 ) goto nla_put_failure;
@@ -1367,7 +1370,7 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb, CTA_EXPECT_MASTER) < 0) goto nla_put_failure; -NLA_PUT_BE32 (skb,CTA_EXPECT_TIMEOUT , timeout); +NLA_PUT_BE32 (skb,CTA_EXPECT_TIMEOUT ,htonl (timeout));NLA_PUT_BE32 (skb,CTA_EXPECT_ID ,htonl ((unsigned long )exp));return 0 ;
PATCH 41/64 : nf_nat_proto_gre: add missing module reference
In reply to Patrick McHardy[NETFILTER]: nf_nat_proto_gre: add missing module reference
---
commit 11f11327057d79cd000efab9e70585fb3a356fa6
tree 27e7b6cb7d92fa39cff8de80f0bcbe2e2231128f
parent 56ffe07f8708058c5aab185ea4658257a5b9f709
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:28 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
net/ipv4/netfilter/nf_nat_proto_gre.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
net/ipv4/netfilter/nf_nat_proto_gre.c +1 -0
@@ -138,6 +138,7 @@ gre_manip_pkt(struct sk_buff *skb, unsigned int iphdroff,static struct nf_nat_protocol gre__read_mostly = { .name ="GRE" , .protonum =IPPROTO_GRE , + .me =THIS_MODULE , .manip_pkt = gre_manip_pkt, .in_range = gre_in_range, .unique_tuple = gre_unique_tuple,
PATCH 42/64 : nf_nat: mark NAT protocols const
In reply to Patrick McHardy[NETFILTER]: nf_nat: mark NAT protocols const
---
commit 7f35f5edca069881dc4bf771d08e192cd8704483
tree 6396e734ccaf658b46560c5fa3ac6b464ef5dcdd
parent 11f11327057d79cd000efab9e70585fb3a356fa6
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:30 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
include/net/netfilter/nf_nat_protocol.h | 18 +++++++++--------- net/ipv4/netfilter/nf_nat_core.c | 20 ++++++++++---------- net/ipv4/netfilter/nf_nat_proto_gre.c | 2 +- net/ipv4/netfilter/nf_nat_proto_icmp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_tcp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_udp.c | 2 +- net/ipv4/netfilter/nf_nat_proto_unknown.c | 2 +- net/netfilter/nf_conntrack_netlink.c | 2 +- 8 files changed, 25 insertions(+), 25 deletions(-)
include/net/netfilter/nf_nat_protocol.h +9 -9
@@ -46,21 +46,21 @@ struct nf_nat_protocol };/* Protocol registration. */ -extern int nf_nat_protocol_register (struct nf_nat_protocol *proto); -extern void nf_nat_protocol_unregister (struct nf_nat_protocol *proto); +extern int nf_nat_protocol_register (const struct nf_nat_protocol *proto); +extern void nf_nat_protocol_unregister (const struct nf_nat_protocol *proto); -extern struct nf_nat_protocol *nf_nat_proto_find_get (u_int8_t protocol); -extern void nf_nat_proto_put (struct nf_nat_protocol *proto); +extern const struct nf_nat_protocol *nf_nat_proto_find_get (u_int8_t protocol); +extern void nf_nat_proto_put (const struct nf_nat_protocol *proto);/* Built-in protocols. */ -extern struct nf_nat_protocol nf_nat_protocol_tcp; -extern struct nf_nat_protocol nf_nat_protocol_udp; -extern struct nf_nat_protocol nf_nat_protocol_icmp; -extern struct nf_nat_protocol nf_nat_unknown_protocol; +extern const struct nf_nat_protocol nf_nat_protocol_tcp; +extern const struct nf_nat_protocol nf_nat_protocol_udp; +extern const struct nf_nat_protocol nf_nat_protocol_icmp; +extern const struct nf_nat_protocol nf_nat_unknown_protocol;extern int init_protocols (void )__init ;extern void cleanup_protocols (void ); -extern struct nf_nat_protocol *find_nat_proto (u_int16_t protonum); +extern const struct nf_nat_protocol *find_nat_proto (u_int16_t protonum);extern int nf_nat_port_range_to_nlattr (struct sk_buff *skb,const struct nf_nat_range *range);
net/ipv4/netfilter/nf_nat_core.c +10 -10
@@ -42,18 +42,18 @@ static int nf_nat_vmalloced;static struct hlist_head *bysource;#define MAX_IP_NAT_PROTO 256 -static struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO ]; +static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO ]; -static inline struct nf_nat_protocol * +static inline const struct nf_nat_protocol *__nf_nat_proto_find (u_int8_t protonum) {return rcu_dereference (nf_nat_protos[protonum]); } -struct nf_nat_protocol * +const struct nf_nat_protocol *nf_nat_proto_find_get (u_int8_t protonum) { -struct nf_nat_protocol *p; +const struct nf_nat_protocol *p;rcu_read_lock (); p =__nf_nat_proto_find (protonum);
@@ -66,7 +66,7 @@ nf_nat_proto_find_get(u_int8_t protonum)EXPORT_SYMBOL_GPL (nf_nat_proto_find_get);void -nf_nat_proto_put (struct nf_nat_protocol *p) +nf_nat_proto_put (const struct nf_nat_protocol *p) {module_put (p->me); }
@@ -105,7 +105,7 @@ static int in_range(const struct nf_conntrack_tuple *tuple, const struct nf_nat_range *range) { - struct nf_nat_protocol *proto; + const struct nf_nat_protocol *proto;int ret =0 ;/* If we are supposed to map IPs, then we must be in the
@@ -226,7 +226,7 @@ get_unique_tuple(struct nf_conntrack_tuple *tuple,struct nf_conn *ct, enum nf_nat_manip_type maniptype) { - struct nf_nat_protocol *proto; + const struct nf_nat_protocol *proto;/* 1) If this srcip/proto/src-proto-part is currently mapped, and that same mapping gives a unique tuple within the given
@@ -355,7 +355,7 @@ manip_pkt(u_int16_t proto, enum nf_nat_manip_type maniptype) {struct iphdr *iph; -struct nf_nat_protocol *p; +const struct nf_nat_protocol *p;if (!skb_make_writable (skb, iphdroff +sizeof (*iph)))return 0 ;
@@ -515,7 +515,7 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct,EXPORT_SYMBOL_GPL (nf_nat_icmp_reply_translation);/* Protocol registration. */ -int nf_nat_protocol_register (struct nf_nat_protocol *proto) +int nf_nat_protocol_register (const struct nf_nat_protocol *proto) {int ret =0 ;
@@ -532,7 +532,7 @@ int nf_nat_protocol_register(struct nf_nat_protocol *proto)EXPORT_SYMBOL (nf_nat_protocol_register);/* Noone stores the protocol anywhere; simply delete it. */ -void nf_nat_protocol_unregister (struct nf_nat_protocol *proto) +void nf_nat_protocol_unregister (const struct nf_nat_protocol *proto) {write_lock_bh (&nf_nat_lock); rcu_assign_pointer(nf_nat_protos[proto->protonum],
net/ipv4/netfilter/nf_nat_proto_gre.c +1 -1
@@ -135,7 +135,7 @@ gre_manip_pkt(struct sk_buff *skb, unsigned int iphdroff,return 1 ; } -static struct nf_nat_protocol gre__read_mostly = { +static const struct nf_nat_protocol gre = { .name ="GRE" , .protonum =IPPROTO_GRE , .me =THIS_MODULE ,
net/ipv4/netfilter/nf_nat_proto_icmp.c +1 -1
@@ -71,7 +71,7 @@ icmp_manip_pkt(struct sk_buff *skb,return 1 ; } -struct nf_nat_protocol nf_nat_protocol_icmp = { +const struct nf_nat_protocol nf_nat_protocol_icmp = { .name ="ICMP" , .protonum =IPPROTO_ICMP , .me =THIS_MODULE ,
net/ipv4/netfilter/nf_nat_proto_tcp.c +1 -1
@@ -137,7 +137,7 @@ tcp_manip_pkt(struct sk_buff *skb,return 1 ; } -struct nf_nat_protocol nf_nat_protocol_tcp = { +const struct nf_nat_protocol nf_nat_protocol_tcp = { .name ="TCP" , .protonum =IPPROTO_TCP , .me =THIS_MODULE ,
net/ipv4/netfilter/nf_nat_proto_udp.c +1 -1
@@ -127,7 +127,7 @@ udp_manip_pkt(struct sk_buff *skb,return 1 ; } -struct nf_nat_protocol nf_nat_protocol_udp = { +const struct nf_nat_protocol nf_nat_protocol_udp = { .name ="UDP" , .protonum =IPPROTO_UDP , .me =THIS_MODULE ,
net/ipv4/netfilter/nf_nat_proto_unknown.c +1 -1
@@ -45,7 +45,7 @@ unknown_manip_pkt(struct sk_buff *skb,return 1 ; } -struct nf_nat_protocol nf_nat_unknown_protocol = { +const struct nf_nat_protocol nf_nat_unknown_protocol = { .name ="unknown" ,/* .me isn't set: getting a ref to this cannot fail. */ .manip_pkt = unknown_manip_pkt,
net/netfilter/nf_conntrack_netlink.c +1 -1
@@ -695,7 +695,7 @@ static int nfnetlink_parse_nat_proto(struct nlattr *attr, struct nf_nat_range *range) {struct nlattr *tb[CTA_PROTONAT_MAX +1 ]; -struct nf_nat_protocol *npt; +const struct nf_nat_protocol *npt;int err; err =nla_parse_nested (tb,CTA_PROTONAT_MAX , attr, protonat_nla_policy);
PATCH 43/64 : nf_nat: sprinkle a few __read_mostlys
In reply to Patrick McHardy[NETFILTER]: nf_nat: sprinkle a few __read_mostlys
---
commit 2c4956d3c5e45fca0caa5f7c431d1c45d27ece49
tree 744cd193e410ca60c057e0ebc02941438f3adaf1
parent 7f35f5edca069881dc4bf771d08e192cd8704483
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:31 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:57 +0100
net/ipv4/netfilter/nf_nat_core.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
net/ipv4/netfilter/nf_nat_core.c +5 -4
@@ -33,16 +33,17 @@static DEFINE_RWLOCK (nf_nat_lock); -static struct nf_conntrack_l3proto *l3proto =NULL ; +static struct nf_conntrack_l3proto *l3proto__read_mostly ;/* Calculated at init based on memory size */ -static unsigned int nf_nat_htable_size; +static unsigned int nf_nat_htable_size__read_mostly ;static int nf_nat_vmalloced; -static struct hlist_head *bysource; +static struct hlist_head *bysource__read_mostly ;#define MAX_IP_NAT_PROTO 256 -static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO ]; +static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO ] +__read_mostly ;static inline const struct nf_nat_protocol *__nf_nat_proto_find (u_int8_t protonum)
PATCH 44/64 : nf_nat: pass manip type instead of hook to nf_nat_setup_info
In reply to Patrick McHardy[NETFILTER]: nf_nat: pass manip type instead of hook to nf_nat_setup_info
nf_nat_setup_info gets the hook number and translates that to the manip type to perform. This is a relict from the time when one manip per hook could exist, the exact hook number doesn't matter anymore, its converted to the manip type. Most callers already know what kind of NAT they want to perform, so pass the maniptype in directly.
---
commit 977f2f4eedc00948e79a6e1cbb385b3a946228cc
tree 2a4008b57ec8c8f01339ff5a5636243c94a4a038
parent 2c4956d3c5e45fca0caa5f7c431d1c45d27ece49
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:33 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
include/net/netfilter/nf_nat.h | 2 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 2 +- net/ipv4/netfilter/ipt_NETMAP.c | 2 +- net/ipv4/netfilter/ipt_REDIRECT.c | 2 +- net/ipv4/netfilter/nf_nat_core.c | 9 +++------ net/ipv4/netfilter/nf_nat_h323.c | 16 ++++------------ net/ipv4/netfilter/nf_nat_helper.c | 6 ++---- net/ipv4/netfilter/nf_nat_pptp.c | 6 ++---- net/ipv4/netfilter/nf_nat_rule.c | 8 ++++---- net/ipv4/netfilter/nf_nat_sip.c | 6 ++---- net/netfilter/nf_conntrack_netlink.c | 10 ++++------ 11 files changed, 25 insertions(+), 44 deletions(-)
include/net/netfilter/nf_nat.h +1 -1
@@ -80,7 +80,7 @@ struct nf_conn_nat/* Set up the info structure to map into this range. */ extern unsigned int nf_nat_setup_info (struct nf_conn *ct,const struct nf_nat_range *range, -unsigned int hooknum); +enum nf_nat_manip_type maniptype);/* Is this tuple already taken? (not by us)*/ extern int nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple,
net/ipv4/netfilter/ipt_MASQUERADE.c +1 -1
@@ -95,7 +95,7 @@ masquerade_tg(struct sk_buff *skb, const struct net_device *in, mr->range[0].min, mr->range[0].max });/* Hand modified range to generic setup. */ -return nf_nat_setup_info (ct, &newrange, hooknum); +return nf_nat_setup_info (ct, &newrange,IP_NAT_MANIP_SRC ); } static int
net/ipv4/netfilter/ipt_NETMAP.c +1 -1
@@ -70,7 +70,7 @@ netmap_tg(struct sk_buff *skb, const struct net_device *in, mr->range[0].min, mr->range[0].max });/* Hand modified range to generic setup. */ -return nf_nat_setup_info (ct, &newrange, hooknum); +return nf_nat_setup_info (ct, &newrange,HOOK2MANIP (hooknum)); } static struct xt_target netmap_tg_reg __read_mostly = {
net/ipv4/netfilter/ipt_REDIRECT.c +1 -1
@@ -87,7 +87,7 @@ redirect_tg(struct sk_buff *skb, const struct net_device *in, mr->range[0].min, mr->range[0].max });/* Hand modified range to generic setup. */ -return nf_nat_setup_info (ct, &newrange, hooknum); +return nf_nat_setup_info (ct, &newrange,IP_NAT_MANIP_DST ); } static struct xt_target redirect_tg_reg __read_mostly = {
net/ipv4/netfilter/nf_nat_core.c +3 -6
@@ -277,12 +277,11 @@ out:unsigned int nf_nat_setup_info (struct nf_conn *ct,const struct nf_nat_range *range, -unsigned int hooknum) +enum nf_nat_manip_type maniptype) {struct nf_conntrack_tuple curr_tuple, new_tuple;struct nf_conn_nat *nat;int have_to_hash = !(ct->status &IPS_NAT_DONE_MASK ); -enum nf_nat_manip_type maniptype =HOOK2MANIP (hooknum);/* nat helper or nfctnetlink also setup binding */ nat =nfct_nat (ct);
@@ -294,10 +293,8 @@ nf_nat_setup_info(struct nf_conn *ct, } } -NF_CT_ASSERT (hooknum ==NF_INET_PRE_ROUTING || - hooknum ==NF_INET_POST_ROUTING || - hooknum ==NF_INET_LOCAL_IN || - hooknum ==NF_INET_LOCAL_OUT ); +NF_CT_ASSERT (maniptype ==IP_NAT_MANIP_SRC || + maniptype ==IP_NAT_MANIP_DST );BUG_ON (nf_nat_initialized (ct, maniptype));/* What we've got will look like inverse of reply. Normally
net/ipv4/netfilter/nf_nat_h323.c +4 -12
@@ -389,18 +389,14 @@ static void ip_nat_q931_expect(struct nf_conn *new,/* Change src to where master sends to */ range.flags =IP_NAT_RANGE_MAP_IPS ; range.min_ip = range.max_ip = new->tuplehash[!this->dir].tuple.src.u3.ip; - -/* hook doesn't matter, but it has to do source manip */ -nf_nat_setup_info (new, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (new, &range,IP_NAT_MANIP_SRC );/* For DST manip, map port here to where it's expected. */ range.flags = (IP_NAT_RANGE_MAP_IPS |IP_NAT_RANGE_PROTO_SPECIFIED ); range.min = range.max = this->saved_proto; range.min_ip = range.max_ip = new->master->tuplehash[!this->dir].tuple.src.u3.ip; - -/* hook doesn't matter, but it has to do destination manip */ -nf_nat_setup_info (new, &range,NF_INET_PRE_ROUTING ); +nf_nat_setup_info (new, &range,IP_NAT_MANIP_DST ); }/****************************************************************************/
@@ -479,17 +475,13 @@ static void ip_nat_callforwarding_expect(struct nf_conn *new,/* Change src to where master sends to */ range.flags =IP_NAT_RANGE_MAP_IPS ; range.min_ip = range.max_ip = new->tuplehash[!this->dir].tuple.src.u3.ip; - -/* hook doesn't matter, but it has to do source manip */ -nf_nat_setup_info (new, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (new, &range,IP_NAT_MANIP_SRC );/* For DST manip, map port here to where it's expected. */ range.flags = (IP_NAT_RANGE_MAP_IPS |IP_NAT_RANGE_PROTO_SPECIFIED ); range.min = range.max = this->saved_proto; range.min_ip = range.max_ip = this->saved_ip; - -/* hook doesn't matter, but it has to do destination manip */ -nf_nat_setup_info (new, &range,NF_INET_PRE_ROUTING ); +nf_nat_setup_info (new, &range,IP_NAT_MANIP_DST ); }/****************************************************************************/
net/ipv4/netfilter/nf_nat_helper.c +2 -4
@@ -433,15 +433,13 @@ void nf_nat_follow_master(struct nf_conn *ct, range.flags =IP_NAT_RANGE_MAP_IPS ; range.min_ip = range.max_ip = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip; -/* hook doesn't matter, but it has to do source manip */ -nf_nat_setup_info (ct, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_SRC );/* For DST manip, map port here to where it's expected. */ range.flags = (IP_NAT_RANGE_MAP_IPS |IP_NAT_RANGE_PROTO_SPECIFIED ); range.min = range.max = exp->saved_proto; range.min_ip = range.max_ip = ct->master->tuplehash[!exp->dir].tuple.src.u3.ip; -/* hook doesn't matter, but it has to do destination manip */ -nf_nat_setup_info (ct, &range,NF_INET_PRE_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_DST ); }EXPORT_SYMBOL (nf_nat_follow_master);
net/ipv4/netfilter/nf_nat_pptp.c +2 -4
@@ -93,8 +93,7 @@ static void pptp_nat_expected(struct nf_conn *ct, range.flags |=IP_NAT_RANGE_PROTO_SPECIFIED ; range.min = range.max = exp->saved_proto; } -/* hook doesn't matter, but it has to do source manip */ -nf_nat_setup_info (ct, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_SRC );/* For DST manip, map port here to where it's expected. */ range.flags =IP_NAT_RANGE_MAP_IPS ;
@@ -104,8 +103,7 @@ static void pptp_nat_expected(struct nf_conn *ct, range.flags |=IP_NAT_RANGE_PROTO_SPECIFIED ; range.min = range.max = exp->saved_proto; } -/* hook doesn't matter, but it has to do destination manip */ -nf_nat_setup_info (ct, &range,NF_INET_PRE_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_DST ); }/* outbound packets == from PNS to PAC */
net/ipv4/netfilter/nf_nat_rule.c +4 -4
@@ -87,7 +87,7 @@ static unsigned int ipt_snat_target(struct sk_buff *skb, ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));NF_CT_ASSERT (out); -return nf_nat_setup_info (ct, &mr->range[0 ], hooknum); +return nf_nat_setup_info (ct, &mr->range[0 ],IP_NAT_MANIP_SRC ); }/* Before 2.6.11 we did implicit source NAT if required. Warn about change. */
@@ -133,7 +133,7 @@ static unsigned int ipt_dnat_target(struct sk_buff *skb,warn_if_extra_mangle (ip_hdr (skb)->daddr, mr->range[0 ].min_ip); -return nf_nat_setup_info (ct, &mr->range[0 ], hooknum); +return nf_nat_setup_info (ct, &mr->range[0 ],IP_NAT_MANIP_DST ); } static bool ipt_snat_checkentry(const char *tablename,
@@ -184,7 +184,7 @@ alloc_null_binding(struct nf_conn *ct, unsigned int hooknum)pr_debug ("Allocating NULL binding for %p (%u.%u.%u.%u)\n" , ct,NIPQUAD (ip)); -return nf_nat_setup_info (ct, &range, hooknum); +return nf_nat_setup_info (ct, &range,HOOK2MANIP (hooknum)); }unsigned int
@@ -203,7 +203,7 @@ alloc_null_binding_confirmed(struct nf_conn *ct, unsigned int hooknum)pr_debug ("Allocating NULL binding for confirmed %p (%u.%u.%u.%u)\n" , ct,NIPQUAD (ip)); -return nf_nat_setup_info (ct, &range, hooknum); +return nf_nat_setup_info (ct, &range,HOOK2MANIP (hooknum)); } int nf_nat_rule_find(struct sk_buff *skb,
net/ipv4/netfilter/nf_nat_sip.c +2 -4
@@ -228,15 +228,13 @@ static void ip_nat_sdp_expect(struct nf_conn *ct, range.flags =IP_NAT_RANGE_MAP_IPS ; range.min_ip = range.max_ip = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip; -/* hook doesn't matter, but it has to do source manip */ -nf_nat_setup_info (ct, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_SRC );/* For DST manip, map port here to where it's expected. */ range.flags = (IP_NAT_RANGE_MAP_IPS |IP_NAT_RANGE_PROTO_SPECIFIED ); range.min = range.max = exp->saved_proto; range.min_ip = range.max_ip = exp->saved_ip; -/* hook doesn't matter, but it has to do destination manip */ -nf_nat_setup_info (ct, &range,NF_INET_PRE_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_DST ); }/* So, this packet has hit the connection tracking matching code.
net/netfilter/nf_conntrack_netlink.c +4 -6
@@ -918,19 +918,17 @@ ctnetlink_change_status(struct nf_conn *ct, struct nlattr *cda[])if (nfnetlink_parse_nat (cda[CTA_NAT_DST ], ct, &range) <0 )return -EINVAL ; -if (nf_nat_initialized (ct, -HOOK2MANIP (NF_INET_PRE_ROUTING ))) +if (nf_nat_initialized (ct,IP_NAT_MANIP_DST ))return -EEXIST ; - nf_nat_setup_info(ct, &range, NF_INET_PRE_ROUTING); + nf_nat_setup_info(ct, &range, IP_NAT_MANIP_DST); }if (cda[CTA_NAT_SRC ]) {if (nfnetlink_parse_nat (cda[CTA_NAT_SRC ], ct, &range) <0 )return -EINVAL ; -if (nf_nat_initialized (ct, -HOOK2MANIP (NF_INET_POST_ROUTING ))) +if (nf_nat_initialized (ct,IP_NAT_MANIP_SRC ))return -EEXIST ; -nf_nat_setup_info (ct, &range,NF_INET_POST_ROUTING ); +nf_nat_setup_info (ct, &range,IP_NAT_MANIP_SRC ); }#endif }
PATCH 45/64 : nf_log: move logging stuff to seperate header
In reply to Patrick McHardy[NETFILTER]: nf_log: move logging stuff to seperate header
---
commit 976e0f77fc8fdb417e7d5526d5e0b2d97c64c74b
tree cd0b5f187216818c0d77412d813db637b9675330
parent 977f2f4eedc00948e79a6e1cbb385b3a946228cc
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:34 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
include/linux/netfilter.h | 55 ---------------------- include/net/netfilter/nf_log.h | 59 ++++++++++++++++++++++++ net/bridge/netfilter/ebt_log.c | 1 net/bridge/netfilter/ebt_ulog.c | 1 net/ipv4/netfilter/ip_tables.c | 1 net/ipv4/netfilter/ipt_LOG.c | 1 net/ipv4/netfilter/ipt_ULOG.c | 1 net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 1 net/ipv6/netfilter/ip6_tables.c | 1 net/ipv6/netfilter/ip6t_LOG.c | 1 net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 1 net/netfilter/nf_conntrack_proto_tcp.c | 1 net/netfilter/nf_conntrack_proto_udp.c | 1 net/netfilter/nf_conntrack_proto_udplite.c | 1 net/netfilter/nf_log.c | 1 net/netfilter/nfnetlink_log.c | 1 net/netfilter/xt_NFLOG.c | 1 17 files changed, 74 insertions(+), 55 deletions(-)
include/linux/netfilter.h +0 -55
@@ -124,61 +124,6 @@ extern struct ctl_table nf_net_ipv4_netfilter_sysctl_path[];extern struct list_head nf_hooks[NPROTO ][NF_MAX_HOOKS ]; -/* those NF_LOG_* defines and struct nf_loginfo are legacy definitios that will -* disappear once iptables is replaced with pkttables. Please DO NOT use them -* for any new code! */ -#define NF_LOG_TCPSEQ 0x01/* Log TCP sequence numbers */ -#define NF_LOG_TCPOPT 0x02/* Log TCP options */ -#define NF_LOG_IPOPT 0x04/* Log IP options */ -#define NF_LOG_UID 0x08/* Log UID owning local socket */ -#define NF_LOG_MASK 0x0f - -#define NF_LOG_TYPE_LOG 0x01 -#define NF_LOG_TYPE_ULOG 0x02 - -struct nf_loginfo { -u_int8_t type; -union { -struct { -u_int32_t copy_len; -u_int16_t group; -u_int16_t qthreshold; - } ulog; -struct { -u_int8_t level; -u_int8_t logflags; - } log; - } u; -}; - -typedef void nf_logfn (unsigned int pf, -unsigned int hooknum, -const struct sk_buff *skb, -const struct net_device *in, -const struct net_device *out, -const struct nf_loginfo *li, -const char *prefix); - -struct nf_logger { -struct module *me; -nf_logfn *logfn; -char *name; -}; - -/* Function to register/unregister log function. */ -int nf_log_register (int pf,struct nf_logger *logger); -void nf_log_unregister (struct nf_logger *logger); -void nf_log_unregister_pf (int pf); - -/* Calls the registered backend logging function */ -void nf_log_packet (int pf, -unsigned int hooknum, -const struct sk_buff *skb, -const struct net_device *in, -const struct net_device *out, -struct nf_loginfo *li, -const char *fmt, ...); -int nf_hook_slow (int pf,unsigned int hook,struct sk_buff *skb,struct net_device *indev,struct net_device *outdev,int (*okfn)(struct sk_buff *),int thresh);
include/net/netfilter/nf_log.h new file +59 -0
59 lines not on this page · raw message
net/bridge/netfilter/ebt_log.c +1 -0
@@ -17,6 +17,7 @@#include <linux/in.h> #include <linux/if_arp.h> #include <linux/spinlock.h> +#include <net/netfilter/nf_log.h> static DEFINE_SPINLOCK (ebt_log_lock);
net/bridge/netfilter/ebt_ulog.c +1 -0
@@ -38,6 +38,7 @@#include <linux/netdevice.h> #include <linux/netfilter_bridge/ebtables.h> #include <linux/netfilter_bridge/ebt_ulog.h> +#include <net/netfilter/nf_log.h> #include <net/sock.h> #include "../br_private.h"
net/ipv4/netfilter/ip_tables.c +1 -0
@@ -26,6 +26,7 @@#include <linux/netfilter/x_tables.h> #include <linux/netfilter_ipv4/ip_tables.h> +#include <net/netfilter/nf_log.h> MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Netfilter Core Team <[email protected]>" );
net/ipv4/netfilter/ipt_LOG.c +1 -0
@@ -22,6 +22,7 @@#include <linux/netfilter.h> #include <linux/netfilter/x_tables.h> #include <linux/netfilter_ipv4/ipt_LOG.h> +#include <net/netfilter/nf_log.h> MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Netfilter Core Team <[email protected]>" );
net/ipv4/netfilter/ipt_ULOG.c +1 -0
@@ -43,6 +43,7 @@#include <linux/netfilter.h> #include <linux/netfilter/x_tables.h> #include <linux/netfilter_ipv4/ipt_ULOG.h> +#include <net/netfilter/nf_log.h> #include <net/sock.h> #include <linux/bitops.h> #include <asm/unaligned.h>
net/ipv4/netfilter/nf_conntrack_proto_icmp.c +1 -0
@@ -18,6 +18,7 @@#include <net/netfilter/nf_conntrack_tuple.h> #include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_core.h> +#include <net/netfilter/nf_log.h> static unsigned long nf_ct_icmp_timeout__read_mostly =30 *HZ ;
net/ipv6/netfilter/ip6_tables.c +1 -0
@@ -28,6 +28,7 @@#include <linux/netfilter_ipv6/ip6_tables.h> #include <linux/netfilter/x_tables.h> +#include <net/netfilter/nf_log.h> MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Netfilter Core Team <[email protected]>" );
net/ipv6/netfilter/ip6t_LOG.c +1 -0
@@ -23,6 +23,7 @@#include <linux/netfilter.h> #include <linux/netfilter/x_tables.h> #include <linux/netfilter_ipv6/ip6_tables.h> +#include <net/netfilter/nf_log.h> MODULE_AUTHOR ("Jan Rekorajski <[email protected]>" );MODULE_DESCRIPTION ("IP6 tables LOG target module" );
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +1 -0
@@ -24,6 +24,7 @@#include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/ipv6/nf_conntrack_icmpv6.h> +#include <net/netfilter/nf_log.h> static unsigned long nf_ct_icmpv6_timeout__read_mostly =30 *HZ ;
net/netfilter/nf_conntrack_proto_tcp.c +1 -0
@@ -24,6 +24,7 @@#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_ecache.h> +#include <net/netfilter/nf_log.h> /* Protects conntrack->proto.tcp */ static DEFINE_RWLOCK (tcp_lock);
net/netfilter/nf_conntrack_proto_udp.c +1 -0
@@ -21,6 +21,7 @@#include <linux/netfilter_ipv6.h> #include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_ecache.h> +#include <net/netfilter/nf_log.h> static unsigned int nf_ct_udp_timeout__read_mostly =30 *HZ ;static unsigned int nf_ct_udp_timeout_stream__read_mostly =180 *HZ ;
net/netfilter/nf_conntrack_proto_udplite.c +1 -0
@@ -22,6 +22,7 @@#include <linux/netfilter_ipv6.h> #include <net/netfilter/nf_conntrack_l4proto.h> #include <net/netfilter/nf_conntrack_ecache.h> +#include <net/netfilter/nf_log.h> static unsigned int nf_ct_udplite_timeout__read_mostly =30 *HZ ;static unsigned int nf_ct_udplite_timeout_stream__read_mostly =180 *HZ ;
net/netfilter/nf_log.c +1 -0
@@ -6,6 +6,7 @@#include <linux/netfilter.h> #include <linux/seq_file.h> #include <net/protocol.h> +#include <net/netfilter/nf_log.h> #include "nf_internals.h"
net/netfilter/nfnetlink_log.c +1 -0
@@ -29,6 +29,7 @@#include <linux/jhash.h> #include <linux/random.h> #include <net/sock.h> +#include <net/netfilter/nf_log.h> #include <asm/atomic.h>
net/netfilter/xt_NFLOG.c +1 -0
@@ -12,6 +12,7 @@#include <linux/netfilter/x_tables.h> #include <linux/netfilter/xt_NFLOG.h> +#include <net/netfilter/nf_log.h> MODULE_AUTHOR ("Patrick McHardy <[email protected]>" );MODULE_DESCRIPTION ("x_tables NFLOG target" );
PATCH 46/64 : nf_log: constify struct nf_logger and nf_log_packet loginfo arg
In reply to Patrick McHardy[NETFILTER]: nf_log: constify struct nf_logger and nf_log_packet loginfo arg
---
commit 31a70984a4c56f7141c77842bd4aa76835f4b1f1
tree c8eff1d8241016e522771f812bedbf820827b838
parent 976e0f77fc8fdb417e7d5526d5e0b2d97c64c74b
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:36 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
include/net/netfilter/nf_log.h | 6 +++--- net/bridge/netfilter/ebt_log.c | 2 +- net/bridge/netfilter/ebt_ulog.c | 2 +- net/ipv4/netfilter/ipt_LOG.c | 2 +- net/ipv6/netfilter/ip6t_LOG.c | 2 +- net/netfilter/nf_log.c | 10 +++++----- net/netfilter/nfnetlink_log.c | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-)
include/net/netfilter/nf_log.h +3 -3
@@ -43,8 +43,8 @@ struct nf_logger { };/* Function to register/unregister log function. */ -int nf_log_register (int pf,struct nf_logger *logger); -void nf_log_unregister (struct nf_logger *logger); +int nf_log_register (int pf,const struct nf_logger *logger); +void nf_log_unregister (const struct nf_logger *logger);void nf_log_unregister_pf (int pf);/* Calls the registered backend logging function */
@@ -53,7 +53,7 @@ void nf_log_packet(int pf,const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, - struct nf_loginfo *li, + const struct nf_loginfo *li, const char *fmt, ...);#endif /* _NF_LOG_H */
net/bridge/netfilter/ebt_log.c +1 -1
@@ -183,7 +183,7 @@ static struct ebt_watcher log = .me = THIS_MODULE, }; -static struct nf_logger ebt_log_logger = { +static const struct nf_logger ebt_log_logger = { .name ="ebt_log" , .logfn = &ebt_log_packet, .me =THIS_MODULE ,
net/bridge/netfilter/ebt_ulog.c +1 -1
@@ -279,7 +279,7 @@ static struct ebt_watcher ulog = { .me = THIS_MODULE, }; -static struct nf_logger ebt_ulog_logger = { +static const struct nf_logger ebt_ulog_logger = { .name =EBT_ULOG_WATCHER , .logfn = &ebt_log_packet, .me =THIS_MODULE ,
net/ipv4/netfilter/ipt_LOG.c +1 -1
@@ -465,7 +465,7 @@ static struct xt_target log_tg_reg __read_mostly = { .me = THIS_MODULE, }; -static struct nf_logger ipt_log_logger ={ +static const struct nf_logger ipt_log_logger ={ .name ="ipt_LOG" , .logfn = &ipt_log_packet, .me =THIS_MODULE ,
net/ipv6/netfilter/ip6t_LOG.c +1 -1
@@ -478,7 +478,7 @@ static struct xt_target log_tg6_reg __read_mostly = { .me = THIS_MODULE, }; -static struct nf_logger ip6t_logger = { +static const struct nf_logger ip6t_logger = { .name ="ip6t_LOG" , .logfn = &ip6t_log_packet, .me =THIS_MODULE ,
net/netfilter/nf_log.c +5 -5
@@ -15,12 +15,12 @@#define NF_LOG_PREFIXLEN 128 -static struct nf_logger *nf_loggers[NPROTO ]; +static const struct nf_logger *nf_loggers[NPROTO ]__read_mostly ;static DEFINE_MUTEX (nf_log_mutex);/* return EBUSY if somebody else is registered, EEXIST if the same logger * is registred, 0 on success. */ -int nf_log_register (int pf,struct nf_logger *logger) +int nf_log_register (int pf,const struct nf_logger *logger) {int ret;
@@ -58,7 +58,7 @@ void nf_log_unregister_pf(int pf) }EXPORT_SYMBOL (nf_log_unregister_pf); -void nf_log_unregister (struct nf_logger *logger) +void nf_log_unregister (const struct nf_logger *logger) {int i;
@@ -78,12 +78,12 @@ void nf_log_packet(int pf,const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, - struct nf_loginfo *loginfo, + const struct nf_loginfo *loginfo, const char *fmt, ...) { va_list args;char prefix[NF_LOG_PREFIXLEN ]; -struct nf_logger *logger; +const struct nf_logger *logger;rcu_read_lock (); logger =rcu_dereference (nf_loggers[pf]);
net/netfilter/nfnetlink_log.c +1 -1
@@ -726,7 +726,7 @@ nfulnl_recv_unsupp(struct sock *ctnl, struct sk_buff *skb,return -ENOTSUPP ; } -static struct nf_logger nfulnl_logger = { +static const struct nf_logger nfulnl_logger = { .name ="nfnetlink_log" , .logfn = &nfulnl_log_packet, .me =THIS_MODULE ,
PATCH 47/64 : nf_log: remove incomprehensible comment
In reply to Patrick McHardy[NETFILTER]: nf_log: remove incomprehensible comment
Whatever that comment tries to say, I don't get it and it looks like a leftover from the time when RCU wasn't used properly.
---
commit b004f3f365c301797f4c40382faed4a4c220aeb1
tree f8c7da6965cdfef93363dba3f9bcb9a7be2afa0e
parent 31a70984a4c56f7141c77842bd4aa76835f4b1f1
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:37 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
net/netfilter/nf_log.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
net/netfilter/nf_log.c +0 -1
@@ -91,7 +91,6 @@ void nf_log_packet(int pf,va_start (args, fmt);vsnprintf (prefix,sizeof (prefix), fmt, args);va_end (args); -/* We must read logging before nf_logfn[pf] */ logger->logfn (pf, hooknum, skb, in, out, loginfo, prefix); }else if (net_ratelimit ()) { printk(KERN_WARNING "nf_log_packet: can\'t log since "
PATCH 48/64 : nfnetlink_log: fix checks in nfulnl_recv_config
In reply to Patrick McHardy[NETFILTER]: nfnetlink_log: fix checks in nfulnl_recv_config
Similar to the nfnetlink_queue fixes:
The peer_pid must be checked in all cases when a logging instance exists, additionally we must check whether an instance exists before attempting to configure it to avoid NULL ptr dereferences.
---
commit 5860f7b62d7a9dcdb1ea33f24e2adb621087ff96
tree 76c14d2a2d94309020b84b7ffaf6786d98cae16a
parent b004f3f365c301797f4c40382faed4a4c220aeb1
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:39 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
net/netfilter/nfnetlink_log.c | 49 +++++++++++++++++++++++------------------ 1 files changed, 27 insertions(+), 22 deletions(-)
net/netfilter/nfnetlink_log.c +27 -22
@@ -753,9 +753,15 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,UDEBUG ("entering for msg %u\n" ,NFNL_MSG_TYPE (nlh->nlmsg_type)); inst =instance_lookup_get (group_num); +if (inst && inst->peer_pid !=NETLINK_CB (skb).pid) { + ret = -EPERM ; + goto out_put; + } +if (nfula[NFULA_CFG_CMD ]) {u_int8_t pf = nfmsg->nfgen_family;struct nfulnl_msg_config_cmd *cmd; + cmd =nla_data (nfula[NFULA_CFG_CMD ]);UDEBUG ("found CFG_CMD for\n" );
@@ -779,11 +785,6 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, goto out; } -if (inst->peer_pid !=NETLINK_CB (skb).pid) { - ret = -EPERM ; - goto out_put; - } -instance_destroy (inst); goto out;case NFULNL_CFG_CMD_PF_BIND :
@@ -800,29 +801,16 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, ret = -EINVAL ;break ; } - -if (!inst) - goto out; - }else { -if (!inst) { -UDEBUG ("no config command, and no instance for " -"group=%u pid=%u =>ENOENT\n" , - group_num,NETLINK_CB (skb).pid); - ret = -ENOENT ; - goto out; - } - -if (inst->peer_pid !=NETLINK_CB (skb).pid) { -UDEBUG ("no config command, and wrong pid\n" ); - ret = -EPERM ; - goto out_put; - } }if (nfula[NFULA_CFG_MODE ]) {struct nfulnl_msg_config_mode *params; params =nla_data (nfula[NFULA_CFG_MODE ]); +if (!inst) { + ret = -ENODEV ; + goto out; + }nfulnl_set_mode (inst, params->copy_mode,ntohl (params->copy_range)); }
@@ -831,6 +819,10 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,__be32 timeout = *(__be32 *)nla_data (nfula[NFULA_CFG_TIMEOUT ]); +if (!inst) { + ret = -ENODEV ; + goto out; + }nfulnl_set_timeout (inst,ntohl (timeout)); }
@@ -838,6 +830,10 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,__be32 nlbufsiz = *(__be32 *)nla_data (nfula[NFULA_CFG_NLBUFSIZ ]); +if (!inst) { + ret = -ENODEV ; + goto out; + }nfulnl_set_nlbufsiz (inst,ntohl (nlbufsiz)); }
@@ -845,12 +841,21 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,__be32 qthresh = *(__be32 *)nla_data (nfula[NFULA_CFG_QTHRESH ]); +if (!inst) { + ret = -ENODEV ; + goto out; + }nfulnl_set_qthresh (inst,ntohl (qthresh)); }if (nfula[NFULA_CFG_FLAGS ]) {__be16 flags = *(__be16 *)nla_data (nfula[NFULA_CFG_FLAGS ]); + +if (!inst) { + ret = -ENODEV ; + goto out; + }nfulnl_set_flags (inst,ntohs (flags)); }
PATCH 49/64 : nfnetlink_{queue,log}: return ENOTSUPP for unknown cfg commands
In reply to Patrick McHardy[NETFILTER]: nfnetlink_{queue,log}: return ENOTSUPP for unknown cfg commands
---
commit 338250942a8a7810a9274028a9d96b8a6d3eecaa
tree 67d03f2ff6ee719cf9548a69227d56fbd6d660d0
parent 5860f7b62d7a9dcdb1ea33f24e2adb621087ff96
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:40 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:58 +0100
net/netfilter/nfnetlink_log.c | 2 +- net/netfilter/nfnetlink_queue.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/netfilter/nfnetlink_log.c +1 -1
@@ -798,7 +798,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,nf_log_unregister_pf (pf);break ;default : - ret = -EINVAL ; + ret = -ENOTSUPP ;break ; } }
net/netfilter/nfnetlink_queue.c +1 -1
@@ -740,7 +740,7 @@ nfqnl_recv_config(struct sock *ctnl, struct sk_buff *skb,case NFQNL_CFG_CMD_PF_UNBIND :break ;default : - ret = -EINVAL ; + ret = -ENOTSUPP ;break ; } }
PATCH 50/64 : nfnetlink_log: remove excessive debugging
In reply to Patrick McHardy[NETFILTER]: nfnetlink_log: remove excessive debugging
---
commit 8c9dba4e0c12b9f605bc3856eba21b605ec1284c
tree 666d63e93a9b2603e18fabffde0e77243bdc76d9
parent 338250942a8a7810a9274028a9d96b8a6d3eecaa
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:41 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
net/netfilter/nfnetlink_log.c | 45 ----------------------------------------- 1 files changed, 0 insertions(+), 45 deletions(-)
net/netfilter/nfnetlink_log.c +0 -45
@@ -45,14 +45,6 @@ #define PRINTR(x, args...) do { if (net_ratelimit()) \ printk(x, ## args); } while (0); -#if 0 -#define UDEBUG(x, args ...) printk(KERN_DEBUG "%s(%d):%s(): " x, \ - __FILE__, __LINE__, __FUNCTION__, \ - ## args) -#else -#define UDEBUG (x, ...) -#endif -struct nfulnl_instance {struct hlist_node hlist;/* global list of instances */ spinlock_t lock;
@@ -93,8 +85,6 @@ __instance_lookup(u_int16_t group_num)struct hlist_node *pos;struct nfulnl_instance *inst; -UDEBUG ("entering (group_num=%u)\n" , group_num); - head = &instance_table[instance_hashfn (group_num)];hlist_for_each_entry (inst, pos, head, hlist) {if (inst->group_num == group_num)
@@ -127,7 +117,6 @@ static void instance_put(struct nfulnl_instance *inst) {if (inst &&atomic_dec_and_test (&inst->use)) { -UDEBUG ("kfree(inst=%p)\n" , inst);kfree (inst);module_put (THIS_MODULE ); }
@@ -140,13 +129,9 @@ instance_create(u_int16_t group_num, int pid) {struct nfulnl_instance *inst; -UDEBUG ("entering (group_num=%u, pid=%d)\n" , group_num, - pid); -write_lock_bh (&instances_lock);if (__instance_lookup (group_num)) { inst =NULL ; -UDEBUG ("aborting, instance already exists\n" ); goto out_unlock; }
@@ -178,9 +163,6 @@ instance_create(u_int16_t group_num, int pid)hlist_add_head (&inst->hlist, &instance_table[instance_hashfn (group_num)]); -UDEBUG ("newly added node: %p, next=%p\n" , &inst->hlist, - inst->hlist.next); -write_unlock_bh (&instances_lock);return inst;
@@ -196,9 +178,6 @@ static void __instance_destroy(struct nfulnl_instance *inst) {/* first pull it out of the global list */ -UDEBUG ("removing instance %p (queuenum=%u) from hash\n" , - inst, inst->group_num); -hlist_del (&inst->hlist);/* then flush all pending packets from skb */
@@ -306,8 +285,6 @@ nfulnl_alloc_skb(unsigned int inst_size, unsigned int pkt_size)struct sk_buff *skb;unsigned int n; -UDEBUG ("entered (%u, %u)\n" , inst_size, pkt_size); -/* alloc skb which should be big enough for a whole multipart * message. WARNING: has to be <= 128k due to slab restrictions */
@@ -342,10 +319,6 @@ __nfulnl_send(struct nfulnl_instance *inst) sizeof(struct nfgenmsg)); status =nfnetlink_unicast (inst->skb, inst->peer_pid,MSG_DONTWAIT ); -if (status <0 ) { -UDEBUG ("netlink_unicast() failed\n" ); -/* FIXME: statistics */ - } inst->qlen =0 ; inst->skb =NULL ;
@@ -369,8 +342,6 @@ nfulnl_timer(unsigned long data) {struct nfulnl_instance *inst = (struct nfulnl_instance *)data; -UDEBUG ("timer function called, flushing buffer\n" ); -spin_lock_bh (&inst->lock);if (inst->skb)__nfulnl_send (inst);
@@ -397,8 +368,6 @@ __build_packet_message(struct nfulnl_instance *inst,__be32 tmp_uint;sk_buff_data_t old_tail = inst->skb->tail; -UDEBUG ("entered\n" ); - nlh =NLMSG_PUT (inst->skb,0 ,0 ,NFNL_SUBSYS_ULOG <<8 |NFULNL_MSG_PACKET ,sizeof (struct nfgenmsg ));
@@ -544,7 +513,6 @@ __build_packet_message(struct nfulnl_instance *inst,return 0 ; nlmsg_failure: -UDEBUG ("nlmsg_failure\n" ); nla_put_failure:PRINTR (KERN_ERR "nfnetlink_log: error creating log nlmsg\n" );return -1 ;
@@ -609,8 +577,6 @@ nfulnl_log_packet(unsigned int pf, +nla_total_size (sizeof (struct nfulnl_msg_packet_hw )) +nla_total_size (sizeof (struct nfulnl_msg_packet_timestamp )); -UDEBUG ("initial size=%u\n" , size); -spin_lock_bh (&inst->lock);if (inst->flags &NFULNL_CFG_F_SEQ )
@@ -637,7 +603,6 @@ nfulnl_log_packet(unsigned int pf, data_len = inst->copy_range; size +=nla_total_size (data_len); -UDEBUG ("copy_packet, therefore size now %u\n" , size);break ;default :
@@ -648,8 +613,6 @@ nfulnl_log_packet(unsigned int pf, size > skb_tailroom(inst->skb) - sizeof(struct nfgenmsg)) {/* either the queue len is too high or we don't have * enough room in the skb left. flush to userspace. */ -UDEBUG ("flushing old skb\n" ); -__nfulnl_flush (inst); }
@@ -659,7 +622,6 @@ nfulnl_log_packet(unsigned int pf, goto alloc_failure; } -UDEBUG ("qlen %d, qthreshold %d\n" , inst->qlen, qthreshold); inst->qlen++; __build_packet_message(inst, skb, data_len, pf,
@@ -681,7 +643,6 @@ unlock_and_release:return ; alloc_failure: -UDEBUG ("error allocating skb\n" );/* FIXME: statistics */ goto unlock_and_release; }
@@ -704,7 +665,6 @@ nfulnl_rcv_nl_event(struct notifier_block *this,struct hlist_head *head = &instance_table[i];hlist_for_each_entry_safe (inst, tmp, t2, head, hlist) { -UDEBUG ("node = %p\n" , inst);if ((n->net == &init_net) && (n->pid == inst->peer_pid))__instance_destroy (inst);
@@ -750,8 +710,6 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,struct nfulnl_instance *inst;int ret =0 ; -UDEBUG ("entering for msg %u\n" ,NFNL_MSG_TYPE (nlh->nlmsg_type)); - inst =instance_lookup_get (group_num);if (inst && inst->peer_pid !=NETLINK_CB (skb).pid) { ret = -EPERM ;
@@ -763,7 +721,6 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,struct nfulnl_msg_config_cmd *cmd; cmd =nla_data (nfula[NFULA_CFG_CMD ]); -UDEBUG ("found CFG_CMD for\n" );switch (cmd->command) {case NFULNL_CFG_CMD_BIND :
@@ -788,11 +745,9 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb,instance_destroy (inst); goto out;case NFULNL_CFG_CMD_PF_BIND : -UDEBUG ("registering log handler for pf=%u\n" , pf); ret =nf_log_register (pf, &nfulnl_logger);break ;case NFULNL_CFG_CMD_PF_UNBIND : -UDEBUG ("unregistering log handler for pf=%u\n" , pf);/* This is a bug and a feature. We cannot unregister * other handlers, like nfnetlink_inst can */ nf_log_unregister_pf (pf);
PATCH 51/64 : nfnetlink_{queue,log}: return proper error codes in instance_create
In reply to Patrick McHardy[NETFILTER]: nfnetlink_{queue,log}: return proper error codes in instance_create
Currently we return EINVAL for "instance exists", "allocation failed" and "module unloaded below us", which is completely inapproriate.
---
commit 686a5513787ed3d89766bb4d8634bbbd43d519dd
tree 907db184c2a29c6a66a71b1ae8897afd8534b5e4
parent 8c9dba4e0c12b9f605bc3856eba21b605ec1284c
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:43 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
net/netfilter/nfnetlink_log.c | 14 +++++++++----- net/netfilter/nfnetlink_queue.c | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-)
net/netfilter/nfnetlink_log.c +9 -5
@@ -128,19 +128,23 @@ static struct nfulnl_instance * instance_create(u_int16_t group_num, int pid) {struct nfulnl_instance *inst; +int err;write_lock_bh (&instances_lock);if (__instance_lookup (group_num)) { - inst =NULL ; + err = -EEXIST ; goto out_unlock; } inst =kzalloc (sizeof (*inst),GFP_ATOMIC ); -if (!inst) +if (!inst) { + err = -ENOMEM ; goto out_unlock; + }if (!try_module_get (THIS_MODULE )) {kfree (inst); + err = -EAGAIN ; goto out_unlock; }
@@ -169,7 +173,7 @@ instance_create(u_int16_t group_num, int pid) out_unlock:write_unlock_bh (&instances_lock); -return NULL ; +return ERR_PTR (err); }static void __nfulnl_flush (struct nfulnl_instance *inst);
@@ -731,8 +735,8 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, inst =instance_create (group_num,NETLINK_CB (skb).pid); -if (!inst) { - ret = -EINVAL ; +if (IS_ERR (inst)) { + ret =PTR_ERR (inst); goto out; }break ;
net/netfilter/nfnetlink_queue.c +14 -7
@@ -89,16 +89,21 @@ instance_lookup(u_int16_t queue_num)static struct nfqnl_instance *instance_create (u_int16_t queue_num,int pid) { -struct nfqnl_instance *inst =NULL ; +struct nfqnl_instance *inst;unsigned int h; +int err;spin_lock (&instances_lock); -if (instance_lookup (queue_num)) +if (instance_lookup (queue_num)) { + err = -EEXIST ; goto out_unlock; + } inst =kzalloc (sizeof (*inst),GFP_ATOMIC ); -if (!inst) +if (!inst) { + err = -ENOMEM ; goto out_unlock; + } inst->queue_num = queue_num; inst->peer_pid = pid;
@@ -109,8 +114,10 @@ instance_create(u_int16_t queue_num, int pid)INIT_LIST_HEAD (&inst->queue_list);INIT_RCU_HEAD (&inst->rcu); -if (!try_module_get (THIS_MODULE )) +if (!try_module_get (THIS_MODULE )) { + err = -EAGAIN ; goto out_free; + } h =instance_hashfn (queue_num);hlist_add_head_rcu (&inst->hlist, &instance_table[h]);
@@ -123,7 +130,7 @@ out_free:kfree (inst); out_unlock:spin_unlock (&instances_lock); -return NULL ; +return ERR_PTR (err); } static void nfqnl_flush(struct nfqnl_instance *queue, nfqnl_cmpfn cmpfn,
@@ -724,8 +731,8 @@ nfqnl_recv_config(struct sock *ctnl, struct sk_buff *skb, goto err_out_unlock; } queue =instance_create (queue_num,NETLINK_CB (skb).pid); -if (!queue) { - ret = -EINVAL ; +if (IS_ERR (queue)) { + ret =PTR_ERR (queue); goto err_out_unlock; }break ;
PATCH 52/64 : nfnetlink_log: use endianness-aware attribute functions
In reply to Patrick McHardy[NETFILTER]: nfnetlink_log: use endianness-aware attribute functions
---
commit 46b6c5e9e3b9e78d9a2a0d73429d269d7f82c26a
tree 14269c8a3dc1c64a4969f6e54e35538b747b7945
parent 686a5513787ed3d89766bb4d8634bbbd43d519dd
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:44 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
net/netfilter/nfnetlink_log.c | 87 ++++++++++++++++------------------------- 1 files changed, 35 insertions(+), 52 deletions(-)
net/netfilter/nfnetlink_log.c +35 -52
@@ -389,32 +389,27 @@ __build_packet_message(struct nfulnl_instance *inst,NLA_PUT (inst->skb,NFULA_PREFIX , plen, prefix);if (indev) { - tmp_uint =htonl (indev->ifindex);#ifndef CONFIG_BRIDGE_NETFILTER -NLA_PUT (inst->skb,NFULA_IFINDEX_INDEV ,sizeof (tmp_uint), - &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_INDEV , +htonl (indev->ifindex));#else if (pf ==PF_BRIDGE ) {/* Case 1: outdev is physical input device, we need to * look for bridge group (when called from * netfilter_bridge) */ -NLA_PUT (inst->skb,NFULA_IFINDEX_PHYSINDEV , -sizeof (tmp_uint), &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_PHYSINDEV , +htonl (indev->ifindex));/* this is the bridge group "brX" */ - tmp_uint =htonl (indev->br_port->br->dev->ifindex); -NLA_PUT (inst->skb,NFULA_IFINDEX_INDEV , -sizeof (tmp_uint), &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_INDEV , +htonl (indev->br_port->br->dev->ifindex)); }else {/* Case 2: indev is bridge group, we need to look for * physical device (when called from ipv4) */ -NLA_PUT (inst->skb,NFULA_IFINDEX_INDEV , -sizeof (tmp_uint), &tmp_uint); -if (skb->nf_bridge && skb->nf_bridge->physindev) { - tmp_uint = -htonl (skb->nf_bridge->physindev->ifindex); -NLA_PUT (inst->skb,NFULA_IFINDEX_PHYSINDEV , -sizeof (tmp_uint), &tmp_uint); - } +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_INDEV , +htonl (indev->ifindex)); +if (skb->nf_bridge && skb->nf_bridge->physindev) +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_PHYSINDEV , +htonl (skb->nf_bridge->physindev->ifindex)); }#endif }
@@ -422,38 +417,32 @@ __build_packet_message(struct nfulnl_instance *inst,if (outdev) { tmp_uint =htonl (outdev->ifindex);#ifndef CONFIG_BRIDGE_NETFILTER -NLA_PUT (inst->skb,NFULA_IFINDEX_OUTDEV ,sizeof (tmp_uint), - &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_OUTDEV , +htonl (outdev->ifindex));#else if (pf ==PF_BRIDGE ) {/* Case 1: outdev is physical output device, we need to * look for bridge group (when called from * netfilter_bridge) */ -NLA_PUT (inst->skb,NFULA_IFINDEX_PHYSOUTDEV , -sizeof (tmp_uint), &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_PHYSOUTDEV , +htonl (outdev->ifindex));/* this is the bridge group "brX" */ - tmp_uint =htonl (outdev->br_port->br->dev->ifindex); -NLA_PUT (inst->skb,NFULA_IFINDEX_OUTDEV , -sizeof (tmp_uint), &tmp_uint); +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_OUTDEV , +htonl (outdev->br_port->br->dev->ifindex)); }else {/* Case 2: indev is a bridge group, we need to look * for physical device (when called from ipv4) */ -NLA_PUT (inst->skb,NFULA_IFINDEX_OUTDEV , -sizeof (tmp_uint), &tmp_uint); -if (skb->nf_bridge && skb->nf_bridge->physoutdev) { - tmp_uint = -htonl (skb->nf_bridge->physoutdev->ifindex); -NLA_PUT (inst->skb,NFULA_IFINDEX_PHYSOUTDEV , -sizeof (tmp_uint), &tmp_uint); - } +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_OUTDEV , +htonl (outdev->ifindex)); +if (skb->nf_bridge && skb->nf_bridge->physoutdev) +NLA_PUT_BE32 (inst->skb,NFULA_IFINDEX_PHYSOUTDEV , +htonl (skb->nf_bridge->physoutdev->ifindex)); }#endif } -if (skb->mark) { - tmp_uint =htonl (skb->mark); -NLA_PUT (inst->skb,NFULA_MARK ,sizeof (tmp_uint), &tmp_uint); - } +if (skb->mark) +NLA_PUT_BE32 (inst->skb,NFULA_MARK ,htonl (skb->mark));if (indev && skb->dev) {struct nfulnl_msg_packet_hw phw;
@@ -480,21 +469,19 @@ __build_packet_message(struct nfulnl_instance *inst,__be32 uid =htonl (skb->sk->sk_socket->file->f_uid);/* need to unlock here since NLA_PUT may goto */ read_unlock_bh (&skb->sk->sk_callback_lock); -NLA_PUT (inst->skb,NFULA_UID ,sizeof (uid), &uid); +NLA_PUT_BE32 (inst->skb,NFULA_UID , uid); }else read_unlock_bh (&skb->sk->sk_callback_lock); }/* local sequence number */ -if (inst->flags &NFULNL_CFG_F_SEQ ) { - tmp_uint =htonl (inst->seq++); -NLA_PUT (inst->skb,NFULA_SEQ ,sizeof (tmp_uint), &tmp_uint); - } +if (inst->flags &NFULNL_CFG_F_SEQ ) +NLA_PUT_BE32 (inst->skb,NFULA_SEQ ,htonl (inst->seq++)); +/* global sequence number */ -if (inst->flags &NFULNL_CFG_F_SEQ_GLOBAL ) { - tmp_uint =htonl (atomic_inc_return (&global_seq)); -NLA_PUT (inst->skb,NFULA_SEQ_GLOBAL ,sizeof (tmp_uint), &tmp_uint); - } +if (inst->flags &NFULNL_CFG_F_SEQ_GLOBAL ) +NLA_PUT_BE32 (inst->skb,NFULA_SEQ_GLOBAL , +htonl (atomic_inc_return (&global_seq)));if (data_len) {struct nlattr *nla;
@@ -775,8 +762,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, }if (nfula[NFULA_CFG_TIMEOUT ]) { -__be32 timeout = - *(__be32 *)nla_data (nfula[NFULA_CFG_TIMEOUT ]); +__be32 timeout =nla_get_be32 (nfula[NFULA_CFG_TIMEOUT ]);if (!inst) { ret = -ENODEV ;
@@ -786,8 +772,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, }if (nfula[NFULA_CFG_NLBUFSIZ ]) { -__be32 nlbufsiz = - *(__be32 *)nla_data (nfula[NFULA_CFG_NLBUFSIZ ]); +__be32 nlbufsiz =nla_get_be32 (nfula[NFULA_CFG_NLBUFSIZ ]);if (!inst) { ret = -ENODEV ;
@@ -797,8 +782,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, }if (nfula[NFULA_CFG_QTHRESH ]) { -__be32 qthresh = - *(__be32 *)nla_data (nfula[NFULA_CFG_QTHRESH ]); +__be32 qthresh =nla_get_be32 (nfula[NFULA_CFG_QTHRESH ]);if (!inst) { ret = -ENODEV ;
@@ -808,8 +792,7 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, }if (nfula[NFULA_CFG_FLAGS ]) { -__be16 flags = - *(__be16 *)nla_data (nfula[NFULA_CFG_FLAGS ]); +__be16 flags =nla_get_be16 (nfula[NFULA_CFG_FLAGS ]);if (!inst) { ret = -ENODEV ;
PATCH 53/64 : nfnetlink_log: include GID in netlink message
In reply to Patrick McHardy[NETFILTER]: nfnetlink_log: include GID in netlink message
Similar to Maciej Soltysiak's ipt_LOG patch, include GID in addition to UID in netlink message.
---
commit fcf0f585c5a36051119f250330feac0a672a73c2
tree 95af7eeb3d3132b085b639c4a697bb724ae13941
parent 46b6c5e9e3b9e78d9a2a0d73429d269d7f82c26a
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:45 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
include/linux/netfilter/nfnetlink_log.h | 1 + net/netfilter/nfnetlink_log.c | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-)
include/linux/netfilter/nfnetlink_log.h +1 -0
@@ -47,6 +47,7 @@ enum nfulnl_attr_type {NFULA_UID ,/* user id of socket */ NFULA_SEQ ,/* instance-local sequence number */ NFULA_SEQ_GLOBAL ,/* global sequence number */ +NFULA_GID ,/* group id of socket */ __NFULA_MAX };
net/netfilter/nfnetlink_log.c +3 -0
@@ -467,9 +467,11 @@ __build_packet_message(struct nfulnl_instance *inst,read_lock_bh (&skb->sk->sk_callback_lock);if (skb->sk->sk_socket && skb->sk->sk_socket->file) {__be32 uid =htonl (skb->sk->sk_socket->file->f_uid); +__be32 gid =htons (skb->sk->sk_socket->file->f_gid);/* need to unlock here since NLA_PUT may goto */ read_unlock_bh (&skb->sk->sk_callback_lock);NLA_PUT_BE32 (inst->skb,NFULA_UID , uid); +NLA_PUT_BE32 (inst->skb,NFULA_GID , gid); }else read_unlock_bh (&skb->sk->sk_callback_lock); }
@@ -564,6 +566,7 @@ nfulnl_log_packet(unsigned int pf,#endif +nla_total_size (sizeof (u_int32_t))/* mark */ +nla_total_size (sizeof (u_int32_t))/* uid */ + +nla_total_size (sizeof (u_int32_t))/* gid */ +nla_total_size (plen)/* prefix */ +nla_total_size (sizeof (struct nfulnl_msg_packet_hw )) +nla_total_size (sizeof (struct nfulnl_msg_packet_timestamp ));
PATCH 54/64 : Kill function prototype for non-existing function
In reply to Patrick McHardy[NETFILTER]: Kill function prototype for non-existing function
---
commit 50a04a644a2d717be1306a9b6121c12180b66dd1
tree a11dfc1c472c600f25d3b4437412a142f20a8f6c
parent fcf0f585c5a36051119f250330feac0a672a73c2
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:47 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
include/linux/netfilter.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
include/linux/netfilter.h +0 -3
@@ -206,9 +206,6 @@ int compat_nf_setsockopt(struct sock *sk, int pf, int optval,int compat_nf_getsockopt (struct sock *sk,int pf,int optval,char __user *opt,int *len); -/* FIXME: Before cache is ever used, this must be implemented for real. */ -extern void nf_invalidate_cache (int pf); -/* Call this before modifying an existing packet: ensures it is modifiable and linear to the point you care about (writable_len). Returns true or false. */
PATCH 55/64 : constify nf_afinfo
In reply to Patrick McHardy[NETFILTER]: constify nf_afinfo
---
commit 6ca04829cbe594b37035da22f809445c31d58f8a
tree 33d3630448c059efcf037bd0af8f5e1a662d4215
parent 50a04a644a2d717be1306a9b6121c12180b66dd1
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:48 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
include/linux/netfilter.h | 10 +++++----- net/ipv4/netfilter.c | 2 +- net/ipv6/netfilter.c | 2 +- net/netfilter/core.c | 6 +++--- net/netfilter/nf_conntrack_h323_main.c | 2 +- net/netfilter/nf_queue.c | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-)
include/linux/netfilter.h +5 -5
@@ -226,8 +226,8 @@ struct nf_afinfo {int route_key_size; }; -extern struct nf_afinfo *nf_afinfo[]; -static inline struct nf_afinfo *nf_get_afinfo (unsigned short family) +extern const struct nf_afinfo *nf_afinfo[NPROTO ]; +static inline const struct nf_afinfo *nf_get_afinfo (unsigned short family) {return rcu_dereference (nf_afinfo[family]); }
@@ -236,7 +236,7 @@ static inline __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook, unsigned int dataoff, u_int8_t protocol, unsigned short family) { - struct nf_afinfo *afinfo; + const struct nf_afinfo *afinfo;__sum16 csum =0 ;rcu_read_lock ();
@@ -247,8 +247,8 @@ nf_checksum(struct sk_buff *skb, unsigned int hook, unsigned int dataoff,return csum; } -extern int nf_register_afinfo (struct nf_afinfo *afinfo); -extern void nf_unregister_afinfo (struct nf_afinfo *afinfo); +extern int nf_register_afinfo (const struct nf_afinfo *afinfo); +extern void nf_unregister_afinfo (const struct nf_afinfo *afinfo);#include <net/flow.h> extern void (*ip_nat_decode_session)(struct sk_buff *,struct flowi *);
net/ipv4/netfilter.c +1 -1
@@ -190,7 +190,7 @@ static int nf_ip_route(struct dst_entry **dst, struct flowi *fl)return ip_route_output_key ((struct rtable **)dst, fl); } -static struct nf_afinfo nf_ip_afinfo = { +static const struct nf_afinfo nf_ip_afinfo = { .family =AF_INET , .checksum = nf_ip_checksum, .route = nf_ip_route,
net/ipv6/netfilter.c +1 -1
@@ -124,7 +124,7 @@ __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,EXPORT_SYMBOL (nf_ip6_checksum); -static struct nf_afinfo nf_ip6_afinfo = { +static const struct nf_afinfo nf_ip6_afinfo = { .family =AF_INET6 , .checksum = nf_ip6_checksum, .route = nf_ip6_route,
net/netfilter/core.c +3 -3
@@ -26,10 +26,10 @@static DEFINE_MUTEX (afinfo_mutex); -struct nf_afinfo *nf_afinfo[NPROTO ]__read_mostly ; +const struct nf_afinfo *nf_afinfo[NPROTO ]__read_mostly ;EXPORT_SYMBOL (nf_afinfo); -int nf_register_afinfo (struct nf_afinfo *afinfo) +int nf_register_afinfo (const struct nf_afinfo *afinfo) {int err;
@@ -42,7 +42,7 @@ int nf_register_afinfo(struct nf_afinfo *afinfo) }EXPORT_SYMBOL_GPL (nf_register_afinfo); -void nf_unregister_afinfo (struct nf_afinfo *afinfo) +void nf_unregister_afinfo (const struct nf_afinfo *afinfo) {mutex_lock (&afinfo_mutex);rcu_assign_pointer (nf_afinfo[afinfo->family],NULL );
net/netfilter/nf_conntrack_h323_main.c +1 -1
@@ -708,7 +708,7 @@ static int callforward_do_filter(union nf_conntrack_address *src, union nf_conntrack_address *dst, int family) { -struct nf_afinfo *afinfo; +const struct nf_afinfo *afinfo;struct flowi fl1, fl2;int ret =0 ;
net/netfilter/nf_queue.c +2 -2
@@ -119,7 +119,7 @@ static int __nf_queue(struct sk_buff *skb,struct net_device *physindev;struct net_device *physoutdev;#endif -struct nf_afinfo *afinfo; +const struct nf_afinfo *afinfo;const struct nf_queue_handler *qh;/* QUEUE == DROP if noone is waiting, to be safe. */
@@ -233,7 +233,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) {struct sk_buff *skb = entry->skb;struct list_head *elem = &entry->elem->list; -struct nf_afinfo *afinfo; +const struct nf_afinfo *afinfo;rcu_read_lock ();
PATCH 56/64 : nf_nat: properly use RCU for ip_nat_decode_session
In reply to Patrick McHardy[NETFILTER]: nf_nat: properly use RCU for ip_nat_decode_session
We need to use rcu_assign_pointer/rcu_dereference to avoid races. Also remove an obsolete CONFIG_IP_NAT_NEEDED ifdef.
---
commit 47ebc04c5a75d528fe66549793aec32cb2d9e444
tree 2389cf3412db22b99402ef249e0978e4c902f5e3
parent 6ca04829cbe594b37035da22f809445c31d58f8a
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:49 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:24:59 +0100
include/linux/netfilter.h | 11 ++++++++--- net/ipv4/netfilter/nf_nat_standalone.c | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-)
include/linux/netfilter.h +8 -3
@@ -256,11 +256,16 @@ extern void (*ip_nat_decode_session)(struct sk_buff *, struct flowi *);static inline void nf_nat_decode_session (struct sk_buff *skb,struct flowi *fl,int family) { -#if defined(CONFIG_IP_NF_NAT_NEEDED ) || defined(CONFIG_NF_NAT_NEEDED ) +#ifdef CONFIG_NF_NAT_NEEDED void (*decodefn)(struct sk_buff *,struct flowi *); -if (family ==AF_INET && (decodefn = ip_nat_decode_session) !=NULL ) -decodefn (skb, fl); +if (family ==AF_INET ) { +rcu_read_lock (); + decodefn =rcu_dereference (ip_nat_decode_session); +if (decodefn) +decodefn (skb, fl); +rcu_read_unlock (); + }#endif }
net/ipv4/netfilter/nf_nat_standalone.c +3 -3
@@ -332,7 +332,7 @@ static int __init nf_nat_standalone_init(void)#ifdef CONFIG_XFRM BUG_ON (ip_nat_decode_session !=NULL ); - ip_nat_decode_session = nat_decode_session; +rcu_assign_pointer (ip_nat_decode_session, nat_decode_session);#endif ret =nf_nat_rule_init ();if (ret <0 ) {
@@ -350,7 +350,7 @@ static int __init nf_nat_standalone_init(void)nf_nat_rule_cleanup (); cleanup_decode_session: #ifdef CONFIG_XFRM - ip_nat_decode_session =NULL ; +rcu_assign_pointer (ip_nat_decode_session ,NULL );synchronize_net ();#endif return ret;
@@ -361,7 +361,7 @@ static void __exit nf_nat_standalone_fini(void)nf_unregister_hooks (nf_nat_ops,ARRAY_SIZE (nf_nat_ops));nf_nat_rule_cleanup ();#ifdef CONFIG_XFRM - ip_nat_decode_session =NULL ; +rcu_assign_pointer (ip_nat_decode_session,NULL );synchronize_net ();#endif /* Conntrack caches are unregistered in nf_conntrack_cleanup */
PATCH 57/64 : x_tables: use %u format specifiers
In reply to Patrick McHardy[NETFILTER]: x_tables: use %u format specifiers
Use %u format specifiers as ->family is unsigned.
---
commit 92c790e129d05df719f233ac8f4e45d736304b23
tree 05c76f78defe79f1dfa54036a9a584356ebce6ae
parent 47ebc04c5a75d528fe66549793aec32cb2d9e444
author Jan Engelhardt <[email protected]> Mon, 17 Dec 2007 14:58:51 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
net/ipv4/netfilter/ipt_CLUSTERIP.c | 2 +- net/netfilter/xt_CONNMARK.c | 2 +- net/netfilter/xt_CONNSECMARK.c | 2 +- net/netfilter/xt_connbytes.c | 2 +- net/netfilter/xt_connmark.c | 2 +- net/netfilter/xt_conntrack.c | 2 +- net/netfilter/xt_helper.c | 2 +- net/netfilter/xt_state.c | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +1 -1
@@ -414,7 +414,7 @@ clusterip_tg_check(const char *tablename, const void *e_void,if (nf_ct_l3proto_try_module_get (target->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , target->family); +"proto=%u\n" , target->family);return false; }
net/netfilter/xt_CONNMARK.c +1 -1
@@ -95,7 +95,7 @@ connmark_tg_check(const char *tablename, const void *entry, }if (nf_ct_l3proto_try_module_get (target->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , target->family); +"proto=%u\n" , target->family);return false; }return true;
net/netfilter/xt_CONNSECMARK.c +1 -1
@@ -106,7 +106,7 @@ connsecmark_tg_check(const char *tablename, const void *entry,if (nf_ct_l3proto_try_module_get (target->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , target->family); +"proto=%u\n" , target->family);return false; }return true;
net/netfilter/xt_connbytes.c +1 -1
@@ -111,7 +111,7 @@ connbytes_mt_check(const char *tablename, const void *ip,if (nf_ct_l3proto_try_module_get (match->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , match->family); +"proto=%u\n" , match->family);return false; }
net/netfilter/xt_connmark.c +1 -1
@@ -61,7 +61,7 @@ connmark_mt_check(const char *tablename, const void *ip, }if (nf_ct_l3proto_try_module_get (match->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , match->family); +"proto=%u\n" , match->family);return false; }return true;
net/netfilter/xt_conntrack.c +1 -1
@@ -117,7 +117,7 @@ conntrack_mt_check(const char *tablename, const void *ip, {if (nf_ct_l3proto_try_module_get (match->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , match->family); +"proto=%u\n" , match->family);return false; }return true;
net/netfilter/xt_helper.c +1 -1
@@ -66,7 +66,7 @@ helper_mt_check(const char *tablename, const void *inf,if (nf_ct_l3proto_try_module_get (match->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , match->family); +"proto=%u\n" , match->family);return false; } info->name[29 ] ='\0' ;
net/netfilter/xt_state.c +1 -1
@@ -47,7 +47,7 @@ state_mt_check(const char *tablename, const void *inf, {if (nf_ct_l3proto_try_module_get (match->family) <0 ) {printk (KERN_WARNING "can't load conntrack support for " -"proto=%d\n" , match->family); +"proto=%u\n" , match->family);return false; }return true;
PATCH 58/64 : Introduce nf_inet_address
In reply to Patrick McHardy[NETFILTER]: Introduce nf_inet_address
A few netfilter modules provide their own union of IPv4 and IPv6 address storage. Will unify that in this patch series.
(1/4): Rename union nf_conntrack_address to union nf_inet_addr and move it to x_tables.h.
---
commit 3cecb3726340f00f0c6e08804fff5b552fe9feef
tree dc96e7cb0fa58e84b1bc19e43689091ae5eac1fb
parent 92c790e129d05df719f233ac8f4e45d736304b23
author Jan Engelhardt <[email protected]> Mon, 17 Dec 2007 14:58:52 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
include/linux/netfilter.h | 6 +++++ include/linux/netfilter/nf_conntrack_h323.h | 6 ++--- include/net/netfilter/nf_conntrack_expect.h | 4 ++- include/net/netfilter/nf_conntrack_tuple.h | 17 ++++---------- net/ipv4/netfilter/nf_nat_h323.c | 10 ++++---- net/netfilter/nf_conntrack_expect.c | 4 ++- net/netfilter/nf_conntrack_ftp.c | 2 +- net/netfilter/nf_conntrack_h323_main.c | 34 ++++++++++++++------------- net/netfilter/nf_conntrack_sip.c | 8 +++--- net/netfilter/xt_connlimit.c | 20 ++++++++-------- 10 files changed, 55 insertions(+), 56 deletions(-)
include/linux/netfilter.h +6 -0
@@ -48,6 +48,12 @@ enum nf_inet_hooks { NF_INET_NUMHOOKS }; +union nf_inet_addr { +u_int32_t all[4 ]; +__be32 ip; +__be32 ip6[4 ]; +}; +#ifdef __KERNEL__#ifdef CONFIG_NETFILTER
include/linux/netfilter/nf_conntrack_h323.h +3 -3
@@ -31,7 +31,7 @@ struct nf_conn;extern int get_h225_addr (struct nf_conn *ct,unsigned char *data,TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 *port); +union nf_inet_addr *addr,__be16 *port);extern void nf_conntrack_h245_expect (struct nf_conn *new,struct nf_conntrack_expect *this); extern void nf_conntrack_q931_expect(struct nf_conn *new,
@@ -39,12 +39,12 @@ extern void nf_conntrack_q931_expect(struct nf_conn *new,extern int (*set_h245_addr_hook) (struct sk_buff *skb,unsigned char **data,int dataoff,H245_TransportAddress *taddr, -union nf_conntrack_address *addr, +union nf_inet_addr *addr,__be16 port);extern int (*set_h225_addr_hook) (struct sk_buff *skb,unsigned char **data,int dataoff,TransportAddress *taddr, -union nf_conntrack_address *addr, +union nf_inet_addr *addr,__be16 port); extern int (*set_sig_addr_hook) (struct sk_buff *skb, struct nf_conn *ct,
include/net/netfilter/nf_conntrack_expect.h +2 -2
@@ -73,8 +73,8 @@ void nf_ct_unexpect_related(struct nf_conntrack_expect *exp);nf_ct_expect_related. You will have to call put afterwards. */ struct nf_conntrack_expect *nf_ct_expect_alloc (struct nf_conn *me);void nf_ct_expect_init (struct nf_conntrack_expect *,int , -union nf_conntrack_address *, -union nf_conntrack_address *, +union nf_inet_addr *, +union nf_inet_addr *,u_int8_t ,__be16 *,__be16 *);void nf_ct_expect_put (struct nf_conntrack_expect *exp);int nf_ct_expect_related (struct nf_conntrack_expect *expect);
include/net/netfilter/nf_conntrack_tuple.h +5 -12
@@ -10,6 +10,7 @@#ifndef _NF_CONNTRACK_TUPLE_H#define _NF_CONNTRACK_TUPLE_H +#include <linux/netfilter/x_tables.h> #include <linux/netfilter/nf_conntrack_tuple_common.h> /* A `tuple' is a structure containing the information to uniquely
@@ -20,15 +21,7 @@"non-manipulatable" lines, for the benefit of the NAT code. */ -#define NF_CT_TUPLE_L3SIZE 4 - -/* The l3 protocol-specific manipulable parts of the tuple: always in -network order! */ -union nf_conntrack_address { -u_int32_t all[NF_CT_TUPLE_L3SIZE ]; -__be32 ip; -__be32 ip6[4 ]; -}; +#define NF_CT_TUPLE_L3SIZE ARRAY_SIZE(((union nf_inet_addr *)NULL)->all)/* The protocol-specific manipulable parts of the tuple: always in network order! */
@@ -57,7 +50,7 @@ union nf_conntrack_man_proto/* The manipulable part of the tuple. */ struct nf_conntrack_man { -union nf_conntrack_address u3; +union nf_inet_addr u3;union nf_conntrack_man_proto u;/* Layer 3 protocol */ u_int16_t l3num;
@@ -70,7 +63,7 @@ struct nf_conntrack_tuple/* These are the parts of the tuple which are fixed. */ struct { -union nf_conntrack_address u3; +union nf_inet_addr u3;union {/* Add other protocols here. */ __be16 all;
@@ -103,7 +96,7 @@ struct nf_conntrack_tuplestruct nf_conntrack_tuple_mask {struct { -union nf_conntrack_address u3; +union nf_inet_addr u3;union nf_conntrack_man_proto u; } src; };
net/ipv4/netfilter/nf_nat_h323.c +5 -5
@@ -76,7 +76,7 @@ static int set_addr(struct sk_buff *skb,static int set_h225_addr (struct sk_buff *skb,unsigned char **data,int dataoff,TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 port) +union nf_inet_addr *addr,__be16 port) {return set_addr (skb, data, dataoff, taddr->ipAddress.ip, addr->ip, port);
@@ -86,7 +86,7 @@ static int set_h225_addr(struct sk_buff *skb,static int set_h245_addr (struct sk_buff *skb,unsigned char **data,int dataoff,H245_TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 port) +union nf_inet_addr *addr,__be16 port) { return set_addr(skb, data, dataoff, taddr->unicastAddress.iPAddress.network,
@@ -103,7 +103,7 @@ static int set_sig_addr(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int i;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;for (i =0 ; i < count; i++) {if (get_h225_addr (ct, *data, &taddr[i], &addr, &port)) {
@@ -155,7 +155,7 @@ static int set_ras_addr(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int i;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;for (i =0 ; i < count; i++) { if (get_h225_addr(ct, *data, &taddr[i], &addr, &port) &&
@@ -408,7 +408,7 @@ static int nat_q931(struct sk_buff *skb, struct nf_conn *ct,struct nf_ct_h323_master *info = &nfct_help (ct)->help.ct_h323_info;int dir =CTINFO2DIR (ctinfo);u_int16_t nated_port =ntohs (port); -union nf_conntrack_address addr; +union nf_inet_addr addr;/* Set expectations for NAT */ exp->saved_proto.tcp.port = exp->tuple.dst.u.tcp.port;
net/netfilter/nf_conntrack_expect.c +2 -2
@@ -226,8 +226,8 @@ struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me)EXPORT_SYMBOL_GPL (nf_ct_expect_alloc);void nf_ct_expect_init (struct nf_conntrack_expect *exp,int family, -union nf_conntrack_address *saddr, -union nf_conntrack_address *daddr, +union nf_inet_addr *saddr, +union nf_inet_addr *daddr,u_int8_t proto,__be16 *src,__be16 *dst) {int len;
net/netfilter/nf_conntrack_ftp.c +1 -1
@@ -358,7 +358,7 @@ static int help(struct sk_buff *skb,unsigned int matchlen, matchoff;struct nf_ct_ftp_master *ct_ftp_info = &nfct_help (ct)->help.ct_ftp_info;struct nf_conntrack_expect *exp; -union nf_conntrack_address *daddr; +union nf_inet_addr *daddr;struct nf_conntrack_man cmd = {};unsigned int i;int found =0 , ends_in_nl;
net/netfilter/nf_conntrack_h323_main.c +17 -17
@@ -50,12 +50,12 @@ MODULE_PARM_DESC(callforward_filter, "only create call forwarding expectations "int (*set_h245_addr_hook) (struct sk_buff *skb,unsigned char **data,int dataoff,H245_TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 port) +union nf_inet_addr *addr,__be16 port)__read_mostly ;int (*set_h225_addr_hook) (struct sk_buff *skb,unsigned char **data,int dataoff,TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 port) +union nf_inet_addr *addr,__be16 port)__read_mostly ; int (*set_sig_addr_hook) (struct sk_buff *skb, struct nf_conn *ct,
@@ -214,7 +214,7 @@ static int get_tpkt_data(struct sk_buff *skb, unsigned int protoff,/****************************************************************************/ static int get_h245_addr (struct nf_conn *ct,unsigned char *data,H245_TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 *port) +union nf_inet_addr *addr,__be16 *port) {unsigned char *p;int family = ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.l3num;
@@ -257,7 +257,7 @@ static int expect_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,int ret =0 ;__be16 port;__be16 rtp_port, rtcp_port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *rtp_exp;struct nf_conntrack_expect *rtcp_exp;typeof (nat_rtp_rtcp_hook) nat_rtp_rtcp;
@@ -330,7 +330,7 @@ static int expect_t120(struct sk_buff *skb,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;typeof (nat_t120_hook) nat_t120;
@@ -623,7 +623,7 @@ static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {/****************************************************************************/ int get_h225_addr (struct nf_conn *ct,unsigned char *data,TransportAddress *taddr, -union nf_conntrack_address *addr,__be16 *port) +union nf_inet_addr *addr,__be16 *port) {unsigned char *p;int family = ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.l3num;
@@ -662,7 +662,7 @@ static int expect_h245(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;typeof (nat_h245_hook) nat_h245;
@@ -704,8 +704,8 @@ static int expect_h245(struct sk_buff *skb, struct nf_conn *ct,/* If the calling party is on the same side of the forward-to party, * we don't need to track the second call */ -static int callforward_do_filter (union nf_conntrack_address *src, -union nf_conntrack_address *dst, +static int callforward_do_filter (union nf_inet_addr *src, +union nf_inet_addr *dst,int family) {const struct nf_afinfo *afinfo;
@@ -772,7 +772,7 @@ static int expect_callforwarding(struct sk_buff *skb,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;typeof (nat_callforwarding_hook) nat_callforwarding;
@@ -828,7 +828,7 @@ static int process_setup(struct sk_buff *skb, struct nf_conn *ct,int ret;int i;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;typeof (set_h225_addr_hook) set_h225_addr;pr_debug ("nf_ct_q931: Setup\n" );
@@ -1200,7 +1200,7 @@ static unsigned char *get_udp_data(struct sk_buff *skb, unsigned int protoff,/****************************************************************************/ static struct nf_conntrack_expect *find_expect (struct nf_conn *ct, -union nf_conntrack_address *addr, +union nf_inet_addr *addr,__be16 port) {struct nf_conntrack_expect *exp;
@@ -1242,7 +1242,7 @@ static int expect_q931(struct sk_buff *skb, struct nf_conn *ct,int ret =0 ;int i;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;typeof (nat_q931_hook) nat_q931;
@@ -1311,7 +1311,7 @@ static int process_gcf(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;pr_debug ("nf_ct_ras: GCF\n" );
@@ -1471,7 +1471,7 @@ static int process_arq(struct sk_buff *skb, struct nf_conn *ct,struct nf_ct_h323_master *info = &nfct_help (ct)->help.ct_h323_info;int dir =CTINFO2DIR (ctinfo);__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;typeof (set_h225_addr_hook) set_h225_addr;pr_debug ("nf_ct_ras: ARQ\n" );
@@ -1513,7 +1513,7 @@ static int process_acf(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;typeof (set_sig_addr_hook) set_sig_addr;
@@ -1576,7 +1576,7 @@ static int process_lcf(struct sk_buff *skb, struct nf_conn *ct,int dir =CTINFO2DIR (ctinfo);int ret =0 ;__be16 port; -union nf_conntrack_address addr; +union nf_inet_addr addr;struct nf_conntrack_expect *exp;pr_debug ("nf_ct_ras: LCF\n" );
net/netfilter/nf_conntrack_sip.c +4 -4
@@ -247,7 +247,7 @@ static int skp_digits_len(struct nf_conn *ct, const char *dptr, }static int parse_addr (struct nf_conn *ct,const char *cp,const char **endp, -union nf_conntrack_address *addr,const char *limit) +union nf_inet_addr *addr,const char *limit) {const char *end;int family = ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.l3num;
@@ -275,7 +275,7 @@ static int parse_addr(struct nf_conn *ct, const char *cp, const char **endp,static int epaddr_len (struct nf_conn *ct,const char *dptr,const char *limit,int *shift) { -union nf_conntrack_address addr; +union nf_inet_addr addr;const char *aux = dptr;if (!parse_addr (ct, dptr, &dptr, &addr, limit)) {
@@ -366,7 +366,7 @@ EXPORT_SYMBOL_GPL(ct_sip_get_info);static int set_expected_rtp (struct sk_buff *skb,struct nf_conn *ct,enum ip_conntrack_info ctinfo, -union nf_conntrack_address *addr, +union nf_inet_addr *addr,__be16 port,const char *dptr) {
@@ -403,7 +403,7 @@ static int sip_help(struct sk_buff *skb, enum ip_conntrack_info ctinfo) {int family = ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.l3num; -union nf_conntrack_address addr; +union nf_inet_addr addr;unsigned int dataoff, datalen;const char *dptr;int ret =NF_ACCEPT ;
net/netfilter/xt_connlimit.c +10 -10
@@ -53,10 +53,10 @@ static inline unsigned int connlimit_iphash(__be32 addr) }static inline unsigned int -connlimit_iphash6 (const union nf_conntrack_address *addr, -const union nf_conntrack_address *mask) +connlimit_iphash6 (const union nf_inet_addr *addr, +const union nf_inet_addr *mask) { -union nf_conntrack_address res; +union nf_inet_addr res;unsigned int i;if (unlikely (!connlimit_rnd_inited)) {
@@ -81,14 +81,14 @@ static inline bool already_closed(const struct nf_conn *conn) }static inline unsigned int -same_source_net (const union nf_conntrack_address *addr, -const union nf_conntrack_address *mask, -const union nf_conntrack_address *u3,unsigned int family) +same_source_net (const union nf_inet_addr *addr, +const union nf_inet_addr *mask, +const union nf_inet_addr *u3,unsigned int family) {if (family ==AF_INET ) {return (addr->ip & mask->ip) == (u3->ip & mask->ip); }else { -union nf_conntrack_address lh, rh; +union nf_inet_addr lh, rh;unsigned int i;for (i =0 ; i <ARRAY_SIZE (addr->ip6); ++i) {
@@ -102,8 +102,8 @@ same_source_net(const union nf_conntrack_address *addr,static int count_them (struct xt_connlimit_data *data,const struct nf_conntrack_tuple *tuple, -const union nf_conntrack_address *addr, -const union nf_conntrack_address *mask, +const union nf_inet_addr *addr, +const union nf_inet_addr *mask,const struct xt_match *match) {struct nf_conntrack_tuple_hash *found;
@@ -185,7 +185,7 @@ connlimit_mt(const struct sk_buff *skb, const struct net_device *in, bool *hotdrop) {const struct xt_connlimit_info *info = matchinfo; -union nf_conntrack_address addr, mask; +union nf_inet_addr addr, mask;struct nf_conntrack_tuple tuple;const struct nf_conntrack_tuple *tuple_ptr = &tuple;enum ip_conntrack_info ctinfo;
PATCH 59/64 : Parenthesize macro parameters
In reply to Patrick McHardy[NETFILTER]: Parenthesize macro parameters
Parenthesize macro parameters.
---
commit d1c627416f8e9632c67483522e7e2dbbebc89fe1
tree b576b31f12002e9f9dec8680850ca435461e3a51
parent 3cecb3726340f00f0c6e08804fff5b552fe9feef
author Jan Engelhardt <[email protected]> Mon, 17 Dec 2007 14:58:54 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
net/ipv4/netfilter/arp_tables.c | 3 ++- net/ipv4/netfilter/ip_tables.c | 3 ++- net/ipv4/netfilter/nf_nat_snmp_basic.c | 2 +- net/ipv6/netfilter/ip6_tables.c | 2 +- net/netfilter/nf_conntrack_h323_asn1.c | 8 ++++---- net/netfilter/nf_conntrack_netlink.c | 2 +- net/netfilter/nf_conntrack_proto_sctp.c | 8 ++++---- net/netfilter/xt_conntrack.c | 3 ++- net/netfilter/xt_policy.c | 2 +- net/netfilter/xt_string.c | 2 +- 10 files changed, 19 insertions(+), 16 deletions(-)
net/ipv4/netfilter/arp_tables.c +2 -1
@@ -84,7 +84,7 @@ static inline int arp_packet_match(const struct arphdr *arphdr,__be32 src_ipaddr, tgt_ipaddr;int i, ret; -#define FWINV (bool,invflg) ((bool) ^ !!(arpinfo->invflags & invflg)) +#define FWINV (bool, invflg) ((bool) ^ !!(arpinfo->invflags & (invflg)))if (FWINV ((arphdr->ar_op & arpinfo->arpop_mask) != arpinfo->arpop,ARPT_INV_ARPOP )) {
@@ -180,6 +180,7 @@ static inline int arp_packet_match(const struct arphdr *arphdr, }return 1 ; +#undef FWINV }static inline int arp_checkentry (const struct arpt_arp *arp)
net/ipv4/netfilter/ip_tables.c +2 -1
@@ -85,7 +85,7 @@ ip_packet_match(const struct iphdr *ip,size_t i;unsigned long ret; -#define FWINV (bool,invflg) ((bool) ^ !!(ipinfo->invflags & invflg)) +#define FWINV (bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg)))if (FWINV ((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr, IPT_INV_SRCIP)
@@ -216,6 +216,7 @@ unconditional(const struct ipt_ip *ip)return 0 ;return 1 ; +#undef FWINV } #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \
net/ipv4/netfilter/nf_nat_snmp_basic.c +1 -1
@@ -60,7 +60,7 @@ MODULE_ALIAS("ip_nat_snmp_basic");#define SNMP_PORT 161#define SNMP_TRAP_PORT 162 -#define NOCT1 (n) (*(u8 *)n) +#define NOCT1 (n) (*(u8 *)(n))static int debug;static DEFINE_SPINLOCK (snmp_lock);
net/ipv6/netfilter/ip6_tables.c +1 -1
@@ -102,7 +102,7 @@ ip6_packet_match(const struct sk_buff *skb,unsigned long ret;const struct ipv6hdr *ipv6 =ipv6_hdr (skb); -#define FWINV (bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg)) +#define FWINV (bool, invflg) ((bool) ^ !!(ip6info->invflags & (invflg)))if (FWINV (ipv6_masked_addr_cmp (&ipv6->saddr, &ip6info->smsk, &ip6info->src), IP6T_INV_SRCIP)
net/netfilter/nf_conntrack_h323_asn1.c +4 -4
@@ -100,10 +100,10 @@ typedef struct { } bitstr_t;/* Tool Functions */ -#define INC_BIT (bs) if((++bs->bit)>7){bs->cur++;bs->bit=0;} -#define INC_BITS (bs,b) if((bs->bit+=b)>7){bs->cur+=bs->bit>>3;bs->bit&=7;} -#define BYTE_ALIGN (bs) if(bs->bit){bs->cur++;bs->bit=0;} -#define CHECK_BOUND (bs,n) if(bs->cur+(n)>bs->end)return(H323_ERROR_BOUND) +#define INC_BIT (bs) if((++(bs)->bit)>7){(bs)->cur++;(bs)->bit=0;} +#define INC_BITS (bs,b) if(((bs)->bit+=(b))>7){(bs)->cur+=(bs)->bit>>3;(bs)->bit&=7;} +#define BYTE_ALIGN (bs) if((bs)->bit){(bs)->cur++;(bs)->bit=0;} +#define CHECK_BOUND (bs,n) if((bs)->cur+(n)>(bs)->end)return(H323_ERROR_BOUND)static unsigned get_len (bitstr_t * bs);static unsigned get_bit (bitstr_t * bs);static unsigned get_bits (bitstr_t * bs,unsigned b);
net/netfilter/nf_conntrack_netlink.c +1 -1
@@ -534,7 +534,7 @@ static int ctnetlink_done(struct netlink_callback *cb)return 0 ; } -#define L3PROTO (ct) ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num +#define L3PROTO (ct) (ct)->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3numstatic int ctnetlink_dump_table (struct sk_buff *skb,struct netlink_callback *cb)
net/netfilter/nf_conntrack_proto_sctp.c +4 -4
@@ -186,10 +186,10 @@ static int sctp_print_conntrack(struct seq_file *s, }#define for_each_sctp_chunk (skb, sch, _sch, offset, dataoff, count) \ -for (offset = dataoff + sizeof(sctp_sctphdr_t), count = 0; \ - offset < skb->len && \ - (sch = skb_header_pointer(skb, offset, sizeof(_sch), &_sch)); \ - offset += (ntohs(sch->length) + 3) & ~3, count++) +for ((offset) = (dataoff) + sizeof(sctp_sctphdr_t), (count) = 0; \ + (offset) < (skb)->len && \ + ((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch))); \ + (offset) += (ntohs((sch)->length) + 3) & ~3, (count)++)/* Some validity checks to make sure the chunks are fine */ static int do_basic_checks(struct nf_conn *conntrack,
net/netfilter/xt_conntrack.c +2 -1
@@ -32,7 +32,7 @@ conntrack_mt(const struct sk_buff *skb, const struct net_device *in, ct =nf_ct_get (skb, &ctinfo); -#define FWINV (bool,invflg) ((bool) ^ !!(sinfo->invflags & invflg)) +#define FWINV (bool, invflg) ((bool) ^ !!(sinfo->invflags & (invflg)))if (ct == &nf_conntrack_untracked) statebit =XT_CONNTRACK_STATE_UNTRACKED ;
@@ -108,6 +108,7 @@ conntrack_mt(const struct sk_buff *skb, const struct net_device *in,return false; }return true; +#undef FWINV } static bool
net/netfilter/xt_policy.c +1 -1
@@ -38,7 +38,7 @@ match_xfrm_state(const struct xfrm_state *x, const struct xt_policy_elem *e, unsigned short family) {#define MATCH_ADDR (x,y,z) (!e->match.x || \ - (xt_addr_cmp(&e->x, &e->y, z, family) \ + (xt_addr_cmp(&e->x, &e->y, (z), family) \ ^ e->invert.x))#define MATCH (x,y) (!e->match.x || ((e->x == (y)) ^ e->invert.x))
net/netfilter/xt_string.c +1 -1
@@ -37,7 +37,7 @@ string_mt(const struct sk_buff *skb, const struct net_device *in, != UINT_MAX) ^ conf->invert; } -#define STRING_TEXT_PRIV (m) ((struct xt_string_info *) m) +#define STRING_TEXT_PRIV (m) ((struct xt_string_info *)(m)) static bool string_mt_check(const char *tablename, const void *ip,
PATCH 60/64 : xt_connlimit: use the new union nf_inet_addr
In reply to Patrick McHardy[NETFILTER]: xt_connlimit: use the new union nf_inet_addr
---
commit 561162888ca9bb1ca4a95c41e7d4e03aae0d79c7
tree 251a0a045ca50713e3000a59c958e882f153a981
parent d1c627416f8e9632c67483522e7e2dbbebc89fe1
author Jan Engelhardt <[email protected]> Mon, 17 Dec 2007 14:58:55 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
include/linux/netfilter/xt_connlimit.h | 9 +++++++-- net/netfilter/xt_connlimit.c | 7 +++---- 2 files changed, 10 insertions(+), 6 deletions(-)
include/linux/netfilter/xt_connlimit.h +7 -2
@@ -5,8 +5,13 @@ struct xt_connlimit_data;struct xt_connlimit_info {union { -__be32 v4_mask; -__be32 v6_mask[4 ]; +union nf_inet_addr mask; +#ifndef __KERNEL__ +union { +__be32 v4_mask; +__be32 v6_mask[4 ]; + }; +#endif };unsigned int limit, inverse;
net/netfilter/xt_connlimit.c +3 -4
@@ -185,7 +185,7 @@ connlimit_mt(const struct sk_buff *skb, const struct net_device *in, bool *hotdrop) {const struct xt_connlimit_info *info = matchinfo; -union nf_inet_addr addr, mask; +union nf_inet_addr addr;struct nf_conntrack_tuple tuple;const struct nf_conntrack_tuple *tuple_ptr = &tuple;enum ip_conntrack_info ctinfo;
@@ -202,15 +202,14 @@ connlimit_mt(const struct sk_buff *skb, const struct net_device *in,if (match->family ==AF_INET6 ) {const struct ipv6hdr *iph =ipv6_hdr (skb);memcpy (&addr.ip6, &iph->saddr,sizeof (iph->saddr)); -memcpy (&mask.ip6, info->v6_mask,sizeof (info->v6_mask)); }else {const struct iphdr *iph =ip_hdr (skb); addr.ip = iph->saddr; - mask.ip = info->v4_mask; }spin_lock_bh (&info->data->lock); - connections =count_them (info->data, tuple_ptr, &addr, &mask, match); + connections =count_them (info->data, tuple_ptr, &addr, + &info->mask, match);spin_unlock_bh (&info->data->lock);if (connections <0 ) {
PATCH 61/64 : xt_hashlimit: speedup hash_dst()
In reply to Patrick McHardy[NETFILTER]: xt_hashlimit: speedup hash_dst()
1) Using jhash2() instead of jhash() is a litle bit faster if applicable.
2) Thanks to jhash, hash value uses full 32 bits. Instead of returning hash % size (implying a divide) we return the high 32 bits of the (hash * size) that will give results between [0 and size-1] and same hash distribution.
On most cpus, a multiply is less expensive than a divide, by an order of magnitude.
---
commit 990af8a278165f0bf91b6d13d9caa61260633868
tree 3804d1bb66fe40adf69e2cd4ef425079fd007b99
parent 561162888ca9bb1ca4a95c41e7d4e03aae0d79c7
author Eric Dumazet <[email protected]> Mon, 17 Dec 2007 14:58:57 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
net/netfilter/xt_hashlimit.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)
net/netfilter/xt_hashlimit.c +10 -1
@@ -105,7 +105,16 @@ static inline bool dst_cmp(const struct dsthash_ent *ent,static u_int32_t hash_dst (const struct xt_hashlimit_htable *ht,const struct dsthash_dst *dst) { -return jhash (dst,sizeof (*dst), ht->rnd) % ht->cfg.size; +u_int32_t hash =jhash2 ((const u32 *)dst, +sizeof (*dst)/sizeof (u32), + ht->rnd); +/* +* Instead of returning hash % ht->cfg.size (implying a divide) +* we return the high 32 bits of the (hash * ht->cfg.size) that will +* give results between [0 and cfg.size-1] and same hash distribution, +* but using a multiply, less expensive than a divide +*/ +return ((u64 )hash * ht->cfg.size) >>32 ; } static struct dsthash_ent *
PATCH 62/64 : xt_hashlimit: reduce overhead without IPv6
In reply to Patrick McHardy[NETFILTER]: xt_hashlimit: reduce overhead without IPv6
This patch generalizes the (CONFIG_IP6_NF_IPTABLES || CONFIG_IP6_NF_IPTABLES_MODULE) test done in hashlimit_init_dst() to all the xt_hashlimit module.
This permits a size reduction of "struct dsthash_dst". This saves memory and cpu for IPV4 only hosts.
---
commit 0a5d984db399c3f71a657b3bbe13904a359bf614
tree e5504b8c345752d394a11a716f0698c0da22b1d6
parent 990af8a278165f0bf91b6d13d9caa61260633868
author Eric Dumazet <[email protected]> Mon, 17 Dec 2007 14:58:58 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
net/netfilter/xt_hashlimit.c | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-)
net/netfilter/xt_hashlimit.c +17 -3
@@ -20,8 +20,11 @@#include <linux/mm.h> #include <linux/in.h> #include <linux/ip.h> +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE )#include <linux/ipv6.h> #include <net/ipv6.h> +#endif +#include <net/net_namespace.h> #include <linux/netfilter/x_tables.h>
@@ -48,10 +51,12 @@ struct dsthash_dst {__be32 src;__be32 dst; } ip; +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE )struct {__be32 src[4 ];__be32 dst[4 ]; } ip6; +#endif } addr;__be16 src_port;__be16 dst_port;
@@ -599,6 +604,7 @@ static struct xt_match hashlimit_mt_reg[] __read_mostly = { .destroy = hashlimit_mt_destroy, .me = THIS_MODULE }, +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE ) { .name = "hashlimit", .family = AF_INET6,
@@ -613,6 +619,7 @@ static struct xt_match hashlimit_mt_reg[] __read_mostly = { .destroy = hashlimit_mt_destroy, .me = THIS_MODULE }, +#endif };/* PROC stuff */
@@ -675,6 +682,7 @@ static int dl_seq_real_show(struct dsthash_ent *ent, int family,ntohs (ent->dst.dst_port), ent->rateinfo.credit, ent->rateinfo.credit_cap, ent->rateinfo.cost); +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE )case AF_INET6 : return seq_printf(s, "%ld " NIP6_FMT ":%u->" NIP6_FMT ":%u %u %u %u\n",
@@ -685,6 +693,7 @@ static int dl_seq_real_show(struct dsthash_ent *ent, int family,ntohs (ent->dst.dst_port), ent->rateinfo.credit, ent->rateinfo.credit_cap, ent->rateinfo.cost); +#endif default :BUG ();return 0 ;
@@ -756,14 +765,17 @@ static int __init hashlimit_mt_init(void) "entry\n"); goto err3; } + err =0 ; +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE ) hashlimit_procdir6 =proc_mkdir ("ip6t_hashlimit" , init_net.proc_net);if (!hashlimit_procdir6) {printk (KERN_ERR "xt_hashlimit: unable to create proc dir " "entry\n" ); - goto err4; + err = -ENOMEM ; } -return 0 ; -err4: +#endif +if (!err) +return 0 ;remove_proc_entry ("ipt_hashlimit" , init_net.proc_net); err3:kmem_cache_destroy (hashlimit_cachep);
@@ -777,7 +789,9 @@ err1: static void __exit hashlimit_mt_exit(void) {remove_proc_entry ("ipt_hashlimit" , init_net.proc_net); +#if defined(CONFIG_IP6_NF_IPTABLES ) || defined(CONFIG_IP6_NF_IPTABLES_MODULE )remove_proc_entry ("ip6t_hashlimit" , init_net.proc_net); +#endif kmem_cache_destroy (hashlimit_cachep);xt_unregister_matches (hashlimit_mt_reg,ARRAY_SIZE (hashlimit_mt_reg)); }
PATCH 63/64 : non-power-of-two jhash optimizations
In reply to Patrick McHardy[NETFILTER]: non-power-of-two jhash optimizations
Apply Eric Dumazet's jhash optimizations where applicable. Quoting Eric:
Thanks to jhash, hash value uses full 32 bits. Instead of returning hash % size (implying a divide) we return the high 32 bits of the (hash * size) that will give results between [0 and size-1] and same hash distribution.
On most cpus, a multiply is less expensive than a divide, by an order of magnitude.
---
commit e5dc0b8b87651227dc92fa1365ab3e9707f9898e
tree f888429a2ffbb20f348d8c8bf0b2602647983c49
parent 0a5d984db399c3f71a657b3bbe13904a359bf614
author Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:25:00 +0100
net/ipv4/netfilter/ipt_CLUSTERIP.c | 2 +- net/ipv4/netfilter/nf_nat_core.c | 10 +++++++--- net/netfilter/nf_conntrack_core.c | 2 +- net/netfilter/nf_conntrack_expect.c | 8 +++++--- 4 files changed, 14 insertions(+), 8 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +1 -1
@@ -273,7 +273,7 @@ clusterip_hashfn(const struct sk_buff *skb, }/* node numbers are 1..n, not 0..n */ -return (hashval % config->num_total_nodes) +1 ; +return (((u64 )hashval * config->num_total_nodes) >>32 ) +1 ; } static inline int
net/ipv4/netfilter/nf_nat_core.c +7 -3
@@ -77,10 +77,13 @@ EXPORT_SYMBOL_GPL(nf_nat_proto_put);static inline unsigned int hash_by_src (const struct nf_conntrack_tuple *tuple) { +unsigned int hash; +/* Original src, to ensure we map it consistently if poss. */ -return jhash_3words ((__force u32 )tuple->src.u3.ip, + hash =jhash_3words ((__force u32 )tuple->src.u3.ip, (__force u32 )tuple->src.u.all, - tuple->dst.protonum,0 ) % nf_nat_htable_size; + tuple->dst.protonum,0 ); +return ((u64 )hash * nf_nat_htable_size) >>32 ; }/* Is this tuple already taken? (not by us) */
@@ -211,7 +214,8 @@ find_best_ips_proto(struct nf_conntrack_tuple *tuple, maxip =ntohl (range->max_ip); j =jhash_2words ((__force u32 )tuple->src.u3.ip, (__force u32 )tuple->dst.u3.ip,0 ); - *var_ipp =htonl (minip + j % (maxip - minip +1 )); + j = ((u64 )j * (maxip - minip +1 )) >>32 ; + *var_ipp =htonl (minip + j); }/* Manipulate the tuple into the range given. For NF_INET_POST_ROUTING,
net/netfilter/nf_conntrack_core.c +1 -1
@@ -81,7 +81,7 @@ static u_int32_t __hash_conntrack(const struct nf_conntrack_tuple *tuple, ((__force __u16 )tuple->src.u.all <<16 ) | (__force __u16)tuple->dst.u.all); -return jhash_2words (a, b, rnd) % size; +return ((u64 )jhash_2words (a, b, rnd) * size) >>32 ; }static inline u_int32_t hash_conntrack (const struct nf_conntrack_tuple *tuple)
net/netfilter/nf_conntrack_expect.c +5 -3
@@ -73,15 +73,17 @@ static void nf_ct_expectation_timed_out(unsigned long ul_expect)static unsigned int nf_ct_expect_dst_hash (const struct nf_conntrack_tuple *tuple) { +unsigned int hash; +if (unlikely (!nf_ct_expect_hash_rnd_initted)) {get_random_bytes (&nf_ct_expect_hash_rnd,4 ); nf_ct_expect_hash_rnd_initted =1 ; } -return jhash2 (tuple->dst.u3.all,ARRAY_SIZE (tuple->dst.u3.all), + hash =jhash2 (tuple->dst.u3.all,ARRAY_SIZE (tuple->dst.u3.all), (((tuple->dst.protonum ^ tuple->src.l3num) <<16 ) | - (__force __u16 )tuple->dst.u.all) ^ nf_ct_expect_hash_rnd) % - nf_ct_expect_hsize; + (__force __u16 )tuple->dst.u.all) ^ nf_ct_expect_hash_rnd); +return ((u64 )hash * nf_ct_expect_hsize) >>32 ; } struct nf_conntrack_expect *
PATCH 64/64 : Add CONFIG_NETFILTER_ADVANCED option
In reply to Patrick McHardy[NETFILTER]: Add CONFIG_NETFILTER_ADVANCED option
The NETFILTER_ADVANCED option hides lots of the rather obscure netfilter options when disabled and provides defaults (M) that should allow to run a distribution firewall without further thinking.
Defaults to 'y' to avoid breaking current configurations.
---
commit ed6a0634607e258ffba2af6dca7591867f429b17
tree 343aa772140fcc3bd9e2684589418a27e3bf2e70
parent e5dc0b8b87651227dc92fa1365ab3e9707f9898e
author Patrick McHardy <[email protected]> Mon, 17 Dec 2007 14:58:59 +0100 committer Patrick McHardy <[email protected]> Tue, 18 Dec 2007 00:29:27 +0100
net/Kconfig | 12 +++++++ net/bridge/netfilter/Kconfig | 2 + net/decnet/netfilter/Kconfig | 1 + net/ipv4/netfilter/Kconfig | 26 +++++++++++++++ net/ipv6/netfilter/Kconfig | 23 ++++++++++++-- net/netfilter/Kconfig | 71 ++++++++++++++++++++++++++++++++++++++---- 6 files changed, 124 insertions(+), 11 deletions(-)
net/Kconfig +12 -0
@@ -144,9 +144,21 @@ config NETFILTER_DEBUG You can say Y here if you want to get additional messages useful in debugging the netfilter code. +config NETFILTER_ADVANCED + bool "Advanced netfilter configuration" + depends on NETFILTER + default y + help + If you say Y here you can select between all the netfilter modules. + If you say N the more ununsual ones will not be shown and the + basic ones needed by most people will default to 'M'. + + If unsure, say Y. + config BRIDGE_NETFILTER bool "Bridged IP/ARP packets filtering" depends on BRIDGE && NETFILTER && INET + depends on NETFILTER_ADVANCED default y ---help--- Enabling this option will let arptables resp. iptables see bridged
net/bridge/netfilter/Kconfig +1 -1
@@ -3,7 +3,7 @@ # menu "Bridge: Netfilter Configuration" - depends on BRIDGE && NETFILTER + depends on BRIDGE && BRIDGE_NETFILTER config BRIDGE_NF_EBTABLES tristate "Ethernet Bridge tables (ebtables) support"
net/decnet/netfilter/Kconfig +1 -0
@@ -4,6 +4,7 @@ menu "DECnet: Netfilter Configuration" depends on DECNET && NETFILTER && EXPERIMENTAL + depends on NETFILTER_ADVANCED config DECNET_NF_GRABULATOR tristate "Routing message grabulator (for userland routing daemon)"
net/ipv4/netfilter/Kconfig +25 -1
@@ -8,6 +8,7 @@ menu "IP: Netfilter Configuration" config NF_CONNTRACK_IPV4 tristate "IPv4 connection tracking support (required for NAT)" depends on NF_CONNTRACK + default m if NETFILTER_ADVANCED=n ---help--- Connection tracking keeps a record of what packets have passed through your machine, in order to figure out how they are related
@@ -32,6 +33,7 @@ config NF_CONNTRACK_PROC_COMPAT config IP_NF_QUEUE tristate "IP Userspace queueing via NETLINK (OBSOLETE)" + depends on NETFILTER_ADVANCED help Netfilter has the ability to queue packets to user space: the netlink device can be used to access them using this driver.
@@ -44,6 +46,7 @@ config IP_NF_QUEUE config IP_NF_IPTABLES tristate "IP tables support (required for filtering/masq/NAT)" + default m if NETFILTER_ADVANCED=n select NETFILTER_XTABLES help iptables is a general, extensible packet identification framework.
@@ -57,6 +60,7 @@ config IP_NF_IPTABLES config IP_NF_MATCH_IPRANGE tristate '"iprange" match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This option makes possible to match IP addresses against IP address ranges.
@@ -66,6 +70,7 @@ config IP_NF_MATCH_IPRANGE config IP_NF_MATCH_RECENT tristate '"recent" match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This match is used for creating one or many lists of recently used addresses and then matching against that/those list(s).
@@ -78,6 +83,7 @@ config IP_NF_MATCH_RECENT config IP_NF_MATCH_ECN tristate '"ecn" match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This option adds a `ECN' match, which allows you to match against the IPv4 and TCP header ECN fields.
@@ -87,6 +93,7 @@ config IP_NF_MATCH_ECN config IP_NF_MATCH_AH tristate '"ah" match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This match extension allows you to match a range of SPIs inside AH header of IPSec packets.
@@ -96,6 +103,7 @@ config IP_NF_MATCH_AH config IP_NF_MATCH_TTL tristate '"ttl" match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This adds CONFIG_IP_NF_MATCH_TTL option, which enabled the user to match packets by their TTL value.
@@ -105,10 +113,11 @@ config IP_NF_MATCH_TTL config IP_NF_MATCH_ADDRTYPE tristate '"addrtype" address type match support' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This option allows you to match what routing thinks of an address, eg. UNICAST, LOCAL, BROADCAST, ... - + If you want to compile it as a module, say M here and read <file:Documentation/kbuild/modules.txt>. If unsure, say `N'.
@@ -116,6 +125,7 @@ config IP_NF_MATCH_ADDRTYPE config IP_NF_FILTER tristate "Packet filtering" depends on IP_NF_IPTABLES + default m if NETFILTER_ADVANCED=n help Packet filtering defines a table `filter', which has a series of rules for simple packet filtering at local input, forwarding and
@@ -126,6 +136,7 @@ config IP_NF_FILTER config IP_NF_TARGET_REJECT tristate "REJECT target support" depends on IP_NF_FILTER + default m if NETFILTER_ADVANCED=n help The REJECT target allows a filtering rule to specify that an ICMP error should be issued in response to an incoming packet, rather
@@ -136,6 +147,7 @@ config IP_NF_TARGET_REJECT config IP_NF_TARGET_LOG tristate "LOG target support" depends on IP_NF_IPTABLES + default m if NETFILTER_ADVANCED=n help This option adds a `LOG' target, which allows you to create rules in any iptables table which records the packet header to the syslog.
@@ -145,6 +157,7 @@ config IP_NF_TARGET_LOG config IP_NF_TARGET_ULOG tristate "ULOG target support" depends on IP_NF_IPTABLES + default m if NETFILTER_ADVANCED=n ---help--- This option enables the old IPv4-only "ipt_ULOG" implementation
@@ -165,6 +178,7 @@ config IP_NF_TARGET_ULOG config NF_NAT tristate "Full NAT" depends on IP_NF_IPTABLES && NF_CONNTRACK_IPV4 + default m if NETFILTER_ADVANCED=n help The Full NAT option allows masquerading, port forwarding and other forms of full Network Address Port Translation. It is controlled by
@@ -180,6 +194,7 @@ config NF_NAT_NEEDED config IP_NF_TARGET_MASQUERADE tristate "MASQUERADE target support" depends on NF_NAT + default m if NETFILTER_ADVANCED=n help Masquerading is a special case of NAT: all outgoing connections are changed to seem to come from a particular interface's address, and
@@ -192,6 +207,7 @@ config IP_NF_TARGET_MASQUERADE config IP_NF_TARGET_REDIRECT tristate "REDIRECT target support" depends on NF_NAT + depends on NETFILTER_ADVANCED help REDIRECT is a special case of NAT: all incoming connections are mapped onto the incoming interface's address, causing the packets to
@@ -203,6 +219,7 @@ config IP_NF_TARGET_REDIRECT config IP_NF_TARGET_NETMAP tristate "NETMAP target support" depends on NF_NAT + depends on NETFILTER_ADVANCED help NETMAP is an implementation of static 1:1 NAT mapping of network addresses. It maps the network address part, while keeping the host
@@ -214,6 +231,7 @@ config IP_NF_TARGET_NETMAP config NF_NAT_SNMP_BASIC tristate "Basic SNMP-ALG support (EXPERIMENTAL)" depends on EXPERIMENTAL && NF_NAT + depends on NETFILTER_ADVANCED ---help--- This module implements an Application Layer Gateway (ALG) for
@@ -277,6 +295,7 @@ config NF_NAT_SIP config IP_NF_MANGLE tristate "Packet mangling" depends on IP_NF_IPTABLES + default m if NETFILTER_ADVANCED=n help This option adds a `mangle' table to iptables: see the man page for iptables(8). This table is used for various packet alterations
@@ -287,6 +306,7 @@ config IP_NF_MANGLE config IP_NF_TARGET_ECN tristate "ECN target support" depends on IP_NF_MANGLE + depends on NETFILTER_ADVANCED ---help--- This option adds a `ECN' target, which can be used in the iptables mangle table.
@@ -301,6 +321,7 @@ config IP_NF_TARGET_ECN config IP_NF_TARGET_TTL tristate 'TTL target support' depends on IP_NF_MANGLE + depends on NETFILTER_ADVANCED help This option adds a `TTL' target, which enables the user to modify the TTL value of the IP header.
@@ -316,6 +337,7 @@ config IP_NF_TARGET_CLUSTERIP tristate "CLUSTERIP target support (EXPERIMENTAL)" depends on IP_NF_MANGLE && EXPERIMENTAL depends on NF_CONNTRACK_IPV4 + depends on NETFILTER_ADVANCED select NF_CONNTRACK_MARK help The CLUSTERIP target allows you to build load-balancing clusters of
@@ -328,6 +350,7 @@ config IP_NF_TARGET_CLUSTERIP config IP_NF_RAW tristate 'raw table support (required for NOTRACK/TRACE)' depends on IP_NF_IPTABLES + depends on NETFILTER_ADVANCED help This option adds a `raw' table to iptables. This table is the very first in the netfilter framework and hooks in at the PREROUTING
@@ -340,6 +363,7 @@ config IP_NF_RAW config IP_NF_ARPTABLES tristate "ARP tables support" select NETFILTER_XTABLES + depends on NETFILTER_ADVANCED help arptables is a general, extensible packet identification framework. The ARP packet filtering and mangling (manipulation)subsystems
net/ipv6/netfilter/Kconfig +20 -3
@@ -8,6 +8,7 @@ menu "IPv6: Netfilter Configuration (EXPERIMENTAL)" config NF_CONNTRACK_IPV6 tristate "IPv6 connection tracking support (EXPERIMENTAL)" depends on INET && IPV6 && EXPERIMENTAL && NF_CONNTRACK + default m if NETFILTER_ADVANCED=n ---help--- Connection tracking keeps a record of what packets have passed through your machine, in order to figure out how they are related
@@ -22,6 +23,7 @@ config NF_CONNTRACK_IPV6 config IP6_NF_QUEUE tristate "IP6 Userspace queueing via NETLINK (OBSOLETE)" depends on INET && IPV6 && NETFILTER && EXPERIMENTAL + depends on NETFILTER_ADVANCED ---help--- This option adds a queue handler to the kernel for IPv6
@@ -44,6 +46,7 @@ config IP6_NF_IPTABLES tristate "IP6 tables support (required for filtering)" depends on INET && IPV6 && EXPERIMENTAL select NETFILTER_XTABLES + default m if NETFILTER_ADVANCED=n help ip6tables is a general, extensible packet identification framework. Currently only the packet filtering and packet mangling subsystem
@@ -56,6 +59,7 @@ config IP6_NF_IPTABLES config IP6_NF_MATCH_RT tristate '"rt" Routing header match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help rt matching allows you to match packets based on the routing header of the packet.
@@ -65,6 +69,7 @@ config IP6_NF_MATCH_RT config IP6_NF_MATCH_OPTS tristate '"hopbyhop" and "dst" opts header match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This allows one to match packets based on the hop-by-hop and destination options headers of a packet.
@@ -74,6 +79,7 @@ config IP6_NF_MATCH_OPTS config IP6_NF_MATCH_FRAG tristate '"frag" Fragmentation header match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help frag matching allows you to match packets based on the fragmentation header of the packet.
@@ -83,6 +89,7 @@ config IP6_NF_MATCH_FRAG config IP6_NF_MATCH_HL tristate '"hl" match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help HL matching allows you to match packets based on the hop limit of the packet.
@@ -92,6 +99,7 @@ config IP6_NF_MATCH_HL config IP6_NF_MATCH_IPV6HEADER tristate '"ipv6header" IPv6 Extension Headers Match' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This module allows one to match packets based upon the ipv6 extension headers.
@@ -101,6 +109,7 @@ config IP6_NF_MATCH_IPV6HEADER config IP6_NF_MATCH_AH tristate '"ah" match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This module allows one to match AH packets.
@@ -109,6 +118,7 @@ config IP6_NF_MATCH_AH config IP6_NF_MATCH_MH tristate '"mh" match support' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This module allows one to match MH packets.
@@ -117,6 +127,7 @@ config IP6_NF_MATCH_MH config IP6_NF_MATCH_EUI64 tristate '"eui64" address check' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This module performs checking on the IPv6 source address Compares the last 64 bits with the EUI64 (delivered
@@ -128,6 +139,7 @@ config IP6_NF_MATCH_EUI64 config IP6_NF_FILTER tristate "Packet filtering" depends on IP6_NF_IPTABLES + default m if NETFILTER_ADVANCED=n help Packet filtering defines a table `filter', which has a series of rules for simple packet filtering at local input, forwarding and
@@ -138,6 +150,7 @@ config IP6_NF_FILTER config IP6_NF_TARGET_LOG tristate "LOG target support" depends on IP6_NF_FILTER + default m if NETFILTER_ADVANCED=n help This option adds a `LOG' target, which allows you to create rules in any iptables table which records the packet header to the syslog.
@@ -147,6 +160,7 @@ config IP6_NF_TARGET_LOG config IP6_NF_TARGET_REJECT tristate "REJECT target support" depends on IP6_NF_FILTER + default m if NETFILTER_ADVANCED=n help The REJECT target allows a filtering rule to specify that an ICMPv6 error should be issued in response to an incoming packet, rather
@@ -157,6 +171,7 @@ config IP6_NF_TARGET_REJECT config IP6_NF_MANGLE tristate "Packet mangling" depends on IP6_NF_IPTABLES + default m if NETFILTER_ADVANCED=n help This option adds a `mangle' table to iptables: see the man page for iptables(8). This table is used for various packet alterations
@@ -167,27 +182,29 @@ config IP6_NF_MANGLE config IP6_NF_TARGET_HL tristate 'HL (hoplimit) target support' depends on IP6_NF_MANGLE + depends on NETFILTER_ADVANCED help This option adds a `HL' target, which enables the user to decrement the hoplimit value of the IPv6 header or set it to a given (lower) value. - + While it is safe to decrement the hoplimit value, this option also enables functionality to increment and set the hoplimit value of the IPv6 header to arbitrary values. This is EXTREMELY DANGEROUS since you can easily create immortal packets that loop forever on the - network. + network. To compile it as a module, choose M here. If unsure, say N. config IP6_NF_RAW tristate 'raw table support (required for TRACE)' depends on IP6_NF_IPTABLES + depends on NETFILTER_ADVANCED help This option adds a `raw' table to ip6tables. This table is the very first in the netfilter framework and hooks in at the PREROUTING and OUTPUT chains. - + If you want to compile it as a module, say M here and read <file:Documentation/kbuild/modules.txt>. If unsure, say `N'.
net/netfilter/Kconfig +65 -6
450 lines not on this page · raw message
David Miller
maintainerFrom: Patrick McHardy <[email protected]>
Date: Tue, 18 Dec 2007 00:46:12 +0100 (MET)
Quoted 3 lines
following is a rather large netfilter update for 2.6.25. The diffstat looks a bit worse than it is, most files are only touched due to
__read_mostlyand const annotations. The rough overview is:
...
Quoted 6 lines
- Finally, the
CONFIG_NETFILTER_ADVANCEDpatch. Its more intrusive than I hoped and the choices weren't really clear, so Its last in the series. Please have a look whether you think its useful like this, otherwise feel free to drop it.Please apply, thanks.
I applied everthing to net-2.6.25 and pushed it all out, including the NETFILTER_ADVANCED thing. It was definitely an improvement.
Can you do something for me Patrick? Go from a config with NETFILTER disabled, then turn it on, use NETFILTER_ADVANCED=n and walk through the options presented to the user.
Some of those default=m cases are marked EXPERIMENTAL. Either the default=m or the EXPERIMENTAL are bogus, in each case. Most of the time it's the latter, and if you could fix these I'd appreciate it.
Thanks!
Quoted 2 lines · David Miller
I applied everthing to net-2.6.25 and pushed it all out, including the
NETFILTER_ADVANCEDthing. It was definitely an improvement.
Thanks Dave.
Quoted 7 lines
Can you do something for me Patrick? Go from a config with NETFILTER disabled, then turn it on, use NETFILTER_ADVANCED=n and walk through the options presented to the user.
Some of those default=m cases are marked EXPERIMENTAL. Either the default=m or the EXPERIMENTAL are bogus, in each case. Most of the time it's the latter, and if you could fix these I'd appreciate it.
Sure, I'll include a patch in my next update. Its a good opportunity to go through all netfilter EXPERIMENTAL marks, I bet there are more that could be removed.
Pablo Neira Ayuso
maintainerQuoted 8 lines · Patrick McHardy
Quoted 3 lines · David Miller
Some of those default=m cases are marked EXPERIMENTAL. Either the default=m or the EXPERIMENTAL are bogus, in each case. Most of the time it's the latter, and if you could fix these I'd appreciate it.
Sure, I'll include a patch in my next update. Its a good opportunity to go through all netfilter EXPERIMENTAL marks, I bet there are more that could be removed.
maybe ctnetlink? :-)
Quoted 6 lines · Pablo Neira Ayuso
Quoted 5 lines · Patrick McHardy
Quoted 3 lines · David Miller
Some of those default=m cases are marked EXPERIMENTAL. Either the default=m or the EXPERIMENTAL are bogus, in each case. Most of the time it's the latter, and if you could fix these I'd appreciate it.
Quoted 6 lines
Quoted 3 lines
Sure, I'll include a patch in my next update. Its a good opportunity to go through all netfilter EXPERIMENTAL marks, I bet there are more that could be removed.
maybe ctnetlink? :-)
Already done :)