|
@@ -72,6 +72,10 @@ MODULE_LICENSE("GPL");
|
|
|
static struct list_head inetsw6[SOCK_MAX];
|
|
|
static DEFINE_SPINLOCK(inetsw6_lock);
|
|
|
|
|
|
+static int disable_ipv6 = 0;
|
|
|
+module_param_named(disable, disable_ipv6, int, 0);
|
|
|
+MODULE_PARM_DESC(disable, "Disable IPv6 such that it is non-functional");
|
|
|
+
|
|
|
static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
|
|
|
{
|
|
|
const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo);
|
|
@@ -991,10 +995,21 @@ static int __init inet6_init(void)
|
|
|
{
|
|
|
struct sk_buff *dummy_skb;
|
|
|
struct list_head *r;
|
|
|
- int err;
|
|
|
+ int err = 0;
|
|
|
|
|
|
BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
|
|
|
|
|
|
+ /* Register the socket-side information for inet6_create. */
|
|
|
+ for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
|
|
|
+ INIT_LIST_HEAD(r);
|
|
|
+
|
|
|
+ if (disable_ipv6) {
|
|
|
+ printk(KERN_INFO
|
|
|
+ "IPv6: Loaded, but administratively disabled, "
|
|
|
+ "reboot required to enable\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
err = proto_register(&tcpv6_prot, 1);
|
|
|
if (err)
|
|
|
goto out;
|
|
@@ -1012,10 +1027,6 @@ static int __init inet6_init(void)
|
|
|
goto out_unregister_udplite_proto;
|
|
|
|
|
|
|
|
|
- /* Register the socket-side information for inet6_create. */
|
|
|
- for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r)
|
|
|
- INIT_LIST_HEAD(r);
|
|
|
-
|
|
|
/* We MUST register RAW sockets before we create the ICMP6,
|
|
|
* IGMP6, or NDISC control sockets.
|
|
|
*/
|