Netfilter updates for net-next
Subsystems (4)
Pablo Neira Ayuso
maintainercover Netfilter updates for net-next
Hi David,
The following patchset contains Netfilter updates for net-next:
1) Support for destination MAC in ipset, from Stefano Brivio.
2) Disallow all-zeroes MAC address in ipset, also from Stefano.
3) Add IPSET_CMD_GET_BYNAME and IPSET_CMD_GET_BYINDEX commands, introduce protocol version number 7, from Jozsef Kadlecsik. A follow up patch to fix ip_set_byindex() is also included in this batch.
4) Honor CTA_MARK_MASK from ctnetlink, from Andreas Jaggi.
5) Statify nf_flow_table_iterate(), from Taehee Yoo.
6) Use nf_flow_table_iterate() to simplify garbage collection in nf_flow_table logic, also from Taehee Yoo.
7) Don't use _bh variants of call_rcu(), rcu_barrier() and synchronize_rcu_bh() in Netfilter, from Paul E. McKenney.
8) Remove NFC_* cache definition from the old caching infrastructure.
9) Remove layer 4 port rover in NAT helpers, use random port instead, from Florian Westphal.
10) Use strscpy() in ipset, from Qian Cai.
11) Remove NF_NAT_RANGE_PROTO_RANDOM_FULLY branch now that random port is allocated by default, from Xiaozhou Liu.
12) Ignore NF_NAT_RANGE_PROTO_RANDOM too, from Florian Westphal.
13) Limit port allocation selection routine in NAT to avoid softlockup splats when most ports are in use, from Florian.
14) Remove unused parameters in nf_ct_l4proto_unregister_sysctl() from Yafang Shao.
15) Direct call to nf_nat_l4proto_unique_tuple() instead of indirection, from Florian Westphal.
16) Several patches to remove all layer 4 NAT indirections, remove nf_nat_l4proto struct, from Florian Westphal.
17) Fix RTP/RTCP source port translation when SNAT is in place, from Alin Nastac.
18) Selective rule dump per chain, from Phil Sutter.
19) Revisit CLUSTERIP target, this includes a deadlock fix from netns path, sleep in atomic, remove bogus WARN_ON_ONCE() and disallow mismatching IP address and MAC address. Patchset from Taehee Yoo.
20) Update UDP timeout to stream after 2 seconds, from Florian.
21) Shrink UDP established timeout to 120 seconds like TCP timewait.
22) Sysctl knobs to set GRE timeouts, from Yafang Shao.
23) Move seq_print_acct() to conntrack core file, from Florian.
24) Add enum for conntrack sysctl knobs, also from Florian.
25) Place nf_conntrack_acct, nf_conntrack_helper, nf_conntrack_events and nf_conntrack_timestamp knobs in the core, from Florian Westphal. As a side effect, shrink netns_ct structure by removing obsolete sysctl anchors, also from Florian.
You can pull these changes from:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git
Thanks!
----------------------------------------------------------------
The following changes since commit 30beabb3c32122d533ce0e2fc712f9d720a82f9f:
net: phy: marvell: remove set but not used variable 'pause' (2018-11-11 18:19:50 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git HEAD
for you to fetch changes up to 8527f9df04a8b5f6ee24ae7bdda5a94d73c7d243:
netfilter: netns: shrink netns_ct struct (2018-12-21 00:51:56 +0100)
----------------------------------------------------------------
Alin Nastac (1):
netfilter: nf_nat_sip: fix RTP/RTCP source port translations
Andreas Jaggi (1):
netfilter: ctnetlink: always honor CTA_MARK_MASK
Florent Fourcot (1):
netfilter: ipset: fix ip_set_byindex function
Florian Westphal (18):
netfilter: nat: remove l4 protocol port rovers
netfilter: nat: limit port clash resolution attempts
netfilter: remove NF_NAT_RANGE_PROTO_RANDOM support
netfilter: nat: un-export nf_nat_l4proto_unique_tuple
netfilter: nat: remove l4proto->unique_tuple
netfilter: nat: fold in_range indirection into caller
netfilter: nat: remove l4proto->in_range
netfilter: nat: remove l4proto->nlattr_to_range
netfilter: nat: remove l4proto->manip_pkt
netfilter: nat: remove nf_nat_l4proto struct
netfilter: conntrack: udp: only extend timeout to stream mode after 2s
netfilter: conntrack: udp: set stream timeout to 2 minutes
netfilter: conntrack: un-export seq_print_acct
netfilter: conntrack: add mnemonics for sysctl table
netfilter: conntrack: merge acct and helper sysctl table with main one
netfilter: conntrack: merge ecache and timestamp sysctl tables with main one
netfilter: conntrack: remove empty pernet fini stubs
netfilter: netns: shrink netns_ct struct
Jozsef Kadlecsik (1):
netfilter: ipset: Introduction of new commands and protocol version 7
Pablo Neira Ayuso (2):
Merge branch 'master' of git://blackhole.kfki.hu/nf-next
netfilter: remove NFC_* cache bits
Paul E. McKenney (1):
netfilter: Replace call_rcu_bh(), rcu_barrier_bh(), and synchronize_rcu_bh()
Phil Sutter (1):
netfilter: nf_tables: Speed up selective rule dumps
Qian Cai (1):
netfilter: ipset: replace a strncpy() with strscpy()
Stefano Brivio (2):
netfilter: ipset: Allow matching on destination MAC address for mac and ipmac sets
netfilter: ipset: Make invalid MAC address checks consistent
Taehee Yoo (6):
netfilter: nf_flow_table: make nf_flow_table_iterate() static
netfilter: nf_flow_table: simplify nf_flow_offload_gc_step()
netfilter: ipt_CLUSTERIP: fix deadlock in netns exit routine
netfilter: ipt_CLUSTERIP: remove wrong WARN_ON_ONCE in netns exit routine
netfilter: ipt_CLUSTERIP: fix sleep-in-atomic bug in clusterip_config_entry_put()
netfilter: ipt_CLUSTERIP: check MAC address when duplicate config is set
Xiaozhou Liu (1):
netfilter: nat: remove unnecessary 'else if' branch
Yafang Shao (2):
netfilter: remove unused parameters in nf_ct_l4proto_[un]register_sysctl()
netfilter: conntrack: register sysctl table for gre
Documentation/networking/nf_conntrack-sysctl.txt | 11 +- include/linux/netfilter/ipset/ip_set.h | 2 +- include/linux/netfilter/nf_conntrack_proto_gre.h | 2 - include/net/netfilter/nf_conntrack.h | 5 + include/net/netfilter/nf_conntrack_acct.h | 6 +- include/net/netfilter/nf_conntrack_ecache.h | 7 +- include/net/netfilter/nf_conntrack_helper.h | 3 +- include/net/netfilter/nf_conntrack_timestamp.h | 13 +- include/net/netfilter/nf_flow_table.h | 4 - include/net/netfilter/nf_nat_l3proto.h | 7 - include/net/netfilter/nf_nat_l4proto.h | 78 +----- include/net/netns/conntrack.h | 6 +- include/uapi/linux/netfilter.h | 4 - include/uapi/linux/netfilter/ipset/ip_set.h | 19 +- include/uapi/linux/netfilter_decnet.h | 10 - include/uapi/linux/netfilter_ipv4.h | 28 -- include/uapi/linux/netfilter_ipv6.h | 29 -- net/ipv4/netfilter/Kconfig | 5 - net/ipv4/netfilter/Makefile | 5 +- net/ipv4/netfilter/ipt_CLUSTERIP.c | 184 ++++++------ net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 43 +-- net/ipv4/netfilter/nf_nat_pptp.c | 2 - net/ipv4/netfilter/nf_nat_proto_gre.c | 150 ---------- net/ipv4/netfilter/nf_nat_proto_icmp.c | 83 ------ net/ipv6/netfilter/Makefile | 2 +- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 43 +-- net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 90 ------ net/netfilter/Kconfig | 15 - net/netfilter/Makefile | 7 +- net/netfilter/ipset/ip_set_bitmap_ipmac.c | 13 +- net/netfilter/ipset/ip_set_core.c | 170 +++++++++-- net/netfilter/ipset/ip_set_hash_gen.h | 4 +- net/netfilter/ipset/ip_set_hash_ipmac.c | 27 +- net/netfilter/ipset/ip_set_hash_mac.c | 10 +- net/netfilter/nf_conntrack_acct.c | 89 +----- net/netfilter/nf_conntrack_core.c | 28 +- net/netfilter/nf_conntrack_ecache.c | 66 +---- net/netfilter/nf_conntrack_helper.c | 69 +---- net/netfilter/nf_conntrack_netlink.c | 30 +- net/netfilter/nf_conntrack_proto.c | 21 +- net/netfilter/nf_conntrack_proto_gre.c | 42 ++- net/netfilter/nf_conntrack_proto_udp.c | 18 +- net/netfilter/nf_conntrack_standalone.c | 103 ++++++- net/netfilter/nf_conntrack_timestamp.c | 70 +---- net/netfilter/nf_flow_table_core.c | 42 +-- net/netfilter/nf_nat_core.c | 327 ++++++++++++--------- net/netfilter/nf_nat_proto.c | 343 +++++++++++++++++++++++ net/netfilter/nf_nat_proto_common.c | 120 -------- net/netfilter/nf_nat_proto_dccp.c | 82 ------ net/netfilter/nf_nat_proto_sctp.c | 77 ----- net/netfilter/nf_nat_proto_tcp.c | 85 ------ net/netfilter/nf_nat_proto_udp.c | 130 --------- net/netfilter/nf_nat_proto_unknown.c | 54 ---- net/netfilter/nf_nat_sip.c | 39 ++- net/netfilter/nf_tables_api.c | 90 ++++-- net/netfilter/nfnetlink_log.c | 2 +- net/netfilter/xt_hashlimit.c | 4 +- 57 files changed, 1166 insertions(+), 1852 deletions(-) delete mode 100644 net/ipv4/netfilter/nf_nat_proto_gre.c delete mode 100644 net/ipv4/netfilter/nf_nat_proto_icmp.c delete mode 100644 net/ipv6/netfilter/nf_nat_proto_icmpv6.c create mode 100644 net/netfilter/nf_nat_proto.c delete mode 100644 net/netfilter/nf_nat_proto_common.c delete mode 100644 net/netfilter/nf_nat_proto_dccp.c delete mode 100644 net/netfilter/nf_nat_proto_sctp.c delete mode 100644 net/netfilter/nf_nat_proto_tcp.c delete mode 100644 net/netfilter/nf_nat_proto_udp.c delete mode 100644 net/netfilter/nf_nat_proto_unknown.c
Pablo Neira Ayuso
maintainerPATCH 1/37 netfilter: ipset: Allow matching on destination MAC address for mac and ipmac sets
From: Stefano Brivio <[email protected]>
There doesn't seem to be any reason to restrict MAC address matching to source MAC addresses in set types bitmap:ipmac, hash:ipmac and hash:mac. With this patch, and this setup:
ip netns add A
ip link add veth1 type veth peer name veth2 netns A ip addr add 192.0.2.1/24 dev veth1
ip -net A addr add 192.0.2.2/24 dev veth2 ip link set veth1 up
ip -net A link set veth2 up
ip netns exec A ipset create test hash:mac
dst=$(ip netns exec A cat /sys/class/net/veth2/address)
ip netns exec A ipset add test ${dst}
ip netns exec A iptables -P INPUT DROP
ip netns exec A iptables -I INPUT -m set --match-set test dst -j ACCEPT
ipset will match packets based on destination MAC address:
# ping -c1 192.0.2.2 >/dev/null # echo $? 0
--- net/netfilter/ipset/ip_set_bitmap_ipmac.c | 10 +++++----- net/netfilter/ipset/ip_set_hash_ipmac.c | 16 ++++++++++------ net/netfilter/ipset/ip_set_hash_mac.c | 10 +++++----- 3 files changed, 20 insertions(+), 16 deletions(-)
net/netfilter/ipset/ip_set_bitmap_ipmac.c +5 -5
@@ -219,10 +219,6 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,struct ip_set_ext ext =IP_SET_INIT_KEXT (skb, opt, set);u32 ip; -/* MAC can be src only */ -if (!(opt->flags &IPSET_DIM_TWO_SRC )) -return 0 ; - ip =ntohl (ip4addr (skb, opt->flags &IPSET_DIM_ONE_SRC ));if (ip < map->first_ip || ip > map->last_ip)return -IPSET_ERR_BITMAP_RANGE ;
@@ -233,7 +229,11 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,return -EINVAL ; e.id =ip_to_id (map, ip); -memcpy (e.ether,eth_hdr (skb)->h_source,ETH_ALEN ); + +if (opt->flags &IPSET_DIM_ONE_SRC ) +ether_addr_copy (e.ether,eth_hdr (skb)->h_source); +else +ether_addr_copy (e.ether,eth_hdr (skb)->h_dest);return adtfn (set, &e, &ext, &opt->ext, opt->cmdflags); }
net/netfilter/ipset/ip_set_hash_ipmac.c +10 -6
@@ -103,7 +103,11 @@ hash_ipmac4_kadt(struct ip_set *set, const struct sk_buff *skb, (skb_mac_header(skb) + ETH_HLEN) > skb->data)return -EINVAL ; -memcpy (e.ether,eth_hdr (skb)->h_source,ETH_ALEN ); +if (opt->flags &IPSET_DIM_ONE_SRC ) +ether_addr_copy (e.ether,eth_hdr (skb)->h_source); +else +ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); +if (ether_addr_equal (e.ether, invalid_ether))return -EINVAL ;
@@ -211,15 +215,15 @@ hash_ipmac6_kadt(struct ip_set *set, const struct sk_buff *skb, };struct ip_set_ext ext =IP_SET_INIT_KEXT (skb, opt, set); -/* MAC can be src only */ -if (!(opt->flags &IPSET_DIM_TWO_SRC )) -return 0 ; -if (skb_mac_header (skb) < skb->head || (skb_mac_header (skb) +ETH_HLEN ) > skb->data)return -EINVAL ; -memcpy (e.ether,eth_hdr (skb)->h_source,ETH_ALEN ); +if (opt->flags &IPSET_DIM_ONE_SRC ) +ether_addr_copy (e.ether,eth_hdr (skb)->h_source); +else +ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); +if (ether_addr_equal (e.ether, invalid_ether))return -EINVAL ;
net/netfilter/ipset/ip_set_hash_mac.c +5 -5
@@ -81,15 +81,15 @@ hash_mac4_kadt(struct ip_set *set, const struct sk_buff *skb,struct hash_mac4_elem e = { { .foo[0 ] =0 , .foo[1 ] =0 } };struct ip_set_ext ext =IP_SET_INIT_KEXT (skb, opt, set); -/* MAC can be src only */ -if (!(opt->flags &IPSET_DIM_ONE_SRC )) -return 0 ; -if (skb_mac_header (skb) < skb->head || (skb_mac_header (skb) +ETH_HLEN ) > skb->data)return -EINVAL ; -ether_addr_copy (e.ether,eth_hdr (skb)->h_source); +if (opt->flags &IPSET_DIM_ONE_SRC ) +ether_addr_copy (e.ether,eth_hdr (skb)->h_source); +else +ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); +if (is_zero_ether_addr (e.ether))return -EINVAL ;return adtfn (set, &e, &ext, &opt->ext, opt->cmdflags);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 2/37 netfilter: ipset: Make invalid MAC address checks consistent
In reply to Pablo Neira AyusoFrom: Stefano Brivio <[email protected]>
Set types bitmap:ipmac and hash:ipmac check that MAC addresses are not all zeroes.
Introduce one missing check, and make the remaining ones consistent, using is_zero_ether_addr() instead of comparing against an array containing zeroes.
This was already done for hash:mac sets in commit 26c97c5d8dac ("netfilter: ipset: Use is_zero_ether_addr instead of static and memcmp").
--- net/netfilter/ipset/ip_set_bitmap_ipmac.c | 3 +++ net/netfilter/ipset/ip_set_hash_ipmac.c | 11 ++++------- 2 files changed, 7 insertions(+), 7 deletions(-)
net/netfilter/ipset/ip_set_bitmap_ipmac.c +3 -0
@@ -235,6 +235,9 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,else ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); +if (is_zero_ether_addr (e.ether)) +return -EINVAL ; +return adtfn (set, &e, &ext, &opt->ext, opt->cmdflags); }
net/netfilter/ipset/ip_set_hash_ipmac.c +4 -7
@@ -36,9 +36,6 @@ MODULE_ALIAS("ip_set_hash:ip,mac");/* Type specific function prefix */ #define HTYPE hash_ipmac -/* Zero valued element is not supported */ -static const unsigned char invalid_ether[ETH_ALEN ] = {0 }; -/* IPv4 variant */ /* Member elements */
@@ -108,7 +105,7 @@ hash_ipmac4_kadt(struct ip_set *set, const struct sk_buff *skb,else ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); -if (ether_addr_equal (e.ether, invalid_ether)) +if (is_zero_ether_addr (e.ether))return -EINVAL ;ip4addrptr (skb, opt->flags &IPSET_DIM_ONE_SRC , &e.ip);
@@ -144,7 +141,7 @@ hash_ipmac4_uadt(struct ip_set *set, struct nlattr *tb[],if (ret)return ret;memcpy (e.ether,nla_data (tb[IPSET_ATTR_ETHER ]),ETH_ALEN ); -if (ether_addr_equal (e.ether, invalid_ether)) +if (is_zero_ether_addr (e.ether))return -IPSET_ERR_HASH_ELEM ;return adtfn (set, &e, &ext, &ext, flags);
@@ -224,7 +221,7 @@ hash_ipmac6_kadt(struct ip_set *set, const struct sk_buff *skb,else ether_addr_copy (e.ether,eth_hdr (skb)->h_dest); -if (ether_addr_equal (e.ether, invalid_ether)) +if (is_zero_ether_addr (e.ether))return -EINVAL ;ip6addrptr (skb, opt->flags &IPSET_DIM_ONE_SRC , &e.ip.in6);
@@ -264,7 +261,7 @@ hash_ipmac6_uadt(struct ip_set *set, struct nlattr *tb[],return ret;memcpy (e.ether,nla_data (tb[IPSET_ATTR_ETHER ]),ETH_ALEN ); -if (ether_addr_equal (e.ether, invalid_ether)) +if (is_zero_ether_addr (e.ether))return -IPSET_ERR_HASH_ELEM ;return adtfn (set, &e, &ext, &ext, flags);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 3/37 netfilter: ipset: Introduction of new commands and protocol version 7
In reply to Pablo Neira AyusoFrom: Jozsef Kadlecsik <[email protected]>
Two new commands (IPSET_CMD_GET_BYNAME, IPSET_CMD_GET_BYINDEX) are introduced. The new commands makes possible to eliminate the getsockopt operation (in iptables set/SET match/target) and thus use only netlink communication between userspace and kernel for ipset. With the new protocol version, userspace can exactly know which functionality is supported by the running kernel.
Both the kernel and userspace is fully backward compatible.
--- include/linux/netfilter/ipset/ip_set.h | 2 +- include/uapi/linux/netfilter/ipset/ip_set.h | 19 ++-- net/netfilter/ipset/ip_set_core.c | 164 +++++++++++++++++++++++++--- 3 files changed, 160 insertions(+), 25 deletions(-)
include/linux/netfilter/ipset/ip_set.h +1 -1
@@ -303,11 +303,11 @@ ip_set_put_flags(struct sk_buff *skb, struct ip_set *set)/* Netlink CB args */ enum {IPSET_CB_NET =0 ,/* net namespace */ +IPSET_CB_PROTO ,/* ipset protocol */ IPSET_CB_DUMP ,/* dump single set/all sets */ IPSET_CB_INDEX ,/* set index */ IPSET_CB_PRIVATE ,/* set private data */ IPSET_CB_ARG0 ,/* type specific */ -IPSET_CB_ARG1 , };/* register and unregister set references */
include/uapi/linux/netfilter/ipset/ip_set.h +12 -7
@@ -13,8 +13,9 @@#include <linux/types.h> -/* The protocol version */ -#define IPSET_PROTOCOL 6 +/* The protocol versions */ +#define IPSET_PROTOCOL 7 +#define IPSET_PROTOCOL_MIN 6/* The max length of strings including NUL: set and type identifiers */ #define IPSET_MAXNAMELEN 32
@@ -38,17 +39,19 @@ enum ipset_cmd {IPSET_CMD_TEST ,/* 11: Test an element in a set */ IPSET_CMD_HEADER ,/* 12: Get set header data only */ IPSET_CMD_TYPE ,/* 13: Get set type */ +IPSET_CMD_GET_BYNAME ,/* 14: Get set index by name */ +IPSET_CMD_GET_BYINDEX ,/* 15: Get set name by index */ IPSET_MSG_MAX ,/* Netlink message commands */ /* Commands in userspace: */ -IPSET_CMD_RESTORE =IPSET_MSG_MAX ,/* 14: Enter restore mode */ -IPSET_CMD_HELP ,/* 15: Get help */ -IPSET_CMD_VERSION ,/* 16: Get program version */ -IPSET_CMD_QUIT ,/* 17: Quit from interactive mode */ +IPSET_CMD_RESTORE =IPSET_MSG_MAX ,/* 16: Enter restore mode */ +IPSET_CMD_HELP ,/* 17: Get help */ +IPSET_CMD_VERSION ,/* 18: Get program version */ +IPSET_CMD_QUIT ,/* 19: Quit from interactive mode */ IPSET_CMD_MAX , - IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 18: Commit buffered commands */ + IPSET_CMD_COMMIT = IPSET_CMD_MAX, /* 20: Commit buffered commands */ };/* Attributes at command level */
@@ -66,6 +69,7 @@ enum {IPSET_ATTR_LINENO ,/* 9: Restore lineno */ IPSET_ATTR_PROTOCOL_MIN ,/* 10: Minimal supported version number */ IPSET_ATTR_REVISION_MIN =IPSET_ATTR_PROTOCOL_MIN ,/* type rev min */ +IPSET_ATTR_INDEX ,/* 11: Kernel index of set */ __IPSET_ATTR_CMD_MAX, };#define IPSET_ATTR_CMD_MAX (__IPSET_ATTR_CMD_MAX - 1)
@@ -223,6 +227,7 @@ enum ipset_adt {/* Sets are identified by an index in kernel space. Tweak with ip_set_id_t * and IPSET_INVALID_ID if you want to increase the max number of sets. +* Also, IPSET_ATTR_INDEX must be changed. */ typedef __u16 ip_set_id_t ;
net/netfilter/ipset/ip_set_core.c +147 -17
287 lines not on this page · raw message
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 4/37 netfilter: ctnetlink: always honor CTA_MARK_MASK
In reply to Pablo Neira AyusoFrom: Andreas Jaggi <[email protected]>
Useful to only set a particular range of the conntrack mark while leaving existing parts of the value alone, e.g. when updating conntrack marks via netlink from userspace.
For NFQUEUE it was already implemented in commit 534473c6080e ("netfilter: ctnetlink: honor CTA_MARK_MASK when setting ctmark").
This now adds the same functionality also for the other netlink conntrack mark changes.
--- net/netfilter/nf_conntrack_netlink.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-)
net/netfilter/nf_conntrack_netlink.c +19 -10
@@ -1688,6 +1688,22 @@ static int ctnetlink_change_timeout(struct nf_conn *ct,return 0 ; } +#if defined(CONFIG_NF_CONNTRACK_MARK ) +static void ctnetlink_change_mark (struct nf_conn *ct, +const struct nlattr *const cda[]) +{ +u32 mark, newmark, mask =0 ; + +if (cda[CTA_MARK_MASK ]) + mask = ~ntohl (nla_get_be32 (cda[CTA_MARK_MASK ])); + + mark =ntohl (nla_get_be32 (cda[CTA_MARK ])); + newmark = (ct->mark & mask) ^ mark; +if (newmark != ct->mark) + ct->mark = newmark; +} +#endif +static const struct nla_policy protoinfo_policy[CTA_PROTOINFO_MAX +1 ] = { [CTA_PROTOINFO_TCP ] = { .type =NLA_NESTED }, [CTA_PROTOINFO_DCCP ] = { .type =NLA_NESTED },
@@ -1883,7 +1899,7 @@ ctnetlink_change_conntrack(struct nf_conn *ct,#if defined(CONFIG_NF_CONNTRACK_MARK )if (cda[CTA_MARK ]) - ct->mark =ntohl (nla_get_be32 (cda[CTA_MARK ])); +ctnetlink_change_mark (ct, cda);#endif if (cda[CTA_SEQ_ADJ_ORIG ] || cda[CTA_SEQ_ADJ_REPLY ]) {
@@ -2027,7 +2043,7 @@ ctnetlink_create_conntrack(struct net *net,#if defined(CONFIG_NF_CONNTRACK_MARK )if (cda[CTA_MARK ]) - ct->mark =ntohl (nla_get_be32 (cda[CTA_MARK ])); +ctnetlink_change_mark (ct, cda);#endif /* setup master conntrack: this is a confirmed expectation */
@@ -2524,14 +2540,7 @@ ctnetlink_glue_parse_ct(const struct nlattr *cda[], struct nf_conn *ct) }#if defined(CONFIG_NF_CONNTRACK_MARK )if (cda[CTA_MARK ]) { -u32 mask =0 , mark, newmark; -if (cda[CTA_MARK_MASK ]) - mask = ~ntohl (nla_get_be32 (cda[CTA_MARK_MASK ])); - - mark =ntohl (nla_get_be32 (cda[CTA_MARK ])); - newmark = (ct->mark & mask) ^ mark; -if (newmark != ct->mark) - ct->mark = newmark; +ctnetlink_change_mark (ct, cda); }#endif return 0 ;
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 5/37 netfilter: nf_flow_table: make nf_flow_table_iterate() static
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
nf_flow_table_iterate() is local function, make it static.
--- include/net/netfilter/nf_flow_table.h | 4 ---- net/netfilter/nf_flow_table_core.c | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-)
include/net/netfilter/nf_flow_table.h +0 -4
@@ -95,10 +95,6 @@ void flow_offload_free(struct flow_offload *flow);int flow_offload_add (struct nf_flowtable *flow_table,struct flow_offload *flow);struct flow_offload_tuple_rhash *flow_offload_lookup (struct nf_flowtable *flow_table,struct flow_offload_tuple *tuple); -int nf_flow_table_iterate (struct nf_flowtable *flow_table, -void (*iter)(struct flow_offload *flow,void *data), -void *data); -void nf_flow_table_cleanup (struct net_device *dev);int nf_flow_table_init (struct nf_flowtable *flow_table);
net/netfilter/nf_flow_table_core.c +4 -4
@@ -247,9 +247,10 @@ flow_offload_lookup(struct nf_flowtable *flow_table, }EXPORT_SYMBOL_GPL (flow_offload_lookup); -int nf_flow_table_iterate (struct nf_flowtable *flow_table, -void (*iter)(struct flow_offload *flow,void *data), -void *data) +static int +nf_flow_table_iterate (struct nf_flowtable *flow_table, +void (*iter)(struct flow_offload *flow,void *data), +void *data) {struct flow_offload_tuple_rhash *tuplehash;struct rhashtable_iter hti;
@@ -279,7 +280,6 @@ int nf_flow_table_iterate(struct nf_flowtable *flow_table,return err; } -EXPORT_SYMBOL_GPL (nf_flow_table_iterate);static inline bool nf_flow_has_expired (const struct flow_offload *flow) {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 6/37 netfilter: nf_flow_table: simplify nf_flow_offload_gc_step()
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
nf_flow_offload_gc_step() and nf_flow_table_iterate() are very similar. so that many duplicate code can be removed.
After this patch, nf_flow_offload_gc_step() is simple callback function of nf_flow_table_iterate() like nf_flow_table_do_cleanup().
--- net/netfilter/nf_flow_table_core.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
net/netfilter/nf_flow_table_core.c +7 -27
@@ -286,33 +286,13 @@ static inline bool nf_flow_has_expired(const struct flow_offload *flow)return (__s32)(flow->timeout - (u32 )jiffies) <=0 ; } -static void nf_flow_offload_gc_step (struct nf_flowtable *flow_table) +static void nf_flow_offload_gc_step (struct flow_offload *flow,void *data) { -struct flow_offload_tuple_rhash *tuplehash; -struct rhashtable_iter hti; -struct flow_offload *flow; - -rhashtable_walk_enter (&flow_table->rhashtable, &hti); -rhashtable_walk_start (&hti); +struct nf_flowtable *flow_table = data; -while ((tuplehash =rhashtable_walk_next (&hti))) { -if (IS_ERR (tuplehash)) { -if (PTR_ERR (tuplehash) != -EAGAIN ) -break ; -continue ; - } -if (tuplehash->tuple.dir) -continue ; - - flow = container_of(tuplehash, struct flow_offload, tuplehash[0]); - -if (nf_flow_has_expired (flow) || - (flow->flags & (FLOW_OFFLOAD_DYING | -FLOW_OFFLOAD_TEARDOWN ))) -flow_offload_del (flow_table, flow); - } -rhashtable_walk_stop (&hti); -rhashtable_walk_exit (&hti); +if (nf_flow_has_expired (flow) || + (flow->flags & (FLOW_OFFLOAD_DYING |FLOW_OFFLOAD_TEARDOWN ))) +flow_offload_del (flow_table, flow); }static void nf_flow_offload_work_gc (struct work_struct *work)
@@ -320,7 +300,7 @@ static void nf_flow_offload_work_gc(struct work_struct *work)struct nf_flowtable *flow_table; flow_table = container_of(work, struct nf_flowtable, gc_work.work); -nf_flow_offload_gc_step (flow_table); +nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step, flow_table);queue_delayed_work (system_power_efficient_wq, &flow_table->gc_work,HZ ); }
@@ -504,7 +484,7 @@ void nf_flow_table_free(struct nf_flowtable *flow_table)mutex_unlock (&flowtable_lock);cancel_delayed_work_sync (&flow_table->gc_work);nf_flow_table_iterate (flow_table, nf_flow_table_do_cleanup,NULL ); -nf_flow_offload_gc_step (flow_table); +nf_flow_table_iterate (flow_table, nf_flow_offload_gc_step, flow_table);rhashtable_destroy (&flow_table->rhashtable); }EXPORT_SYMBOL_GPL (nf_flow_table_free);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 7/37 netfilter: Replace call_rcu_bh(), rcu_barrier_bh(), and synchronize_rcu_bh()
In reply to Pablo Neira AyusoFrom: "Paul E. McKenney" <[email protected]>
Now that call_rcu()'s callback is not invoked until after bh-disable regions of code have completed (in addition to explicitly marked RCU read-side critical sections), call_rcu() can be used in place of call_rcu_bh(). Similarly, rcu_barrier() can be used in place of rcu_barrier_bh() and synchronize_rcu() in place of synchronize_rcu_bh(). This commit therefore makes these changes.
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 6 +++--- net/netfilter/ipset/ip_set_hash_gen.h | 4 ++-- net/netfilter/nfnetlink_log.c | 2 +- net/netfilter/xt_hashlimit.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +3 -3
@@ -94,7 +94,7 @@ static inline void clusterip_config_put(struct clusterip_config *c) {if (refcount_dec_and_test (&c->refcount)) -call_rcu_bh (&c->rcu, clusterip_config_rcu_free); +call_rcu (&c->rcu, clusterip_config_rcu_free); }/* decrease the count of entries using/referencing this config. If last
@@ -876,8 +876,8 @@ static void __exit clusterip_tg_exit(void)xt_unregister_target (&clusterip_tg_reg);unregister_pernet_subsys (&clusterip_net_ops); -/* Wait for completion of call_rcu_bh()'s (clusterip_config_rcu_free) */ -rcu_barrier_bh (); +/* Wait for completion of call_rcu()'s (clusterip_config_rcu_free) */ +rcu_barrier (); }module_init (clusterip_tg_init);
net/netfilter/ipset/ip_set_hash_gen.h +2 -2
@@ -67,7 +67,7 @@ tune_ahash_max(u8 curr, u32 multi)/* A hash bucket */ struct hbucket { -struct rcu_head rcu;/* for call_rcu_bh */ +struct rcu_head rcu;/* for call_rcu */ /* Which positions are used in the array */ DECLARE_BITMAP(used, AHASH_MAX_TUNED);u8 size;/* size of the array */
@@ -664,7 +664,7 @@ mtype_resize(struct ip_set *set, bool retried)spin_unlock_bh (&set->lock);/* Give time to other readers of the set */ -synchronize_rcu_bh (); +synchronize_rcu ();pr_debug ("set %s resized from %u (%p) to %u (%p)\n" , set->name, orig->htable_bits, orig, t->htable_bits, t);
net/netfilter/nfnetlink_log.c +1 -1
@@ -148,7 +148,7 @@ static void instance_put(struct nfulnl_instance *inst) {if (inst &&refcount_dec_and_test (&inst->use)) -call_rcu_bh (&inst->rcu, nfulnl_instance_free_rcu); +call_rcu (&inst->rcu, nfulnl_instance_free_rcu); }static void nfulnl_timer (struct timer_list *t);
net/netfilter/xt_hashlimit.c +2 -2
@@ -260,7 +260,7 @@ static inline void dsthash_free(struct xt_hashlimit_htable *ht, struct dsthash_ent *ent) { hlist_del_rcu(&ent->node); -call_rcu_bh (&ent->rcu, dsthash_free_rcu); +call_rcu (&ent->rcu, dsthash_free_rcu); ht->count--; }static void htable_gc (struct work_struct *work);
@@ -1329,7 +1329,7 @@ static void __exit hashlimit_mt_exit(void)xt_unregister_matches (hashlimit_mt_reg,ARRAY_SIZE (hashlimit_mt_reg));unregister_pernet_subsys (&hashlimit_net_ops); -rcu_barrier_bh (); +rcu_barrier ();kmem_cache_destroy (hashlimit_cachep); }
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 8/37 netfilter: remove NFC_* cache bits
In reply to Pablo Neira AyusoThese are very very (for long time unused) caching infrastructure definition, remove then. They have nothing to do with the NFC subsystem.
--- include/uapi/linux/netfilter.h | 4 ---- include/uapi/linux/netfilter_decnet.h | 10 ---------- include/uapi/linux/netfilter_ipv4.h | 28 ---------------------------- include/uapi/linux/netfilter_ipv6.h | 29 ----------------------------- 4 files changed, 71 deletions(-)
include/uapi/linux/netfilter.h +0 -4
@@ -34,10 +34,6 @@/* only for userspace compatibility */ #ifndef __KERNEL__ -/* Generic cache responses from hook functions. -<= 0x2000 is used for protocol-flags. */ -#define NFC_UNKNOWN 0x4000 -#define NFC_ALTERED 0x8000/* NF_VERDICT_BITS should be 8 now, but userspace might break if this changes */ #define NF_VERDICT_BITS 16
include/uapi/linux/netfilter_decnet.h +0 -10
@@ -15,16 +15,6 @@#include <limits.h> /* for INT_MIN, INT_MAX */ -/* IP Cache bits. */ -/* Src IP address. */ -#define NFC_DN_SRC 0x0001 -/* Dest IP address. */ -#define NFC_DN_DST 0x0002 -/* Input device. */ -#define NFC_DN_IF_IN 0x0004 -/* Output device. */ -#define NFC_DN_IF_OUT 0x0008 -/* kernel define is in netfilter_defs.h */ #define NF_DN_NUMHOOKS 7#endif /* ! __KERNEL__ */
include/uapi/linux/netfilter_ipv4.h +0 -28
@@ -13,34 +13,6 @@#include <limits.h> /* for INT_MIN, INT_MAX */ -/* IP Cache bits. */ -/* Src IP address. */ -#define NFC_IP_SRC 0x0001 -/* Dest IP address. */ -#define NFC_IP_DST 0x0002 -/* Input device. */ -#define NFC_IP_IF_IN 0x0004 -/* Output device. */ -#define NFC_IP_IF_OUT 0x0008 -/* TOS. */ -#define NFC_IP_TOS 0x0010 -/* Protocol. */ -#define NFC_IP_PROTO 0x0020 -/* IP options. */ -#define NFC_IP_OPTIONS 0x0040 -/* Frag & flags. */ -#define NFC_IP_FRAG 0x0080 - -/* Per-protocol information: only matters if proto match. */ -/* TCP flags. */ -#define NFC_IP_TCPFLAGS 0x0100 -/* Source port. */ -#define NFC_IP_SRC_PT 0x0200 -/* Dest port. */ -#define NFC_IP_DST_PT 0x0400 -/* Something else about the proto */ -#define NFC_IP_PROTO_UNKNOWN 0x2000 -/* IP Hooks */ /* After promisc drops, checksum checks. */ #define NF_IP_PRE_ROUTING 0
include/uapi/linux/netfilter_ipv6.h +0 -29
@@ -16,35 +16,6 @@#include <limits.h> /* for INT_MIN, INT_MAX */ -/* IP Cache bits. */ -/* Src IP address. */ -#define NFC_IP6_SRC 0x0001 -/* Dest IP address. */ -#define NFC_IP6_DST 0x0002 -/* Input device. */ -#define NFC_IP6_IF_IN 0x0004 -/* Output device. */ -#define NFC_IP6_IF_OUT 0x0008 -/* TOS. */ -#define NFC_IP6_TOS 0x0010 -/* Protocol. */ -#define NFC_IP6_PROTO 0x0020 -/* IP options. */ -#define NFC_IP6_OPTIONS 0x0040 -/* Frag & flags. */ -#define NFC_IP6_FRAG 0x0080 - - -/* Per-protocol information: only matters if proto match. */ -/* TCP flags. */ -#define NFC_IP6_TCPFLAGS 0x0100 -/* Source port. */ -#define NFC_IP6_SRC_PT 0x0200 -/* Dest port. */ -#define NFC_IP6_DST_PT 0x0400 -/* Something else about the proto */ -#define NFC_IP6_PROTO_UNKNOWN 0x2000 -/* IP6 Hooks */ /* After promisc drops, checksum checks. */ #define NF_IP6_PRE_ROUTING 0
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 9/37 netfilter: nat: remove l4 protocol port rovers
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
This is a leftover from days where single-cpu systems were common:
Store last port used to resolve a clash to use it as a starting point when the next conflict needs to be resolved.
When we have parallel attempt to connect to same address:port pair, its likely that both cores end up computing the same "available" port, as both use same starting port, and newly used ports won't become visible to other cores until the conntrack gets confirmed later.
One of the cores then has to drop the packet at insertion time because the chosen new tuple turns out to be in use after all.
Lets simplify this: remove port rover and use a pseudo-random starting point.
Note that this doesn't make netfilter default to 'fully random' mode; the 'rover' was only used if NAT could not reuse source port as-is.
--- include/net/netfilter/nf_nat_l4proto.h | 2 +- net/netfilter/nf_nat_proto_common.c | 8 ++------ net/netfilter/nf_nat_proto_dccp.c | 5 +---- net/netfilter/nf_nat_proto_sctp.c | 5 +---- net/netfilter/nf_nat_proto_tcp.c | 5 +---- net/netfilter/nf_nat_proto_udp.c | 10 ++-------- 6 files changed, 8 insertions(+), 27 deletions(-)
include/net/netfilter/nf_nat_l4proto.h +1 -1
@@ -74,7 +74,7 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto,struct nf_conntrack_tuple *tuple, const struct nf_nat_range2 *range, enum nf_nat_manip_type maniptype, - const struct nf_conn *ct, u16 *rover); + const struct nf_conn *ct);int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[],struct nf_nat_range2 *range);
net/netfilter/nf_nat_proto_common.c +2 -6
@@ -38,8 +38,7 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto,struct nf_conntrack_tuple *tuple, const struct nf_nat_range2 *range, enum nf_nat_manip_type maniptype, - const struct nf_conn *ct, - u16 *rover) + const struct nf_conn *ct) { unsigned int range_size, min, max, i;__be16 *portptr;
@@ -86,16 +85,13 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, }else if (range->flags &NF_NAT_RANGE_PROTO_OFFSET ) { off = (ntohs (*portptr) -ntohs (range->base_proto.all)); }else { - off = *rover; + off =prandom_u32 (); }for (i =0 ; ; ++off) { *portptr =htons (min + off % range_size);if (++i != range_size &&nf_nat_used_tuple (tuple, ct))continue ; -if (!(range->flags & (NF_NAT_RANGE_PROTO_RANDOM_ALL | -NF_NAT_RANGE_PROTO_OFFSET ))) - *rover = off;return ; } }
net/netfilter/nf_nat_proto_dccp.c +1 -4
@@ -18,8 +18,6 @@#include <net/netfilter/nf_nat_l3proto.h> #include <net/netfilter/nf_nat_l4proto.h> -static u_int16_t dccp_port_rover; - static void dccp_unique_tuple(const struct nf_nat_l3proto *l3proto, struct nf_conntrack_tuple *tuple,
@@ -27,8 +25,7 @@ dccp_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { -nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct , - &dccp_port_rover); +nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct ); } static bool
net/netfilter/nf_nat_proto_sctp.c +1 -4
@@ -12,8 +12,6 @@#include <net/netfilter/nf_nat_l4proto.h> -static u_int16_t nf_sctp_port_rover; - static void sctp_unique_tuple(const struct nf_nat_l3proto *l3proto, struct nf_conntrack_tuple *tuple,
@@ -21,8 +19,7 @@ sctp_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { -nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct , - &nf_sctp_port_rover); +nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct ); } static bool
net/netfilter/nf_nat_proto_tcp.c +1 -4
@@ -18,8 +18,6 @@#include <net/netfilter/nf_nat_l4proto.h> #include <net/netfilter/nf_nat_core.h> -static u16 tcp_port_rover; - static void tcp_unique_tuple(const struct nf_nat_l3proto *l3proto, struct nf_conntrack_tuple *tuple,
@@ -27,8 +25,7 @@ tcp_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { -nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct , - &tcp_port_rover); +nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct ); } static bool
net/netfilter/nf_nat_proto_udp.c +2 -8
@@ -17,8 +17,6 @@#include <net/netfilter/nf_nat_l3proto.h> #include <net/netfilter/nf_nat_l4proto.h> -static u16 udp_port_rover; - static void udp_unique_tuple(const struct nf_nat_l3proto *l3proto, struct nf_conntrack_tuple *tuple,
@@ -26,8 +24,7 @@ udp_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { -nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct , - &udp_port_rover); +nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct ); } static void
@@ -79,8 +76,6 @@ static bool udp_manip_pkt(struct sk_buff *skb, }#ifdef CONFIG_NF_NAT_PROTO_UDPLITE -static u16 udplite_port_rover; - static bool udplite_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto, unsigned int iphdroff, unsigned int hdroff,
@@ -104,8 +99,7 @@ udplite_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { -nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct , - &udplite_port_rover); +nf_nat_l4proto_unique_tuple (l3proto ,tuple ,range ,maniptype ,ct ); } const struct nf_nat_l4proto nf_nat_l4proto_udplite = {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 10/37 netfilter: ipset: fix ip_set_byindex function
In reply to Pablo Neira AyusoFrom: Florent Fourcot <[email protected]>
New function added by "Introduction of new commands and protocol version 7" is not working, since we return skb2 to user
--- net/netfilter/ipset/ip_set_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/ipset/ip_set_core.c +1 -1
@@ -1949,7 +1949,7 @@ static int ip_set_byindex(struct net *net, struct sock *ctnl,if (!nlh2) goto nlmsg_failure;if (nla_put_u8 (skb2,IPSET_ATTR_PROTOCOL ,protocol (attr)) || -nla_put_string (skb,IPSET_ATTR_SETNAME , set->name)) +nla_put_string (skb2,IPSET_ATTR_SETNAME , set->name)) goto nla_put_failure;nlmsg_end (skb2, nlh2);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 11/37 netfilter: ipset: replace a strncpy() with strscpy()
In reply to Pablo Neira AyusoFrom: Qian Cai <[email protected]>
To make overflows as obvious as possible and to prevent code from blithely proceeding with a truncated string. This also has a side-effect to fix a compilation warning when using GCC 8.2.1.
net/netfilter/ipset/ip_set_core.c: In function 'ip_set_sockfn_get':net/netfilter/ipset/ip_set_core.c:2027:3: warning: 'strncpy' writing 32 bytes into a region of size 2 overflows the destination [-Wstringop-overflow=]
--- net/netfilter/ipset/ip_set_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netfilter/ipset/ip_set_core.c +4 -2
@@ -2154,9 +2154,11 @@ ip_set_sockfn_get(struct sock *sk, int optval, void __user *user, int *len) }nfnl_lock (NFNL_SUBSYS_IPSET ); set =ip_set (inst, req_get->set.index); -strncpy (req_get->set.name, set ? set->name :"" , -IPSET_MAXNAMELEN ); + ret =strscpy (req_get->set.name, set ? set->name :"" , +IPSET_MAXNAMELEN );nfnl_unlock (NFNL_SUBSYS_IPSET ); +if (ret <0 ) + goto done; goto copy; }default :
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 12/37 netfilter: nat: remove unnecessary 'else if' branch
In reply to Pablo Neira AyusoFrom: Xiaozhou Liu <[email protected]>
Since a pseudo-random starting point is used in finding a port in the default case, that 'else if' branch above is no longer a necessity. So remove it to simplify code.
--- net/netfilter/nf_nat_proto_common.c | 2 -- 1 file changed, 2 deletions(-)
net/netfilter/nf_nat_proto_common.c +0 -2
@@ -80,8 +80,6 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, off = l3proto->secure_port (tuple, maniptype ==NF_NAT_MANIP_SRC ? tuple->dst.u.all : tuple->src.u.all); - }else if (range->flags &NF_NAT_RANGE_PROTO_RANDOM_FULLY ) { - off =prandom_u32 (); }else if (range->flags &NF_NAT_RANGE_PROTO_OFFSET ) { off = (ntohs (*portptr) -ntohs (range->base_proto.all)); }else {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 13/37 netfilter: nat: limit port clash resolution attempts
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
In case almost or all available ports are taken, clash resolution can take a very long time, resulting in soft lockup.
This can happen when many to-be-natted hosts connect to same destination:port (e.g. a proxy) and all connections pass the same SNAT.
Pick a random offset in the acceptable range, then try ever smaller number of adjacent port numbers, until either the limit is reached or a useable port was found. This results in at most 248 attempts (128 + 64 + 32 + 16 + 8, i.e. 4 restarts with new search offset) instead of 64000+,
--- net/netfilter/nf_nat_proto_common.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-)
net/netfilter/nf_nat_proto_common.c +23 -6
@@ -40,9 +40,10 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto,enum nf_nat_manip_type maniptype, const struct nf_conn *ct) { - unsigned int range_size, min, max, i; + unsigned int range_size, min, max, i, attempts;__be16 *portptr; -u_int16_t off; +u16 off; +static const unsigned int max_attempts =128 ;if (maniptype ==NF_NAT_MANIP_SRC ) portptr = &tuple->src.u.all;
@@ -86,12 +87,28 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, off =prandom_u32 (); } -for (i =0 ; ; ++off) { + attempts = range_size; +if (attempts > max_attempts) + attempts = max_attempts; + +/* We are in softirq; doing a search of the entire range risks +* soft lockup when all tuples are already used. +* +* If we can't find any free port from first offset, pick a new +* one and try again, with ever smaller search window. +*/ +another_round: +for (i =0 ; i < attempts; i++, off++) { *portptr =htons (min + off % range_size); -if (++i != range_size &&nf_nat_used_tuple (tuple, ct)) -continue ; -return ; +if (!nf_nat_used_tuple (tuple, ct)) +return ; } + +if (attempts >= range_size || attempts <16 ) +return ; + attempts /=2 ; + off =prandom_u32 (); + goto another_round; }EXPORT_SYMBOL_GPL (nf_nat_l4proto_unique_tuple);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 14/37 netfilter: remove unused parameters in nf_ct_l4proto_[un]register_sysctl()
In reply to Pablo Neira AyusoFrom: Yafang Shao <[email protected]>
These parameters aren't used now.
So remove them.
--- net/netfilter/nf_conntrack_proto.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-)
net/netfilter/nf_conntrack_proto.c +7 -14
@@ -175,8 +175,7 @@ static struct nf_proto_net *nf_ct_l4proto_net(struct net *net,static int nf_ct_l4proto_register_sysctl (struct net *net, -struct nf_proto_net *pn, -const struct nf_conntrack_l4proto *l4proto) +struct nf_proto_net *pn) {int err =0 ;
@@ -198,9 +197,7 @@ int nf_ct_l4proto_register_sysctl(struct net *net, }static -void nf_ct_l4proto_unregister_sysctl (struct net *net, -struct nf_proto_net *pn, -const struct nf_conntrack_l4proto *l4proto) +void nf_ct_l4proto_unregister_sysctl (struct nf_proto_net *pn) {#ifdef CONFIG_SYSCTL if (pn->ctl_table_header !=NULL )
@@ -252,7 +249,7 @@ int nf_ct_l4proto_pernet_register_one(struct net *net,if (pn ==NULL ) goto out; - ret =nf_ct_l4proto_register_sysctl (net, pn, l4proto); + ret =nf_ct_l4proto_register_sysctl (net, pn);if (ret <0 ) goto out;
@@ -296,7 +293,7 @@ void nf_ct_l4proto_pernet_unregister_one(struct net *net,return ; pn->users--; -nf_ct_l4proto_unregister_sysctl (net, pn, l4proto); +nf_ct_l4proto_unregister_sysctl (pn); }EXPORT_SYMBOL_GPL (nf_ct_l4proto_pernet_unregister_one);
@@ -946,16 +943,14 @@ int nf_conntrack_proto_pernet_init(struct net *net)if (err <0 )return err; err =nf_ct_l4proto_register_sysctl (net, - pn, - &nf_conntrack_l4proto_generic); + pn);if (err <0 )return err; err =nf_ct_l4proto_pernet_register (net, builtin_l4proto,ARRAY_SIZE (builtin_l4proto));if (err <0 ) { -nf_ct_l4proto_unregister_sysctl (net, pn, - &nf_conntrack_l4proto_generic); +nf_ct_l4proto_unregister_sysctl (pn);return err; }
@@ -971,9 +966,7 @@ void nf_conntrack_proto_pernet_fini(struct net *net)nf_ct_l4proto_pernet_unregister (net, builtin_l4proto,ARRAY_SIZE (builtin_l4proto)); pn->users--; -nf_ct_l4proto_unregister_sysctl (net, - pn, - &nf_conntrack_l4proto_generic); +nf_ct_l4proto_unregister_sysctl (pn); }
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 15/37 netfilter: remove NF_NAT_RANGE_PROTO_RANDOM support
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Historically this was net_random() based, and was then converted to a hash based algorithm (private boot seed + hash of endpoint addresses) due to concerns of leaking net_random() bits.
RANDOM_FULLY mode was added later to avoid problems with hash based mode (see commit 34ce324019e76,
"netfilter: nf_nat: add full port randomization support" for details).
Just make prandom_u32() the default search starting point and get rid of ->secure_port() altogether.
--- include/net/netfilter/nf_nat_l3proto.h | 2 -- net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 7 ------- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 7 ------- net/netfilter/nf_nat_proto_common.c | 9 ++------- 4 files changed, 2 insertions(+), 23 deletions(-)
include/net/netfilter/nf_nat_l3proto.h +0 -2
@@ -9,8 +9,6 @@ struct nf_nat_l3proto {bool (*in_range)(const struct nf_conntrack_tuple *t,const struct nf_nat_range2 *range); -u32 (*secure_port)(const struct nf_conntrack_tuple *t,__be16 ); - bool (*manip_pkt)(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
net/ipv4/netfilter/nf_nat_l3proto_ipv4.c +0 -7
@@ -69,12 +69,6 @@ static bool nf_nat_ipv4_in_range(const struct nf_conntrack_tuple *t,ntohl (t->src.u3.ip) <=ntohl (range->max_addr.ip); } -static u32 nf_nat_ipv4_secure_port (const struct nf_conntrack_tuple *t, -__be16 dport) -{ -return secure_ipv4_port_ephemeral (t->src.u3.ip, t->dst.u3.ip, dport); -} - static bool nf_nat_ipv4_manip_pkt(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
@@ -162,7 +156,6 @@ static int nf_nat_ipv4_nlattr_to_range(struct nlattr *tb[],static const struct nf_nat_l3proto nf_nat_l3proto_ipv4 = { .l3proto =NFPROTO_IPV4 , .in_range = nf_nat_ipv4_in_range, - .secure_port = nf_nat_ipv4_secure_port, .manip_pkt = nf_nat_ipv4_manip_pkt, .csum_update = nf_nat_ipv4_csum_update, .csum_recalc = nf_nat_ipv4_csum_recalc,
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +0 -7
@@ -68,12 +68,6 @@ static bool nf_nat_ipv6_in_range(const struct nf_conntrack_tuple *t,ipv6_addr_cmp (&t->src.u3.in6, &range->max_addr.in6) <=0 ; } -static u32 nf_nat_ipv6_secure_port (const struct nf_conntrack_tuple *t, -__be16 dport) -{ -return secure_ipv6_port_ephemeral (t->src.u3.ip6, t->dst.u3.ip6, dport); -} - static bool nf_nat_ipv6_manip_pkt(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
@@ -171,7 +165,6 @@ static int nf_nat_ipv6_nlattr_to_range(struct nlattr *tb[],static const struct nf_nat_l3proto nf_nat_l3proto_ipv6 = { .l3proto =NFPROTO_IPV6 , - .secure_port = nf_nat_ipv6_secure_port, .in_range = nf_nat_ipv6_in_range, .manip_pkt = nf_nat_ipv6_manip_pkt, .csum_update = nf_nat_ipv6_csum_update,
net/netfilter/nf_nat_proto_common.c +2 -7
@@ -77,15 +77,10 @@ void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, range_size = max - min +1 ; } -if (range->flags &NF_NAT_RANGE_PROTO_RANDOM ) { - off = l3proto->secure_port (tuple, maniptype ==NF_NAT_MANIP_SRC - ? tuple->dst.u.all - : tuple->src.u.all); - }else if (range->flags &NF_NAT_RANGE_PROTO_OFFSET ) { +if (range->flags &NF_NAT_RANGE_PROTO_OFFSET ) off = (ntohs (*portptr) -ntohs (range->base_proto.all)); - }else { +else off =prandom_u32 (); - } attempts = range_size;if (attempts > max_attempts)
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 16/37 netfilter: nat: un-export nf_nat_l4proto_unique_tuple
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
almost all l4proto->unique_tuple implementations just call this helper, so make ->unique_tuple() optional and call its helper directly if the l4proto doesn't override it.
This is an intermediate step to get rid of ->unique_tuple completely.
--- include/net/netfilter/nf_nat_l4proto.h | 6 --- net/netfilter/nf_nat_core.c | 76 +++++++++++++++++++++++++++++++++- net/netfilter/nf_nat_proto_common.c | 73 -------------------------------- net/netfilter/nf_nat_proto_dccp.c | 11 ----- net/netfilter/nf_nat_proto_sctp.c | 11 ----- net/netfilter/nf_nat_proto_tcp.c | 11 ----- net/netfilter/nf_nat_proto_udp.c | 22 ---------- 7 files changed, 75 insertions(+), 135 deletions(-)
include/net/netfilter/nf_nat_l4proto.h +0 -6
@@ -70,12 +70,6 @@ bool nf_nat_l4proto_in_range(const struct nf_conntrack_tuple *tuple,const union nf_conntrack_man_proto *min, const union nf_conntrack_man_proto *max); -void nf_nat_l4proto_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct); -int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[],struct nf_nat_range2 *range);
net/netfilter/nf_nat_core.c +75 -1
88 lines not on this page · raw message
net/netfilter/nf_nat_proto_common.c +0 -73
79 lines not on this page · raw message
net/netfilter/nf_nat_proto_dccp.c +0 -11
@@ -18,16 +18,6 @@#include <net/netfilter/nf_nat_l3proto.h> #include <net/netfilter/nf_nat_l4proto.h> -static void -dccp_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -nf_nat_l4proto_unique_tuple (l3proto, tuple, range, maniptype, ct); -} - static bool dccp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -72,7 +62,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_dccp = { .l4proto = IPPROTO_DCCP, .manip_pkt = dccp_manip_pkt, .in_range = nf_nat_l4proto_in_range, - .unique_tuple = dccp_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
net/netfilter/nf_nat_proto_sctp.c +0 -11
@@ -12,16 +12,6 @@#include <net/netfilter/nf_nat_l4proto.h> -static void -sctp_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -nf_nat_l4proto_unique_tuple (l3proto, tuple, range, maniptype, ct); -} - static bool sctp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -67,7 +57,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_sctp = { .l4proto = IPPROTO_SCTP, .manip_pkt = sctp_manip_pkt, .in_range = nf_nat_l4proto_in_range, - .unique_tuple = sctp_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
net/netfilter/nf_nat_proto_tcp.c +0 -11
@@ -18,16 +18,6 @@#include <net/netfilter/nf_nat_l4proto.h> #include <net/netfilter/nf_nat_core.h> -static void -tcp_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -nf_nat_l4proto_unique_tuple (l3proto, tuple, range, maniptype, ct); -} - static bool tcp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -75,7 +65,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_tcp = { .l4proto = IPPROTO_TCP, .manip_pkt = tcp_manip_pkt, .in_range = nf_nat_l4proto_in_range, - .unique_tuple = tcp_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
net/netfilter/nf_nat_proto_udp.c +0 -22
@@ -18,16 +18,6 @@#include <net/netfilter/nf_nat_l4proto.h> static void -udp_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -nf_nat_l4proto_unique_tuple (l3proto, tuple, range, maniptype, ct); -} - -static void __udp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto, unsigned int iphdroff, struct udphdr *hdr,
@@ -92,21 +82,10 @@ static bool udplite_manip_pkt(struct sk_buff *skb,return true; } -static void -udplite_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -nf_nat_l4proto_unique_tuple (l3proto, tuple, range, maniptype, ct); -} -const struct nf_nat_l4proto nf_nat_l4proto_udplite = { .l4proto =IPPROTO_UDPLITE , .manip_pkt = udplite_manip_pkt, .in_range = nf_nat_l4proto_in_range, - .unique_tuple = udplite_unique_tuple, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
@@ -117,7 +96,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_udp = { .l4proto = IPPROTO_UDP, .manip_pkt = udp_manip_pkt, .in_range = nf_nat_l4proto_in_range, - .unique_tuple = udp_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 17/37 netfilter: nat: remove l4proto->unique_tuple
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
fold remaining users (icmp, icmpv6, gre) into nf_nat_l4proto_unique_tuple. The static-save of old incarnation of resolved key in gre and icmp is removed as well, just use the prandom based offset like the others.
--- include/net/netfilter/nf_nat_l4proto.h | 11 ----- net/ipv4/netfilter/nf_nat_proto_gre.c | 44 -------------------- net/ipv4/netfilter/nf_nat_proto_icmp.c | 27 ------------- net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 26 ------------ net/netfilter/nf_nat_core.c | 69 ++++++++++++++++++++++++++------ net/netfilter/nf_nat_proto_unknown.c | 13 ------ 6 files changed, 56 insertions(+), 134 deletions(-)
include/net/netfilter/nf_nat_l4proto.h +0 -11
@@ -27,17 +27,6 @@ struct nf_nat_l4proto {const union nf_conntrack_man_proto *min, const union nf_conntrack_man_proto *max); -/* Alter the per-proto part of the tuple (depending on -* maniptype), to give a unique tuple in the given range if -* possible. Per-protocol part of tuple is initialized to the -* incoming packet. -*/ -void (*unique_tuple)(const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct); -int (*nlattr_to_range)(struct nlattr *tb[],struct nf_nat_range2 *range); };
net/ipv4/netfilter/nf_nat_proto_gre.c +0 -44
56 lines not on this page · raw message
net/ipv4/netfilter/nf_nat_proto_icmp.c +0 -27
@@ -27,32 +27,6 @@ icmp_in_range(const struct nf_conntrack_tuple *tuple,ntohs (tuple->src.u.icmp.id) <=ntohs (max->icmp.id); } -static void -icmp_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -static u_int16_t id; -unsigned int range_size; -unsigned int i; - - range_size =ntohs (range->max_proto.icmp.id) - -ntohs (range->min_proto.icmp.id) +1 ; -/* If no range specified... */ -if (!(range->flags &NF_NAT_RANGE_PROTO_SPECIFIED )) - range_size =0xFFFF ; - -for (i =0 ; ; ++id) { - tuple->src.u.icmp.id =htons (ntohs (range->min_proto.icmp.id) + - (id % range_size)); -if (++i == range_size || !nf_nat_used_tuple (tuple, ct)) -return ; - } -return ; -} - static bool icmp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -76,7 +50,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_icmp = { .l4proto = IPPROTO_ICMP, .manip_pkt = icmp_manip_pkt, .in_range = icmp_in_range, - .unique_tuple = icmp_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
net/ipv6/netfilter/nf_nat_proto_icmpv6.c +0 -26
@@ -29,31 +29,6 @@ icmpv6_in_range(const struct nf_conntrack_tuple *tuple,ntohs (tuple->src.u.icmp.id) <=ntohs (max->icmp.id); } -static void -icmpv6_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -static u16 id; -unsigned int range_size; -unsigned int i; - - range_size =ntohs (range->max_proto.icmp.id) - -ntohs (range->min_proto.icmp.id) +1 ; - -if (!(range->flags &NF_NAT_RANGE_PROTO_SPECIFIED )) - range_size =0xffff ; - -for (i =0 ; ; ++id) { - tuple->src.u.icmp.id =htons (ntohs (range->min_proto.icmp.id) + - (id % range_size)); -if (++i == range_size || !nf_nat_used_tuple (tuple, ct)) -return ; - } -} - static bool icmpv6_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -83,7 +58,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_icmpv6 = { .l4proto = IPPROTO_ICMPV6, .manip_pkt = icmpv6_manip_pkt, .in_range = icmpv6_in_range, - .unique_tuple = icmpv6_unique_tuple,#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range,#endif
net/netfilter/nf_nat_core.c +56 -13
110 lines not on this page · raw message
net/netfilter/nf_nat_proto_unknown.c +0 -13
@@ -25,18 +25,6 @@ static bool unknown_in_range(const struct nf_conntrack_tuple *tuple,return true; } -static void unknown_unique_tuple (const struct nf_nat_l3proto *l3proto, -struct nf_conntrack_tuple *tuple, -const struct nf_nat_range2 *range, -enum nf_nat_manip_type maniptype, -const struct nf_conn *ct) -{ -/* Sorry: we can't help you; if it's not unique, we can't frob -* anything. -*/ -return ; -} - static bool unknown_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -50,5 +38,4 @@ unknown_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_unknown = { .manip_pkt = unknown_manip_pkt, .in_range = unknown_in_range, - .unique_tuple = unknown_unique_tuple, };
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 18/37 netfilter: nat: fold in_range indirection into caller
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
No need for indirections here, we only support ipv4 and ipv6 and the called functions are very small.
--- include/net/netfilter/nf_nat_l3proto.h | 3 --- net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 8 -------- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 8 -------- net/netfilter/nf_nat_core.c | 23 ++++++++++++++++------- 4 files changed, 16 insertions(+), 26 deletions(-)
include/net/netfilter/nf_nat_l3proto.h +0 -3
@@ -6,9 +6,6 @@ struct nf_nat_l4proto;struct nf_nat_l3proto {u8 l3proto; -bool (*in_range)(const struct nf_conntrack_tuple *t, -const struct nf_nat_range2 *range); - bool (*manip_pkt)(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
net/ipv4/netfilter/nf_nat_l3proto_ipv4.c +0 -8
@@ -62,13 +62,6 @@ static void nf_nat_ipv4_decode_session(struct sk_buff *skb, }#endif /* CONFIG_XFRM */ -static bool nf_nat_ipv4_in_range (const struct nf_conntrack_tuple *t, -const struct nf_nat_range2 *range) -{ -return ntohl (t->src.u3.ip) >=ntohl (range->min_addr.ip) && -ntohl (t->src.u3.ip) <=ntohl (range->max_addr.ip); -} - static bool nf_nat_ipv4_manip_pkt(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
@@ -155,7 +148,6 @@ static int nf_nat_ipv4_nlattr_to_range(struct nlattr *tb[],static const struct nf_nat_l3proto nf_nat_l3proto_ipv4 = { .l3proto =NFPROTO_IPV4 , - .in_range = nf_nat_ipv4_in_range, .manip_pkt = nf_nat_ipv4_manip_pkt, .csum_update = nf_nat_ipv4_csum_update, .csum_recalc = nf_nat_ipv4_csum_recalc,
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +0 -8
@@ -61,13 +61,6 @@ static void nf_nat_ipv6_decode_session(struct sk_buff *skb, }#endif -static bool nf_nat_ipv6_in_range (const struct nf_conntrack_tuple *t, -const struct nf_nat_range2 *range) -{ -return ipv6_addr_cmp (&t->src.u3.in6, &range->min_addr.in6) >=0 && -ipv6_addr_cmp (&t->src.u3.in6, &range->max_addr.in6) <=0 ; -} - static bool nf_nat_ipv6_manip_pkt(struct sk_buff *skb, unsigned int iphdroff, const struct nf_nat_l4proto *l4proto,
@@ -165,7 +158,6 @@ static int nf_nat_ipv6_nlattr_to_range(struct nlattr *tb[],static const struct nf_nat_l3proto nf_nat_l3proto_ipv6 = { .l3proto =NFPROTO_IPV6 , - .in_range = nf_nat_ipv6_in_range, .manip_pkt = nf_nat_ipv6_manip_pkt, .csum_update = nf_nat_ipv6_csum_update, .csum_recalc = nf_nat_ipv6_csum_recalc,
net/netfilter/nf_nat_core.c +16 -7
@@ -172,11 +172,21 @@ nf_nat_used_tuple(const struct nf_conntrack_tuple *tuple, }EXPORT_SYMBOL (nf_nat_used_tuple); +static bool nf_nat_inet_in_range (const struct nf_conntrack_tuple *t, +const struct nf_nat_range2 *range) +{ +if (t->src.l3num ==NFPROTO_IPV4 ) +return ntohl (t->src.u3.ip) >=ntohl (range->min_addr.ip) && +ntohl (t->src.u3.ip) <=ntohl (range->max_addr.ip); + +return ipv6_addr_cmp (&t->src.u3.in6, &range->min_addr.in6) >=0 && +ipv6_addr_cmp (&t->src.u3.in6, &range->max_addr.in6) <=0 ; +} +/* If we source map this tuple so reply looks like reply_tuple, will * that meet the constraints of range. */ -static int in_range (const struct nf_nat_l3proto *l3proto, -const struct nf_nat_l4proto *l4proto, +static int in_range (const struct nf_nat_l4proto *l4proto,const struct nf_conntrack_tuple *tuple,const struct nf_nat_range2 *range) {
@@ -184,7 +194,7 @@ static int in_range(const struct nf_nat_l3proto *l3proto,* range specified, otherwise let this drag us onto a new src IP. */ if (range->flags &NF_NAT_RANGE_MAP_IPS && - !l3proto->in_range (tuple, range)) + !nf_nat_inet_in_range (tuple, range))return 0 ; if (!(range->flags & NF_NAT_RANGE_PROTO_SPECIFIED) ||
@@ -211,7 +221,6 @@ same_src(const struct nf_conn *ct, static int find_appropriate_src(struct net *net, const struct nf_conntrack_zone *zone, - const struct nf_nat_l3proto *l3proto, const struct nf_nat_l4proto *l4proto, const struct nf_conntrack_tuple *tuple, struct nf_conntrack_tuple *result,
@@ -229,7 +238,7 @@ find_appropriate_src(struct net *net, &ct->tuplehash[IP_CT_DIR_REPLY].tuple); result->dst = tuple->dst; -if (in_range (l3proto, l4proto, result, range)) +if (in_range (l4proto, result, range))return 1 ; } }
@@ -463,12 +472,12 @@ get_unique_tuple(struct nf_conntrack_tuple *tuple,if (maniptype ==NF_NAT_MANIP_SRC && !(range->flags &NF_NAT_RANGE_PROTO_RANDOM_ALL )) {/* try the original tuple first */ -if (in_range (l3proto, l4proto, orig_tuple, range)) { +if (in_range (l4proto, orig_tuple, range)) {if (!nf_nat_used_tuple (orig_tuple, ct)) { *tuple = *orig_tuple; goto out; } - }else if (find_appropriate_src (net, zone, l3proto, l4proto, + }else if (find_appropriate_src (net, zone, l4proto, orig_tuple, tuple, range)) {pr_debug ("get_unique_tuple: Found current src map\n" );if (!nf_nat_used_tuple (tuple, ct))
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 19/37 netfilter: nat: remove l4proto->in_range
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
With exception of icmp, all of the l4 nat protocols set this to nf_nat_l4proto_in_range.
Get rid of this and just check the l4proto in the caller.
--- include/net/netfilter/nf_nat_l4proto.h | 11 ------ net/ipv4/netfilter/nf_nat_proto_gre.c | 1 - net/ipv4/netfilter/nf_nat_proto_icmp.c | 11 ------ net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 11 ------ net/netfilter/nf_nat_core.c | 67 ++++++++++++++++++++------------ net/netfilter/nf_nat_proto_common.c | 17 -------- net/netfilter/nf_nat_proto_dccp.c | 1 - net/netfilter/nf_nat_proto_sctp.c | 1 - net/netfilter/nf_nat_proto_tcp.c | 1 - net/netfilter/nf_nat_proto_udp.c | 2 - net/netfilter/nf_nat_proto_unknown.c | 9 ----- 11 files changed, 43 insertions(+), 89 deletions(-)
include/net/netfilter/nf_nat_l4proto.h +0 -11
@@ -21,12 +21,6 @@ struct nf_nat_l4proto {const struct nf_conntrack_tuple *tuple, enum nf_nat_manip_type maniptype); -/* Is the manipable part of the tuple between min and max incl? */ -bool (*in_range)(const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max); -int (*nlattr_to_range)(struct nlattr *tb[],struct nf_nat_range2 *range); };
@@ -54,11 +48,6 @@ extern const struct nf_nat_l4proto nf_nat_l4proto_sctp;extern const struct nf_nat_l4proto nf_nat_l4proto_udplite;#endif -bool nf_nat_l4proto_in_range (const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max); -int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[],struct nf_nat_range2 *range);
net/ipv4/netfilter/nf_nat_proto_gre.c +0 -1
@@ -80,7 +80,6 @@ gre_manip_pkt(struct sk_buff *skb,static const struct nf_nat_l4proto gre = { .l4proto =IPPROTO_GRE , .manip_pkt = gre_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/ipv4/netfilter/nf_nat_proto_icmp.c +0 -11
@@ -18,16 +18,6 @@#include <net/netfilter/nf_nat_l4proto.h> static bool -icmp_in_range (const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max) -{ -return ntohs (tuple->src.u.icmp.id) >=ntohs (min->icmp.id) && -ntohs (tuple->src.u.icmp.id) <=ntohs (max->icmp.id); -} - -static bool icmp_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto, unsigned int iphdroff, unsigned int hdroff,
@@ -49,7 +39,6 @@ icmp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_icmp = { .l4proto =IPPROTO_ICMP , .manip_pkt = icmp_manip_pkt, - .in_range = icmp_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/ipv6/netfilter/nf_nat_proto_icmpv6.c +0 -11
@@ -20,16 +20,6 @@#include <net/netfilter/nf_nat_l4proto.h> static bool -icmpv6_in_range (const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max) -{ -return ntohs (tuple->src.u.icmp.id) >=ntohs (min->icmp.id) && -ntohs (tuple->src.u.icmp.id) <=ntohs (max->icmp.id); -} - -static bool icmpv6_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto, unsigned int iphdroff, unsigned int hdroff,
@@ -57,7 +47,6 @@ icmpv6_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_icmpv6 = { .l4proto =IPPROTO_ICMPV6 , .manip_pkt = icmpv6_manip_pkt, - .in_range = icmpv6_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/netfilter/nf_nat_core.c +43 -24
134 lines not on this page · raw message
net/netfilter/nf_nat_proto_common.c +0 -17
@@ -17,23 +17,6 @@#include <net/netfilter/nf_nat_l3proto.h> #include <net/netfilter/nf_nat_l4proto.h> -bool nf_nat_l4proto_in_range (const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max) -{ -__be16 port; - -if (maniptype ==NF_NAT_MANIP_SRC ) - port = tuple->src.u.all; -else - port = tuple->dst.u.all; - -return ntohs (port) >=ntohs (min->all) && -ntohs (port) <=ntohs (max->all); -} -EXPORT_SYMBOL_GPL (nf_nat_l4proto_in_range); -#if IS_ENABLED (CONFIG_NF_CT_NETLINK )int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[],struct nf_nat_range2 *range)
net/netfilter/nf_nat_proto_dccp.c +0 -1
@@ -61,7 +61,6 @@ dccp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_dccp = { .l4proto =IPPROTO_DCCP , .manip_pkt = dccp_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/netfilter/nf_nat_proto_sctp.c +0 -1
@@ -56,7 +56,6 @@ sctp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_sctp = { .l4proto =IPPROTO_SCTP , .manip_pkt = sctp_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/netfilter/nf_nat_proto_tcp.c +0 -1
@@ -64,7 +64,6 @@ tcp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_tcp = { .l4proto =IPPROTO_TCP , .manip_pkt = tcp_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/netfilter/nf_nat_proto_udp.c +0 -2
@@ -85,7 +85,6 @@ static bool udplite_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_udplite = { .l4proto =IPPROTO_UDPLITE , .manip_pkt = udplite_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
@@ -95,7 +94,6 @@ const struct nf_nat_l4proto nf_nat_l4proto_udplite = {const struct nf_nat_l4proto nf_nat_l4proto_udp = { .l4proto =IPPROTO_UDP , .manip_pkt = udp_manip_pkt, - .in_range = nf_nat_l4proto_in_range, #if IS_ENABLED(CONFIG_NF_CT_NETLINK) .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, #endif
net/netfilter/nf_nat_proto_unknown.c +0 -9
@@ -17,14 +17,6 @@#include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_l4proto.h> -static bool unknown_in_range (const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type manip_type, -const union nf_conntrack_man_proto *min, -const union nf_conntrack_man_proto *max) -{ -return true; -} - static bool unknown_manip_pkt(struct sk_buff *skb, const struct nf_nat_l3proto *l3proto,
@@ -37,5 +29,4 @@ unknown_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_unknown = { .manip_pkt = unknown_manip_pkt, - .in_range = unknown_in_range, };
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 20/37 netfilter: nat: remove l4proto->nlattr_to_range
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
all protocols did set this to nf_nat_l4proto_nlattr_to_range, so just call it directly.
The important difference is that we'll now also call it for protocols that we don't support (i.e., nf_nat_proto_unknown did not provide .nlattr_to_range).
However, there should be no harm, even icmp provided this callback. If we don't implement a specific l4nat for this, nothing would make use of this information, so adding a big switch/case construct listing all supported l4protocols seems a bit pointless.
This change leaves a single function pointer in the l4proto struct.
--- include/net/netfilter/nf_nat_l4proto.h | 6 ------ net/ipv4/netfilter/nf_nat_proto_gre.c | 3 --- net/ipv4/netfilter/nf_nat_proto_icmp.c | 3 --- net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 3 --- net/netfilter/Makefile | 2 +- net/netfilter/nf_nat_core.c | 22 +++++++++++++------ net/netfilter/nf_nat_proto_common.c | 36 -------------------------------- net/netfilter/nf_nat_proto_dccp.c | 3 --- net/netfilter/nf_nat_proto_sctp.c | 3 --- net/netfilter/nf_nat_proto_tcp.c | 3 --- net/netfilter/nf_nat_proto_udp.c | 6 ------ 11 files changed, 17 insertions(+), 73 deletions(-) delete mode 100644 net/netfilter/nf_nat_proto_common.c
include/net/netfilter/nf_nat_l4proto.h +0 -6
@@ -20,9 +20,6 @@ struct nf_nat_l4proto { unsigned int iphdroff, unsigned int hdroff, const struct nf_conntrack_tuple *tuple, enum nf_nat_manip_type maniptype); - -int (*nlattr_to_range)(struct nlattr *tb[], -struct nf_nat_range2 *range); };/* Protocol registration. */
@@ -48,7 +45,4 @@ extern const struct nf_nat_l4proto nf_nat_l4proto_sctp;extern const struct nf_nat_l4proto nf_nat_l4proto_udplite;#endif -int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[], -struct nf_nat_range2 *range); -#endif /*_NF_NAT_L4PROTO_H*/
net/ipv4/netfilter/nf_nat_proto_gre.c +0 -3
@@ -80,9 +80,6 @@ gre_manip_pkt(struct sk_buff *skb,static const struct nf_nat_l4proto gre = { .l4proto =IPPROTO_GRE , .manip_pkt = gre_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };static int __init nf_nat_proto_gre_init (void )
net/ipv4/netfilter/nf_nat_proto_icmp.c +0 -3
@@ -39,7 +39,4 @@ icmp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_icmp = { .l4proto =IPPROTO_ICMP , .manip_pkt = icmp_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
net/ipv6/netfilter/nf_nat_proto_icmpv6.c +0 -3
@@ -47,7 +47,4 @@ icmpv6_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_icmpv6 = { .l4proto =IPPROTO_ICMPV6 , .manip_pkt = icmpv6_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
net/netfilter/Makefile +1 -1
@@ -47,7 +47,7 @@ obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o -nf_nat-y := nf_nat_core.o nf_nat_proto_unknown.o nf_nat_proto_common.o \ +nf_nat-y := nf_nat_core.o nf_nat_proto_unknown.o \ nf_nat_proto_udp.o nf_nat_proto_tcp.o nf_nat_helper.o # NAT protocols (nf_nat)
net/netfilter/nf_nat_core.c +16 -6
@@ -946,12 +946,26 @@ static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = { [CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 }, }; +static int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[], +struct nf_nat_range2 *range) +{ +if (tb[CTA_PROTONAT_PORT_MIN ]) { + range->min_proto.all =nla_get_be16 (tb[CTA_PROTONAT_PORT_MIN ]); + range->max_proto.all = range->min_proto.all; + range->flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; + } +if (tb[CTA_PROTONAT_PORT_MAX ]) { + range->max_proto.all =nla_get_be16 (tb[CTA_PROTONAT_PORT_MAX ]); + range->flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; + } +return 0 ; +} +static int nfnetlink_parse_nat_proto (struct nlattr *attr,const struct nf_conn *ct,struct nf_nat_range2 *range) {struct nlattr *tb[CTA_PROTONAT_MAX +1 ]; -const struct nf_nat_l4proto *l4proto;int err; err = nla_parse_nested(tb, CTA_PROTONAT_MAX, attr,
@@ -959,11 +973,7 @@ static int nfnetlink_parse_nat_proto(struct nlattr *attr,if (err <0 )return err; - l4proto =__nf_nat_l4proto_find (nf_ct_l3num (ct),nf_ct_protonum (ct)); -if (l4proto->nlattr_to_range) - err = l4proto->nlattr_to_range (tb, range); - -return err; +return nf_nat_l4proto_nlattr_to_range (tb, range); }static const struct nla_policy nat_nla_policy[CTA_NAT_MAX +1 ] = {
net/netfilter/nf_nat_proto_common.c deleted +0 -36
@@ -1,36 +0,0 @@ -/* (C) 1999-2001 Paul `Rusty' Russell -* (C) 2002-2006 Netfilter Core Team <[email protected]> -* (C) 2008 Patrick McHardy <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/types.h> -#include <linux/random.h> -#include <linux/netfilter.h> -#include <linux/export.h> - -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_core.h> -#include <net/netfilter/nf_nat_l3proto.h> -#include <net/netfilter/nf_nat_l4proto.h> - -#if IS_ENABLED (CONFIG_NF_CT_NETLINK ) -int nf_nat_l4proto_nlattr_to_range (struct nlattr *tb[], -struct nf_nat_range2 *range) -{ -if (tb[CTA_PROTONAT_PORT_MIN ]) { - range->min_proto.all =nla_get_be16 (tb[CTA_PROTONAT_PORT_MIN ]); - range->max_proto.all = range->min_proto.all; - range->flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; - } -if (tb[CTA_PROTONAT_PORT_MAX ]) { - range->max_proto.all =nla_get_be16 (tb[CTA_PROTONAT_PORT_MAX ]); - range->flags |=NF_NAT_RANGE_PROTO_SPECIFIED ; - } -return 0 ; -} -EXPORT_SYMBOL_GPL (nf_nat_l4proto_nlattr_to_range); -#endif
net/netfilter/nf_nat_proto_dccp.c +0 -3
@@ -61,7 +61,4 @@ dccp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_dccp = { .l4proto =IPPROTO_DCCP , .manip_pkt = dccp_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
net/netfilter/nf_nat_proto_sctp.c +0 -3
@@ -56,7 +56,4 @@ sctp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_sctp = { .l4proto =IPPROTO_SCTP , .manip_pkt = sctp_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
net/netfilter/nf_nat_proto_tcp.c +0 -3
@@ -64,7 +64,4 @@ tcp_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_tcp = { .l4proto =IPPROTO_TCP , .manip_pkt = tcp_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
net/netfilter/nf_nat_proto_udp.c +0 -6
@@ -85,16 +85,10 @@ static bool udplite_manip_pkt(struct sk_buff *skb,const struct nf_nat_l4proto nf_nat_l4proto_udplite = { .l4proto =IPPROTO_UDPLITE , .manip_pkt = udplite_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };#endif /* CONFIG_NF_NAT_PROTO_UDPLITE */ const struct nf_nat_l4proto nf_nat_l4proto_udp = { .l4proto =IPPROTO_UDP , .manip_pkt = udp_manip_pkt, -#if IS_ENABLED(CONFIG_NF_CT_NETLINK) - .nlattr_to_range = nf_nat_l4proto_nlattr_to_range, -#endif };
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 21/37 netfilter: nat: remove l4proto->manip_pkt
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
This removes the last l4proto indirection, the two callers, the l3proto packet mangling helpers for ipv4 and ipv6, now call the nf_nat_l4proto_manip_pkt() helper.
nf_nat_proto_{dccp,tcp,sctp,gre,icmp,icmpv6} are left behind, even though they contain no functionality anymore to not clutter this patch.
Next patch will remove the empty files and the nf_nat_l4proto struct.
nf_nat_proto_udp.c is renamed to nf_nat_proto.c, as it now contains the other nat manip functionality as well, not just udp and udplite.
--- include/net/netfilter/nf_nat_l4proto.h | 15 +- net/ipv4/netfilter/Kconfig | 5 - net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 4 +- net/ipv4/netfilter/nf_nat_pptp.c | 2 - net/ipv4/netfilter/nf_nat_proto_gre.c | 41 ---- net/ipv4/netfilter/nf_nat_proto_icmp.c | 21 -- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 4 +- net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 26 --- net/netfilter/Kconfig | 15 -- net/netfilter/Makefile | 2 +- net/netfilter/nf_nat_proto.c | 353 +++++++++++++++++++++++++++++++ net/netfilter/nf_nat_proto_dccp.c | 42 ---- net/netfilter/nf_nat_proto_sctp.c | 43 ---- net/netfilter/nf_nat_proto_tcp.c | 44 ---- net/netfilter/nf_nat_proto_udp.c | 94 -------- net/netfilter/nf_nat_proto_unknown.c | 11 - 16 files changed, 365 insertions(+), 357 deletions(-) create mode 100644 net/netfilter/nf_nat_proto.c delete mode 100644 net/netfilter/nf_nat_proto_udp.c
include/net/netfilter/nf_nat_l4proto.h +7 -8
@@ -12,14 +12,6 @@ struct nf_nat_l4proto {/* Protocol number. */ u8 l4proto; -/* Translate a packet to the target according to manip type. -* Return true if succeeded. -*/ -bool (*manip_pkt)(struct sk_buff *skb, -const struct nf_nat_l3proto *l3proto, -unsigned int iphdroff,unsigned int hdroff, -const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype); };/* Protocol registration. */
@@ -29,6 +21,13 @@ void nf_nat_l4proto_unregister(u8 l3proto,const struct nf_nat_l4proto *__nf_nat_l4proto_find (u8 l3proto,u8 l4proto); +/* Translate a packet to the target according to manip type. Return on success. */ +bool nf_nat_l4proto_manip_pkt (struct sk_buff *skb, +const struct nf_nat_l3proto *l3proto, +unsigned int iphdroff,unsigned int hdroff, +const struct nf_conntrack_tuple *tuple, +enum nf_nat_manip_type maniptype); +/* Built-in protocols. */ extern const struct nf_nat_l4proto nf_nat_l4proto_tcp;extern const struct nf_nat_l4proto nf_nat_l4proto_udp;
net/ipv4/netfilter/Kconfig +0 -5
@@ -156,15 +156,10 @@ config NF_NAT_SNMP_BASIC To compile it as a module, choose M here. If unsure, say N. -config NF_NAT_PROTO_GRE - tristate - depends on NF_CT_PROTO_GRE - config NF_NAT_PPTP tristate depends on NF_CONNTRACK default NF_CONNTRACK_PPTP - select NF_NAT_PROTO_GRE config NF_NAT_H323 tristate
net/ipv4/netfilter/nf_nat_l3proto_ipv4.c +2 -2
@@ -77,8 +77,8 @@ static bool nf_nat_ipv4_manip_pkt(struct sk_buff *skb, iph = (void *)skb->data + iphdroff; hdroff = iphdroff + iph->ihl *4 ; -if (!l4proto->manip_pkt (skb, &nf_nat_l3proto_ipv4, iphdroff, hdroff, - target, maniptype)) +if (!nf_nat_l4proto_manip_pkt (skb, &nf_nat_l3proto_ipv4, iphdroff, + hdroff, target, maniptype))return false; iph = (void *)skb->data + iphdroff;
net/ipv4/netfilter/nf_nat_pptp.c +0 -2
@@ -299,8 +299,6 @@ pptp_inbound_pkt(struct sk_buff *skb,static int __init nf_nat_helper_pptp_init (void ) { -nf_nat_need_gre (); -BUG_ON (nf_nat_pptp_hook_outbound !=NULL );RCU_INIT_POINTER (nf_nat_pptp_hook_outbound, pptp_outbound_pkt);
net/ipv4/netfilter/nf_nat_proto_gre.c +0 -41
49 lines not on this page · raw message
net/ipv4/netfilter/nf_nat_proto_icmp.c +0 -21
@@ -10,33 +10,12 @@#include <linux/init.h> #include <linux/export.h> #include <linux/ip.h> -#include <linux/icmp.h> #include <linux/netfilter.h> #include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_core.h> #include <net/netfilter/nf_nat_l4proto.h> -static bool -icmp_manip_pkt (struct sk_buff *skb, -const struct nf_nat_l3proto *l3proto, -unsigned int iphdroff,unsigned int hdroff, -const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype) -{ -struct icmphdr *hdr; - -if (!skb_make_writable (skb, hdroff +sizeof (*hdr))) -return false; - - hdr = (struct icmphdr *)(skb->data + hdroff); -inet_proto_csum_replace2 (&hdr->checksum, skb, - hdr->un.echo.id, tuple->src.u.icmp.id, false); - hdr->un.echo.id = tuple->src.u.icmp.id; -return true; -} -const struct nf_nat_l4proto nf_nat_l4proto_icmp = { .l4proto =IPPROTO_ICMP , - .manip_pkt = icmp_manip_pkt, };
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +2 -2
@@ -83,8 +83,8 @@ static bool nf_nat_ipv6_manip_pkt(struct sk_buff *skb, goto manip_addr;if ((frag_off &htons (~0x7 )) ==0 && - !l4proto->manip_pkt (skb, &nf_nat_l3proto_ipv6, iphdroff, hdroff, - target, maniptype)) + !nf_nat_l4proto_manip_pkt (skb, &nf_nat_l3proto_ipv6, iphdroff, hdroff, + target, maniptype))return false;/* must reload, offset might have changed */
net/ipv6/netfilter/nf_nat_proto_icmpv6.c +0 -26
@@ -19,32 +19,6 @@#include <net/netfilter/nf_nat_l3proto.h> #include <net/netfilter/nf_nat_l4proto.h> -static bool -icmpv6_manip_pkt (struct sk_buff *skb, -const struct nf_nat_l3proto *l3proto, -unsigned int iphdroff,unsigned int hdroff, -const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype) -{ -struct icmp6hdr *hdr; - -if (!skb_make_writable (skb, hdroff +sizeof (*hdr))) -return false; - - hdr = (struct icmp6hdr *)(skb->data + hdroff); - l3proto->csum_update (skb, iphdroff, &hdr->icmp6_cksum, - tuple, maniptype); -if (hdr->icmp6_type ==ICMPV6_ECHO_REQUEST || - hdr->icmp6_type ==ICMPV6_ECHO_REPLY ) { -inet_proto_csum_replace2 (&hdr->icmp6_cksum, skb, - hdr->icmp6_identifier, - tuple->src.u.icmp.id, false); - hdr->icmp6_identifier = tuple->src.u.icmp.id; - } -return true; -} -const struct nf_nat_l4proto nf_nat_l4proto_icmpv6 = { .l4proto =IPPROTO_ICMPV6 , - .manip_pkt = icmpv6_manip_pkt, };
net/netfilter/Kconfig +0 -15
@@ -403,21 +403,6 @@ config NF_NAT_NEEDED depends on NF_NAT default y -config NF_NAT_PROTO_DCCP - bool - depends on NF_NAT && NF_CT_PROTO_DCCP - default NF_NAT && NF_CT_PROTO_DCCP - -config NF_NAT_PROTO_UDPLITE - bool - depends on NF_NAT && NF_CT_PROTO_UDPLITE - default NF_NAT && NF_CT_PROTO_UDPLITE - -config NF_NAT_PROTO_SCTP - bool - default NF_NAT && NF_CT_PROTO_SCTP - depends on NF_NAT && NF_CT_PROTO_SCTP - config NF_NAT_AMANDA tristate depends on NF_CONNTRACK && NF_NAT
net/netfilter/Makefile +1 -1
@@ -48,7 +48,7 @@ obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o nf_nat-y := nf_nat_core.o nf_nat_proto_unknown.o \ - nf_nat_proto_udp.o nf_nat_proto_tcp.o nf_nat_helper.o + nf_nat_proto.o nf_nat_proto_tcp.o nf_nat_helper.o # NAT protocols (nf_nat) nf_nat-$(CONFIG_NF_NAT_PROTO_DCCP) += nf_nat_proto_dccp.o
net/netfilter/nf_nat_proto.c new file +353 -0
353 lines not on this page · raw message
net/netfilter/nf_nat_proto_dccp.c +0 -42
54 lines not on this page · raw message
net/netfilter/nf_nat_proto_sctp.c +0 -43
53 lines not on this page · raw message
net/netfilter/nf_nat_proto_tcp.c +0 -44
50 lines not on this page · raw message
net/netfilter/nf_nat_proto_udp.c deleted +0 -94
94 lines not on this page · raw message
net/netfilter/nf_nat_proto_unknown.c +0 -11
@@ -17,16 +17,5 @@#include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_l4proto.h> -static bool -unknown_manip_pkt (struct sk_buff *skb, -const struct nf_nat_l3proto *l3proto, -unsigned int iphdroff,unsigned int hdroff, -const struct nf_conntrack_tuple *tuple, -enum nf_nat_manip_type maniptype) -{ -return true; -} -const struct nf_nat_l4proto nf_nat_l4proto_unknown = { - .manip_pkt = unknown_manip_pkt, };
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 22/37 netfilter: nat: remove nf_nat_l4proto struct
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
This removes the (now empty) nf_nat_l4proto struct, all its instances and all the no longer needed runtime (un)register functionality.
nf_nat_need_gre() can be axed as well: the module that calls it (to load the no-longer-existing nat_gre module) also calls other nat core functions. GRE nat is now always available if kernel is built with it.
--- include/linux/netfilter/nf_conntrack_proto_gre.h | 2 - include/net/netfilter/nf_nat_l3proto.h | 2 - include/net/netfilter/nf_nat_l4proto.h | 31 ------- net/ipv4/netfilter/Makefile | 5 +- net/ipv4/netfilter/nf_nat_l3proto_ipv4.c | 24 +----- net/ipv4/netfilter/nf_nat_proto_gre.c | 61 ------------- net/ipv4/netfilter/nf_nat_proto_icmp.c | 21 ----- net/ipv6/netfilter/Makefile | 2 +- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 24 +----- net/ipv6/netfilter/nf_nat_proto_icmpv6.c | 24 ------ net/netfilter/Makefile | 7 +- net/netfilter/nf_conntrack_netlink.c | 1 - net/netfilter/nf_nat_core.c | 104 +---------------------- net/netfilter/nf_nat_proto.c | 10 --- net/netfilter/nf_nat_proto_dccp.c | 22 ----- net/netfilter/nf_nat_proto_sctp.c | 16 ---- net/netfilter/nf_nat_proto_tcp.c | 23 ----- net/netfilter/nf_nat_proto_unknown.c | 21 ----- 18 files changed, 10 insertions(+), 390 deletions(-) delete mode 100644 net/ipv4/netfilter/nf_nat_proto_gre.c delete mode 100644 net/ipv4/netfilter/nf_nat_proto_icmp.c delete mode 100644 net/ipv6/netfilter/nf_nat_proto_icmpv6.c delete mode 100644 net/netfilter/nf_nat_proto_dccp.c delete mode 100644 net/netfilter/nf_nat_proto_sctp.c delete mode 100644 net/netfilter/nf_nat_proto_tcp.c delete mode 100644 net/netfilter/nf_nat_proto_unknown.c
include/linux/netfilter/nf_conntrack_proto_gre.h +0 -2
@@ -28,7 +28,5 @@ int nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir,/* delete keymap entries */ void nf_ct_gre_keymap_destroy (struct nf_conn *ct); -void nf_nat_need_gre (void ); -#endif /* __KERNEL__ */ #endif /* _CONNTRACK_PROTO_GRE_H */
include/net/netfilter/nf_nat_l3proto.h +0 -2
@@ -2,13 +2,11 @@ #ifndef _NF_NAT_L3PROTO_H #define _NF_NAT_L3PROTO_H -struct nf_nat_l4proto; struct nf_nat_l3proto { u8 l3proto; bool (*manip_pkt)(struct sk_buff *skb, unsigned int iphdroff, - const struct nf_nat_l4proto *l4proto, const struct nf_conntrack_tuple *target, enum nf_nat_manip_type maniptype);
include/net/netfilter/nf_nat_l4proto.h +0 -31
@@ -5,43 +5,12 @@#include <net/netfilter/nf_nat.h> #include <linux/netfilter/nfnetlink_conntrack.h> -struct nf_nat_range ;struct nf_nat_l3proto ; -struct nf_nat_l4proto { -/* Protocol number. */ -u8 l4proto; - -}; - -/* Protocol registration. */ -int nf_nat_l4proto_register (u8 l3proto,const struct nf_nat_l4proto *l4proto); -void nf_nat_l4proto_unregister (u8 l3proto, -const struct nf_nat_l4proto *l4proto); - -const struct nf_nat_l4proto *__nf_nat_l4proto_find (u8 l3proto,u8 l4proto); -/* Translate a packet to the target according to manip type. Return on success. */ bool nf_nat_l4proto_manip_pkt (struct sk_buff *skb,const struct nf_nat_l3proto *l3proto,unsigned int iphdroff,unsigned int hdroff,const struct nf_conntrack_tuple *tuple,enum nf_nat_manip_type maniptype); - -/* Built-in protocols. */ -extern const struct nf_nat_l4proto nf_nat_l4proto_tcp; -extern const struct nf_nat_l4proto nf_nat_l4proto_udp; -extern const struct nf_nat_l4proto nf_nat_l4proto_icmp; -extern const struct nf_nat_l4proto nf_nat_l4proto_icmpv6; -extern const struct nf_nat_l4proto nf_nat_l4proto_unknown; -#ifdef CONFIG_NF_NAT_PROTO_DCCP -extern const struct nf_nat_l4proto nf_nat_l4proto_dccp; -#endif -#ifdef CONFIG_NF_NAT_PROTO_SCTP -extern const struct nf_nat_l4proto nf_nat_l4proto_sctp; -#endif -#ifdef CONFIG_NF_NAT_PROTO_UDPLITE -extern const struct nf_nat_l4proto nf_nat_l4proto_udplite; -#endif -#endif /*_NF_NAT_L4PROTO_H*/
net/ipv4/netfilter/Makefile +1 -4
@@ -3,7 +3,7 @@ # Makefile for the netfilter modules on top of IPv4. # -nf_nat_ipv4-y := nf_nat_l3proto_ipv4.o nf_nat_proto_icmp.o +nf_nat_ipv4-y := nf_nat_l3proto_ipv4.o nf_nat_ipv4-$(CONFIG_NF_NAT_MASQUERADE_IPV4) += nf_nat_masquerade_ipv4.o obj-$(CONFIG_NF_NAT_IPV4) += nf_nat_ipv4.o
@@ -28,9 +28,6 @@ nf_nat_snmp_basic-y := nf_nat_snmp_basic.asn1.o nf_nat_snmp_basic_main.o $(obj)/nf_nat_snmp_basic_main.o: $(obj)/nf_nat_snmp_basic.asn1.h obj-$(CONFIG_NF_NAT_SNMP_BASIC) += nf_nat_snmp_basic.o -# NAT protocols (nf_nat) -obj-$(CONFIG_NF_NAT_PROTO_GRE) += nf_nat_proto_gre.o - obj-$(CONFIG_NFT_CHAIN_ROUTE_IPV4) += nft_chain_route_ipv4.o obj-$(CONFIG_NFT_CHAIN_NAT_IPV4) += nft_chain_nat_ipv4.o obj-$(CONFIG_NFT_REJECT_IPV4) += nft_reject_ipv4.o
net/ipv4/netfilter/nf_nat_l3proto_ipv4.c +3 -21
@@ -64,7 +64,6 @@ static void nf_nat_ipv4_decode_session(struct sk_buff *skb,static bool nf_nat_ipv4_manip_pkt (struct sk_buff *skb,unsigned int iphdroff, -const struct nf_nat_l4proto *l4proto,const struct nf_conntrack_tuple *target,enum nf_nat_manip_type maniptype) {
@@ -171,7 +170,6 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb,enum ip_conntrack_dir dir =CTINFO2DIR (ctinfo);enum nf_nat_manip_type manip =HOOK2MANIP (hooknum);unsigned int hdrlen =ip_hdrlen (skb); -const struct nf_nat_l4proto *l4proto;struct nf_conntrack_tuple target;unsigned long statusbit;
@@ -202,9 +200,8 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb,if (!(ct->status & statusbit))return 1 ; - l4proto =__nf_nat_l4proto_find (NFPROTO_IPV4 , inside->ip.protocol);if (!nf_nat_ipv4_manip_pkt (skb, hdrlen +sizeof (inside->icmp), - l4proto, &ct->tuplehash[!dir].tuple, !manip)) + &ct->tuplehash[!dir].tuple, !manip))return 0 ;if (skb->ip_summed !=CHECKSUM_PARTIAL ) {
@@ -218,8 +215,7 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb,/* Change outer to look like the reply to an incoming packet */ nf_ct_invert_tuplepr (&target, &ct->tuplehash[!dir].tuple); - l4proto =__nf_nat_l4proto_find (NFPROTO_IPV4 ,0 ); -if (!nf_nat_ipv4_manip_pkt (skb,0 , l4proto, &target, manip)) +if (!nf_nat_ipv4_manip_pkt (skb,0 , &target, manip))return 0 ;return 1 ;
@@ -376,26 +372,12 @@ EXPORT_SYMBOL_GPL(nf_nat_l3proto_ipv4_unregister_fn);static int __init nf_nat_l3proto_ipv4_init (void ) { -int err; - - err =nf_nat_l4proto_register (NFPROTO_IPV4 , &nf_nat_l4proto_icmp); -if (err <0 ) - goto err1; - err =nf_nat_l3proto_register (&nf_nat_l3proto_ipv4); -if (err <0 ) - goto err2; -return err; - -err2: -nf_nat_l4proto_unregister (NFPROTO_IPV4 , &nf_nat_l4proto_icmp); -err1: -return err; +return nf_nat_l3proto_register (&nf_nat_l3proto_ipv4); } static void __exit nf_nat_l3proto_ipv4_exit(void) {nf_nat_l3proto_unregister (&nf_nat_l3proto_ipv4); -nf_nat_l4proto_unregister (NFPROTO_IPV4 , &nf_nat_l4proto_icmp); }MODULE_LICENSE ("GPL" );
net/ipv4/netfilter/nf_nat_proto_gre.c deleted +0 -61
61 lines not on this page · raw message
net/ipv4/netfilter/nf_nat_proto_icmp.c deleted +0 -21
@@ -1,21 +0,0 @@ -/* (C) 1999-2001 Paul `Rusty' Russell -* (C) 2002-2006 Netfilter Core Team <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/types.h> -#include <linux/init.h> -#include <linux/export.h> -#include <linux/ip.h> - -#include <linux/netfilter.h> -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_core.h> -#include <net/netfilter/nf_nat_l4proto.h> - -const struct nf_nat_l4proto nf_nat_l4proto_icmp = { - .l4proto =IPPROTO_ICMP , -};
net/ipv6/netfilter/Makefile +1 -1
@@ -11,7 +11,7 @@ obj-$(CONFIG_IP6_NF_RAW) += ip6table_raw.o obj-$(CONFIG_IP6_NF_SECURITY) += ip6table_security.o obj-$(CONFIG_IP6_NF_NAT) += ip6table_nat.o -nf_nat_ipv6-y := nf_nat_l3proto_ipv6.o nf_nat_proto_icmpv6.o +nf_nat_ipv6-y := nf_nat_l3proto_ipv6.o nf_nat_ipv6-$(CONFIG_NF_NAT_MASQUERADE_IPV6) += nf_nat_masquerade_ipv6.o obj-$(CONFIG_NF_NAT_IPV6) += nf_nat_ipv6.o
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +3 -21
@@ -63,7 +63,6 @@ static void nf_nat_ipv6_decode_session(struct sk_buff *skb,static bool nf_nat_ipv6_manip_pkt (struct sk_buff *skb,unsigned int iphdroff, -const struct nf_nat_l4proto *l4proto,const struct nf_conntrack_tuple *target,enum nf_nat_manip_type maniptype) {
@@ -181,7 +180,6 @@ int nf_nat_icmpv6_reply_translation(struct sk_buff *skb, } *inside;enum ip_conntrack_dir dir =CTINFO2DIR (ctinfo);enum nf_nat_manip_type manip =HOOK2MANIP (hooknum); -const struct nf_nat_l4proto *l4proto;struct nf_conntrack_tuple target;unsigned long statusbit;
@@ -212,9 +210,8 @@ int nf_nat_icmpv6_reply_translation(struct sk_buff *skb,if (!(ct->status & statusbit))return 1 ; - l4proto =__nf_nat_l4proto_find (NFPROTO_IPV6 , inside->ip6.nexthdr);if (!nf_nat_ipv6_manip_pkt (skb, hdrlen +sizeof (inside->icmp6), - l4proto, &ct->tuplehash[!dir].tuple, !manip)) + &ct->tuplehash[!dir].tuple, !manip))return 0 ;if (skb->ip_summed !=CHECKSUM_PARTIAL ) {
@@ -229,8 +226,7 @@ int nf_nat_icmpv6_reply_translation(struct sk_buff *skb, }nf_ct_invert_tuplepr (&target, &ct->tuplehash[!dir].tuple); - l4proto =__nf_nat_l4proto_find (NFPROTO_IPV6 ,IPPROTO_ICMPV6 ); -if (!nf_nat_ipv6_manip_pkt (skb,0 , l4proto, &target, manip)) +if (!nf_nat_ipv6_manip_pkt (skb,0 , &target, manip))return 0 ;return 1 ;
@@ -400,26 +396,12 @@ EXPORT_SYMBOL_GPL(nf_nat_l3proto_ipv6_unregister_fn);static int __init nf_nat_l3proto_ipv6_init (void ) { -int err; - - err =nf_nat_l4proto_register (NFPROTO_IPV6 , &nf_nat_l4proto_icmpv6); -if (err <0 ) - goto err1; - err =nf_nat_l3proto_register (&nf_nat_l3proto_ipv6); -if (err <0 ) - goto err2; -return err; - -err2: -nf_nat_l4proto_unregister (NFPROTO_IPV6 , &nf_nat_l4proto_icmpv6); -err1: -return err; +return nf_nat_l3proto_register (&nf_nat_l3proto_ipv6); } static void __exit nf_nat_l3proto_ipv6_exit(void) {nf_nat_l3proto_unregister (&nf_nat_l3proto_ipv6); -nf_nat_l4proto_unregister (NFPROTO_IPV6 , &nf_nat_l4proto_icmpv6); }MODULE_LICENSE ("GPL" );
net/ipv6/netfilter/nf_nat_proto_icmpv6.c deleted +0 -24
@@ -1,24 +0,0 @@ -/* -* Copyright (c) 2011 Patrick Mchardy <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -* Based on Rusty Russell's IPv4 ICMP NAT code. Development of IPv6 -* NAT funded by Astaro. -*/ - -#include <linux/types.h> -#include <linux/init.h> -#include <linux/icmpv6.h> - -#include <linux/netfilter.h> -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_core.h> -#include <net/netfilter/nf_nat_l3proto.h> -#include <net/netfilter/nf_nat_l4proto.h> - -const struct nf_nat_l4proto nf_nat_l4proto_icmpv6 = { - .l4proto =IPPROTO_ICMPV6 , -};
net/netfilter/Makefile +1 -6
@@ -47,12 +47,7 @@ obj-$(CONFIG_NF_CONNTRACK_SANE) += nf_conntrack_sane.o obj-$(CONFIG_NF_CONNTRACK_SIP) += nf_conntrack_sip.o obj-$(CONFIG_NF_CONNTRACK_TFTP) += nf_conntrack_tftp.o -nf_nat-y := nf_nat_core.o nf_nat_proto_unknown.o \ - nf_nat_proto.o nf_nat_proto_tcp.o nf_nat_helper.o - -# NAT protocols (nf_nat) -nf_nat-$(CONFIG_NF_NAT_PROTO_DCCP) += nf_nat_proto_dccp.o -nf_nat-$(CONFIG_NF_NAT_PROTO_SCTP) += nf_nat_proto_sctp.o +nf_nat-y := nf_nat_core.o nf_nat_proto.o nf_nat_helper.o # generic transport layer logging obj-$(CONFIG_NF_LOG_COMMON) += nf_log_common.o
net/netfilter/nf_conntrack_netlink.c +0 -1
@@ -47,7 +47,6 @@#include <net/netfilter/nf_conntrack_synproxy.h> #ifdef CONFIG_NF_NAT_NEEDED #include <net/netfilter/nf_nat_core.h> -#include <net/netfilter/nf_nat_l4proto.h> #include <net/netfilter/nf_nat_helper.h> #endif
net/netfilter/nf_nat_core.c +1 -103
160 lines not on this page · raw message
net/netfilter/nf_nat_proto.c +0 -10
@@ -341,13 +341,3 @@ bool nf_nat_l4proto_manip_pkt(struct sk_buff *skb,return true; }EXPORT_SYMBOL_GPL (nf_nat_l4proto_manip_pkt); - -#ifdef CONFIG_NF_NAT_PROTO_UDPLITE -const struct nf_nat_l4proto nf_nat_l4proto_udplite = { - .l4proto =IPPROTO_UDPLITE , -}; -#endif /* CONFIG_NF_NAT_PROTO_UDPLITE */ - -const struct nf_nat_l4proto nf_nat_l4proto_udp = { - .l4proto =IPPROTO_UDP , -};
net/netfilter/nf_nat_proto_dccp.c deleted +0 -22
@@ -1,22 +0,0 @@ -/* -* DCCP NAT protocol helper -* -* Copyright (c) 2005, 2006, 2008 Patrick McHardy <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -*/ - -#include <linux/kernel.h> -#include <linux/skbuff.h> - -#include <net/netfilter/nf_conntrack.h> -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_l3proto.h> -#include <net/netfilter/nf_nat_l4proto.h> - -const struct nf_nat_l4proto nf_nat_l4proto_dccp = { - .l4proto =IPPROTO_DCCP , -};
net/netfilter/nf_nat_proto_sctp.c deleted +0 -16
@@ -1,16 +0,0 @@ -/* -* Copyright (c) 2008 Patrick McHardy <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/types.h> - -#include <net/netfilter/nf_nat_l4proto.h> - - -const struct nf_nat_l4proto nf_nat_l4proto_sctp = { - .l4proto =IPPROTO_SCTP , -};
net/netfilter/nf_nat_proto_tcp.c deleted +0 -23
@@ -1,23 +0,0 @@ -/* (C) 1999-2001 Paul `Rusty' Russell -* (C) 2002-2006 Netfilter Core Team <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/types.h> -#include <linux/init.h> -#include <linux/export.h> -#include <linux/tcp.h> - -#include <linux/netfilter.h> -#include <linux/netfilter/nfnetlink_conntrack.h> -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_l3proto.h> -#include <net/netfilter/nf_nat_l4proto.h> -#include <net/netfilter/nf_nat_core.h> - -const struct nf_nat_l4proto nf_nat_l4proto_tcp = { - .l4proto =IPPROTO_TCP , -};
net/netfilter/nf_nat_proto_unknown.c deleted +0 -21
@@ -1,21 +0,0 @@ -/* The "unknown" protocol. This is what is used for protocols we -* don't understand. It's returned by ip_ct_find_proto(). -*/ - -/* (C) 1999-2001 Paul `Rusty' Russell -* (C) 2002-2006 Netfilter Core Team <[email protected]> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/types.h> -#include <linux/init.h> - -#include <linux/netfilter.h> -#include <net/netfilter/nf_nat.h> -#include <net/netfilter/nf_nat_l4proto.h> - -const struct nf_nat_l4proto nf_nat_l4proto_unknown = { -};
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 23/37 netfilter: nf_nat_sip: fix RTP/RTCP source port translations
In reply to Pablo Neira AyusoFrom: Alin Nastac <[email protected]>
Each media stream negotiation between 2 SIP peers will trigger creation of 4 different expectations (2 RTP and 2 RTCP):
- INVITE will create expectations for the media packets sent by the called peer
- reply to the INVITE will create expectations for media packets sent by the caller
The dport used by these expectations usually match the ones selected by the SIP peers, but they might get translated due to conflicts with another expectation. When such event occur, it is important to do this translation in both directions, dport translation on the receiving path and sport translation on the sending path.
This commit fixes the sport translation when the peer requiring it is also the one that starts the media stream. In this scenario, first media stream packet is forwarded from LAN to WAN and will rely on nf_nat_sip_expected() to do the necessary sport translation. However, the expectation matched by this packet does not contain the necessary information for doing SNAT, this data being stored in the paired expectation created by the sender's SIP message (INVITE or reply to it).
--- net/netfilter/nf_nat_sip.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-)
net/netfilter/nf_nat_sip.c +35 -4
@@ -18,6 +18,7 @@#include <net/netfilter/nf_nat.h> #include <net/netfilter/nf_nat_helper.h> +#include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_conntrack_helper.h> #include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_seqadj.h>
@@ -316,6 +317,9 @@ static void nf_nat_sip_seq_adjust(struct sk_buff *skb, unsigned int protoff,static void nf_nat_sip_expected (struct nf_conn *ct,struct nf_conntrack_expect *exp) { +struct nf_conn_help *help =nfct_help (ct->master); +struct nf_conntrack_expect *pair_exp; +int range_set_for_snat =0 ;struct nf_nat_range2 range;/* This must be a fresh one. */
@@ -327,15 +331,42 @@ static void nf_nat_sip_expected(struct nf_conn *ct, range.min_addr = range.max_addr = exp->saved_addr;nf_nat_setup_info (ct, &range,NF_NAT_MANIP_DST ); -/* Change src to where master sends to, but only if the connection -* actually came from the same source. */ -if (nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, +/* Do media streams SRC manip according with the parameters +* found in the paired expectation. +*/ +if (exp->class !=SIP_EXPECT_SIGNALLING ) { +spin_lock_bh (&nf_conntrack_expect_lock); +hlist_for_each_entry (pair_exp, &help->expectations, lnode) { +if (pair_exp->tuple.src.l3num ==nf_ct_l3num (ct) && + pair_exp->tuple.dst.protonum == ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.dst.protonum && +nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, &pair_exp->saved_addr) && + ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u.all == pair_exp->saved_proto.all) { + range.flags = (NF_NAT_RANGE_MAP_IPS |NF_NAT_RANGE_PROTO_SPECIFIED ); + range.min_proto.all = range.max_proto.all = pair_exp->tuple.dst.u.all; + range.min_addr = range.max_addr = pair_exp->tuple.dst.u3; + range_set_for_snat =1 ; +break ; + } + } +spin_unlock_bh (&nf_conntrack_expect_lock); + } + +/* When no paired expectation has been found, change src to +* where master sends to, but only if the connection actually came +* from the same source. +*/ +if (!range_set_for_snat && +nf_inet_addr_cmp (&ct->tuplehash[IP_CT_DIR_ORIGINAL ].tuple.src.u3, &ct->master->tuplehash[exp->dir].tuple.src.u3)) { range.flags =NF_NAT_RANGE_MAP_IPS ; range.min_addr = range.max_addr = ct->master->tuplehash[!exp->dir].tuple.dst.u3; -nf_nat_setup_info (ct, &range,NF_NAT_MANIP_SRC ); + range_set_for_snat =1 ; } + +/* Perform SRC manip. */ +if (range_set_for_snat) +nf_nat_setup_info (ct, &range,NF_NAT_MANIP_SRC ); } static unsigned int nf_nat_sip_expect(struct sk_buff *skb, unsigned int protoff,
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 24/37 netfilter: nf_tables: Speed up selective rule dumps
In reply to Pablo Neira AyusoFrom: Phil Sutter <[email protected]>
If just a table name was given, nf_tables_dump_rules() continued over the list of tables even after a match was found. The simple fix is to exit the loop if it reached the bottom and ctx->table was not NULL.
When iterating over the table's chains, the same problem as above existed. But worse than that, if a chain name was given the hash table wasn't used to find the corresponding chain. Fix this by introducing a helper function iterating over a chain's rules (and taking care of the cb->args handling), then introduce a shortcut to it if a chain name was given.
--- net/netfilter/nf_tables_api.c | 90 +++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 28 deletions(-)
net/netfilter/nf_tables_api.c +62 -28
@@ -2291,15 +2291,52 @@ struct nft_rule_dump_ctx {char *chain; }; +static int __nf_tables_dump_rules (struct sk_buff *skb, +unsigned int *idx, +struct netlink_callback *cb, +const struct nft_table *table, +const struct nft_chain *chain) +{ +struct net *net =sock_net (skb->sk); +unsigned int s_idx = cb->args[0 ]; +const struct nft_rule *rule; +int rc =1 ; + +list_for_each_entry_rcu (rule, &chain->rules, list) { +if (!nft_is_active (net, rule)) + goto cont; +if (*idx < s_idx) + goto cont; +if (*idx > s_idx) { +memset (&cb->args[1 ],0 , +sizeof (cb->args) -sizeof (cb->args[0 ])); + } +if (nf_tables_fill_rule_info (skb, net,NETLINK_CB (cb->skb).portid, + cb->nlh->nlmsg_seq, +NFT_MSG_NEWRULE , +NLM_F_MULTI |NLM_F_APPEND , + table->family, + table, chain, rule) <0 ) + goto out_unfinished; + +nl_dump_check_consistent (cb,nlmsg_hdr (skb)); +cont: + (*idx)++; + } + rc =0 ; +out_unfinished: + cb->args[0 ] = *idx; +return rc; +} +static int nf_tables_dump_rules (struct sk_buff *skb,struct netlink_callback *cb) {const struct nfgenmsg *nfmsg =nlmsg_data (cb->nlh);const struct nft_rule_dump_ctx *ctx = cb->data; -const struct nft_table *table; +struct nft_table *table;const struct nft_chain *chain; -const struct nft_rule *rule; -unsigned int idx =0 , s_idx = cb->args[0 ]; +unsigned int idx =0 ;struct net *net =sock_net (skb->sk);int family = nfmsg->nfgen_family;
@@ -2313,37 +2350,34 @@ static int nf_tables_dump_rules(struct sk_buff *skb,if (ctx && ctx->table &&strcmp (ctx->table, table->name) !=0 )continue ; -list_for_each_entry_rcu (chain, &table->chains, list) { -if (ctx && ctx->chain && -strcmp (ctx->chain, chain->name) !=0 ) -continue ; +if (ctx && ctx->chain) { +struct rhlist_head *list, *tmp; -list_for_each_entry_rcu (rule, &chain->rules, list) { -if (!nft_is_active (net, rule)) - goto cont; -if (idx < s_idx) - goto cont; -if (idx > s_idx) -memset (&cb->args[1 ],0 , -sizeof (cb->args) -sizeof (cb->args[0 ])); -if (nf_tables_fill_rule_info (skb, net,NETLINK_CB (cb->skb).portid, - cb->nlh->nlmsg_seq, -NFT_MSG_NEWRULE , -NLM_F_MULTI |NLM_F_APPEND , - table->family, - table, chain, rule) <0 ) - goto done; - -nl_dump_check_consistent (cb,nlmsg_hdr (skb)); -cont: - idx++; + list =rhltable_lookup (&table->chains_ht, ctx->chain, + nft_chain_ht_params); +if (!list) + goto done; + +rhl_for_each_entry_rcu (chain, tmp, list, rhlhead) { +if (!nft_is_active (net, chain)) +continue ; +__nf_tables_dump_rules (skb, &idx, + cb, table, chain); +break ; } + goto done; } + +list_for_each_entry_rcu (chain, &table->chains, list) { +if (__nf_tables_dump_rules (skb, &idx, cb, table, chain)) + goto done; + } + +if (ctx && ctx->table) +break ; } done:rcu_read_unlock (); - - cb->args[0 ] = idx;return skb->len; }
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 25/37 netfilter: ipt_CLUSTERIP: fix deadlock in netns exit routine
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
When network namespace is destroyed, cleanup_net() is called. cleanup_net() holds pernet_ops_rwsem then calls each ->exit callback. So that clusterip_tg_destroy() is called by cleanup_net(). And clusterip_tg_destroy() calls unregister_netdevice_notifier().
But both cleanup_net() and clusterip_tg_destroy() hold same lock(pernet_ops_rwsem). hence deadlock occurrs.
After this patch, only 1 notifier is registered when module is inserted. And all of configs are added to per-net list.
test commands:
%ip netns add vm1
%ip netns exec vm1 bash
%ip link set lo up
%iptables -A INPUT -p tcp -i lo -d 192.168.0.5 --dport 80 \ -j CLUSTERIP --new --hashmode sourceip \ --clustermac 01:00:5e:00:00:20 --total-nodes 2 --local-node 1
%exit
%ip netns del vm1
splat looks like:
[ 341.809674] ============================================
[ 341.809674] WARNING: possible recursive locking detected
[ 341.809674] 4.19.0-rc5+ #16 Tainted: G W
[ 341.809674] --------------------------------------------
[ 341.809674] kworker/u4:2/87 is trying to acquire lock:
[ 341.809674] 000000005da2d519 (pernet_ops_rwsem){++++}, at: unregister_netdevice_notifier+0x8c/0x460
[ 341.809674]
[ 341.809674] but task is already holding lock:
[ 341.809674] 000000005da2d519 (pernet_ops_rwsem){++++}, at: cleanup_net+0x119/0x900
[ 341.809674]
[ 341.809674] other info that might help us debug this:
[ 341.809674] Possible unsafe locking scenario:
[ 341.809674]
[ 341.809674] CPU0
[ 341.809674] ----
[ 341.809674] lock(pernet_ops_rwsem);
[ 341.809674] lock(pernet_ops_rwsem);
[ 341.809674]
[ 341.809674] *** DEADLOCK ***
[ 341.809674]
[ 341.809674] May be due to missing lock nesting notation
[ 341.809674]
[ 341.809674] 3 locks held by kworker/u4:2/87:
[ 341.809674] #0: 00000000d9df6c92 ((wq_completion)"%s""netns"){+.+.}, at: process_one_work+0xafe/0x1de0
[ 341.809674] #1: 00000000c2cbcee2 (net_cleanup_work){+.+.}, at: process_one_work+0xb60/0x1de0
[ 341.809674] #2: 000000005da2d519 (pernet_ops_rwsem){++++}, at: cleanup_net+0x119/0x900
[ 341.809674]
[ 341.809674] stack backtrace:
[ 341.809674] CPU: 1 PID: 87 Comm: kworker/u4:2 Tainted: G W 4.19.0-rc5+ #16
[ 341.809674] Workqueue: netns cleanup_net
[ 341.809674] Call Trace:
[ ... ]
[ 342.070196] down_write+0x93/0x160
[ 342.070196] ? unregister_netdevice_notifier+0x8c/0x460
[ 342.070196] ? down_read+0x1e0/0x1e0
[ 342.070196] ? sched_clock_cpu+0x126/0x170
[ 342.070196] ? find_held_lock+0x39/0x1c0
[ 342.070196] unregister_netdevice_notifier+0x8c/0x460
[ 342.070196] ? register_netdevice_notifier+0x790/0x790
[ 342.070196] ? __local_bh_enable_ip+0xe9/0x1b0
[ 342.070196] ? __local_bh_enable_ip+0xe9/0x1b0
[ 342.070196] ? clusterip_tg_destroy+0x372/0x650 [ipt_CLUSTERIP]
[ 342.070196] ? trace_hardirqs_on+0x93/0x210
[ 342.070196] ? __bpf_trace_preemptirq_template+0x10/0x10
[ 342.070196] ? clusterip_tg_destroy+0x372/0x650 [ipt_CLUSTERIP]
[ 342.123094] clusterip_tg_destroy+0x3ad/0x650 [ipt_CLUSTERIP]
[ 342.123094] ? clusterip_net_init+0x3d0/0x3d0 [ipt_CLUSTERIP]
[ 342.123094] ? cleanup_match+0x17d/0x200 [ip_tables]
[ 342.123094] ? xt_unregister_table+0x215/0x300 [x_tables]
[ 342.123094] ? kfree+0xe2/0x2a0
[ 342.123094] cleanup_entry+0x1d5/0x2f0 [ip_tables]
[ 342.123094] ? cleanup_match+0x200/0x200 [ip_tables]
[ 342.123094] __ipt_unregister_table+0x9b/0x1a0 [ip_tables]
[ 342.123094] iptable_filter_net_exit+0x43/0x80 [iptable_filter]
[ 342.123094] ops_exit_list.isra.10+0x94/0x140
[ 342.123094] cleanup_net+0x45b/0x900[ ... ]
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 155 +++++++++++++++++++++---------------- 1 file changed, 87 insertions(+), 68 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +87 -68
@@ -57,17 +57,14 @@ struct clusterip_config {enum clusterip_hashmode hash_mode;/* which hashing mode */ u_int32_t hash_initval;/* hash initialization */ struct rcu_head rcu; - +struct net *net;/* netns for pernet list */ char ifname[IFNAMSIZ ];/* device ifname */ -struct notifier_block notifier;/* refresh c->ifindex in it */ };#ifdef CONFIG_PROC_FS static const struct file_operations clusterip_proc_fops;#endif -static unsigned int clusterip_net_id__read_mostly ; -struct clusterip_net {struct list_head configs;/* lock protects the configs list */
@@ -78,16 +75,30 @@ struct clusterip_net {#endif }; +static unsigned int clusterip_net_id__read_mostly ; +static inline struct clusterip_net *clusterip_pernet (struct net *net) +{ +return net_generic (net, clusterip_net_id); +} +static inline void clusterip_config_get (struct clusterip_config *c) {refcount_inc (&c->refcount); } -static void clusterip_config_rcu_free (struct rcu_head *head) { -kfree (container_of(head ,struct clusterip_config ,rcu )); +struct clusterip_config *config; +struct net_device *dev; + + config = container_of(head, struct clusterip_config, rcu); + dev =dev_get_by_name (config->net, config->ifname); +if (dev) { +dev_mc_del (dev, config->clustermac); +dev_put (dev); + } +kfree (config); } static inline void
@@ -101,9 +112,9 @@ clusterip_config_put(struct clusterip_config *c)* entry(rule) is removed, remove the config from lists, but don't free it * yet, since proc-files could still be holding references */ static inline void -clusterip_config_entry_put (struct net *net,struct clusterip_config *c) +clusterip_config_entry_put (struct clusterip_config *c) { -struct clusterip_net *cn =net_generic (net, clusterip_net_id); +struct clusterip_net *cn =clusterip_pernet (c->net);local_bh_disable ();if (refcount_dec_and_lock (&c->entries, &cn->lock)) {
@@ -118,8 +129,6 @@ clusterip_config_entry_put(struct net *net, struct clusterip_config *c)spin_unlock (&cn->lock);local_bh_enable (); -unregister_netdevice_notifier (&c->notifier); -return ; }local_bh_enable ();
@@ -129,7 +138,7 @@ static struct clusterip_config * __clusterip_config_find(struct net *net, __be32 clusterip) {struct clusterip_config *c; -struct clusterip_net *cn =net_generic (net, clusterip_net_id); +struct clusterip_net *cn =clusterip_pernet (net);list_for_each_entry_rcu (c, &cn->configs, list) {if (c->clusterip == clusterip)
@@ -181,32 +190,37 @@ clusterip_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) {struct net_device *dev =netdev_notifier_info_to_dev (ptr); +struct net *net =dev_net (dev); +struct clusterip_net *cn =clusterip_pernet (net);struct clusterip_config *c; - c = container_of(this, struct clusterip_config, notifier); -switch (event) { -case NETDEV_REGISTER : -if (!strcmp (dev->name, c->ifname)) { - c->ifindex = dev->ifindex; -dev_mc_add (dev, c->clustermac); - } -break ; -case NETDEV_UNREGISTER : -if (dev->ifindex == c->ifindex) { -dev_mc_del (dev, c->clustermac); - c->ifindex =-1 ; - } -break ; -case NETDEV_CHANGENAME : -if (!strcmp (dev->name, c->ifname)) { - c->ifindex = dev->ifindex; -dev_mc_add (dev, c->clustermac); - }else if (dev->ifindex == c->ifindex) { -dev_mc_del (dev, c->clustermac); - c->ifindex =-1 ; +spin_lock_bh (&cn->lock); +list_for_each_entry_rcu (c, &cn->configs, list) { +switch (event) { +case NETDEV_REGISTER : +if (!strcmp (dev->name, c->ifname)) { + c->ifindex = dev->ifindex; +dev_mc_add (dev, c->clustermac); + } +break ; +case NETDEV_UNREGISTER : +if (dev->ifindex == c->ifindex) { +dev_mc_del (dev, c->clustermac); + c->ifindex =-1 ; + } +break ; +case NETDEV_CHANGENAME : +if (!strcmp (dev->name, c->ifname)) { + c->ifindex = dev->ifindex; +dev_mc_add (dev, c->clustermac); + }else if (dev->ifindex == c->ifindex) { +dev_mc_del (dev, c->clustermac); + c->ifindex =-1 ; + } +break ; } -break ; } +spin_unlock_bh (&cn->lock);return NOTIFY_DONE ; }
@@ -215,30 +229,44 @@ static struct clusterip_config * clusterip_config_init(struct net *net, const struct ipt_clusterip_tgt_info *i, __be32 ip, const char *iniface) { - struct clusterip_net *cn = net_generic(net, clusterip_net_id); + struct clusterip_net *cn = clusterip_pernet(net);struct clusterip_config *c; +struct net_device *dev;int err; +if (iniface[0 ] =='\0' ) { +pr_info ("Please specify an interface name\n" ); +return ERR_PTR (-EINVAL ); + } + c =kzalloc (sizeof (*c),GFP_ATOMIC );if (!c)return ERR_PTR (-ENOMEM ); -strcpy (c->ifname, iniface); - c->ifindex =-1 ; - c->clusterip = ip; + dev =dev_get_by_name (net, iniface); +if (!dev) { +pr_info ("no such interface %s\n" , iniface); +kfree (c); +return ERR_PTR (-ENOENT ); + } + c->ifindex = dev->ifindex; +strcpy (c->ifname, dev->name);memcpy (&c->clustermac, &i->clustermac,ETH_ALEN ); +dev_mc_add (dev, c->clustermac); +dev_put (dev); + + c->clusterip = ip; c->num_total_nodes = i->num_total_nodes;clusterip_config_init_nodelist (c, i); c->hash_mode = i->hash_mode; c->hash_initval = i->hash_initval; + c->net = net;refcount_set (&c->refcount,1 );spin_lock_bh (&cn->lock);if (__clusterip_config_find (net, ip)) { -spin_unlock_bh (&cn->lock); -kfree (c); - -return ERR_PTR (-EBUSY ); + err = -EBUSY ; + goto out_config_put; }list_add_rcu (&c->list, &cn->configs);
@@ -260,22 +288,17 @@ clusterip_config_init(struct net *net, const struct ipt_clusterip_tgt_info *i, }#endif - c->notifier.notifier_call = clusterip_netdev_event; - err =register_netdevice_notifier (&c->notifier); -if (!err) { -refcount_set (&c->entries,1 ); -return c; - } +refcount_set (&c->entries,1 ); +return c;#ifdef CONFIG_PROC_FS -proc_remove (c->pde); err:#endif spin_lock_bh (&cn->lock);list_del_rcu (&c->list); +out_config_put:spin_unlock_bh (&cn->lock);clusterip_config_put (c); -return ERR_PTR (err); }
@@ -475,21 +498,6 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par) &e->ip.dst.s_addr);return -EINVAL ; }else { -struct net_device *dev; - -if (e->ip.iniface[0 ] =='\0' ) { -pr_info ("Please specify an interface name\n" ); -return -EINVAL ; - } - - dev =dev_get_by_name (par->net, e->ip.iniface); -if (!dev) { -pr_info ("no such interface %s\n" , - e->ip.iniface); -return -ENOENT ; - } -dev_put (dev); - config =clusterip_config_init (par->net, cipinfo, e->ip.dst.s_addr, e->ip.iniface);
@@ -502,7 +510,7 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par)if (ret <0 ) {pr_info ("cannot load conntrack support for proto=%u\n" , par->family); -clusterip_config_entry_put (par->net, config); +clusterip_config_entry_put (config);clusterip_config_put (config);return ret; }
@@ -524,7 +532,7 @@ static void clusterip_tg_destroy(const struct xt_tgdtor_param *par)/* if no more entries are referencing the config, remove it * from the list and destroy the proc entry */ -clusterip_config_entry_put (par->net, cipinfo->config); +clusterip_config_entry_put (cipinfo->config);clusterip_config_put (cipinfo->config);
@@ -806,7 +814,7 @@ static const struct file_operations clusterip_proc_fops = {static int clusterip_net_init (struct net *net) { -struct clusterip_net *cn =net_generic (net, clusterip_net_id); +struct clusterip_net *cn =clusterip_pernet (net);int ret;INIT_LIST_HEAD (&cn->configs);
@@ -831,7 +839,7 @@ static int clusterip_net_init(struct net *net)static void clusterip_net_exit (struct net *net) { -struct clusterip_net *cn =net_generic (net, clusterip_net_id); +struct clusterip_net *cn =clusterip_pernet (net);#ifdef CONFIG_PROC_FS proc_remove (cn->procdir); cn->procdir =NULL ;
@@ -847,6 +855,10 @@ static struct pernet_operations clusterip_net_ops = { .size = sizeof(struct clusterip_net), }; +struct notifier_block cip_netdev_notifier = { + .notifier_call = clusterip_netdev_event +}; +static int __init clusterip_tg_init (void ) {int ret;
@@ -859,11 +871,17 @@ static int __init clusterip_tg_init(void)if (ret <0 ) goto cleanup_subsys; + ret =register_netdevice_notifier (&cip_netdev_notifier); +if (ret <0 ) + goto unregister_target; +pr_info ("ClusterIP Version %s loaded successfully\n" ,CLUSTERIP_VERSION );return 0 ; +unregister_target: +xt_unregister_target (&clusterip_tg_reg); cleanup_subsys:unregister_pernet_subsys (&clusterip_net_ops);return ret;
@@ -873,6 +891,7 @@ static void __exit clusterip_tg_exit(void) {pr_info ("ClusterIP Version %s unloading\n" ,CLUSTERIP_VERSION ); +unregister_netdevice_notifier (&cip_netdev_notifier);xt_unregister_target (&clusterip_tg_reg);unregister_pernet_subsys (&clusterip_net_ops);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 26/37 netfilter: ipt_CLUSTERIP: remove wrong WARN_ON_ONCE in netns exit routine
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
When network namespace is destroyed, both clusterip_tg_destroy() and clusterip_net_exit() are called. and clusterip_net_exit() is called before clusterip_tg_destroy().
Hence cleanup check code in clusterip_net_exit() doesn't make sense.
test commands:
%ip netns add vm1
%ip netns exec vm1 bash
%ip link set lo up
%iptables -A INPUT -p tcp -i lo -d 192.168.0.5 --dport 80 \ -j CLUSTERIP --new --hashmode sourceip \ --clustermac 01:00:5e:00:00:20 --total-nodes 2 --local-node 1
%exit
%ip netns del vm1
splat looks like:
[ 341.184508] WARNING: CPU: 1 PID: 87 at net/ipv4/netfilter/ipt_CLUSTERIP.c:840 clusterip_net_exit+0x319/0x380 [ipt_CLUSTERIP] [ 341.184850] Modules linked in: ipt_CLUSTERIP nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 xt_tcpudp iptable_filter bpfilter ip_tables x_tables [ 341.184850] CPU: 1 PID: 87 Comm: kworker/u4:2 Not tainted 4.19.0-rc5+ #16 [ 341.227509] Workqueue: netns cleanup_net [ 341.227509] RIP: 0010:clusterip_net_exit+0x319/0x380 [ipt_CLUSTERIP] [ 341.227509] Code: 0f 85 7f fe ff ff 48 c7 c2 80 64 2c c0 be a8 02 00 00 48 c7 c7 a0 63 2c c0 c6 05 18 6e 00 00 01 e8 bc 38 ff f5 e9 5b fe ff ff <0f> 0b e9 33 ff ff ff e8 4b 90 50 f6 e9 2d fe ff ff 48 89 df e8 de [ 341.227509] RSP: 0018:ffff88011086f408 EFLAGS: 00010202 [ 341.227509] RAX: dffffc0000000000 RBX: 1ffff1002210de85 RCX: 0000000000000000 [ 341.227509] RDX: 1ffff1002210de85 RSI: ffff880110813be8 RDI: ffffed002210de58 [ 341.227509] RBP: ffff88011086f4d0 R08: 0000000000000000 R09: 0000000000000000 [ 341.227509] R10: 0000000000000000 R11: 0000000000000000 R12: 1ffff1002210de81 [ 341.227509] R13: ffff880110625a48 R14: ffff880114cec8c8 R15: 0000000000000014 [ 341.227509] FS: 0000000000000000(0000) GS:ffff880116600000(0000) knlGS:0000000000000000 [ 341.227509] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 341.227509] CR2: 00007f11fd38e000 CR3: 000000013ca16000 CR4: 00000000001006e0 [ 341.227509] Call Trace: [ 341.227509] ? __clusterip_config_find+0x460/0x460 [ipt_CLUSTERIP] [ 341.227509] ? default_device_exit+0x1ca/0x270 [ 341.227509] ? remove_proc_entry+0x1cd/0x390 [ 341.227509] ? dev_change_net_namespace+0xd00/0xd00 [ 341.227509] ? __init_waitqueue_head+0x130/0x130 [ 341.227509] ops_exit_list.isra.10+0x94/0x140 [ 341.227509] cleanup_net+0x45b/0x900
[ ... ]
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 1 - 1 file changed, 1 deletion(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +0 -1
@@ -845,7 +845,6 @@ static void clusterip_net_exit(struct net *net) cn->procdir =NULL ;#endif nf_unregister_net_hook (net, &cip_arp_ops); -WARN_ON_ONCE (!list_empty (&cn->configs)); }static struct pernet_operations clusterip_net_ops = {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 27/37 netfilter: ipt_CLUSTERIP: fix sleep-in-atomic bug in clusterip_config_entry_put()
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
A proc_remove() can sleep. so that it can't be inside of spin_lock. Hence proc_remove() is moved to outside of spin_lock. and it also adds mutex to sync create and remove of proc entry(config->pde).
test commands:
SHELL#1
%while :; do iptables -A INPUT -p udp -i enp2s0 -d 192.168.1.100 \ --dport 9000 -j CLUSTERIP --new --hashmode sourceip \ --clustermac 01:00:5e:00:00:21 --total-nodes 3 --local-node 3; \ iptables -F; done
SHELL#2
%while :; do echo +1 > /proc/net/ipt_CLUSTERIP/192.168.1.100; \ echo -1 > /proc/net/ipt_CLUSTERIP/192.168.1.100; done
[ 2949.569864] BUG: sleeping function called from invalid context at kernel/sched/completion.c:99
[ 2949.579944] in_atomic(): 1, irqs_disabled(): 0, pid: 5472, name: iptables
[ 2949.587920] 1 lock held by iptables/5472:
[ 2949.592711] #0: 000000008f0ebcf2 (&(&cn->lock)->rlock){+...}, at: refcount_dec_and_lock+0x24/0x50
[ 2949.603307] CPU: 1 PID: 5472 Comm: iptables Tainted: G W 4.19.0-rc5+ #16
[ 2949.604212] Hardware name: To be filled by O.E.M. To be filled by O.E.M./Aptio CRB, BIOS 5.6.5 07/08/2015
[ 2949.604212] Call Trace:
[ 2949.604212] dump_stack+0xc9/0x16b
[ 2949.604212] ? show_regs_print_info+0x5/0x5
[ 2949.604212] ___might_sleep+0x2eb/0x420
[ 2949.604212] ? set_rq_offline.part.87+0x140/0x140
[ 2949.604212] ? _rcu_barrier_trace+0x400/0x400
[ 2949.604212] wait_for_completion+0x94/0x710
[ 2949.604212] ? wait_for_completion_interruptible+0x780/0x780
[ 2949.604212] ? __kernel_text_address+0xe/0x30
[ 2949.604212] ? __lockdep_init_map+0x10e/0x5c0
[ 2949.604212] ? __lockdep_init_map+0x10e/0x5c0
[ 2949.604212] ? __init_waitqueue_head+0x86/0x130
[ 2949.604212] ? init_wait_entry+0x1a0/0x1a0
[ 2949.604212] proc_entry_rundown+0x208/0x270
[ 2949.604212] ? proc_reg_get_unmapped_area+0x370/0x370
[ 2949.604212] ? __lock_acquire+0x4500/0x4500
[ 2949.604212] ? complete+0x18/0x70
[ 2949.604212] remove_proc_subtree+0x143/0x2a0
[ 2949.708655] ? remove_proc_entry+0x390/0x390
[ 2949.708655] clusterip_tg_destroy+0x27a/0x630 [ipt_CLUSTERIP][ ... ]
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +14 -5
@@ -56,7 +56,7 @@ struct clusterip_config {#endif enum clusterip_hashmode hash_mode;/* which hashing mode */ u_int32_t hash_initval;/* hash initialization */ -struct rcu_head rcu; +struct rcu_head rcu;/* for call_rcu_bh */ struct net *net;/* netns for pernet list */ char ifname[IFNAMSIZ ];/* device ifname */ };
@@ -72,6 +72,8 @@ struct clusterip_net {#ifdef CONFIG_PROC_FS struct proc_dir_entry *procdir; +/* mutex protects the config->pde*/ +struct mutex mutex;#endif };
@@ -118,17 +120,18 @@ clusterip_config_entry_put(struct clusterip_config *c)local_bh_disable ();if (refcount_dec_and_lock (&c->entries, &cn->lock)) { +list_del_rcu (&c->list); +spin_unlock (&cn->lock); +local_bh_enable ();/* In case anyone still accesses the file, the open/close * functions are also incrementing the refcount on their own, * so it's safe to remove the entry even if it's in use. */ #ifdef CONFIG_PROC_FS +mutex_lock (&cn->mutex);if (cn->procdir)proc_remove (c->pde); +mutex_unlock (&cn->mutex);#endif -list_del_rcu (&c->list); -spin_unlock (&cn->lock); -local_bh_enable (); -return ; }local_bh_enable ();
@@ -278,9 +281,11 @@ clusterip_config_init(struct net *net, const struct ipt_clusterip_tgt_info *i,/* create proc dir entry */ sprintf (buffer,"%pI4" , &ip); +mutex_lock (&cn->mutex); c->pde =proc_create_data (buffer,0600 , cn->procdir, &clusterip_proc_fops, c); +mutex_unlock (&cn->mutex);if (!c->pde) { err = -ENOMEM ; goto err;
@@ -832,6 +837,7 @@ static int clusterip_net_init(struct net *net)pr_err ("Unable to proc dir entry\n" ); return -ENOMEM; } +mutex_init (&cn->mutex);#endif /* CONFIG_PROC_FS */ return 0 ;
@@ -840,9 +846,12 @@ static int clusterip_net_init(struct net *net)static void clusterip_net_exit (struct net *net) {struct clusterip_net *cn =clusterip_pernet (net); +#ifdef CONFIG_PROC_FS +mutex_lock (&cn->mutex);proc_remove (cn->procdir); cn->procdir =NULL ; +mutex_unlock (&cn->mutex);#endif nf_unregister_net_hook (net, &cip_arp_ops); }
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 28/37 netfilter: ipt_CLUSTERIP: check MAC address when duplicate config is set
In reply to Pablo Neira AyusoFrom: Taehee Yoo <[email protected]>
If same destination IP address config is already existing, that config is just used. MAC address also should be same.
However, there is no MAC address checking routine.
So that MAC address checking routine is added.
test commands:
%iptables -A INPUT -p tcp -i lo -d 192.168.0.5 --dport 80 \ -j CLUSTERIP --new --hashmode sourceip \ --clustermac 01:00:5e:00:00:20 --total-nodes 2 --local-node 1 %iptables -A INPUT -p tcp -i lo -d 192.168.0.5 --dport 80 \ -j CLUSTERIP --new --hashmode sourceip \ --clustermac 01:00:5e:00:00:21 --total-nodes 2 --local-node 1
After this patch, above commands are disallowed.
--- net/ipv4/netfilter/ipt_CLUSTERIP.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/netfilter/ipt_CLUSTERIP.c +2 -1
@@ -509,7 +509,8 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par)if (IS_ERR (config))return PTR_ERR (config); } - } + }else if (memcmp (&config->clustermac, &cipinfo->clustermac,ETH_ALEN )) +return -EINVAL ; ret =nf_ct_netns_get (par->net, par->family);if (ret <0 ) {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 29/37 netfilter: conntrack: udp: only extend timeout to stream mode after 2s
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Currently DNS resolvers that send both A and AAAA queries from same source port can trigger stream mode prematurely, which results in non-early-evictable conntrack entry for three minutes, even though DNS requests are done in a few milliseconds.
Add a two second grace period where we continue to use the ordinary 30-second default timeout. Its enough for DNS request/response traffic, even if two request/reply packets are involved.
ASSURED is still set, else conntrack (and thus a possible NAT mapping ...) gets zapped too in case conntrack table runs full.
--- include/net/netfilter/nf_conntrack.h | 5 +++++ net/netfilter/nf_conntrack_proto_udp.c | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-)
include/net/netfilter/nf_conntrack.h +5 -0
@@ -27,12 +27,17 @@#include <net/netfilter/nf_conntrack_tuple.h> +struct nf_ct_udp { +unsigned long stream_ts; +}; +/* per conntrack: protocol private data */ union nf_conntrack_proto {/* insert conntrack proto private data here */ struct nf_ct_dccp dccp;struct ip_ct_sctp sctp;struct ip_ct_tcp tcp; +struct nf_ct_udp udp;struct nf_ct_gre gre;unsigned int tmpl_padto; };
net/netfilter/nf_conntrack_proto_udp.c +13 -3
@@ -100,11 +100,21 @@ static int udp_packet(struct nf_conn *ct,if (!timeouts) timeouts =udp_get_timeouts (nf_ct_net (ct)); +if (!nf_ct_is_confirmed (ct)) + ct->proto.udp.stream_ts =2 *HZ + jiffies; +/* If we've seen traffic both ways, this is some kind of UDP -stream. Extend timeout. */ +* stream. Set Assured. +*/ if (test_bit (IPS_SEEN_REPLY_BIT , &ct->status)) { -nf_ct_refresh_acct (ct, ctinfo, skb, - timeouts[UDP_CT_REPLIED ]); +unsigned long extra = timeouts[UDP_CT_UNREPLIED ]; + +/* Still active after two seconds? Extend timeout. */ +if (time_after (jiffies, ct->proto.udp.stream_ts)) + extra = timeouts[UDP_CT_REPLIED ]; + +nf_ct_refresh_acct (ct, ctinfo, skb, extra); +/* Also, more likely to be important, and not a probe */ if (!test_and_set_bit (IPS_ASSURED_BIT , &ct->status))nf_conntrack_event_cache (IPCT_ASSURED , ct);
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 30/37 netfilter: conntrack: udp: set stream timeout to 2 minutes
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
We have no explicit signal when a UDP stream has terminated, peers just stop sending.
For suspected stream connections a timeout of two minutes is sane to keep NAT mapping alive a while longer.
It matches tcp conntracks 'timewait' default timeout value.
--- Documentation/networking/nf_conntrack-sysctl.txt | 2 +- net/netfilter/nf_conntrack_proto_udp.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/networking/nf_conntrack-sysctl.txt +1 -1
@@ -157,7 +157,7 @@ nf_conntrack_udp_timeout - INTEGER (seconds) default 30 nf_conntrack_udp_timeout_stream - INTEGER (seconds) - default 180 + default 120 This extended timeout will be used in case there is an UDP stream detected.
net/netfilter/nf_conntrack_proto_udp.c +1 -1
@@ -29,7 +29,7 @@static const unsigned int udp_timeouts[UDP_CT_MAX ] = { [UDP_CT_UNREPLIED ] =30 *HZ , - [UDP_CT_REPLIED ] =180 *HZ , + [UDP_CT_REPLIED ] =120 *HZ , };static unsigned int *udp_get_timeouts (struct net *net)
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 31/37 netfilter: conntrack: register sysctl table for gre
In reply to Pablo Neira AyusoFrom: Yafang Shao <[email protected]>
This patch adds two sysctl knobs for GRE:
net.netfilter.nf_conntrack_gre_timeout = 30 net.netfilter.nf_conntrack_gre_timeout_stream = 180
Update the Documentation as well.
--- Documentation/networking/nf_conntrack-sysctl.txt | 9 +++++ net/netfilter/nf_conntrack_proto_gre.c | 42 +++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-)
Documentation/networking/nf_conntrack-sysctl.txt +9 -0
@@ -161,3 +161,12 @@ nf_conntrack_udp_timeout_stream - INTEGER (seconds) This extended timeout will be used in case there is an UDP stream detected. + +nf_conntrack_gre_timeout - INTEGER (seconds) + default 30 + +nf_conntrack_gre_timeout_stream - INTEGER (seconds) + default 180 + + This extended timeout will be used in case there is an GRE stream + detected.
net/netfilter/nf_conntrack_proto_gre.c +41 -1
57 lines not on this page · raw message
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 32/37 netfilter: conntrack: un-export seq_print_acct
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Only one caller, just place it where its needed.
--- include/net/netfilter/nf_conntrack_acct.h | 3 --- net/netfilter/nf_conntrack_acct.c | 19 ------------------- net/netfilter/nf_conntrack_standalone.c | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 22 deletions(-)
include/net/netfilter/nf_conntrack_acct.h +0 -3
@@ -46,9 +46,6 @@ struct nf_conn_acct *nf_ct_acct_ext_add(struct nf_conn *ct, gfp_t gfp)return acct; }; -unsigned int seq_print_acct (struct seq_file *s,const struct nf_conn *ct, -int dir); -/* Check if connection tracking accounting is enabled */ static inline bool nf_ct_acct_enabled (struct net *net) {
net/netfilter/nf_conntrack_acct.c +0 -19
@@ -38,25 +38,6 @@ static struct ctl_table acct_sysctl_table[] = { };#endif /* CONFIG_SYSCTL */ -unsigned int -seq_print_acct (struct seq_file *s,const struct nf_conn *ct,int dir) -{ -struct nf_conn_acct *acct; -struct nf_conn_counter *counter; - - acct =nf_conn_acct_find (ct); -if (!acct) -return 0 ; - - counter = acct->counter; -seq_printf (s,"packets=%llu bytes=%llu " , - (unsigned long long )atomic64_read (&counter[dir].packets), - (unsigned long long )atomic64_read (&counter[dir].bytes)); - -return 0 ; -}; -EXPORT_SYMBOL_GPL (seq_print_acct); -static const struct nf_ct_ext_type acct_extend = { .len =sizeof (struct nf_conn_acct ), .align = __alignof__(struct nf_conn_acct ),
net/netfilter/nf_conntrack_standalone.c +18 -0
@@ -267,6 +267,24 @@ static const char* l4proto_name(u16 proto)return "unknown" ; } +static unsigned int +seq_print_acct (struct seq_file *s,const struct nf_conn *ct,int dir) +{ +struct nf_conn_acct *acct; +struct nf_conn_counter *counter; + + acct =nf_conn_acct_find (ct); +if (!acct) +return 0 ; + + counter = acct->counter; +seq_printf (s,"packets=%llu bytes=%llu " , + (unsigned long long )atomic64_read (&counter[dir].packets), + (unsigned long long )atomic64_read (&counter[dir].bytes)); + +return 0 ; +} +/* return 0 on success, 1 in case of error */ static int ct_seq_show (struct seq_file *s,void *v) {
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 33/37 netfilter: conntrack: add mnemonics for sysctl table
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Its a bit hard to see what table[3] really lines up with, so add human-readable mnemonics and use them for initialisation.
This makes it easier to see e.g. which sysctls are not exported to unprivileged userns.
objdiff shows no changes.
--- net/netfilter/nf_conntrack_standalone.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
net/netfilter/nf_conntrack_standalone.c +20 -11
@@ -532,36 +532,45 @@ nf_conntrack_hash_sysctl(struct ctl_table *table, int write,static struct ctl_table_header *nf_ct_netfilter_header; +enum nf_ct_sysctl_index { +NF_SYSCTL_CT_MAX , +NF_SYSCTL_CT_COUNT , +NF_SYSCTL_CT_BUCKETS , +NF_SYSCTL_CT_CHECKSUM , +NF_SYSCTL_CT_LOG_INVALID , +NF_SYSCTL_CT_EXPECT_MAX , +}; +static struct ctl_table nf_ct_sysctl_table[] = { - { + [NF_SYSCTL_CT_MAX ] = { .procname ="nf_conntrack_max" , .data = &nf_conntrack_max, .maxlen =sizeof (int ), .mode =0644 , .proc_handler = proc_dointvec, }, - { + [NF_SYSCTL_CT_COUNT ] = { .procname ="nf_conntrack_count" , .data = &init_net.ct.count, .maxlen =sizeof (int ), .mode =0444 , .proc_handler = proc_dointvec, }, - { + [NF_SYSCTL_CT_BUCKETS ] = { .procname ="nf_conntrack_buckets" , .data = &nf_conntrack_htable_size_user, .maxlen =sizeof (unsigned int ), .mode =0644 , .proc_handler = nf_conntrack_hash_sysctl, }, - { + [NF_SYSCTL_CT_CHECKSUM ] = { .procname ="nf_conntrack_checksum" , .data = &init_net.ct.sysctl_checksum, .maxlen =sizeof (unsigned int ), .mode =0644 , .proc_handler = proc_dointvec, }, - { + [NF_SYSCTL_CT_LOG_INVALID ] = { .procname ="nf_conntrack_log_invalid" , .data = &init_net.ct.sysctl_log_invalid, .maxlen =sizeof (unsigned int ),
@@ -570,7 +579,7 @@ static struct ctl_table nf_ct_sysctl_table[] = { .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, - { + [NF_SYSCTL_CT_EXPECT_MAX] = { .procname = "nf_conntrack_expect_max", .data = &nf_ct_expect_max, .maxlen = sizeof(int),
@@ -600,16 +609,16 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net)if (!table) goto out_kmemdup; - table[1 ].data = &net->ct.count; - table[3 ].data = &net->ct.sysctl_checksum; - table[4 ].data = &net->ct.sysctl_log_invalid; + table[NF_SYSCTL_CT_COUNT ].data = &net->ct.count; + table[NF_SYSCTL_CT_CHECKSUM ].data = &net->ct.sysctl_checksum; + table[NF_SYSCTL_CT_LOG_INVALID ].data = &net->ct.sysctl_log_invalid;/* Don't export sysctls to unprivileged users */ if (net->user_ns != &init_user_ns) - table[0 ].procname =NULL ; + table[NF_SYSCTL_CT_MAX ].procname =NULL ;if (!net_eq (&init_net, net)) - table[2 ].mode =0444 ; + table[NF_SYSCTL_CT_BUCKETS ].mode =0444 ; net->ct.sysctl_header =register_net_sysctl (net,"net/netfilter" , table);if (!net->ct.sysctl_header)
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 34/37 netfilter: conntrack: merge acct and helper sysctl table with main one
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Needless copy&paste, just handle all in one. Next patch will handle acct and timestamp, which have similar functions.
Intentionally leaves cruft behind, will be cleaned up in a followup patch.
The obsolete sysctl pointers in netns_ct struct are left in place and removed in a single change, as changes to netns trigger rebuild of almost all files.
--- net/netfilter/nf_conntrack_acct.c | 65 +-------------------------------- net/netfilter/nf_conntrack_helper.c | 64 +------------------------------- net/netfilter/nf_conntrack_standalone.c | 21 ++++++++++- 3 files changed, 22 insertions(+), 128 deletions(-)
net/netfilter/nf_conntrack_acct.c +1 -64
@@ -25,83 +25,20 @@ static bool nf_ct_acct __read_mostly;module_param_named (acct, nf_ct_acct, bool,0644 );MODULE_PARM_DESC (acct,"Enable connection tracking flow accounting." ); -#ifdef CONFIG_SYSCTL -static struct ctl_table acct_sysctl_table[] = { - { - .procname ="nf_conntrack_acct" , - .data = &init_net.ct.sysctl_acct, - .maxlen =sizeof (unsigned int ), - .mode =0644 , - .proc_handler = proc_dointvec, - }, - {} -}; -#endif /* CONFIG_SYSCTL */ -static const struct nf_ct_ext_type acct_extend = { .len =sizeof (struct nf_conn_acct ), .align = __alignof__(struct nf_conn_acct ), .id =NF_CT_EXT_ACCT , }; -#ifdef CONFIG_SYSCTL -static int nf_conntrack_acct_init_sysctl (struct net *net) -{ -struct ctl_table *table; - - table =kmemdup (acct_sysctl_table,sizeof (acct_sysctl_table), -GFP_KERNEL ); -if (!table) - goto out; - - table[0 ].data = &net->ct.sysctl_acct; - -/* Don't export sysctls to unprivileged users */ -if (net->user_ns != &init_user_ns) - table[0 ].procname =NULL ; - - net->ct.acct_sysctl_header =register_net_sysctl (net,"net/netfilter" , - table); -if (!net->ct.acct_sysctl_header) { -pr_err ("can't register to sysctl\n" ); - goto out_register; - } -return 0 ; - -out_register: -kfree (table); -out: -return -ENOMEM ; -} - -static void nf_conntrack_acct_fini_sysctl (struct net *net) -{ -struct ctl_table *table; - - table = net->ct.acct_sysctl_header->ctl_table_arg; -unregister_net_sysctl_table (net->ct.acct_sysctl_header); -kfree (table); -} -#else -static int nf_conntrack_acct_init_sysctl (struct net *net) -{ -return 0 ; -} - -static void nf_conntrack_acct_fini_sysctl (struct net *net) -{ -} -#endif -int nf_conntrack_acct_pernet_init (struct net *net) { net->ct.sysctl_acct = nf_ct_acct; -return nf_conntrack_acct_init_sysctl (net); +return 0 ; }void nf_conntrack_acct_pernet_fini (struct net *net) { -nf_conntrack_acct_fini_sysctl (net); }int nf_conntrack_acct_init (void )
net/netfilter/nf_conntrack_helper.c +1 -63
80 lines not on this page · raw message
net/netfilter/nf_conntrack_standalone.c +20 -1
@@ -539,6 +539,8 @@ enum nf_ct_sysctl_index {NF_SYSCTL_CT_CHECKSUM ,NF_SYSCTL_CT_LOG_INVALID ,NF_SYSCTL_CT_EXPECT_MAX , +NF_SYSCTL_CT_ACCT , + NF_SYSCTL_CT_HELPER, }; static struct ctl_table nf_ct_sysctl_table[] = {
@@ -586,6 +588,20 @@ static struct ctl_table nf_ct_sysctl_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + [NF_SYSCTL_CT_ACCT] = { + .procname = "nf_conntrack_acct", + .data = &init_net.ct.sysctl_acct, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, + [NF_SYSCTL_CT_HELPER] = { + .procname = "nf_conntrack_helper", + .data = &init_net.ct.sysctl_auto_assign_helper, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, { } };
@@ -614,8 +630,11 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) table[NF_SYSCTL_CT_LOG_INVALID ].data = &net->ct.sysctl_log_invalid;/* Don't export sysctls to unprivileged users */ -if (net->user_ns != &init_user_ns) +if (net->user_ns != &init_user_ns) { table[NF_SYSCTL_CT_MAX ].procname =NULL ; + table[NF_SYSCTL_CT_ACCT ].procname =NULL ; + table[NF_SYSCTL_CT_HELPER ].procname =NULL ; + }if (!net_eq (&init_net, net)) table[NF_SYSCTL_CT_BUCKETS ].mode =0444 ;
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 35/37 netfilter: conntrack: merge ecache and timestamp sysctl tables with main one
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
Similar to previous change, this time for eache and timestamp. Unlike helper and acct, these can be disabled at build time, so they need ifdef guards.
Next patch will remove a few (now obsolete) functions.
--- net/netfilter/nf_conntrack_ecache.c | 65 +-------------------------------- net/netfilter/nf_conntrack_standalone.c | 33 +++++++++++++++++ net/netfilter/nf_conntrack_timestamp.c | 65 +-------------------------------- 3 files changed, 35 insertions(+), 128 deletions(-)
net/netfilter/nf_conntrack_ecache.c +1 -64
@@ -336,85 +336,22 @@ EXPORT_SYMBOL_GPL(nf_ct_expect_unregister_notifier);#define NF_CT_EVENTS_DEFAULT 1static int nf_ct_events__read_mostly =NF_CT_EVENTS_DEFAULT ; -#ifdef CONFIG_SYSCTL -static struct ctl_table event_sysctl_table[] = { - { - .procname ="nf_conntrack_events" , - .data = &init_net.ct.sysctl_events, - .maxlen =sizeof (unsigned int ), - .mode =0644 , - .proc_handler = proc_dointvec, - }, - {} -}; -#endif /* CONFIG_SYSCTL */ -static const struct nf_ct_ext_type event_extend = { .len =sizeof (struct nf_conntrack_ecache ), .align = __alignof__(struct nf_conntrack_ecache ), .id =NF_CT_EXT_ECACHE , }; -#ifdef CONFIG_SYSCTL -static int nf_conntrack_event_init_sysctl (struct net *net) -{ -struct ctl_table *table; - - table =kmemdup (event_sysctl_table,sizeof (event_sysctl_table), -GFP_KERNEL ); -if (!table) - goto out; - - table[0 ].data = &net->ct.sysctl_events; - -/* Don't export sysctls to unprivileged users */ -if (net->user_ns != &init_user_ns) - table[0 ].procname =NULL ; - - net->ct.event_sysctl_header = -register_net_sysctl (net,"net/netfilter" , table); -if (!net->ct.event_sysctl_header) { -pr_err ("can't register to sysctl\n" ); - goto out_register; - } -return 0 ; - -out_register: -kfree (table); -out: -return -ENOMEM ; -} - -static void nf_conntrack_event_fini_sysctl (struct net *net) -{ -struct ctl_table *table; - - table = net->ct.event_sysctl_header->ctl_table_arg; -unregister_net_sysctl_table (net->ct.event_sysctl_header); -kfree (table); -} -#else -static int nf_conntrack_event_init_sysctl (struct net *net) -{ -return 0 ; -} - -static void nf_conntrack_event_fini_sysctl (struct net *net) -{ -} -#endif /* CONFIG_SYSCTL */ -int nf_conntrack_ecache_pernet_init (struct net *net) { net->ct.sysctl_events = nf_ct_events;INIT_DELAYED_WORK (&net->ct.ecache_dwork, ecache_work); -return nf_conntrack_event_init_sysctl (net); +return 0 ; }void nf_conntrack_ecache_pernet_fini (struct net *net) {cancel_delayed_work_sync (&net->ct.ecache_dwork); -nf_conntrack_event_fini_sysctl (net); }int nf_conntrack_ecache_init (void )
net/netfilter/nf_conntrack_standalone.c +33 -0
@@ -541,6 +541,12 @@ enum nf_ct_sysctl_index {NF_SYSCTL_CT_EXPECT_MAX ,NF_SYSCTL_CT_ACCT ,NF_SYSCTL_CT_HELPER , +#ifdef CONFIG_NF_CONNTRACK_EVENTS +NF_SYSCTL_CT_EVENTS , +#endif +#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP + NF_SYSCTL_CT_TIMESTAMP, +#endif }; static struct ctl_table nf_ct_sysctl_table[] = {
@@ -602,6 +608,24 @@ static struct ctl_table nf_ct_sysctl_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, +#ifdef CONFIG_NF_CONNTRACK_EVENTS + [NF_SYSCTL_CT_EVENTS] = { + .procname = "nf_conntrack_events", + .data = &init_net.ct.sysctl_events, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif +#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP + [NF_SYSCTL_CT_TIMESTAMP] = { + .procname ="nf_conntrack_timestamp" , + .data = &init_net.ct.sysctl_tstamp, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif { } };
@@ -628,12 +652,21 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) table[NF_SYSCTL_CT_COUNT ].data = &net->ct.count; table[NF_SYSCTL_CT_CHECKSUM ].data = &net->ct.sysctl_checksum; table[NF_SYSCTL_CT_LOG_INVALID ].data = &net->ct.sysctl_log_invalid; +#ifdef CONFIG_NF_CONNTRACK_EVENTS + table[NF_SYSCTL_CT_EVENTS ].data = &net->ct.sysctl_events; +#endif /* Don't export sysctls to unprivileged users */ if (net->user_ns != &init_user_ns) { table[NF_SYSCTL_CT_MAX ].procname =NULL ; table[NF_SYSCTL_CT_ACCT ].procname =NULL ; table[NF_SYSCTL_CT_HELPER ].procname =NULL ; +#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP + table[NF_SYSCTL_CT_TIMESTAMP ].procname =NULL ; +#endif +#ifdef CONFIG_NF_CONNTRACK_EVENTS + table[NF_SYSCTL_CT_EVENTS ].procname =NULL ; +#endif }if (!net_eq (&init_net, net))
net/netfilter/nf_conntrack_timestamp.c +1 -64
84 lines not on this page · raw message
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 36/37 netfilter: conntrack: remove empty pernet fini stubs
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
after moving sysctl handling into single place, the init functions can't fail anymore and some of the fini functions are empty.
Remove them and change return type to void.
This also simplifies error unwinding in conntrack module init path.
--- include/net/netfilter/nf_conntrack_acct.h | 3 +-- include/net/netfilter/nf_conntrack_ecache.h | 7 ++----- include/net/netfilter/nf_conntrack_helper.h | 3 +-- include/net/netfilter/nf_conntrack_timestamp.h | 13 ++---------- net/netfilter/nf_conntrack_acct.c | 7 +------ net/netfilter/nf_conntrack_core.c | 28 ++++++-------------------- net/netfilter/nf_conntrack_ecache.c | 3 +-- net/netfilter/nf_conntrack_helper.c | 7 +------ net/netfilter/nf_conntrack_timestamp.c | 7 +------ 9 files changed, 16 insertions(+), 62 deletions(-)
include/net/netfilter/nf_conntrack_acct.h +1 -2
@@ -58,8 +58,7 @@ static inline void nf_ct_set_acct(struct net *net, bool enable) net->ct.sysctl_acct = enable; } -int nf_conntrack_acct_pernet_init (struct net *net); -void nf_conntrack_acct_pernet_fini (struct net *net); +void nf_conntrack_acct_pernet_init (struct net *net);int nf_conntrack_acct_init (void );void nf_conntrack_acct_fini (void );
include/net/netfilter/nf_conntrack_ecache.h +2 -5
@@ -142,7 +142,7 @@ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,struct nf_conntrack_expect *exp, u32 portid, int report); -int nf_conntrack_ecache_pernet_init (struct net *net); +void nf_conntrack_ecache_pernet_init (struct net *net);void nf_conntrack_ecache_pernet_fini (struct net *net);int nf_conntrack_ecache_init (void );
@@ -182,10 +182,7 @@ static inline void nf_ct_expect_event_report(enum ip_conntrack_expect_events e, u32 portid, int report) {} -static inline int nf_conntrack_ecache_pernet_init (struct net *net) -{ -return 0 ; -} +static inline void nf_conntrack_ecache_pernet_init (struct net *net) {}static inline void nf_conntrack_ecache_pernet_fini (struct net *net) {
include/net/netfilter/nf_conntrack_helper.h +1 -2
@@ -124,8 +124,7 @@ static inline void *nfct_help_data(const struct nf_conn *ct)return (void *)help->data; } -int nf_conntrack_helper_pernet_init (struct net *net); -void nf_conntrack_helper_pernet_fini (struct net *net); +void nf_conntrack_helper_pernet_init (struct net *net);int nf_conntrack_helper_init (void );void nf_conntrack_helper_fini (void );
include/net/netfilter/nf_conntrack_timestamp.h +2 -11
@@ -49,21 +49,12 @@ static inline void nf_ct_set_tstamp(struct net *net, bool enable) }#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP -int nf_conntrack_tstamp_pernet_init (struct net *net); -void nf_conntrack_tstamp_pernet_fini (struct net *net); +void nf_conntrack_tstamp_pernet_init (struct net *net);int nf_conntrack_tstamp_init (void );void nf_conntrack_tstamp_fini (void );#else -static inline int nf_conntrack_tstamp_pernet_init (struct net *net) -{ -return 0 ; -} - -static inline void nf_conntrack_tstamp_pernet_fini (struct net *net) -{ -return ; -} +static inline void nf_conntrack_tstamp_pernet_init (struct net *net) {}static inline int nf_conntrack_tstamp_init (void ) {
net/netfilter/nf_conntrack_acct.c +1 -6
@@ -31,14 +31,9 @@ static const struct nf_ct_ext_type acct_extend = { .id = NF_CT_EXT_ACCT, }; -int nf_conntrack_acct_pernet_init (struct net *net) +void nf_conntrack_acct_pernet_init (struct net *net) { net->ct.sysctl_acct = nf_ct_acct; -return 0 ; -} - -void nf_conntrack_acct_pernet_fini (struct net *net) -{ }int nf_conntrack_acct_init (void )
net/netfilter/nf_conntrack_core.c +6 -22
@@ -2110,10 +2110,7 @@ void nf_conntrack_cleanup_net_list(struct list_head *net_exit_list)list_for_each_entry (net, net_exit_list, exit_list) {nf_conntrack_proto_pernet_fini (net); -nf_conntrack_helper_pernet_fini (net);nf_conntrack_ecache_pernet_fini (net); -nf_conntrack_tstamp_pernet_fini (net); -nf_conntrack_acct_pernet_fini (net);nf_conntrack_expect_pernet_fini (net);free_percpu (net->ct.stat);free_percpu (net->ct.pcpu_lists);
@@ -2410,32 +2407,19 @@ int nf_conntrack_init_net(struct net *net) ret =nf_conntrack_expect_pernet_init (net);if (ret <0 ) goto err_expect; - ret =nf_conntrack_acct_pernet_init (net); -if (ret <0 ) - goto err_acct; - ret =nf_conntrack_tstamp_pernet_init (net); -if (ret <0 ) - goto err_tstamp; - ret =nf_conntrack_ecache_pernet_init (net); -if (ret <0 ) - goto err_ecache; - ret =nf_conntrack_helper_pernet_init (net); -if (ret <0 ) - goto err_helper; + +nf_conntrack_acct_pernet_init (net); +nf_conntrack_tstamp_pernet_init (net); +nf_conntrack_ecache_pernet_init (net); +nf_conntrack_helper_pernet_init (net); + ret =nf_conntrack_proto_pernet_init (net);if (ret <0 ) goto err_proto;return 0 ; err_proto: -nf_conntrack_helper_pernet_fini (net); -err_helper:nf_conntrack_ecache_pernet_fini (net); -err_ecache: -nf_conntrack_tstamp_pernet_fini (net); -err_tstamp: -nf_conntrack_acct_pernet_fini (net); -err_acct:nf_conntrack_expect_pernet_fini (net); err_expect:free_percpu (net->ct.stat);
net/netfilter/nf_conntrack_ecache.c +1 -2
@@ -342,11 +342,10 @@ static const struct nf_ct_ext_type event_extend = { .id = NF_CT_EXT_ECACHE, }; -int nf_conntrack_ecache_pernet_init (struct net *net) +void nf_conntrack_ecache_pernet_init (struct net *net) { net->ct.sysctl_events = nf_ct_events;INIT_DELAYED_WORK (&net->ct.ecache_dwork, ecache_work); -return 0 ; }void nf_conntrack_ecache_pernet_fini (struct net *net)
net/netfilter/nf_conntrack_helper.c +1 -6
@@ -472,15 +472,10 @@ static const struct nf_ct_ext_type helper_extend = { .id = NF_CT_EXT_HELPER, }; -int nf_conntrack_helper_pernet_init (struct net *net) +void nf_conntrack_helper_pernet_init (struct net *net) { net->ct.auto_assign_helper_warned = false; net->ct.sysctl_auto_assign_helper = nf_ct_auto_assign_helper; -return 0 ; -} - -void nf_conntrack_helper_pernet_fini (struct net *net) -{ }int nf_conntrack_helper_init (void )
net/netfilter/nf_conntrack_timestamp.c +1 -6
@@ -28,14 +28,9 @@ static const struct nf_ct_ext_type tstamp_extend = { .id = NF_CT_EXT_TSTAMP, }; -int nf_conntrack_tstamp_pernet_init (struct net *net) +void nf_conntrack_tstamp_pernet_init (struct net *net) { net->ct.sysctl_tstamp = nf_ct_tstamp; -return 0 ; -} - -void nf_conntrack_tstamp_pernet_fini (struct net *net) -{ }int nf_conntrack_tstamp_init (void )
Signature · 1 line
2.11.0
Pablo Neira Ayuso
maintainerPATCH 37/37 netfilter: netns: shrink netns_ct struct
In reply to Pablo Neira AyusoFrom: Florian Westphal <[email protected]>
remove the obsolete sysctl anchors and move auto_assign_helper_warned to avoid/cover a hole. Reduces size by 40 bytes on 64 bit.
--- include/net/netns/conntrack.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
include/net/netns/conntrack.h +1 -5
@@ -97,18 +97,14 @@ struct netns_ct {struct delayed_work ecache_dwork;bool ecache_dwork_pending;#endif +bool auto_assign_helper_warned;#ifdef CONFIG_SYSCTL struct ctl_table_header *sysctl_header; -struct ctl_table_header *acct_sysctl_header; -struct ctl_table_header *tstamp_sysctl_header; -struct ctl_table_header *event_sysctl_header; -struct ctl_table_header *helper_sysctl_header;#endif unsigned int sysctl_log_invalid;/* Log invalid packets */ int sysctl_events;int sysctl_acct;int sysctl_auto_assign_helper; -bool auto_assign_helper_warned;int sysctl_tstamp;int sysctl_checksum;
Signature · 1 line
2.11.0
David Miller
maintainerFrom: Pablo Neira Ayuso <[email protected]>
Date: Fri, 21 Dec 2018 01:28:04 +0100
Quoted 1 line
The following patchset contains Netfilter updates for net-next:
...
Quoted 3 lines
You can pull these changes from:
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git
Pulled, thanks.