vserver 2.0 rc7
[linux-2.6.git] / net / sctp / protocol.c
index c1ee92a..5135e1a 100644 (file)
@@ -378,10 +378,13 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
 {
        int ret = inet_addr_type(addr->v4.sin_addr.s_addr);
 
-       /* FIXME: ip_nonlocal_bind sysctl support. */
 
-       if (addr->v4.sin_addr.s_addr != INADDR_ANY && ret != RTN_LOCAL)
+       if (addr->v4.sin_addr.s_addr != INADDR_ANY &&
+          ret != RTN_LOCAL &&
+          !sp->inet.freebind &&
+          !sysctl_ip_nonlocal_bind)
                return 0;
+
        return 1;
 }
 
@@ -550,30 +553,26 @@ static int sctp_v4_is_ce(const struct sk_buff *skb)
 static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
                                             struct sctp_association *asoc)
 {
-       struct sock *newsk;
        struct inet_sock *inet = inet_sk(sk);
        struct inet_sock *newinet;
+       struct sock *newsk = sk_alloc(PF_INET, GFP_KERNEL, sk->sk_prot, 1);
 
-       newsk = sk_alloc(PF_INET, GFP_KERNEL, sk->sk_prot->slab_obj_size,
-                        sk->sk_prot->slab);
        if (!newsk)
                goto out;
 
        sock_init_data(NULL, newsk);
-       sk_set_owner(newsk, THIS_MODULE);
 
        newsk->sk_type = SOCK_STREAM;
 
-       newsk->sk_prot = sk->sk_prot;
        newsk->sk_no_check = sk->sk_no_check;
        newsk->sk_reuse = sk->sk_reuse;
        newsk->sk_shutdown = sk->sk_shutdown;
 
        newsk->sk_destruct = inet_sock_destruct;
-       newsk->sk_zapped = 0;
        newsk->sk_family = PF_INET;
        newsk->sk_protocol = IPPROTO_SCTP;
        newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv;
+       sock_reset_flag(newsk, SOCK_ZAPPED);
 
        newinet = inet_sk(newsk);
 
@@ -970,7 +969,7 @@ SCTP_STATIC __init int sctp_init(void)
        if (!sctp_sanity_check())
                goto out;
 
-       status = sk_alloc_slab(&sctp_prot, "sctp_sock");
+       status = proto_register(&sctp_prot, 1);
        if (status)
                goto out;
 
@@ -1047,6 +1046,9 @@ SCTP_STATIC __init int sctp_init(void)
        sctp_max_retrans_path           = 5;
        sctp_max_retrans_init           = 8;
 
+       /* Sendbuffer growth        - do per-socket accounting */
+       sctp_sndbuf_policy              = 0;
+
        /* HB.interval              - 30 seconds */
        sctp_hb_interval                = 30 * HZ;
 
@@ -1163,8 +1165,6 @@ SCTP_STATIC __init int sctp_init(void)
        status = 0;
 out:
        return status;
-err_add_protocol:
-       sk_free_slab(&sctp_prot);
 err_ctl_sock_init:
        sctp_v6_exit();
 err_v6_init:
@@ -1192,6 +1192,8 @@ err_bucket_cachep:
        inet_del_protocol(&sctp_protocol, IPPROTO_SCTP);
        inet_unregister_protosw(&sctp_seqpacket_protosw);
        inet_unregister_protosw(&sctp_stream_protosw);
+err_add_protocol:
+       proto_unregister(&sctp_prot);
        goto out;
 }
 
@@ -1233,7 +1235,7 @@ SCTP_STATIC __exit void sctp_exit(void)
        inet_del_protocol(&sctp_protocol, IPPROTO_SCTP);
        inet_unregister_protosw(&sctp_seqpacket_protosw);
        inet_unregister_protosw(&sctp_stream_protosw);
-       sk_free_slab(&sctp_prot);
+       proto_unregister(&sctp_prot);
 }
 
 module_init(sctp_init);