Commit 1ffad6d1 authored by David S. Miller's avatar David S. Miller

Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next

Pablo Neira Ayuso says:

===================
Netfilter updates for net-next

The following batch contains Netfilter updates for net-next, they are:

1) Move nft_expr_clone() to nft_dynset, from Paul Gortmaker.

2) Do not include module.h from net/netfilter/nf_tables.h,
   also from Paul.

3) Restrict conntrack sysctl entries to boolean, from Tonghao Zhang.

4) Several patches to add infrastructure to autoload NAT helper
   modules from their respective conntrack helper, this also includes
   the first client of this code in OVS, patches from Flavio Leitner.

5) Add support to match for conntrack ID, from Brett Mastbergen.

6) Spelling fix in connlabel, from Colin Ian King.

7) Use struct_size() from hashlimit, from Gustavo A. R. Silva.

8) Add optimized version of nf_inet_addr_mask(), from Li RongQing.
===================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 19ab5f40 522e4077
...@@ -41,10 +41,19 @@ static inline void nf_inet_addr_mask(const union nf_inet_addr *a1, ...@@ -41,10 +41,19 @@ static inline void nf_inet_addr_mask(const union nf_inet_addr *a1,
union nf_inet_addr *result, union nf_inet_addr *result,
const union nf_inet_addr *mask) const union nf_inet_addr *mask)
{ {
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
const unsigned long *ua = (const unsigned long *)a1;
unsigned long *ur = (unsigned long *)result;
const unsigned long *um = (const unsigned long *)mask;
ur[0] = ua[0] & um[0];
ur[1] = ua[1] & um[1];
#else
result->all[0] = a1->all[0] & mask->all[0]; result->all[0] = a1->all[0] & mask->all[0];
result->all[1] = a1->all[1] & mask->all[1]; result->all[1] = a1->all[1] & mask->all[1];
result->all[2] = a1->all[2] & mask->all[2]; result->all[2] = a1->all[2] & mask->all[2];
result->all[3] = a1->all[3] & mask->all[3]; result->all[3] = a1->all[3] & mask->all[3];
#endif
} }
int netfilter_init(void); int netfilter_init(void);
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
#include <net/netfilter/nf_conntrack_extend.h> #include <net/netfilter/nf_conntrack_extend.h>
#include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_expect.h>
#define NF_NAT_HELPER_PREFIX "ip_nat_"
#define NF_NAT_HELPER_NAME(name) NF_NAT_HELPER_PREFIX name
#define MODULE_ALIAS_NF_NAT_HELPER(name) \
MODULE_ALIAS(NF_NAT_HELPER_NAME(name))
struct module; struct module;
enum nf_ct_helper_flags { enum nf_ct_helper_flags {
...@@ -54,6 +59,8 @@ struct nf_conntrack_helper { ...@@ -54,6 +59,8 @@ struct nf_conntrack_helper {
unsigned int queue_num; unsigned int queue_num;
/* length of userspace private data stored in nf_conn_help->data */ /* length of userspace private data stored in nf_conn_help->data */
u16 data_len; u16 data_len;
/* name of NAT helper module */
char nat_mod_name[NF_CT_HELPER_NAME_LEN];
}; };
/* Must be kept in sync with the classes defined by helpers */ /* Must be kept in sync with the classes defined by helpers */
...@@ -153,4 +160,21 @@ nf_ct_helper_expectfn_find_by_symbol(const void *symbol); ...@@ -153,4 +160,21 @@ nf_ct_helper_expectfn_find_by_symbol(const void *symbol);
extern struct hlist_head *nf_ct_helper_hash; extern struct hlist_head *nf_ct_helper_hash;
extern unsigned int nf_ct_helper_hsize; extern unsigned int nf_ct_helper_hsize;
struct nf_conntrack_nat_helper {
struct list_head list;
char mod_name[NF_CT_HELPER_NAME_LEN]; /* module name */
struct module *module; /* pointer to self */
};
#define NF_CT_NAT_HELPER_INIT(name) \
{ \
.mod_name = NF_NAT_HELPER_NAME(name), \
.module = THIS_MODULE \
}
void nf_nat_helper_register(struct nf_conntrack_nat_helper *nat);
void nf_nat_helper_unregister(struct nf_conntrack_nat_helper *nat);
int nf_nat_helper_try_module_get(const char *name, u16 l3num,
u8 protonum);
void nf_nat_helper_put(struct nf_conntrack_helper *helper);
#endif /*_NF_CONNTRACK_HELPER_H*/ #endif /*_NF_CONNTRACK_HELPER_H*/
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#ifndef _NET_NF_TABLES_H #ifndef _NET_NF_TABLES_H
#define _NET_NF_TABLES_H #define _NET_NF_TABLES_H
#include <linux/module.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/netfilter/nfnetlink.h> #include <linux/netfilter/nfnetlink.h>
...@@ -13,6 +12,8 @@ ...@@ -13,6 +12,8 @@
#include <net/netfilter/nf_flow_table.h> #include <net/netfilter/nf_flow_table.h>
#include <net/netlink.h> #include <net/netlink.h>
struct module;
#define NFT_JUMP_STACK_SIZE 16 #define NFT_JUMP_STACK_SIZE 16
struct nft_pktinfo { struct nft_pktinfo {
...@@ -806,23 +807,6 @@ void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr); ...@@ -806,23 +807,6 @@ void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
int nft_expr_dump(struct sk_buff *skb, unsigned int attr, int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
const struct nft_expr *expr); const struct nft_expr *expr);
static inline int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
{
int err;
if (src->ops->clone) {
dst->ops = src->ops;
err = src->ops->clone(dst, src);
if (err < 0)
return err;
} else {
memcpy(dst, src, src->ops->size);
}
__module_get(src->ops->type->owner);
return 0;
}
/** /**
* struct nft_rule - nf_tables rule * struct nft_rule - nf_tables rule
* *
......
...@@ -24,9 +24,9 @@ struct nf_generic_net { ...@@ -24,9 +24,9 @@ struct nf_generic_net {
struct nf_tcp_net { struct nf_tcp_net {
unsigned int timeouts[TCP_CONNTRACK_TIMEOUT_MAX]; unsigned int timeouts[TCP_CONNTRACK_TIMEOUT_MAX];
unsigned int tcp_loose; int tcp_loose;
unsigned int tcp_be_liberal; int tcp_be_liberal;
unsigned int tcp_max_retrans; int tcp_max_retrans;
}; };
enum udp_conntrack { enum udp_conntrack {
......
...@@ -967,6 +967,7 @@ enum nft_socket_keys { ...@@ -967,6 +967,7 @@ enum nft_socket_keys {
* @NFT_CT_SRC_IP6: conntrack layer 3 protocol source (IPv6 address) * @NFT_CT_SRC_IP6: conntrack layer 3 protocol source (IPv6 address)
* @NFT_CT_DST_IP6: conntrack layer 3 protocol destination (IPv6 address) * @NFT_CT_DST_IP6: conntrack layer 3 protocol destination (IPv6 address)
* @NFT_CT_TIMEOUT: connection tracking timeout policy assigned to conntrack * @NFT_CT_TIMEOUT: connection tracking timeout policy assigned to conntrack
* @NFT_CT_ID: conntrack id
*/ */
enum nft_ct_keys { enum nft_ct_keys {
NFT_CT_STATE, NFT_CT_STATE,
...@@ -993,6 +994,7 @@ enum nft_ct_keys { ...@@ -993,6 +994,7 @@ enum nft_ct_keys {
NFT_CT_SRC_IP6, NFT_CT_SRC_IP6,
NFT_CT_DST_IP6, NFT_CT_DST_IP6,
NFT_CT_TIMEOUT, NFT_CT_TIMEOUT,
NFT_CT_ID,
__NFT_CT_MAX __NFT_CT_MAX
}; };
#define NFT_CT_MAX (__NFT_CT_MAX - 1) #define NFT_CT_MAX (__NFT_CT_MAX - 1)
......
...@@ -631,4 +631,4 @@ module_exit(fini); ...@@ -631,4 +631,4 @@ module_exit(fini);
MODULE_AUTHOR("Jing Min Zhao <zhaojingmin@users.sourceforge.net>"); MODULE_AUTHOR("Jing Min Zhao <zhaojingmin@users.sourceforge.net>");
MODULE_DESCRIPTION("H.323 NAT helper"); MODULE_DESCRIPTION("H.323 NAT helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_nat_h323"); MODULE_ALIAS_NF_NAT_HELPER("h323");
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>"); MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>");
MODULE_DESCRIPTION("Netfilter NAT helper module for PPTP"); MODULE_DESCRIPTION("Netfilter NAT helper module for PPTP");
MODULE_ALIAS("ip_nat_pptp"); MODULE_ALIAS_NF_NAT_HELPER("pptp");
static void pptp_nat_expected(struct nf_conn *ct, static void pptp_nat_expected(struct nf_conn *ct,
struct nf_conntrack_expect *exp) struct nf_conntrack_expect *exp)
......
...@@ -28,11 +28,13 @@ ...@@ -28,11 +28,13 @@
static unsigned int master_timeout __read_mostly = 300; static unsigned int master_timeout __read_mostly = 300;
static char *ts_algo = "kmp"; static char *ts_algo = "kmp";
#define HELPER_NAME "amanda"
MODULE_AUTHOR("Brian J. Murrell <netfilter@interlinx.bc.ca>"); MODULE_AUTHOR("Brian J. Murrell <netfilter@interlinx.bc.ca>");
MODULE_DESCRIPTION("Amanda connection tracking module"); MODULE_DESCRIPTION("Amanda connection tracking module");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_conntrack_amanda"); MODULE_ALIAS("ip_conntrack_amanda");
MODULE_ALIAS_NFCT_HELPER("amanda"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
module_param(master_timeout, uint, 0600); module_param(master_timeout, uint, 0600);
MODULE_PARM_DESC(master_timeout, "timeout for the master connection"); MODULE_PARM_DESC(master_timeout, "timeout for the master connection");
...@@ -179,13 +181,14 @@ static const struct nf_conntrack_expect_policy amanda_exp_policy = { ...@@ -179,13 +181,14 @@ static const struct nf_conntrack_expect_policy amanda_exp_policy = {
static struct nf_conntrack_helper amanda_helper[2] __read_mostly = { static struct nf_conntrack_helper amanda_helper[2] __read_mostly = {
{ {
.name = "amanda", .name = HELPER_NAME,
.me = THIS_MODULE, .me = THIS_MODULE,
.help = amanda_help, .help = amanda_help,
.tuple.src.l3num = AF_INET, .tuple.src.l3num = AF_INET,
.tuple.src.u.udp.port = cpu_to_be16(10080), .tuple.src.u.udp.port = cpu_to_be16(10080),
.tuple.dst.protonum = IPPROTO_UDP, .tuple.dst.protonum = IPPROTO_UDP,
.expect_policy = &amanda_exp_policy, .expect_policy = &amanda_exp_policy,
.nat_mod_name = NF_NAT_HELPER_NAME(HELPER_NAME),
}, },
{ {
.name = "amanda", .name = "amanda",
...@@ -195,6 +198,7 @@ static struct nf_conntrack_helper amanda_helper[2] __read_mostly = { ...@@ -195,6 +198,7 @@ static struct nf_conntrack_helper amanda_helper[2] __read_mostly = {
.tuple.src.u.udp.port = cpu_to_be16(10080), .tuple.src.u.udp.port = cpu_to_be16(10080),
.tuple.dst.protonum = IPPROTO_UDP, .tuple.dst.protonum = IPPROTO_UDP,
.expect_policy = &amanda_exp_policy, .expect_policy = &amanda_exp_policy,
.nat_mod_name = NF_NAT_HELPER_NAME(HELPER_NAME),
}, },
}; };
......
...@@ -29,11 +29,13 @@ ...@@ -29,11 +29,13 @@
#include <net/netfilter/nf_conntrack_helper.h> #include <net/netfilter/nf_conntrack_helper.h>
#include <linux/netfilter/nf_conntrack_ftp.h> #include <linux/netfilter/nf_conntrack_ftp.h>
#define HELPER_NAME "ftp"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>"); MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>");
MODULE_DESCRIPTION("ftp connection tracking helper"); MODULE_DESCRIPTION("ftp connection tracking helper");
MODULE_ALIAS("ip_conntrack_ftp"); MODULE_ALIAS("ip_conntrack_ftp");
MODULE_ALIAS_NFCT_HELPER("ftp"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
/* This is slow, but it's simple. --RR */ /* This is slow, but it's simple. --RR */
static char *ftp_buffer; static char *ftp_buffer;
...@@ -588,12 +590,14 @@ static int __init nf_conntrack_ftp_init(void) ...@@ -588,12 +590,14 @@ static int __init nf_conntrack_ftp_init(void)
/* FIXME should be configurable whether IPv4 and IPv6 FTP connections /* FIXME should be configurable whether IPv4 and IPv6 FTP connections
are tracked or not - YK */ are tracked or not - YK */
for (i = 0; i < ports_c; i++) { for (i = 0; i < ports_c; i++) {
nf_ct_helper_init(&ftp[2 * i], AF_INET, IPPROTO_TCP, "ftp", nf_ct_helper_init(&ftp[2 * i], AF_INET, IPPROTO_TCP,
FTP_PORT, ports[i], ports[i], &ftp_exp_policy, HELPER_NAME, FTP_PORT, ports[i], ports[i],
0, help, nf_ct_ftp_from_nlattr, THIS_MODULE); &ftp_exp_policy, 0, help,
nf_ct_helper_init(&ftp[2 * i + 1], AF_INET6, IPPROTO_TCP, "ftp", nf_ct_ftp_from_nlattr, THIS_MODULE);
FTP_PORT, ports[i], ports[i], &ftp_exp_policy, nf_ct_helper_init(&ftp[2 * i + 1], AF_INET6, IPPROTO_TCP,
0, help, nf_ct_ftp_from_nlattr, THIS_MODULE); HELPER_NAME, FTP_PORT, ports[i], ports[i],
&ftp_exp_policy, 0, help,
nf_ct_ftp_from_nlattr, THIS_MODULE);
} }
ret = nf_conntrack_helpers_register(ftp, ports_c * 2); ret = nf_conntrack_helpers_register(ftp, ports_c * 2);
......
...@@ -42,6 +42,9 @@ module_param_named(nf_conntrack_helper, nf_ct_auto_assign_helper, bool, 0644); ...@@ -42,6 +42,9 @@ module_param_named(nf_conntrack_helper, nf_ct_auto_assign_helper, bool, 0644);
MODULE_PARM_DESC(nf_conntrack_helper, MODULE_PARM_DESC(nf_conntrack_helper,
"Enable automatic conntrack helper assignment (default 0)"); "Enable automatic conntrack helper assignment (default 0)");
static DEFINE_MUTEX(nf_ct_nat_helpers_mutex);
static struct list_head nf_ct_nat_helpers __read_mostly;
/* Stupid hash, but collision free for the default registrations of the /* Stupid hash, but collision free for the default registrations of the
* helpers currently in the kernel. */ * helpers currently in the kernel. */
static unsigned int helper_hash(const struct nf_conntrack_tuple *tuple) static unsigned int helper_hash(const struct nf_conntrack_tuple *tuple)
...@@ -130,6 +133,70 @@ void nf_conntrack_helper_put(struct nf_conntrack_helper *helper) ...@@ -130,6 +133,70 @@ void nf_conntrack_helper_put(struct nf_conntrack_helper *helper)
} }
EXPORT_SYMBOL_GPL(nf_conntrack_helper_put); EXPORT_SYMBOL_GPL(nf_conntrack_helper_put);
static struct nf_conntrack_nat_helper *
nf_conntrack_nat_helper_find(const char *mod_name)
{
struct nf_conntrack_nat_helper *cur;
bool found = false;
list_for_each_entry_rcu(cur, &nf_ct_nat_helpers, list) {
if (!strcmp(cur->mod_name, mod_name)) {
found = true;
break;
}
}
return found ? cur : NULL;
}
int
nf_nat_helper_try_module_get(const char *name, u16 l3num, u8 protonum)
{
struct nf_conntrack_helper *h;
struct nf_conntrack_nat_helper *nat;
char mod_name[NF_CT_HELPER_NAME_LEN];
int ret = 0;
rcu_read_lock();
h = __nf_conntrack_helper_find(name, l3num, protonum);
if (!h) {
rcu_read_unlock();
return -ENOENT;
}
nat = nf_conntrack_nat_helper_find(h->nat_mod_name);
if (!nat) {
snprintf(mod_name, sizeof(mod_name), "%s", h->nat_mod_name);
rcu_read_unlock();
request_module(mod_name);
rcu_read_lock();
nat = nf_conntrack_nat_helper_find(mod_name);
if (!nat) {
rcu_read_unlock();
return -ENOENT;
}
}
if (!try_module_get(nat->module))
ret = -ENOENT;
rcu_read_unlock();
return ret;
}
EXPORT_SYMBOL_GPL(nf_nat_helper_try_module_get);
void nf_nat_helper_put(struct nf_conntrack_helper *helper)
{
struct nf_conntrack_nat_helper *nat;
nat = nf_conntrack_nat_helper_find(helper->nat_mod_name);
if (WARN_ON_ONCE(!nat))
return;
module_put(nat->module);
}
EXPORT_SYMBOL_GPL(nf_nat_helper_put);
struct nf_conn_help * struct nf_conn_help *
nf_ct_helper_ext_add(struct nf_conn *ct, gfp_t gfp) nf_ct_helper_ext_add(struct nf_conn *ct, gfp_t gfp)
{ {
...@@ -430,6 +497,8 @@ void nf_ct_helper_init(struct nf_conntrack_helper *helper, ...@@ -430,6 +497,8 @@ void nf_ct_helper_init(struct nf_conntrack_helper *helper,
helper->help = help; helper->help = help;
helper->from_nlattr = from_nlattr; helper->from_nlattr = from_nlattr;
helper->me = module; helper->me = module;
snprintf(helper->nat_mod_name, sizeof(helper->nat_mod_name),
NF_NAT_HELPER_PREFIX "%s", name);
if (spec_port == default_port) if (spec_port == default_port)
snprintf(helper->name, sizeof(helper->name), "%s", name); snprintf(helper->name, sizeof(helper->name), "%s", name);
...@@ -466,6 +535,22 @@ void nf_conntrack_helpers_unregister(struct nf_conntrack_helper *helper, ...@@ -466,6 +535,22 @@ void nf_conntrack_helpers_unregister(struct nf_conntrack_helper *helper,
} }
EXPORT_SYMBOL_GPL(nf_conntrack_helpers_unregister); EXPORT_SYMBOL_GPL(nf_conntrack_helpers_unregister);
void nf_nat_helper_register(struct nf_conntrack_nat_helper *nat)
{
mutex_lock(&nf_ct_nat_helpers_mutex);
list_add_rcu(&nat->list, &nf_ct_nat_helpers);
mutex_unlock(&nf_ct_nat_helpers_mutex);
}
EXPORT_SYMBOL_GPL(nf_nat_helper_register);
void nf_nat_helper_unregister(struct nf_conntrack_nat_helper *nat)
{
mutex_lock(&nf_ct_nat_helpers_mutex);
list_del_rcu(&nat->list);
mutex_unlock(&nf_ct_nat_helpers_mutex);
}
EXPORT_SYMBOL_GPL(nf_nat_helper_unregister);
static const struct nf_ct_ext_type helper_extend = { static const struct nf_ct_ext_type helper_extend = {
.len = sizeof(struct nf_conn_help), .len = sizeof(struct nf_conn_help),
.align = __alignof__(struct nf_conn_help), .align = __alignof__(struct nf_conn_help),
...@@ -493,6 +578,7 @@ int nf_conntrack_helper_init(void) ...@@ -493,6 +578,7 @@ int nf_conntrack_helper_init(void)
goto out_extend; goto out_extend;
} }
INIT_LIST_HEAD(&nf_ct_nat_helpers);
return 0; return 0;
out_extend: out_extend:
kvfree(nf_ct_helper_hash); kvfree(nf_ct_helper_hash);
......
...@@ -42,11 +42,13 @@ unsigned int (*nf_nat_irc_hook)(struct sk_buff *skb, ...@@ -42,11 +42,13 @@ unsigned int (*nf_nat_irc_hook)(struct sk_buff *skb,
struct nf_conntrack_expect *exp) __read_mostly; struct nf_conntrack_expect *exp) __read_mostly;
EXPORT_SYMBOL_GPL(nf_nat_irc_hook); EXPORT_SYMBOL_GPL(nf_nat_irc_hook);
#define HELPER_NAME "irc"
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>"); MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
MODULE_DESCRIPTION("IRC (DCC) connection tracking helper"); MODULE_DESCRIPTION("IRC (DCC) connection tracking helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_conntrack_irc"); MODULE_ALIAS("ip_conntrack_irc");
MODULE_ALIAS_NFCT_HELPER("irc"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
module_param_array(ports, ushort, &ports_c, 0400); module_param_array(ports, ushort, &ports_c, 0400);
MODULE_PARM_DESC(ports, "port numbers of IRC servers"); MODULE_PARM_DESC(ports, "port numbers of IRC servers");
...@@ -259,7 +261,7 @@ static int __init nf_conntrack_irc_init(void) ...@@ -259,7 +261,7 @@ static int __init nf_conntrack_irc_init(void)
ports[ports_c++] = IRC_PORT; ports[ports_c++] = IRC_PORT;
for (i = 0; i < ports_c; i++) { for (i = 0; i < ports_c; i++) {
nf_ct_helper_init(&irc[i], AF_INET, IPPROTO_TCP, "irc", nf_ct_helper_init(&irc[i], AF_INET, IPPROTO_TCP, HELPER_NAME,
IRC_PORT, ports[i], i, &irc_exp_policy, IRC_PORT, ports[i], i, &irc_exp_policy,
0, help, NULL, THIS_MODULE); 0, help, NULL, THIS_MODULE);
} }
......
...@@ -30,10 +30,12 @@ ...@@ -30,10 +30,12 @@
#include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_expect.h>
#include <linux/netfilter/nf_conntrack_sane.h> #include <linux/netfilter/nf_conntrack_sane.h>
#define HELPER_NAME "sane"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Michal Schmidt <mschmidt@redhat.com>"); MODULE_AUTHOR("Michal Schmidt <mschmidt@redhat.com>");
MODULE_DESCRIPTION("SANE connection tracking helper"); MODULE_DESCRIPTION("SANE connection tracking helper");
MODULE_ALIAS_NFCT_HELPER("sane"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
static char *sane_buffer; static char *sane_buffer;
...@@ -195,12 +197,12 @@ static int __init nf_conntrack_sane_init(void) ...@@ -195,12 +197,12 @@ static int __init nf_conntrack_sane_init(void)
/* FIXME should be configurable whether IPv4 and IPv6 connections /* FIXME should be configurable whether IPv4 and IPv6 connections
are tracked or not - YK */ are tracked or not - YK */
for (i = 0; i < ports_c; i++) { for (i = 0; i < ports_c; i++) {
nf_ct_helper_init(&sane[2 * i], AF_INET, IPPROTO_TCP, "sane", nf_ct_helper_init(&sane[2 * i], AF_INET, IPPROTO_TCP,
SANE_PORT, ports[i], ports[i], HELPER_NAME, SANE_PORT, ports[i], ports[i],
&sane_exp_policy, 0, help, NULL, &sane_exp_policy, 0, help, NULL,
THIS_MODULE); THIS_MODULE);
nf_ct_helper_init(&sane[2 * i + 1], AF_INET6, IPPROTO_TCP, "sane", nf_ct_helper_init(&sane[2 * i + 1], AF_INET6, IPPROTO_TCP,
SANE_PORT, ports[i], ports[i], HELPER_NAME, SANE_PORT, ports[i], ports[i],
&sane_exp_policy, 0, help, NULL, &sane_exp_policy, 0, help, NULL,
THIS_MODULE); THIS_MODULE);
} }
......
...@@ -30,11 +30,13 @@ ...@@ -30,11 +30,13 @@
#include <net/netfilter/nf_conntrack_zones.h> #include <net/netfilter/nf_conntrack_zones.h>
#include <linux/netfilter/nf_conntrack_sip.h> #include <linux/netfilter/nf_conntrack_sip.h>
#define HELPER_NAME "sip"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>"); MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>");
MODULE_DESCRIPTION("SIP connection tracking helper"); MODULE_DESCRIPTION("SIP connection tracking helper");
MODULE_ALIAS("ip_conntrack_sip"); MODULE_ALIAS("ip_conntrack_sip");
MODULE_ALIAS_NFCT_HELPER("sip"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
#define MAX_PORTS 8 #define MAX_PORTS 8
static unsigned short ports[MAX_PORTS]; static unsigned short ports[MAX_PORTS];
...@@ -1669,21 +1671,21 @@ static int __init nf_conntrack_sip_init(void) ...@@ -1669,21 +1671,21 @@ static int __init nf_conntrack_sip_init(void)
ports[ports_c++] = SIP_PORT; ports[ports_c++] = SIP_PORT;
for (i = 0; i < ports_c; i++) { for (i = 0; i < ports_c; i++) {
nf_ct_helper_init(&sip[4 * i], AF_INET, IPPROTO_UDP, "sip", nf_ct_helper_init(&sip[4 * i], AF_INET, IPPROTO_UDP,
SIP_PORT, ports[i], i, sip_exp_policy, HELPER_NAME, SIP_PORT, ports[i], i,
SIP_EXPECT_MAX, sip_help_udp, sip_exp_policy, SIP_EXPECT_MAX, sip_help_udp,
NULL, THIS_MODULE); NULL, THIS_MODULE);
nf_ct_helper_init(&sip[4 * i + 1], AF_INET, IPPROTO_TCP, "sip", nf_ct_helper_init(&sip[4 * i + 1], AF_INET, IPPROTO_TCP,
SIP_PORT, ports[i], i, sip_exp_policy, HELPER_NAME, SIP_PORT, ports[i], i,
SIP_EXPECT_MAX, sip_help_tcp, sip_exp_policy, SIP_EXPECT_MAX, sip_help_tcp,
NULL, THIS_MODULE); NULL, THIS_MODULE);
nf_ct_helper_init(&sip[4 * i + 2], AF_INET6, IPPROTO_UDP, "sip", nf_ct_helper_init(&sip[4 * i + 2], AF_INET6, IPPROTO_UDP,
SIP_PORT, ports[i], i, sip_exp_policy, HELPER_NAME, SIP_PORT, ports[i], i,
SIP_EXPECT_MAX, sip_help_udp, sip_exp_policy, SIP_EXPECT_MAX, sip_help_udp,
NULL, THIS_MODULE); NULL, THIS_MODULE);
nf_ct_helper_init(&sip[4 * i + 3], AF_INET6, IPPROTO_TCP, "sip", nf_ct_helper_init(&sip[4 * i + 3], AF_INET6, IPPROTO_TCP,
SIP_PORT, ports[i], i, sip_exp_policy, HELPER_NAME, SIP_PORT, ports[i], i,
SIP_EXPECT_MAX, sip_help_tcp, sip_exp_policy, SIP_EXPECT_MAX, sip_help_tcp,
NULL, THIS_MODULE); NULL, THIS_MODULE);
} }
......
...@@ -511,6 +511,8 @@ static void nf_conntrack_standalone_fini_proc(struct net *net) ...@@ -511,6 +511,8 @@ static void nf_conntrack_standalone_fini_proc(struct net *net)
/* Log invalid packets of a given protocol */ /* Log invalid packets of a given protocol */
static int log_invalid_proto_min __read_mostly; static int log_invalid_proto_min __read_mostly;
static int log_invalid_proto_max __read_mostly = 255; static int log_invalid_proto_max __read_mostly = 255;
static int zero;
static int one = 1;
/* size the user *wants to set */ /* size the user *wants to set */
static unsigned int nf_conntrack_htable_size_user __read_mostly; static unsigned int nf_conntrack_htable_size_user __read_mostly;
...@@ -624,9 +626,11 @@ static struct ctl_table nf_ct_sysctl_table[] = { ...@@ -624,9 +626,11 @@ static struct ctl_table nf_ct_sysctl_table[] = {
[NF_SYSCTL_CT_CHECKSUM] = { [NF_SYSCTL_CT_CHECKSUM] = {
.procname = "nf_conntrack_checksum", .procname = "nf_conntrack_checksum",
.data = &init_net.ct.sysctl_checksum, .data = &init_net.ct.sysctl_checksum,
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
[NF_SYSCTL_CT_LOG_INVALID] = { [NF_SYSCTL_CT_LOG_INVALID] = {
.procname = "nf_conntrack_log_invalid", .procname = "nf_conntrack_log_invalid",
...@@ -647,33 +651,41 @@ static struct ctl_table nf_ct_sysctl_table[] = { ...@@ -647,33 +651,41 @@ static struct ctl_table nf_ct_sysctl_table[] = {
[NF_SYSCTL_CT_ACCT] = { [NF_SYSCTL_CT_ACCT] = {
.procname = "nf_conntrack_acct", .procname = "nf_conntrack_acct",
.data = &init_net.ct.sysctl_acct, .data = &init_net.ct.sysctl_acct,
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
[NF_SYSCTL_CT_HELPER] = { [NF_SYSCTL_CT_HELPER] = {
.procname = "nf_conntrack_helper", .procname = "nf_conntrack_helper",
.data = &init_net.ct.sysctl_auto_assign_helper, .data = &init_net.ct.sysctl_auto_assign_helper,
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
#ifdef CONFIG_NF_CONNTRACK_EVENTS #ifdef CONFIG_NF_CONNTRACK_EVENTS
[NF_SYSCTL_CT_EVENTS] = { [NF_SYSCTL_CT_EVENTS] = {
.procname = "nf_conntrack_events", .procname = "nf_conntrack_events",
.data = &init_net.ct.sysctl_events, .data = &init_net.ct.sysctl_events,
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
#endif #endif
#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
[NF_SYSCTL_CT_TIMESTAMP] = { [NF_SYSCTL_CT_TIMESTAMP] = {
.procname = "nf_conntrack_timestamp", .procname = "nf_conntrack_timestamp",
.data = &init_net.ct.sysctl_tstamp, .data = &init_net.ct.sysctl_tstamp,
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
#endif #endif
[NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC] = { [NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC] = {
...@@ -744,15 +756,19 @@ static struct ctl_table nf_ct_sysctl_table[] = { ...@@ -744,15 +756,19 @@ static struct ctl_table nf_ct_sysctl_table[] = {
}, },
[NF_SYSCTL_CT_PROTO_TCP_LOOSE] = { [NF_SYSCTL_CT_PROTO_TCP_LOOSE] = {
.procname = "nf_conntrack_tcp_loose", .procname = "nf_conntrack_tcp_loose",
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
[NF_SYSCTL_CT_PROTO_TCP_LIBERAL] = { [NF_SYSCTL_CT_PROTO_TCP_LIBERAL] = {
.procname = "nf_conntrack_tcp_be_liberal", .procname = "nf_conntrack_tcp_be_liberal",
.maxlen = sizeof(unsigned int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
[NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS] = { [NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS] = {
.procname = "nf_conntrack_tcp_max_retrans", .procname = "nf_conntrack_tcp_max_retrans",
...@@ -887,7 +903,9 @@ static struct ctl_table nf_ct_sysctl_table[] = { ...@@ -887,7 +903,9 @@ static struct ctl_table nf_ct_sysctl_table[] = {
.procname = "nf_conntrack_dccp_loose", .procname = "nf_conntrack_dccp_loose",
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec_minmax,
.extra1 = &zero,
.extra2 = &one,
}, },
#endif #endif
#ifdef CONFIG_NF_CT_PROTO_GRE #ifdef CONFIG_NF_CT_PROTO_GRE
......
...@@ -20,11 +20,13 @@ ...@@ -20,11 +20,13 @@
#include <net/netfilter/nf_conntrack_helper.h> #include <net/netfilter/nf_conntrack_helper.h>
#include <linux/netfilter/nf_conntrack_tftp.h> #include <linux/netfilter/nf_conntrack_tftp.h>
#define HELPER_NAME "tftp"
MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>"); MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>");
MODULE_DESCRIPTION("TFTP connection tracking helper"); MODULE_DESCRIPTION("TFTP connection tracking helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_conntrack_tftp"); MODULE_ALIAS("ip_conntrack_tftp");
MODULE_ALIAS_NFCT_HELPER("tftp"); MODULE_ALIAS_NFCT_HELPER(HELPER_NAME);
#define MAX_PORTS 8 #define MAX_PORTS 8
static unsigned short ports[MAX_PORTS]; static unsigned short ports[MAX_PORTS];
...@@ -119,12 +121,14 @@ static int __init nf_conntrack_tftp_init(void) ...@@ -119,12 +121,14 @@ static int __init nf_conntrack_tftp_init(void)
ports[ports_c++] = TFTP_PORT; ports[ports_c++] = TFTP_PORT;
for (i = 0; i < ports_c; i++) { for (i = 0; i < ports_c; i++) {
nf_ct_helper_init(&tftp[2 * i], AF_INET, IPPROTO_UDP, "tftp", nf_ct_helper_init(&tftp[2 * i], AF_INET, IPPROTO_UDP,
TFTP_PORT, ports[i], i, &tftp_exp_policy, HELPER_NAME, TFTP_PORT, ports[i], i,
0, tftp_help, NULL, THIS_MODULE); &tftp_exp_policy, 0, tftp_help, NULL,
nf_ct_helper_init(&tftp[2 * i + 1], AF_INET6, IPPROTO_UDP, "tftp", THIS_MODULE);
TFTP_PORT, ports[i], i, &tftp_exp_policy, nf_ct_helper_init(&tftp[2 * i + 1], AF_INET6, IPPROTO_UDP,
0, tftp_help, NULL, THIS_MODULE); HELPER_NAME, TFTP_PORT, ports[i], i,
&tftp_exp_policy, 0, tftp_help, NULL,
THIS_MODULE);
} }
ret = nf_conntrack_helpers_register(tftp, ports_c * 2); ret = nf_conntrack_helpers_register(tftp, ports_c * 2);
......
...@@ -19,10 +19,15 @@ ...@@ -19,10 +19,15 @@
#include <net/netfilter/nf_nat_helper.h> #include <net/netfilter/nf_nat_helper.h>
#include <linux/netfilter/nf_conntrack_amanda.h> #include <linux/netfilter/nf_conntrack_amanda.h>
#define NAT_HELPER_NAME "amanda"
MODULE_AUTHOR("Brian J. Murrell <netfilter@interlinx.bc.ca>"); MODULE_AUTHOR("Brian J. Murrell <netfilter@interlinx.bc.ca>");
MODULE_DESCRIPTION("Amanda NAT helper"); MODULE_DESCRIPTION("Amanda NAT helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_nat_amanda"); MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
static struct nf_conntrack_nat_helper nat_helper_amanda =
NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
static unsigned int help(struct sk_buff *skb, static unsigned int help(struct sk_buff *skb,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
...@@ -74,6 +79,7 @@ static unsigned int help(struct sk_buff *skb, ...@@ -74,6 +79,7 @@ static unsigned int help(struct sk_buff *skb,
static void __exit nf_nat_amanda_fini(void) static void __exit nf_nat_amanda_fini(void)
{ {
nf_nat_helper_unregister(&nat_helper_amanda);
RCU_INIT_POINTER(nf_nat_amanda_hook, NULL); RCU_INIT_POINTER(nf_nat_amanda_hook, NULL);
synchronize_rcu(); synchronize_rcu();
} }
...@@ -81,6 +87,7 @@ static void __exit nf_nat_amanda_fini(void) ...@@ -81,6 +87,7 @@ static void __exit nf_nat_amanda_fini(void)
static int __init nf_nat_amanda_init(void) static int __init nf_nat_amanda_init(void)
{ {
BUG_ON(nf_nat_amanda_hook != NULL); BUG_ON(nf_nat_amanda_hook != NULL);
nf_nat_helper_register(&nat_helper_amanda);
RCU_INIT_POINTER(nf_nat_amanda_hook, help); RCU_INIT_POINTER(nf_nat_amanda_hook, help);
return 0; return 0;
} }
......
...@@ -21,13 +21,18 @@ ...@@ -21,13 +21,18 @@
#include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_expect.h>
#include <linux/netfilter/nf_conntrack_ftp.h> #include <linux/netfilter/nf_conntrack_ftp.h>
#define NAT_HELPER_NAME "ftp"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>"); MODULE_AUTHOR("Rusty Russell <rusty@rustcorp.com.au>");
MODULE_DESCRIPTION("ftp NAT helper"); MODULE_DESCRIPTION("ftp NAT helper");
MODULE_ALIAS("ip_nat_ftp"); MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
/* FIXME: Time out? --RR */ /* FIXME: Time out? --RR */
static struct nf_conntrack_nat_helper nat_helper_ftp =
NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
static int nf_nat_ftp_fmt_cmd(struct nf_conn *ct, enum nf_ct_ftp_type type, static int nf_nat_ftp_fmt_cmd(struct nf_conn *ct, enum nf_ct_ftp_type type,
char *buffer, size_t buflen, char *buffer, size_t buflen,
union nf_inet_addr *addr, u16 port) union nf_inet_addr *addr, u16 port)
...@@ -124,6 +129,7 @@ static unsigned int nf_nat_ftp(struct sk_buff *skb, ...@@ -124,6 +129,7 @@ static unsigned int nf_nat_ftp(struct sk_buff *skb,
static void __exit nf_nat_ftp_fini(void) static void __exit nf_nat_ftp_fini(void)
{ {
nf_nat_helper_unregister(&nat_helper_ftp);
RCU_INIT_POINTER(nf_nat_ftp_hook, NULL); RCU_INIT_POINTER(nf_nat_ftp_hook, NULL);
synchronize_rcu(); synchronize_rcu();
} }
...@@ -131,6 +137,7 @@ static void __exit nf_nat_ftp_fini(void) ...@@ -131,6 +137,7 @@ static void __exit nf_nat_ftp_fini(void)
static int __init nf_nat_ftp_init(void) static int __init nf_nat_ftp_init(void)
{ {
BUG_ON(nf_nat_ftp_hook != NULL); BUG_ON(nf_nat_ftp_hook != NULL);
nf_nat_helper_register(&nat_helper_ftp);
RCU_INIT_POINTER(nf_nat_ftp_hook, nf_nat_ftp); RCU_INIT_POINTER(nf_nat_ftp_hook, nf_nat_ftp);
return 0; return 0;
} }
......
...@@ -23,10 +23,15 @@ ...@@ -23,10 +23,15 @@
#include <net/netfilter/nf_conntrack_expect.h> #include <net/netfilter/nf_conntrack_expect.h>
#include <linux/netfilter/nf_conntrack_irc.h> #include <linux/netfilter/nf_conntrack_irc.h>
#define NAT_HELPER_NAME "irc"
MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>"); MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>");
MODULE_DESCRIPTION("IRC (DCC) NAT helper"); MODULE_DESCRIPTION("IRC (DCC) NAT helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_nat_irc"); MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
static struct nf_conntrack_nat_helper nat_helper_irc =
NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
static unsigned int help(struct sk_buff *skb, static unsigned int help(struct sk_buff *skb,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
...@@ -96,6 +101,7 @@ static unsigned int help(struct sk_buff *skb, ...@@ -96,6 +101,7 @@ static unsigned int help(struct sk_buff *skb,
static void __exit nf_nat_irc_fini(void) static void __exit nf_nat_irc_fini(void)
{ {
nf_nat_helper_unregister(&nat_helper_irc);
RCU_INIT_POINTER(nf_nat_irc_hook, NULL); RCU_INIT_POINTER(nf_nat_irc_hook, NULL);
synchronize_rcu(); synchronize_rcu();
} }
...@@ -103,6 +109,7 @@ static void __exit nf_nat_irc_fini(void) ...@@ -103,6 +109,7 @@ static void __exit nf_nat_irc_fini(void)
static int __init nf_nat_irc_init(void) static int __init nf_nat_irc_init(void)
{ {
BUG_ON(nf_nat_irc_hook != NULL); BUG_ON(nf_nat_irc_hook != NULL);
nf_nat_helper_register(&nat_helper_irc);
RCU_INIT_POINTER(nf_nat_irc_hook, help); RCU_INIT_POINTER(nf_nat_irc_hook, help);
return 0; return 0;
} }
......
...@@ -24,11 +24,15 @@ ...@@ -24,11 +24,15 @@
#include <net/netfilter/nf_conntrack_seqadj.h> #include <net/netfilter/nf_conntrack_seqadj.h>
#include <linux/netfilter/nf_conntrack_sip.h> #include <linux/netfilter/nf_conntrack_sip.h>
#define NAT_HELPER_NAME "sip"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>"); MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>");
MODULE_DESCRIPTION("SIP NAT helper"); MODULE_DESCRIPTION("SIP NAT helper");
MODULE_ALIAS("ip_nat_sip"); MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
static struct nf_conntrack_nat_helper nat_helper_sip =
NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
static unsigned int mangle_packet(struct sk_buff *skb, unsigned int protoff, static unsigned int mangle_packet(struct sk_buff *skb, unsigned int protoff,
unsigned int dataoff, unsigned int dataoff,
...@@ -656,8 +660,8 @@ static struct nf_ct_helper_expectfn sip_nat = { ...@@ -656,8 +660,8 @@ static struct nf_ct_helper_expectfn sip_nat = {
static void __exit nf_nat_sip_fini(void) static void __exit nf_nat_sip_fini(void)
{ {
nf_nat_helper_unregister(&nat_helper_sip);
RCU_INIT_POINTER(nf_nat_sip_hooks, NULL); RCU_INIT_POINTER(nf_nat_sip_hooks, NULL);
nf_ct_helper_expectfn_unregister(&sip_nat); nf_ct_helper_expectfn_unregister(&sip_nat);
synchronize_rcu(); synchronize_rcu();
} }
...@@ -675,6 +679,7 @@ static const struct nf_nat_sip_hooks sip_hooks = { ...@@ -675,6 +679,7 @@ static const struct nf_nat_sip_hooks sip_hooks = {
static int __init nf_nat_sip_init(void) static int __init nf_nat_sip_init(void)
{ {
BUG_ON(nf_nat_sip_hooks != NULL); BUG_ON(nf_nat_sip_hooks != NULL);
nf_nat_helper_register(&nat_helper_sip);
RCU_INIT_POINTER(nf_nat_sip_hooks, &sip_hooks); RCU_INIT_POINTER(nf_nat_sip_hooks, &sip_hooks);
nf_ct_helper_expectfn_register(&sip_nat); nf_ct_helper_expectfn_register(&sip_nat);
return 0; return 0;
......
...@@ -13,10 +13,15 @@ ...@@ -13,10 +13,15 @@
#include <net/netfilter/nf_nat_helper.h> #include <net/netfilter/nf_nat_helper.h>
#include <linux/netfilter/nf_conntrack_tftp.h> #include <linux/netfilter/nf_conntrack_tftp.h>
#define NAT_HELPER_NAME "tftp"
MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>"); MODULE_AUTHOR("Magnus Boden <mb@ozaba.mine.nu>");
MODULE_DESCRIPTION("TFTP NAT helper"); MODULE_DESCRIPTION("TFTP NAT helper");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("ip_nat_tftp"); MODULE_ALIAS_NF_NAT_HELPER(NAT_HELPER_NAME);
static struct nf_conntrack_nat_helper nat_helper_tftp =
NF_CT_NAT_HELPER_INIT(NAT_HELPER_NAME);
static unsigned int help(struct sk_buff *skb, static unsigned int help(struct sk_buff *skb,
enum ip_conntrack_info ctinfo, enum ip_conntrack_info ctinfo,
...@@ -37,6 +42,7 @@ static unsigned int help(struct sk_buff *skb, ...@@ -37,6 +42,7 @@ static unsigned int help(struct sk_buff *skb,
static void __exit nf_nat_tftp_fini(void) static void __exit nf_nat_tftp_fini(void)
{ {
nf_nat_helper_unregister(&nat_helper_tftp);
RCU_INIT_POINTER(nf_nat_tftp_hook, NULL); RCU_INIT_POINTER(nf_nat_tftp_hook, NULL);
synchronize_rcu(); synchronize_rcu();
} }
...@@ -44,6 +50,7 @@ static void __exit nf_nat_tftp_fini(void) ...@@ -44,6 +50,7 @@ static void __exit nf_nat_tftp_fini(void)
static int __init nf_nat_tftp_init(void) static int __init nf_nat_tftp_init(void)
{ {
BUG_ON(nf_nat_tftp_hook != NULL); BUG_ON(nf_nat_tftp_hook != NULL);
nf_nat_helper_register(&nat_helper_tftp);
RCU_INIT_POINTER(nf_nat_tftp_hook, help); RCU_INIT_POINTER(nf_nat_tftp_hook, help);
return 0; return 0;
} }
......
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
#include <linux/module.h>
#include <net/netfilter/nf_tables_core.h> #include <net/netfilter/nf_tables_core.h>
static int __init nf_tables_set_module_init(void) static int __init nf_tables_set_module_init(void)
......
...@@ -178,6 +178,11 @@ static void nft_ct_get_eval(const struct nft_expr *expr, ...@@ -178,6 +178,11 @@ static void nft_ct_get_eval(const struct nft_expr *expr,
return; return;
} }
#endif #endif
case NFT_CT_ID:
if (!nf_ct_is_confirmed(ct))
goto err;
*dest = nf_ct_get_id(ct);
return;
default: default:
break; break;
} }
...@@ -479,6 +484,9 @@ static int nft_ct_get_init(const struct nft_ctx *ctx, ...@@ -479,6 +484,9 @@ static int nft_ct_get_init(const struct nft_ctx *ctx,
len = sizeof(u16); len = sizeof(u16);
break; break;
#endif #endif
case NFT_CT_ID:
len = sizeof(u32);
break;
default: default:
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -28,6 +28,23 @@ struct nft_dynset { ...@@ -28,6 +28,23 @@ struct nft_dynset {
struct nft_set_binding binding; struct nft_set_binding binding;
}; };
static int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
{
int err;
if (src->ops->clone) {
dst->ops = src->ops;
err = src->ops->clone(dst, src);
if (err < 0)
return err;
} else {
memcpy(dst, src, src->ops->size);
}
__module_get(src->ops->type->owner);
return 0;
}
static void *nft_dynset_new(struct nft_set *set, const struct nft_expr *expr, static void *nft_dynset_new(struct nft_set *set, const struct nft_expr *expr,
struct nft_regs *regs) struct nft_regs *regs)
{ {
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Florian Westphal <fw@strlen.de>"); MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
MODULE_DESCRIPTION("Xtables: add/match connection trackling labels"); MODULE_DESCRIPTION("Xtables: add/match connection tracking labels");
MODULE_ALIAS("ipt_connlabel"); MODULE_ALIAS("ipt_connlabel");
MODULE_ALIAS("ip6t_connlabel"); MODULE_ALIAS("ip6t_connlabel");
......
...@@ -288,8 +288,7 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg, ...@@ -288,8 +288,7 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg,
size = 16; size = 16;
} }
/* FIXME: don't use vmalloc() here or anywhere else -HW */ /* FIXME: don't use vmalloc() here or anywhere else -HW */
hinfo = vmalloc(sizeof(struct xt_hashlimit_htable) + hinfo = vmalloc(struct_size(hinfo, hash, size));
sizeof(struct hlist_head) * size);
if (hinfo == NULL) if (hinfo == NULL)
return -ENOMEM; return -ENOMEM;
*out_hinfo = hinfo; *out_hinfo = hinfo;
......
...@@ -1307,6 +1307,7 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name, ...@@ -1307,6 +1307,7 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name,
{ {
struct nf_conntrack_helper *helper; struct nf_conntrack_helper *helper;
struct nf_conn_help *help; struct nf_conn_help *help;
int ret = 0;
helper = nf_conntrack_helper_try_module_get(name, info->family, helper = nf_conntrack_helper_try_module_get(name, info->family,
key->ip.proto); key->ip.proto);
...@@ -1321,13 +1322,21 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name, ...@@ -1321,13 +1322,21 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name,
return -ENOMEM; return -ENOMEM;
} }
#ifdef CONFIG_NF_NAT_NEEDED
if (info->nat) {
ret = nf_nat_helper_try_module_get(name, info->family,
key->ip.proto);
if (ret) {
nf_conntrack_helper_put(helper);
OVS_NLERR(log, "Failed to load \"%s\" NAT helper, error: %d",
name, ret);
return ret;
}
}
#endif
rcu_assign_pointer(help->helper, helper); rcu_assign_pointer(help->helper, helper);
info->helper = helper; info->helper = helper;
return ret;
if (info->nat)
request_module("ip_nat_%s", name);
return 0;
} }
#if IS_ENABLED(CONFIG_NF_NAT) #if IS_ENABLED(CONFIG_NF_NAT)
...@@ -1801,8 +1810,13 @@ void ovs_ct_free_action(const struct nlattr *a) ...@@ -1801,8 +1810,13 @@ void ovs_ct_free_action(const struct nlattr *a)
static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info) static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info)
{ {
if (ct_info->helper) if (ct_info->helper) {
#ifdef CONFIG_NF_NAT_NEEDED
if (ct_info->nat)
nf_nat_helper_put(ct_info->helper);
#endif
nf_conntrack_helper_put(ct_info->helper); nf_conntrack_helper_put(ct_info->helper);
}
if (ct_info->ct) { if (ct_info->ct) {
if (ct_info->timeout[0]) if (ct_info->timeout[0])
nf_ct_destroy_timeout(ct_info->ct); nf_ct_destroy_timeout(ct_info->ct);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment