Merge branch 'master' of git://1984.lsi.us.es/nf-next
Pablo Neira Ayuso says: ==================== This batch contains netfilter updates for you net-next tree, they are: * The new connlabel extension for x_tables, that allows us to attach labels to each conntrack flow. The kernel implementation uses a bitmask and there's a file in user-space that maps the bits with the corresponding string for each existing label. By now, you can attach up to 128 overlapping labels. From Florian Westphal. * A new round of improvements for the netns support for conntrack. Gao feng has moved many of the initialization code of each module of the netns init path. He also made several code refactoring, that code looks cleaner to me now. * Added documentation for all possible tweaks for nf_conntrack via sysctl, from Jiri Pirko. * Cisco 7941/7945 IP phone support for our SIP conntrack helper, from Kevin Cernekee. * Missing header file in the snmp helper, from Stephen Hemminger. * Finally, a couple of fixes to resolve minor issues with these changes, from myself. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -57,7 +57,9 @@ static inline void nf_ct_set_acct(struct net *net, bool enable)
|
||||
net->ct.sysctl_acct = enable;
|
||||
}
|
||||
|
||||
extern int nf_conntrack_acct_init(struct net *net);
|
||||
extern void nf_conntrack_acct_fini(struct net *net);
|
||||
extern int nf_conntrack_acct_pernet_init(struct net *net);
|
||||
extern void nf_conntrack_acct_pernet_fini(struct net *net);
|
||||
|
||||
extern int nf_conntrack_acct_init(void);
|
||||
extern void nf_conntrack_acct_fini(void);
|
||||
#endif /* _NF_CONNTRACK_ACCT_H */
|
||||
|
@@ -25,12 +25,19 @@ extern unsigned int nf_conntrack_in(struct net *net,
|
||||
unsigned int hooknum,
|
||||
struct sk_buff *skb);
|
||||
|
||||
extern int nf_conntrack_init(struct net *net);
|
||||
extern void nf_conntrack_cleanup(struct net *net);
|
||||
extern int nf_conntrack_init_net(struct net *net);
|
||||
extern void nf_conntrack_cleanup_net(struct net *net);
|
||||
|
||||
extern int nf_conntrack_proto_init(struct net *net);
|
||||
extern void nf_conntrack_proto_fini(struct net *net);
|
||||
extern int nf_conntrack_proto_pernet_init(struct net *net);
|
||||
extern void nf_conntrack_proto_pernet_fini(struct net *net);
|
||||
|
||||
extern int nf_conntrack_proto_init(void);
|
||||
extern void nf_conntrack_proto_fini(void);
|
||||
|
||||
extern int nf_conntrack_init_start(void);
|
||||
extern void nf_conntrack_cleanup_start(void);
|
||||
|
||||
extern void nf_conntrack_init_end(void);
|
||||
extern void nf_conntrack_cleanup_end(void);
|
||||
|
||||
extern bool
|
||||
|
@@ -207,9 +207,11 @@ nf_ct_expect_event(enum ip_conntrack_expect_events event,
|
||||
nf_ct_expect_event_report(event, exp, 0, 0);
|
||||
}
|
||||
|
||||
extern int nf_conntrack_ecache_init(struct net *net);
|
||||
extern void nf_conntrack_ecache_fini(struct net *net);
|
||||
extern int nf_conntrack_ecache_pernet_init(struct net *net);
|
||||
extern void nf_conntrack_ecache_pernet_fini(struct net *net);
|
||||
|
||||
extern int nf_conntrack_ecache_init(void);
|
||||
extern void nf_conntrack_ecache_fini(void);
|
||||
#else /* CONFIG_NF_CONNTRACK_EVENTS */
|
||||
|
||||
static inline void nf_conntrack_event_cache(enum ip_conntrack_events event,
|
||||
@@ -232,12 +234,21 @@ static inline void nf_ct_expect_event_report(enum ip_conntrack_expect_events e,
|
||||
u32 portid,
|
||||
int report) {}
|
||||
|
||||
static inline int nf_conntrack_ecache_init(struct net *net)
|
||||
static inline int nf_conntrack_ecache_pernet_init(struct net *net)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_fini(struct net *net)
|
||||
static inline void nf_conntrack_ecache_pernet_fini(struct net *net)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int nf_conntrack_ecache_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_ecache_fini(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_NF_CONNTRACK_EVENTS */
|
||||
|
@@ -69,8 +69,11 @@ struct nf_conntrack_expect_policy {
|
||||
|
||||
#define NF_CT_EXPECT_CLASS_DEFAULT 0
|
||||
|
||||
int nf_conntrack_expect_init(struct net *net);
|
||||
void nf_conntrack_expect_fini(struct net *net);
|
||||
int nf_conntrack_expect_pernet_init(struct net *net);
|
||||
void nf_conntrack_expect_pernet_fini(struct net *net);
|
||||
|
||||
int nf_conntrack_expect_init(void);
|
||||
void nf_conntrack_expect_fini(void);
|
||||
|
||||
struct nf_conntrack_expect *
|
||||
__nf_ct_expect_find(struct net *net, u16 zone,
|
||||
|
@@ -22,6 +22,9 @@ enum nf_ct_ext_id {
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
NF_CT_EXT_TIMEOUT,
|
||||
#endif
|
||||
#ifdef CONFIG_NF_CONNTRACK_LABELS
|
||||
NF_CT_EXT_LABELS,
|
||||
#endif
|
||||
NF_CT_EXT_NUM,
|
||||
};
|
||||
@@ -33,6 +36,7 @@ enum nf_ct_ext_id {
|
||||
#define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone
|
||||
#define NF_CT_EXT_TSTAMP_TYPE struct nf_conn_tstamp
|
||||
#define NF_CT_EXT_TIMEOUT_TYPE struct nf_conn_timeout
|
||||
#define NF_CT_EXT_LABELS_TYPE struct nf_conn_labels
|
||||
|
||||
/* Extensions: optional stuff which isn't permanently in struct. */
|
||||
struct nf_ct_ext {
|
||||
|
@@ -82,8 +82,11 @@ static inline void *nfct_help_data(const struct nf_conn *ct)
|
||||
return (void *)help->data;
|
||||
}
|
||||
|
||||
extern int nf_conntrack_helper_init(struct net *net);
|
||||
extern void nf_conntrack_helper_fini(struct net *net);
|
||||
extern int nf_conntrack_helper_pernet_init(struct net *net);
|
||||
extern void nf_conntrack_helper_pernet_fini(struct net *net);
|
||||
|
||||
extern int nf_conntrack_helper_init(void);
|
||||
extern void nf_conntrack_helper_fini(void);
|
||||
|
||||
extern int nf_conntrack_broadcast_help(struct sk_buff *skb,
|
||||
unsigned int protoff,
|
||||
|
@@ -76,11 +76,16 @@ struct nf_conntrack_l3proto {
|
||||
|
||||
extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[AF_MAX];
|
||||
|
||||
/* Protocol registration. */
|
||||
extern int nf_conntrack_l3proto_register(struct net *net,
|
||||
/* Protocol pernet registration. */
|
||||
extern int nf_ct_l3proto_pernet_register(struct net *net,
|
||||
struct nf_conntrack_l3proto *proto);
|
||||
extern void nf_conntrack_l3proto_unregister(struct net *net,
|
||||
extern void nf_ct_l3proto_pernet_unregister(struct net *net,
|
||||
struct nf_conntrack_l3proto *proto);
|
||||
|
||||
/* Protocol global registration. */
|
||||
extern int nf_ct_l3proto_register(struct nf_conntrack_l3proto *proto);
|
||||
extern void nf_ct_l3proto_unregister(struct nf_conntrack_l3proto *proto);
|
||||
|
||||
extern struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);
|
||||
extern void nf_ct_l3proto_put(struct nf_conntrack_l3proto *p);
|
||||
|
||||
|
@@ -121,12 +121,16 @@ extern struct nf_conntrack_l4proto *
|
||||
nf_ct_l4proto_find_get(u_int16_t l3proto, u_int8_t l4proto);
|
||||
extern void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p);
|
||||
|
||||
/* Protocol registration. */
|
||||
extern int nf_conntrack_l4proto_register(struct net *net,
|
||||
/* Protocol pernet registration. */
|
||||
extern int nf_ct_l4proto_pernet_register(struct net *net,
|
||||
struct nf_conntrack_l4proto *proto);
|
||||
extern void nf_conntrack_l4proto_unregister(struct net *net,
|
||||
extern void nf_ct_l4proto_pernet_unregister(struct net *net,
|
||||
struct nf_conntrack_l4proto *proto);
|
||||
|
||||
/* Protocol global registration. */
|
||||
extern int nf_ct_l4proto_register(struct nf_conntrack_l4proto *proto);
|
||||
extern void nf_ct_l4proto_unregister(struct nf_conntrack_l4proto *proto);
|
||||
|
||||
static inline void nf_ct_kfree_compat_sysctl_table(struct nf_proto_net *pn)
|
||||
{
|
||||
#if defined(CONFIG_SYSCTL) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT)
|
||||
|
58
include/net/netfilter/nf_conntrack_labels.h
Normal file
58
include/net/netfilter/nf_conntrack_labels.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#include <linux/types.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <linux/netfilter/nf_conntrack_common.h>
|
||||
#include <linux/netfilter/nf_conntrack_tuple_common.h>
|
||||
#include <net/netfilter/nf_conntrack.h>
|
||||
#include <net/netfilter/nf_conntrack_extend.h>
|
||||
|
||||
#include <uapi/linux/netfilter/xt_connlabel.h>
|
||||
|
||||
struct nf_conn_labels {
|
||||
u8 words;
|
||||
unsigned long bits[];
|
||||
};
|
||||
|
||||
static inline struct nf_conn_labels *nf_ct_labels_find(const struct nf_conn *ct)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_LABELS
|
||||
return nf_ct_ext_find(ct, NF_CT_EXT_LABELS);
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct)
|
||||
{
|
||||
#ifdef CONFIG_NF_CONNTRACK_LABELS
|
||||
struct nf_conn_labels *cl_ext;
|
||||
struct net *net = nf_ct_net(ct);
|
||||
u8 words;
|
||||
|
||||
words = ACCESS_ONCE(net->ct.label_words);
|
||||
if (words == 0 || WARN_ON_ONCE(words > 8))
|
||||
return NULL;
|
||||
|
||||
cl_ext = nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS,
|
||||
words * sizeof(long), GFP_ATOMIC);
|
||||
if (cl_ext != NULL)
|
||||
cl_ext->words = words;
|
||||
|
||||
return cl_ext;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool nf_connlabel_match(const struct nf_conn *ct, u16 bit);
|
||||
int nf_connlabel_set(struct nf_conn *ct, u16 bit);
|
||||
|
||||
int nf_connlabels_replace(struct nf_conn *ct,
|
||||
const u32 *data, const u32 *mask, unsigned int words);
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_LABELS
|
||||
int nf_conntrack_labels_init(void);
|
||||
void nf_conntrack_labels_fini(void);
|
||||
#else
|
||||
static inline int nf_conntrack_labels_init(void) { return 0; }
|
||||
static inline void nf_conntrack_labels_fini(void) {}
|
||||
#endif
|
@@ -76,15 +76,15 @@ nf_ct_timeout_lookup(struct net *net, struct nf_conn *ct,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
|
||||
extern int nf_conntrack_timeout_init(struct net *net);
|
||||
extern void nf_conntrack_timeout_fini(struct net *net);
|
||||
extern int nf_conntrack_timeout_init(void);
|
||||
extern void nf_conntrack_timeout_fini(void);
|
||||
#else
|
||||
static inline int nf_conntrack_timeout_init(struct net *net)
|
||||
static inline int nf_conntrack_timeout_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_timeout_fini(struct net *net)
|
||||
static inline void nf_conntrack_timeout_fini(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@@ -48,15 +48,28 @@ static inline void nf_ct_set_tstamp(struct net *net, bool enable)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
|
||||
extern int nf_conntrack_tstamp_init(struct net *net);
|
||||
extern void nf_conntrack_tstamp_fini(struct net *net);
|
||||
extern int nf_conntrack_tstamp_pernet_init(struct net *net);
|
||||
extern void nf_conntrack_tstamp_pernet_fini(struct net *net);
|
||||
|
||||
extern int nf_conntrack_tstamp_init(void);
|
||||
extern void nf_conntrack_tstamp_fini(void);
|
||||
#else
|
||||
static inline int nf_conntrack_tstamp_init(struct net *net)
|
||||
static inline int nf_conntrack_tstamp_pernet_init(struct net *net)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_tstamp_fini(struct net *net)
|
||||
static inline void nf_conntrack_tstamp_pernet_fini(struct net *net)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int nf_conntrack_tstamp_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nf_conntrack_tstamp_fini(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@@ -84,6 +84,10 @@ struct netns_ct {
|
||||
int sysctl_auto_assign_helper;
|
||||
bool auto_assign_helper_warned;
|
||||
struct nf_ip_net nf_ct_proto;
|
||||
#if defined(CONFIG_NF_CONNTRACK_LABELS)
|
||||
unsigned int labels_used;
|
||||
u8 label_words;
|
||||
#endif
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
struct hlist_head *nat_bysource;
|
||||
unsigned int nat_htable_size;
|
||||
|
Reference in New Issue
Block a user