|
@@ -643,6 +643,7 @@ struct ip_vs_service {
|
|
|
|
|
|
/* alternate persistence engine */
|
|
|
struct ip_vs_pe __rcu *pe;
|
|
|
+ int conntrack_afmask;
|
|
|
|
|
|
struct rcu_head rcu_head;
|
|
|
};
|
|
@@ -1620,6 +1621,35 @@ static inline bool ip_vs_conn_uses_conntrack(struct ip_vs_conn *cp,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static inline int ip_vs_register_conntrack(struct ip_vs_service *svc)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
|
|
+ int afmask = (svc->af == AF_INET6) ? 2 : 1;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!(svc->conntrack_afmask & afmask)) {
|
|
|
+ ret = nf_ct_netns_get(svc->ipvs->net, svc->af);
|
|
|
+ if (ret >= 0)
|
|
|
+ svc->conntrack_afmask |= afmask;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+#else
|
|
|
+ return 0;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+static inline void ip_vs_unregister_conntrack(struct ip_vs_service *svc)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_NF_CONNTRACK)
|
|
|
+ int afmask = (svc->af == AF_INET6) ? 2 : 1;
|
|
|
+
|
|
|
+ if (svc->conntrack_afmask & afmask) {
|
|
|
+ nf_ct_netns_put(svc->ipvs->net, svc->af);
|
|
|
+ svc->conntrack_afmask &= ~afmask;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
static inline int
|
|
|
ip_vs_dest_conn_overhead(struct ip_vs_dest *dest)
|
|
|
{
|