void (*exit_netns)(struct netns_ipvs *ipvs, struct ip_vs_proto_data *pd);
 
-       int (*conn_schedule)(int af, struct sk_buff *skb,
+       int (*conn_schedule)(struct netns_ipvs *ipvs,
+                            int af, struct sk_buff *skb,
                             struct ip_vs_proto_data *pd,
                             int *verdict, struct ip_vs_conn **cpp,
                             struct ip_vs_iphdr *iph);
 
 #endif
 
 static unsigned int
-ip_vs_try_to_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
+ip_vs_try_to_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
+                     struct ip_vs_proto_data *pd,
                      int *verdict, struct ip_vs_conn **cpp,
                      struct ip_vs_iphdr *iph)
 {
                 */
 
                /* Schedule and create new connection entry into cpp */
-               if (!pp->conn_schedule(af, skb, pd, verdict, cpp, iph))
+               if (!pp->conn_schedule(ipvs, af, skb, pd, verdict, cpp, iph))
                        return 0;
        }
 
                if (!sysctl_schedule_icmp(ipvs))
                        return NF_ACCEPT;
 
-               if (!ip_vs_try_to_schedule(AF_INET, skb, pd, &v, &cp, &ciph))
+               if (!ip_vs_try_to_schedule(ipvs, AF_INET, skb, pd, &v, &cp, &ciph))
                        return v;
                new_cp = true;
        }
                if (!sysctl_schedule_icmp(ipvs))
                        return NF_ACCEPT;
 
-               if (!ip_vs_try_to_schedule(AF_INET6, skb, pd, &v, &cp, &ciph))
+               if (!ip_vs_try_to_schedule(ipvs, AF_INET6, skb, pd, &v, &cp, &ciph))
                        return v;
 
                new_cp = true;
        if (unlikely(!cp)) {
                int v;
 
-               if (!ip_vs_try_to_schedule(af, skb, pd, &v, &cp, &iph))
+               if (!ip_vs_try_to_schedule(ipvs, af, skb, pd, &v, &cp, &iph))
                        return v;
        }
 
 
 
 
 static int
-ah_esp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
+ah_esp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
+                    struct ip_vs_proto_data *pd,
                     int *verdict, struct ip_vs_conn **cpp,
                     struct ip_vs_iphdr *iph)
 {
 
 #include <net/ip_vs.h>
 
 static int
-sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
+sctp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
+                  struct ip_vs_proto_data *pd,
                   int *verdict, struct ip_vs_conn **cpp,
                   struct ip_vs_iphdr *iph)
 {
-       struct net *net;
        struct ip_vs_service *svc;
-       struct netns_ipvs *ipvs;
        sctp_chunkhdr_t _schunkh, *sch;
        sctp_sctphdr_t *sh, _sctph;
        __be16 _ports[2], *ports = NULL;
 
-       net = skb_net(skb);
-       ipvs = net_ipvs(net);
-
        if (likely(!ip_vs_iph_icmp(iph))) {
                sh = skb_header_pointer(skb, iph->len, sizeof(_sctph), &_sctph);
                if (sh) {
 
 #include <net/ip_vs.h>
 
 static int
-tcp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
+tcp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
+                 struct ip_vs_proto_data *pd,
                  int *verdict, struct ip_vs_conn **cpp,
                  struct ip_vs_iphdr *iph)
 {
-       struct net *net;
        struct ip_vs_service *svc;
        struct tcphdr _tcph, *th;
-       struct netns_ipvs *ipvs;
        __be16 _ports[2], *ports = NULL;
 
-       net = skb_net(skb);
-       ipvs = net_ipvs(net);
-
        /* In the event of icmp, we're only guaranteed to have the first 8
         * bytes of the transport header, so we only check the rest of the
         * TCP packet for non-ICMP packets
 
 #include <net/ip6_checksum.h>
 
 static int
-udp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
+udp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
+                 struct ip_vs_proto_data *pd,
                  int *verdict, struct ip_vs_conn **cpp,
                  struct ip_vs_iphdr *iph)
 {
-       struct net *net;
-       struct netns_ipvs *ipvs;
        struct ip_vs_service *svc;
        struct udphdr _udph, *uh;
        __be16 _ports[2], *ports = NULL;
                return 0;
        }
 
-       net = skb_net(skb);
-       ipvs = net_ipvs(net);
        rcu_read_lock();
        if (likely(!ip_vs_iph_inverse(iph)))
                svc = ip_vs_service_find(ipvs, af, skb->mark, iph->protocol,
        if (svc) {
                int ignored;
 
-               if (ip_vs_todrop(net_ipvs(net))) {
+               if (ip_vs_todrop(ipvs)) {
                        /*
                         * It seems that we are very loaded.
                         * We have to drop this packet :(