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);
 
 
 }
 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)
 {
 
        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)
        }
 
        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,