net: move add ct helper function to nf_conntrack_helper for ovs and tc
Move ovs_ct_add_helper from openvswitch to nf_conntrack_helper and rename as nf_ct_add_helper, so that it can be used in TC act_ct in the next patch. Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
ca71277f36
commit
f96cba2eb9
@ -117,6 +117,8 @@ int __nf_ct_try_assign_helper(struct nf_conn *ct, struct nf_conn *tmpl,
|
||||
|
||||
int nf_ct_helper(struct sk_buff *skb, struct nf_conn *ct,
|
||||
enum ip_conntrack_info ctinfo, u16 proto);
|
||||
int nf_ct_add_helper(struct nf_conn *ct, const char *name, u8 family,
|
||||
u8 proto, bool nat, struct nf_conntrack_helper **hp);
|
||||
|
||||
void nf_ct_helper_destroy(struct nf_conn *ct);
|
||||
|
||||
|
@ -309,6 +309,37 @@ int nf_ct_helper(struct sk_buff *skb, struct nf_conn *ct,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_helper);
|
||||
|
||||
int nf_ct_add_helper(struct nf_conn *ct, const char *name, u8 family,
|
||||
u8 proto, bool nat, struct nf_conntrack_helper **hp)
|
||||
{
|
||||
struct nf_conntrack_helper *helper;
|
||||
struct nf_conn_help *help;
|
||||
int ret = 0;
|
||||
|
||||
helper = nf_conntrack_helper_try_module_get(name, family, proto);
|
||||
if (!helper)
|
||||
return -EINVAL;
|
||||
|
||||
help = nf_ct_helper_ext_add(ct, GFP_KERNEL);
|
||||
if (!help) {
|
||||
nf_conntrack_helper_put(helper);
|
||||
return -ENOMEM;
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
if (nat) {
|
||||
ret = nf_nat_helper_try_module_get(name, family, proto);
|
||||
if (ret) {
|
||||
nf_conntrack_helper_put(helper);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
rcu_assign_pointer(help->helper, helper);
|
||||
*hp = helper;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_add_helper);
|
||||
|
||||
/* appropriate ct lock protecting must be taken by caller */
|
||||
static int unhelp(struct nf_conn *ct, void *me)
|
||||
{
|
||||
|
@ -1291,43 +1291,6 @@ int ovs_ct_clear(struct sk_buff *skb, struct sw_flow_key *key)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name,
|
||||
const struct sw_flow_key *key, bool log)
|
||||
{
|
||||
struct nf_conntrack_helper *helper;
|
||||
struct nf_conn_help *help;
|
||||
int ret = 0;
|
||||
|
||||
helper = nf_conntrack_helper_try_module_get(name, info->family,
|
||||
key->ip.proto);
|
||||
if (!helper) {
|
||||
OVS_NLERR(log, "Unknown helper \"%s\"", name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
help = nf_ct_helper_ext_add(info->ct, GFP_KERNEL);
|
||||
if (!help) {
|
||||
nf_conntrack_helper_put(helper);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
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);
|
||||
info->helper = helper;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
static int parse_nat(const struct nlattr *attr,
|
||||
struct ovs_conntrack_info *info, bool log)
|
||||
@ -1661,9 +1624,12 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
|
||||
}
|
||||
|
||||
if (helper) {
|
||||
err = ovs_ct_add_helper(&ct_info, helper, key, log);
|
||||
if (err)
|
||||
err = nf_ct_add_helper(ct_info.ct, helper, ct_info.family,
|
||||
key->ip.proto, ct_info.nat, &ct_info.helper);
|
||||
if (err) {
|
||||
OVS_NLERR(log, "Failed to add %s helper %d", helper, err);
|
||||
goto err_free_ct;
|
||||
}
|
||||
}
|
||||
|
||||
err = ovs_nla_add_action(sfa, OVS_ACTION_ATTR_CT, &ct_info,
|
||||
|
Loading…
Reference in New Issue
Block a user