Commit 08010a21 authored by Flavio Leitner's avatar Flavio Leitner Committed by Pablo Neira Ayuso

netfilter: add API to manage NAT helpers.

The API allows a conntrack helper to indicate its corresponding
NAT helper which then can be loaded and reference counted.
Signed-off-by: default avatarFlavio Leitner <fbl@redhat.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent e1f172e1
...@@ -15,7 +15,8 @@ ...@@ -15,7 +15,8 @@
#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_NAME(name) "ip_nat_" name #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) \ #define MODULE_ALIAS_NF_NAT_HELPER(name) \
MODULE_ALIAS(NF_NAT_HELPER_NAME(name)) MODULE_ALIAS(NF_NAT_HELPER_NAME(name))
...@@ -58,6 +59,8 @@ struct nf_conntrack_helper { ...@@ -58,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 */
...@@ -157,4 +160,21 @@ nf_ct_helper_expectfn_find_by_symbol(const void *symbol); ...@@ -157,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*/
...@@ -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);
} }
......
...@@ -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);
......
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