Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
Pablo Neira Ayuso says: ==================== Netfilter/IPVS updates for net-next The following patchset contains Netfilter/IPVS updates for net-next, most relevantly they are: * cleanup to remove double semicolon from stephen hemminger. * calm down sparse warning in xt_ipcomp, from Fan Du. * nf_ct_labels support for nf_tables, from Florian Westphal. * new macros to simplify rcu dereferences in the scope of nfnetlink and nf_tables, from Patrick McHardy. * Accept queue and drop (including reason for drop) to verdict parsing in nf_tables, also from Patrick. * Remove unused random seed initialization in nfnetlink_log, from Florian Westphal. * Allow to attach user-specific information to nf_tables rules, useful to attach user comments to rule, from me. * Return errors in ipset according to the manpage documentation, from Jozsef Kadlecsik. * Fix coccinelle warnings related to incorrect bool type usage for ipset, from Fengguang Wu. * Add hash:ip,mark set type to ipset, from Vytas Dauksa. * Fix message for each spotted by ipset for each netns that is created, from Ilia Mirkin. * Add forceadd option to ipset, which evicts a random entry from the set if it becomes full, from Josh Hunt. * Minor IPVS cleanups and fixes from Andi Kleen and Tingwei Liu. * Improve conntrack scalability by removing a central spinlock, original work from Eric Dumazet. Jesper Dangaard Brouer took them over to address remaining issues. Several patches to prepare this change come in first place. * Rework nft_hash to resolve bugs (leaking chain, missing rcu synchronization on element removal, etc. from Patrick McHardy. * Restore context in the rule deletion path, as we now release rule objects synchronously, from Patrick McHardy. This gets back event notification for anonymous sets. * Fix NAT family validation in nft_nat, also from Patrick. * Improve scalability of xt_connlimit by using an array of spinlocks and by introducing a rb-tree of hashtables for faster lookup of accounted objects per network. This patch was preceded by several patches and refactorizations to accomodate this change including the use of kmem_cache, from Florian Westphal. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -73,10 +73,17 @@ struct nf_conn_help {
|
||||
|
||||
struct nf_conn {
|
||||
/* Usage count in here is 1 for hash table/destruct timer, 1 per skb,
|
||||
plus 1 for any connection(s) we are `master' for */
|
||||
* plus 1 for any connection(s) we are `master' for
|
||||
*
|
||||
* Hint, SKB address this struct and refcnt via skb->nfct and
|
||||
* helpers nf_conntrack_get() and nf_conntrack_put().
|
||||
* Helper nf_ct_put() equals nf_conntrack_put() by dec refcnt,
|
||||
* beware nf_ct_get() is different and don't inc refcnt.
|
||||
*/
|
||||
struct nf_conntrack ct_general;
|
||||
|
||||
spinlock_t lock;
|
||||
spinlock_t lock;
|
||||
u16 cpu;
|
||||
|
||||
/* XXX should I move this to the tail ? - Y.K */
|
||||
/* These are my tuples; original and reply */
|
||||
|
||||
@@ -77,6 +77,13 @@ print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
|
||||
const struct nf_conntrack_l3proto *l3proto,
|
||||
const struct nf_conntrack_l4proto *proto);
|
||||
|
||||
extern spinlock_t nf_conntrack_lock ;
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
# define CONNTRACK_LOCKS 8
|
||||
#else
|
||||
# define CONNTRACK_LOCKS 1024
|
||||
#endif
|
||||
extern spinlock_t nf_conntrack_locks[CONNTRACK_LOCKS];
|
||||
|
||||
extern spinlock_t nf_conntrack_expect_lock;
|
||||
|
||||
#endif /* _NF_CONNTRACK_CORE_H */
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
|
||||
#include <uapi/linux/netfilter/xt_connlabel.h>
|
||||
|
||||
#define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE)
|
||||
|
||||
struct nf_conn_labels {
|
||||
u8 words;
|
||||
unsigned long bits[];
|
||||
@@ -29,7 +31,7 @@ static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct)
|
||||
u8 words;
|
||||
|
||||
words = ACCESS_ONCE(net->ct.label_words);
|
||||
if (words == 0 || WARN_ON_ONCE(words > 8))
|
||||
if (words == 0)
|
||||
return NULL;
|
||||
|
||||
cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS,
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter/nfnetlink.h>
|
||||
#include <linux/netfilter/x_tables.h>
|
||||
#include <linux/netfilter/nf_tables.h>
|
||||
#include <net/netlink.h>
|
||||
@@ -288,7 +289,8 @@ struct nft_expr_ops {
|
||||
int (*init)(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr,
|
||||
const struct nlattr * const tb[]);
|
||||
void (*destroy)(const struct nft_expr *expr);
|
||||
void (*destroy)(const struct nft_ctx *ctx,
|
||||
const struct nft_expr *expr);
|
||||
int (*dump)(struct sk_buff *skb,
|
||||
const struct nft_expr *expr);
|
||||
int (*validate)(const struct nft_ctx *ctx,
|
||||
@@ -325,13 +327,15 @@ static inline void *nft_expr_priv(const struct nft_expr *expr)
|
||||
* @handle: rule handle
|
||||
* @genmask: generation mask
|
||||
* @dlen: length of expression data
|
||||
* @ulen: length of user data (used for comments)
|
||||
* @data: expression data
|
||||
*/
|
||||
struct nft_rule {
|
||||
struct list_head list;
|
||||
u64 handle:46,
|
||||
u64 handle:42,
|
||||
genmask:2,
|
||||
dlen:16;
|
||||
dlen:12,
|
||||
ulen:8;
|
||||
unsigned char data[]
|
||||
__attribute__((aligned(__alignof__(struct nft_expr))));
|
||||
};
|
||||
@@ -340,19 +344,13 @@ struct nft_rule {
|
||||
* struct nft_rule_trans - nf_tables rule update in transaction
|
||||
*
|
||||
* @list: used internally
|
||||
* @ctx: rule context
|
||||
* @rule: rule that needs to be updated
|
||||
* @chain: chain that this rule belongs to
|
||||
* @table: table for which this chain applies
|
||||
* @nlh: netlink header of the message that contain this update
|
||||
* @family: family expressesed as AF_*
|
||||
*/
|
||||
struct nft_rule_trans {
|
||||
struct list_head list;
|
||||
struct nft_ctx ctx;
|
||||
struct nft_rule *rule;
|
||||
const struct nft_chain *chain;
|
||||
const struct nft_table *table;
|
||||
const struct nlmsghdr *nlh;
|
||||
u8 family;
|
||||
};
|
||||
|
||||
static inline struct nft_expr *nft_expr_first(const struct nft_rule *rule)
|
||||
@@ -370,6 +368,11 @@ static inline struct nft_expr *nft_expr_last(const struct nft_rule *rule)
|
||||
return (struct nft_expr *)&rule->data[rule->dlen];
|
||||
}
|
||||
|
||||
static inline void *nft_userdata(const struct nft_rule *rule)
|
||||
{
|
||||
return (void *)&rule->data[rule->dlen];
|
||||
}
|
||||
|
||||
/*
|
||||
* The last pointer isn't really necessary, but the compiler isn't able to
|
||||
* determine that the result of nft_expr_last() is always the same since it
|
||||
@@ -521,6 +524,9 @@ void nft_unregister_chain_type(const struct nf_chain_type *);
|
||||
int nft_register_expr(struct nft_expr_type *);
|
||||
void nft_unregister_expr(struct nft_expr_type *);
|
||||
|
||||
#define nft_dereference(p) \
|
||||
nfnl_dereference(p, NFNL_SUBSYS_NFTABLES)
|
||||
|
||||
#define MODULE_ALIAS_NFT_FAMILY(family) \
|
||||
MODULE_ALIAS("nft-afinfo-" __stringify(family))
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/list_nulls.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/netfilter/nf_conntrack_tcp.h>
|
||||
#include <linux/seqlock.h>
|
||||
|
||||
struct ctl_table_header;
|
||||
struct nf_conntrack_ecache;
|
||||
@@ -62,6 +63,13 @@ struct nf_ip_net {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ct_pcpu {
|
||||
spinlock_t lock;
|
||||
struct hlist_nulls_head unconfirmed;
|
||||
struct hlist_nulls_head dying;
|
||||
struct hlist_nulls_head tmpl;
|
||||
};
|
||||
|
||||
struct netns_ct {
|
||||
atomic_t count;
|
||||
unsigned int expect_count;
|
||||
@@ -83,12 +91,11 @@ struct netns_ct {
|
||||
int sysctl_checksum;
|
||||
|
||||
unsigned int htable_size;
|
||||
seqcount_t generation;
|
||||
struct kmem_cache *nf_conntrack_cachep;
|
||||
struct hlist_nulls_head *hash;
|
||||
struct hlist_head *expect_hash;
|
||||
struct hlist_nulls_head unconfirmed;
|
||||
struct hlist_nulls_head dying;
|
||||
struct hlist_nulls_head tmpl;
|
||||
struct ct_pcpu __percpu *pcpu_lists;
|
||||
struct ip_conntrack_stat __percpu *stat;
|
||||
struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
|
||||
struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
|
||||
|
||||
Reference in New Issue
Block a user