diff options
author | Patrick McHardy <kaber@trash.net> | 2010-02-03 14:13:03 +0100 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2010-02-03 14:40:17 +0100 |
commit | b2a15a604d379af323645e330638e2cfcc696aff (patch) | |
tree | 75a863636fae6f5e3fcf3dacbdee3ccf1f8b7c8d /net/netfilter/nf_conntrack_helper.c | |
parent | 0cebe4b4163b6373c9d24c1a192939777bc27e55 (diff) | |
download | kernel_samsung_espresso10-b2a15a604d379af323645e330638e2cfcc696aff.zip kernel_samsung_espresso10-b2a15a604d379af323645e330638e2cfcc696aff.tar.gz kernel_samsung_espresso10-b2a15a604d379af323645e330638e2cfcc696aff.tar.bz2 |
netfilter: nf_conntrack: support conntrack templates
Support initializing selected parameters of new conntrack entries from a
"conntrack template", which is a specially marked conntrack entry attached
to the skb.
Currently the helper and the event delivery masks can be initialized this
way.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net/netfilter/nf_conntrack_helper.c')
-rw-r--r-- | net/netfilter/nf_conntrack_helper.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index c0e461f..8144b0d 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c @@ -96,13 +96,22 @@ struct nf_conn_help *nf_ct_helper_ext_add(struct nf_conn *ct, gfp_t gfp) } EXPORT_SYMBOL_GPL(nf_ct_helper_ext_add); -int __nf_ct_try_assign_helper(struct nf_conn *ct, gfp_t flags) +int __nf_ct_try_assign_helper(struct nf_conn *ct, struct nf_conn *tmpl, + gfp_t flags) { + struct nf_conntrack_helper *helper = NULL; + struct nf_conn_help *help; int ret = 0; - struct nf_conntrack_helper *helper; - struct nf_conn_help *help = nfct_help(ct); - helper = __nf_ct_helper_find(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); + if (tmpl != NULL) { + help = nfct_help(tmpl); + if (help != NULL) + helper = help->helper; + } + + help = nfct_help(ct); + if (helper == NULL) + helper = __nf_ct_helper_find(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); if (helper == NULL) { if (help) rcu_assign_pointer(help->helper, NULL); |