diff options
| author | Brian Haley <brian.haley@hp.com> | 2009-03-04 06:18:11 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-03-04 06:19:08 -0500 |
| commit | fe7ca2e1e847b65c12d245cbf402af89da96888a (patch) | |
| tree | aec65ae7a12d3c700f8c7f855024058e80075779 | |
| parent | 4a8fd2cfdad4d043a1fadba2f3f340945d966825 (diff) | |
IPv6: add "disable" module parameter support to ipv6.ko
Add "disable" module parameter support to ipv6.ko by specifying
"disable=1" on module load. We just do the minimum of initializing
inetsw6[] so calls from other modules to inet6_register_protosw()
won't OOPs, then bail out. No IPv6 addresses or sockets can be
created as a result, and a reboot is required to enable IPv6.
Signed-off-by: Brian Haley <brian.haley@hp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | Documentation/networking/ipv6.txt | 35 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 21 |
2 files changed, 51 insertions, 5 deletions
diff --git a/Documentation/networking/ipv6.txt b/Documentation/networking/ipv6.txt new file mode 100644 index 000000000000..268e5c103dd8 --- /dev/null +++ b/Documentation/networking/ipv6.txt | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | |||
| 2 | Options for the ipv6 module are supplied as parameters at load time. | ||
| 3 | |||
| 4 | Module options may be given as command line arguments to the insmod | ||
| 5 | or modprobe command, but are usually specified in either the | ||
| 6 | /etc/modules.conf or /etc/modprobe.conf configuration file, or in a | ||
| 7 | distro-specific configuration file. | ||
| 8 | |||
| 9 | The available ipv6 module parameters are listed below. If a parameter | ||
| 10 | is not specified the default value is used. | ||
| 11 | |||
| 12 | The parameters are as follows: | ||
| 13 | |||
| 14 | disable | ||
| 15 | |||
| 16 | Specifies whether to load the IPv6 module, but disable all | ||
| 17 | its functionality. This might be used when another module | ||
| 18 | has a dependency on the IPv6 module being loaded, but no | ||
| 19 | IPv6 addresses or operations are desired. | ||
| 20 | |||
| 21 | The possible values and their effects are: | ||
| 22 | |||
| 23 | 0 | ||
| 24 | IPv6 is enabled. | ||
| 25 | |||
| 26 | This is the default value. | ||
| 27 | |||
| 28 | 1 | ||
| 29 | IPv6 is disabled. | ||
| 30 | |||
| 31 | No IPv6 addresses will be added to interfaces, and | ||
| 32 | it will not be possible to open an IPv6 socket. | ||
| 33 | |||
| 34 | A reboot is required to enable IPv6. | ||
| 35 | |||
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index c802bc1658a8..da944eca2ca6 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -72,6 +72,10 @@ MODULE_LICENSE("GPL"); | |||
| 72 | static struct list_head inetsw6[SOCK_MAX]; | 72 | static struct list_head inetsw6[SOCK_MAX]; |
| 73 | static DEFINE_SPINLOCK(inetsw6_lock); | 73 | static DEFINE_SPINLOCK(inetsw6_lock); |
| 74 | 74 | ||
| 75 | static int disable_ipv6 = 0; | ||
| 76 | module_param_named(disable, disable_ipv6, int, 0); | ||
| 77 | MODULE_PARM_DESC(disable, "Disable IPv6 such that it is non-functional"); | ||
| 78 | |||
| 75 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) | 79 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) |
| 76 | { | 80 | { |
| 77 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); | 81 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); |
| @@ -991,10 +995,21 @@ static int __init inet6_init(void) | |||
| 991 | { | 995 | { |
| 992 | struct sk_buff *dummy_skb; | 996 | struct sk_buff *dummy_skb; |
| 993 | struct list_head *r; | 997 | struct list_head *r; |
| 994 | int err; | 998 | int err = 0; |
| 995 | 999 | ||
| 996 | BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); | 1000 | BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); |
| 997 | 1001 | ||
| 1002 | /* Register the socket-side information for inet6_create. */ | ||
| 1003 | for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) | ||
| 1004 | INIT_LIST_HEAD(r); | ||
| 1005 | |||
| 1006 | if (disable_ipv6) { | ||
| 1007 | printk(KERN_INFO | ||
| 1008 | "IPv6: Loaded, but administratively disabled, " | ||
| 1009 | "reboot required to enable\n"); | ||
| 1010 | goto out; | ||
| 1011 | } | ||
| 1012 | |||
| 998 | err = proto_register(&tcpv6_prot, 1); | 1013 | err = proto_register(&tcpv6_prot, 1); |
| 999 | if (err) | 1014 | if (err) |
| 1000 | goto out; | 1015 | goto out; |
| @@ -1012,10 +1027,6 @@ static int __init inet6_init(void) | |||
| 1012 | goto out_unregister_udplite_proto; | 1027 | goto out_unregister_udplite_proto; |
| 1013 | 1028 | ||
| 1014 | 1029 | ||
| 1015 | /* Register the socket-side information for inet6_create. */ | ||
| 1016 | for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) | ||
| 1017 | INIT_LIST_HEAD(r); | ||
| 1018 | |||
| 1019 | /* We MUST register RAW sockets before we create the ICMP6, | 1030 | /* We MUST register RAW sockets before we create the ICMP6, |
| 1020 | * IGMP6, or NDISC control sockets. | 1031 | * IGMP6, or NDISC control sockets. |
| 1021 | */ | 1032 | */ |
