diff options
Diffstat (limited to 'net/ipv6/af_inet6.c')
| -rw-r--r-- | net/ipv6/af_inet6.c | 62 |
1 files changed, 18 insertions, 44 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 28d9bcab0970..4f8795af2edb 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #include <linux/netdevice.h> | 44 | #include <linux/netdevice.h> |
| 45 | #include <linux/icmpv6.h> | 45 | #include <linux/icmpv6.h> |
| 46 | #include <linux/smp_lock.h> | 46 | #include <linux/smp_lock.h> |
| 47 | #include <linux/netfilter_ipv6.h> | ||
| 47 | 48 | ||
| 48 | #include <net/ip.h> | 49 | #include <net/ip.h> |
| 49 | #include <net/ipv6.h> | 50 | #include <net/ipv6.h> |
| @@ -66,45 +67,14 @@ MODULE_AUTHOR("Cast of dozens"); | |||
| 66 | MODULE_DESCRIPTION("IPv6 protocol stack for Linux"); | 67 | MODULE_DESCRIPTION("IPv6 protocol stack for Linux"); |
| 67 | MODULE_LICENSE("GPL"); | 68 | MODULE_LICENSE("GPL"); |
| 68 | 69 | ||
| 69 | /* IPv6 procfs goodies... */ | ||
| 70 | |||
| 71 | #ifdef CONFIG_PROC_FS | ||
| 72 | extern int raw6_proc_init(void); | ||
| 73 | extern void raw6_proc_exit(void); | ||
| 74 | extern int tcp6_proc_init(void); | ||
| 75 | extern void tcp6_proc_exit(void); | ||
| 76 | extern int udp6_proc_init(void); | ||
| 77 | extern void udp6_proc_exit(void); | ||
| 78 | extern int ipv6_misc_proc_init(void); | ||
| 79 | extern void ipv6_misc_proc_exit(void); | ||
| 80 | extern int ac6_proc_init(void); | ||
| 81 | extern void ac6_proc_exit(void); | ||
| 82 | extern int if6_proc_init(void); | ||
| 83 | extern void if6_proc_exit(void); | ||
| 84 | #endif | ||
| 85 | |||
| 86 | int sysctl_ipv6_bindv6only; | 70 | int sysctl_ipv6_bindv6only; |
| 87 | 71 | ||
| 88 | #ifdef INET_REFCNT_DEBUG | ||
| 89 | atomic_t inet6_sock_nr; | ||
| 90 | EXPORT_SYMBOL(inet6_sock_nr); | ||
| 91 | #endif | ||
| 92 | |||
| 93 | /* The inetsw table contains everything that inet_create needs to | 72 | /* The inetsw table contains everything that inet_create needs to |
| 94 | * build a new socket. | 73 | * build a new socket. |
| 95 | */ | 74 | */ |
| 96 | static struct list_head inetsw6[SOCK_MAX]; | 75 | static struct list_head inetsw6[SOCK_MAX]; |
| 97 | static DEFINE_SPINLOCK(inetsw6_lock); | 76 | static DEFINE_SPINLOCK(inetsw6_lock); |
| 98 | 77 | ||
| 99 | static void inet6_sock_destruct(struct sock *sk) | ||
| 100 | { | ||
| 101 | inet_sock_destruct(sk); | ||
| 102 | |||
| 103 | #ifdef INET_REFCNT_DEBUG | ||
| 104 | atomic_dec(&inet6_sock_nr); | ||
| 105 | #endif | ||
| 106 | } | ||
| 107 | |||
| 108 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) | 78 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) |
| 109 | { | 79 | { |
| 110 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); | 80 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); |
| @@ -185,7 +155,7 @@ static int inet6_create(struct socket *sock, int protocol) | |||
| 185 | inet->hdrincl = 1; | 155 | inet->hdrincl = 1; |
| 186 | } | 156 | } |
| 187 | 157 | ||
| 188 | sk->sk_destruct = inet6_sock_destruct; | 158 | sk->sk_destruct = inet_sock_destruct; |
| 189 | sk->sk_family = PF_INET6; | 159 | sk->sk_family = PF_INET6; |
| 190 | sk->sk_protocol = protocol; | 160 | sk->sk_protocol = protocol; |
| 191 | 161 | ||
| @@ -212,12 +182,17 @@ static int inet6_create(struct socket *sock, int protocol) | |||
| 212 | inet->pmtudisc = IP_PMTUDISC_DONT; | 182 | inet->pmtudisc = IP_PMTUDISC_DONT; |
| 213 | else | 183 | else |
| 214 | inet->pmtudisc = IP_PMTUDISC_WANT; | 184 | inet->pmtudisc = IP_PMTUDISC_WANT; |
| 185 | /* | ||
| 186 | * Increment only the relevant sk_prot->socks debug field, this changes | ||
| 187 | * the previous behaviour of incrementing both the equivalent to | ||
| 188 | * answer->prot->socks (inet6_sock_nr) and inet_sock_nr. | ||
| 189 | * | ||
| 190 | * This allows better debug granularity as we'll know exactly how many | ||
| 191 | * UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6 | ||
| 192 | * transport protocol socks. -acme | ||
| 193 | */ | ||
| 194 | sk_refcnt_debug_inc(sk); | ||
| 215 | 195 | ||
| 216 | |||
| 217 | #ifdef INET_REFCNT_DEBUG | ||
| 218 | atomic_inc(&inet6_sock_nr); | ||
| 219 | atomic_inc(&inet_sock_nr); | ||
| 220 | #endif | ||
| 221 | if (inet->num) { | 196 | if (inet->num) { |
| 222 | /* It assumes that any protocol which allows | 197 | /* It assumes that any protocol which allows |
| 223 | * the user to assign a number at socket | 198 | * the user to assign a number at socket |
| @@ -513,11 +488,6 @@ static struct net_proto_family inet6_family_ops = { | |||
| 513 | .owner = THIS_MODULE, | 488 | .owner = THIS_MODULE, |
| 514 | }; | 489 | }; |
| 515 | 490 | ||
| 516 | #ifdef CONFIG_SYSCTL | ||
| 517 | extern void ipv6_sysctl_register(void); | ||
| 518 | extern void ipv6_sysctl_unregister(void); | ||
| 519 | #endif | ||
| 520 | |||
| 521 | /* Same as inet6_dgram_ops, sans udp_poll. */ | 491 | /* Same as inet6_dgram_ops, sans udp_poll. */ |
| 522 | static struct proto_ops inet6_sockraw_ops = { | 492 | static struct proto_ops inet6_sockraw_ops = { |
| 523 | .family = PF_INET6, | 493 | .family = PF_INET6, |
| @@ -684,8 +654,6 @@ static void cleanup_ipv6_mibs(void) | |||
| 684 | snmp6_mib_free((void **)udp_stats_in6); | 654 | snmp6_mib_free((void **)udp_stats_in6); |
| 685 | } | 655 | } |
| 686 | 656 | ||
| 687 | extern int ipv6_misc_proc_init(void); | ||
| 688 | |||
| 689 | static int __init inet6_init(void) | 657 | static int __init inet6_init(void) |
| 690 | { | 658 | { |
| 691 | struct sk_buff *dummy_skb; | 659 | struct sk_buff *dummy_skb; |
| @@ -757,6 +725,9 @@ static int __init inet6_init(void) | |||
| 757 | err = igmp6_init(&inet6_family_ops); | 725 | err = igmp6_init(&inet6_family_ops); |
| 758 | if (err) | 726 | if (err) |
| 759 | goto igmp_fail; | 727 | goto igmp_fail; |
| 728 | err = ipv6_netfilter_init(); | ||
| 729 | if (err) | ||
| 730 | goto netfilter_fail; | ||
| 760 | /* Create /proc/foo6 entries. */ | 731 | /* Create /proc/foo6 entries. */ |
| 761 | #ifdef CONFIG_PROC_FS | 732 | #ifdef CONFIG_PROC_FS |
| 762 | err = -ENOMEM; | 733 | err = -ENOMEM; |
| @@ -813,6 +784,8 @@ proc_tcp6_fail: | |||
| 813 | raw6_proc_exit(); | 784 | raw6_proc_exit(); |
| 814 | proc_raw6_fail: | 785 | proc_raw6_fail: |
| 815 | #endif | 786 | #endif |
| 787 | ipv6_netfilter_fini(); | ||
| 788 | netfilter_fail: | ||
| 816 | igmp6_cleanup(); | 789 | igmp6_cleanup(); |
| 817 | igmp_fail: | 790 | igmp_fail: |
| 818 | ndisc_cleanup(); | 791 | ndisc_cleanup(); |
| @@ -852,6 +825,7 @@ static void __exit inet6_exit(void) | |||
| 852 | ip6_route_cleanup(); | 825 | ip6_route_cleanup(); |
| 853 | ipv6_packet_cleanup(); | 826 | ipv6_packet_cleanup(); |
| 854 | igmp6_cleanup(); | 827 | igmp6_cleanup(); |
| 828 | ipv6_netfilter_fini(); | ||
| 855 | ndisc_cleanup(); | 829 | ndisc_cleanup(); |
| 856 | icmpv6_cleanup(); | 830 | icmpv6_cleanup(); |
| 857 | #ifdef CONFIG_SYSCTL | 831 | #ifdef CONFIG_SYSCTL |
