#endif
        int     *net_id;
        /* Init l4proto pernet data */
-       int (*init_net)(struct net *net);
+       int (*init_net)(struct net *net, u_int16_t proto);
 
        /* Protocol name */
        const char *name;
 
 #endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */
 #endif /* CONFIG_SYSCTL */
 
-static int icmp_init_net(struct net *net)
+static int icmp_init_net(struct net *net, u_int16_t proto)
 {
        struct nf_icmp_net *in = icmp_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)in;
 
 };
 #endif /* CONFIG_SYSCTL */
 
-static int icmpv6_init_net(struct net *net)
+static int icmpv6_init_net(struct net *net, u_int16_t proto)
 {
        struct nf_icmp_net *in = icmpv6_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)in;
 
        int ret = 0;
 
        if (l4proto->init_net) {
-               ret = l4proto->init_net(net);
+               ret = l4proto->init_net(net, l4proto->l3proto);
                if (ret < 0)
                        return ret;
        }
 {
        unsigned int i;
        int err;
-       err = nf_conntrack_l4proto_generic.init_net(net);
+       err = nf_conntrack_l4proto_generic.init_net(net,
+                                       nf_conntrack_l4proto_generic.l3proto);
        if (err < 0)
                return err;
        err = nf_ct_l4proto_register_sysctl(net,
 
 };
 #endif /* CONFIG_SYSCTL */
 
-static int dccp_init_net(struct net *net)
+static int dccp_init_net(struct net *net, u_int16_t proto)
 {
        struct dccp_net *dn = dccp_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)dn;
 
 #endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */
 #endif /* CONFIG_SYSCTL */
 
-static int generic_init_net(struct net *net)
+static int generic_init_net(struct net *net, u_int16_t proto)
 {
        struct nf_generic_net *gn = generic_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)gn;
 
 };
 #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */
 
-static int gre_init_net(struct net *net)
+static int gre_init_net(struct net *net, u_int16_t proto)
 {
        struct netns_proto_gre *net_gre = gre_pernet(net);
        int i;
 
        return 0;
 }
 
-static int sctpv4_init_net(struct net *net)
+static int sctpv4_init_net(struct net *net, u_int16_t proto)
 {
        int ret;
        struct sctp_net *sn = sctp_pernet(net);
        return ret;
 }
 
-static int sctpv6_init_net(struct net *net)
+static int sctpv6_init_net(struct net *net, u_int16_t proto)
 {
        struct sctp_net *sn = sctp_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)sn;
 
        return 0;
 }
 
-static int tcpv4_init_net(struct net *net)
+static int tcpv4_init_net(struct net *net, u_int16_t proto)
 {
        int i;
        int ret = 0;
        return ret;
 }
 
-static int tcpv6_init_net(struct net *net)
+static int tcpv6_init_net(struct net *net, u_int16_t proto)
 {
        int i;
        struct nf_tcp_net *tn = tcp_pernet(net);
 
        }
 }
 
-static int udpv4_init_net(struct net *net)
+static int udpv4_init_net(struct net *net, u_int16_t proto)
 {
        int ret;
        struct nf_udp_net *un = udp_pernet(net);
        return ret;
 }
 
-static int udpv6_init_net(struct net *net)
+static int udpv6_init_net(struct net *net, u_int16_t proto)
 {
        struct nf_udp_net *un = udp_pernet(net);
        struct nf_proto_net *pn = (struct nf_proto_net *)un;
 
 };
 #endif /* CONFIG_SYSCTL */
 
-static int udplite_init_net(struct net *net)
+static int udplite_init_net(struct net *net, u_int16_t proto)
 {
        int i;
        struct udplite_net *un = udplite_pernet(net);