#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
-#include <linux/major.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/string.h>
#ifdef INET_REFCNT_DEBUG
atomic_t inet6_sock_nr;
+EXPORT_SYMBOL(inet6_sock_nr);
#endif
/* The inetsw table contains everything that inet_create needs to
static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
{
- const int offset = sk->sk_prot->slab_obj_size - sizeof(struct ipv6_pinfo);
+ const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
}
BUG_TRAP(answer_prot->slab != NULL);
rc = -ENOBUFS;
- sk = sk_alloc(PF_INET6, GFP_KERNEL,
- answer_prot->slab_obj_size,
- answer_prot->slab);
+ sk = sk_alloc(PF_INET6, GFP_KERNEL, answer_prot, 1);
if (sk == NULL)
goto out;
sock_init_data(sock, sk);
- sk->sk_prot = answer_prot;
- sk_set_owner(sk, sk->sk_prot->owner);
rc = 0;
sk->sk_no_check = answer_no_check;
return -EINVAL;
}
- err = sk_alloc_slab(&tcpv6_prot, "tcpv6_sock");
- if (err) {
- sk_alloc_slab_error(&tcpv6_prot);
+ err = proto_register(&tcpv6_prot, 1);
+ if (err)
goto out;
- }
- err = sk_alloc_slab(&udpv6_prot, "udpv6_sock");
- if (err) {
- sk_alloc_slab_error(&udpv6_prot);
- goto out_tcp_free_slab;
- }
- err = sk_alloc_slab(&rawv6_prot, "rawv6_sock");
- if (err) {
- sk_alloc_slab_error(&rawv6_prot);
- goto out_udp_free_slab;
- }
+
+ err = proto_register(&udpv6_prot, 1);
+ if (err)
+ goto out_unregister_tcp_proto;
+
+ err = proto_register(&rawv6_prot, 1);
+ if (err)
+ goto out_unregister_udp_proto;
+
/* Register the socket-side information for inet6_create. */
for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
/* Initialise ipv6 mibs */
err = init_ipv6_mibs();
if (err)
- goto out_raw_free_slab;
+ goto out_unregister_raw_proto;
/*
* ipngwg API draft makes clear that the correct semantics
ipv6_packet_init();
ip6_route_init();
ip6_flowlabel_init();
- addrconf_init();
+ err = addrconf_init();
+ if (err)
+ goto addrconf_fail;
sit_init();
/* Init v6 extension headers. */
out:
return err;
+addrconf_fail:
+ ip6_flowlabel_cleanup();
+ ip6_route_cleanup();
+ ipv6_packet_cleanup();
#ifdef CONFIG_PROC_FS
+ if6_proc_exit();
proc_if6_fail:
ac6_proc_exit();
proc_anycast6_fail:
proc_tcp6_fail:
raw6_proc_exit();
proc_raw6_fail:
- igmp6_cleanup();
#endif
+ igmp6_cleanup();
igmp_fail:
ndisc_cleanup();
ndisc_fail:
ipv6_sysctl_unregister();
#endif
cleanup_ipv6_mibs();
-out_raw_free_slab:
- sk_free_slab(&rawv6_prot);
-out_udp_free_slab:
- sk_free_slab(&udpv6_prot);
-out_tcp_free_slab:
- sk_free_slab(&tcpv6_prot);
+out_unregister_raw_proto:
+ proto_unregister(&rawv6_prot);
+out_unregister_udp_proto:
+ proto_unregister(&udpv6_prot);
+out_unregister_tcp_proto:
+ proto_unregister(&tcpv6_prot);
goto out;
}
module_init(inet6_init);
ipv6_sysctl_unregister();
#endif
cleanup_ipv6_mibs();
- sk_free_slab(&rawv6_prot);
- sk_free_slab(&udpv6_prot);
- sk_free_slab(&tcpv6_prot);
+ proto_unregister(&rawv6_prot);
+ proto_unregister(&udpv6_prot);
+ proto_unregister(&tcpv6_prot);
}
module_exit(inet6_exit);