]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv6/tcp_ipv6.c
[NET]: {get|set}sockopt compatibility layer
[net-next-2.6.git] / net / ipv6 / tcp_ipv6.c
index ca9cf6853755fc3081693334c6f8f3e70265dcac..2f8975e0150a6c675de7e422a14ef5d13976b3f5 100644 (file)
@@ -987,6 +987,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
                inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
                                                     newnp->opt->opt_flen);
 
+       tcp_mtup_init(newsk);
        tcp_sync_mss(newsk, dst_mtu(dst));
        newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
        tcp_initialize_rcv_mss(newsk);
@@ -1307,6 +1308,10 @@ static struct inet_connection_sock_af_ops ipv6_specific = {
 
        .setsockopt     =       ipv6_setsockopt,
        .getsockopt     =       ipv6_getsockopt,
+#ifdef CONFIG_COMPAT
+       .compat_setsockopt      = compat_ipv6_setsockopt,
+       .compat_getsockopt      = compat_ipv6_getsockopt,
+#endif
        .addr2sockaddr  =       inet6_csk_addr2sockaddr,
        .sockaddr_len   =       sizeof(struct sockaddr_in6)
 };
@@ -1326,6 +1331,10 @@ static struct inet_connection_sock_af_ops ipv6_mapped = {
 
        .setsockopt     =       ipv6_setsockopt,
        .getsockopt     =       ipv6_getsockopt,
+#ifdef CONFIG_COMPAT
+       .compat_setsockopt      = compat_ipv6_setsockopt,
+       .compat_getsockopt      = compat_ipv6_getsockopt,
+#endif
        .addr2sockaddr  =       inet6_csk_addr2sockaddr,
        .sockaddr_len   =       sizeof(struct sockaddr_in6)
 };
@@ -1565,6 +1574,10 @@ struct proto tcpv6_prot = {
        .shutdown               = tcp_shutdown,
        .setsockopt             = tcp_setsockopt,
        .getsockopt             = tcp_getsockopt,
+#ifdef CONFIG_COMPAT
+       .compat_setsockopt      = compat_tcp_setsockopt,
+       .compat_getsockopt      = compat_tcp_getsockopt,
+#endif
        .sendmsg                = tcp_sendmsg,
        .recvmsg                = tcp_recvmsg,
        .backlog_rcv            = tcp_v6_do_rcv,
@@ -1604,21 +1617,12 @@ static struct inet_protosw tcpv6_protosw = {
 
 void __init tcpv6_init(void)
 {
-       int err;
-
        /* register inet6 protocol */
        if (inet6_add_protocol(&tcpv6_protocol, IPPROTO_TCP) < 0)
                printk(KERN_ERR "tcpv6_init: Could not register protocol\n");
        inet6_register_protosw(&tcpv6_protosw);
 
-       err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_TCP, &tcp6_socket);
-       if (err < 0)
+       if (inet_csk_ctl_sock_create(&tcp6_socket, PF_INET6, SOCK_RAW,
+                                    IPPROTO_TCP) < 0)
                panic("Failed to create the TCPv6 control socket.\n");
-       tcp6_socket->sk->sk_allocation = GFP_ATOMIC;
-
-       /* Unhash it so that IP input processing does not even
-        * see it, we do not wish this socket to see incoming
-        * packets.
-        */
-       tcp6_socket->sk->sk_prot->unhash(tcp6_socket->sk);
 }