OSDN Git Service

net: move add ct helper function to nf_conntrack_helper for ovs and tc
authorXin Long <lucien.xin@gmail.com>
Sun, 6 Nov 2022 20:34:15 +0000 (15:34 -0500)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 8 Nov 2022 11:15:19 +0000 (12:15 +0100)
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>
include/net/netfilter/nf_conntrack_helper.h
net/netfilter/nf_conntrack_helper.c
net/openvswitch/conntrack.c

index b667624..f30b169 100644 (file)
@@ -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);
 
index 88039ee..48ea6d0 100644 (file)
@@ -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)
 {
index 18f54fa..4348321 100644 (file)
@@ -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,