aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/af_inet6.c
diff options
context:
space:
mode:
authorDaniel Lezcano <dlezcano@fr.ibm.com>2007-12-11 05:25:35 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:57:13 -0500
commit7f4e4868f3ce0e946f116c28fa4fe033be5e4ba9 (patch)
tree144add1d4c94a145f7e048a17d91b563f5e6e265 /net/ipv6/af_inet6.c
parent87c3efbfdd1f98af14a1f60ff19f73d9a8d8da98 (diff)
[IPV6]: make the protocol initialization to return an error code
This patchset makes the different protocols to return an error code, so the af_inet6 module can check the initialization was correct or not. The raw6 was taken into account to be consistent with the rest of the protocols, but the registration is at the same place. Because the raw6 has its own init function, the proto and the ops structure can be moved inside the raw6.c file. Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/af_inet6.c')
-rw-r--r--net/ipv6/af_inet6.c77
1 files changed, 33 insertions, 44 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 53b06de696bd..34c20533ba5d 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -529,42 +529,6 @@ static struct net_proto_family inet6_family_ops = {
529 .owner = THIS_MODULE, 529 .owner = THIS_MODULE,
530}; 530};
531 531
532/* Same as inet6_dgram_ops, sans udp_poll. */
533static const struct proto_ops inet6_sockraw_ops = {
534 .family = PF_INET6,
535 .owner = THIS_MODULE,
536 .release = inet6_release,
537 .bind = inet6_bind,
538 .connect = inet_dgram_connect, /* ok */
539 .socketpair = sock_no_socketpair, /* a do nothing */
540 .accept = sock_no_accept, /* a do nothing */
541 .getname = inet6_getname,
542 .poll = datagram_poll, /* ok */
543 .ioctl = inet6_ioctl, /* must change */
544 .listen = sock_no_listen, /* ok */
545 .shutdown = inet_shutdown, /* ok */
546 .setsockopt = sock_common_setsockopt, /* ok */
547 .getsockopt = sock_common_getsockopt, /* ok */
548 .sendmsg = inet_sendmsg, /* ok */
549 .recvmsg = sock_common_recvmsg, /* ok */
550 .mmap = sock_no_mmap,
551 .sendpage = sock_no_sendpage,
552#ifdef CONFIG_COMPAT
553 .compat_setsockopt = compat_sock_common_setsockopt,
554 .compat_getsockopt = compat_sock_common_getsockopt,
555#endif
556};
557
558static struct inet_protosw rawv6_protosw = {
559 .type = SOCK_RAW,
560 .protocol = IPPROTO_IP, /* wild card */
561 .prot = &rawv6_prot,
562 .ops = &inet6_sockraw_ops,
563 .capability = CAP_NET_RAW,
564 .no_check = UDP_CSUM_DEFAULT,
565 .flags = INET_PROTOSW_REUSE,
566};
567
568int inet6_register_protosw(struct inet_protosw *p) 532int inet6_register_protosw(struct inet_protosw *p)
569{ 533{
570 struct list_head *lh; 534 struct list_head *lh;
@@ -771,7 +735,6 @@ static int __init inet6_init(void)
771 __this_module.can_unload = &ipv6_unload; 735 __this_module.can_unload = &ipv6_unload;
772#endif 736#endif
773#endif 737#endif
774
775 err = proto_register(&tcpv6_prot, 1); 738 err = proto_register(&tcpv6_prot, 1);
776 if (err) 739 if (err)
777 goto out; 740 goto out;
@@ -796,14 +759,16 @@ static int __init inet6_init(void)
796 /* We MUST register RAW sockets before we create the ICMP6, 759 /* We MUST register RAW sockets before we create the ICMP6,
797 * IGMP6, or NDISC control sockets. 760 * IGMP6, or NDISC control sockets.
798 */ 761 */
799 inet6_register_protosw(&rawv6_protosw); 762 err = rawv6_init();
763 if (err)
764 goto out_unregister_raw_proto;
800 765
801 /* Register the family here so that the init calls below will 766 /* Register the family here so that the init calls below will
802 * be able to create sockets. (?? is this dangerous ??) 767 * be able to create sockets. (?? is this dangerous ??)
803 */ 768 */
804 err = sock_register(&inet6_family_ops); 769 err = sock_register(&inet6_family_ops);
805 if (err) 770 if (err)
806 goto out_unregister_raw_proto; 771 goto out_sock_register_fail;
807 772
808 /* Initialise ipv6 mibs */ 773 /* Initialise ipv6 mibs */
809 err = init_ipv6_mibs(); 774 err = init_ipv6_mibs();
@@ -871,15 +836,32 @@ static int __init inet6_init(void)
871 goto ipv6_frag_fail; 836 goto ipv6_frag_fail;
872 837
873 /* Init v6 transport protocols. */ 838 /* Init v6 transport protocols. */
874 udpv6_init(); 839 err = udpv6_init();
875 udplitev6_init(); 840 if (err)
876 tcpv6_init(); 841 goto udpv6_fail;
877 842
878 ipv6_packet_init(); 843 err = udplitev6_init();
879 err = 0; 844 if (err)
845 goto udplitev6_fail;
846
847 err = tcpv6_init();
848 if (err)
849 goto tcpv6_fail;
850
851 err = ipv6_packet_init();
852 if (err)
853 goto ipv6_packet_fail;
880out: 854out:
881 return err; 855 return err;
882 856
857ipv6_packet_fail:
858 tcpv6_exit();
859tcpv6_fail:
860 udplitev6_exit();
861udplitev6_fail:
862 udpv6_exit();
863udpv6_fail:
864 ipv6_frag_exit();
883ipv6_frag_fail: 865ipv6_frag_fail:
884 ipv6_exthdrs_exit(); 866 ipv6_exthdrs_exit();
885ipv6_exthdrs_fail: 867ipv6_exthdrs_fail:
@@ -920,6 +902,8 @@ icmp_fail:
920out_unregister_sock: 902out_unregister_sock:
921 sock_unregister(PF_INET6); 903 sock_unregister(PF_INET6);
922 rtnl_unregister_all(PF_INET6); 904 rtnl_unregister_all(PF_INET6);
905out_sock_register_fail:
906 rawv6_exit();
923out_unregister_raw_proto: 907out_unregister_raw_proto:
924 proto_unregister(&rawv6_prot); 908 proto_unregister(&rawv6_prot);
925out_unregister_udplite_proto: 909out_unregister_udplite_proto:
@@ -939,6 +923,10 @@ static void __exit inet6_exit(void)
939 /* Disallow any further netlink messages */ 923 /* Disallow any further netlink messages */
940 rtnl_unregister_all(PF_INET6); 924 rtnl_unregister_all(PF_INET6);
941 925
926 udpv6_exit();
927 udplitev6_exit();
928 tcpv6_exit();
929
942 /* Cleanup code parts. */ 930 /* Cleanup code parts. */
943 ipv6_packet_cleanup(); 931 ipv6_packet_cleanup();
944 ipv6_frag_exit(); 932 ipv6_frag_exit();
@@ -961,6 +949,7 @@ static void __exit inet6_exit(void)
961 igmp6_cleanup(); 949 igmp6_cleanup();
962 ndisc_cleanup(); 950 ndisc_cleanup();
963 icmpv6_cleanup(); 951 icmpv6_cleanup();
952 rawv6_exit();
964#ifdef CONFIG_SYSCTL 953#ifdef CONFIG_SYSCTL
965 ipv6_sysctl_unregister(); 954 ipv6_sysctl_unregister();
966#endif 955#endif