This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / core / sock.c
index 9146be7..91608bc 100644 (file)
 #include <linux/ipsec.h>
 
 #include <linux/filter.h>
+#include <linux/vs_socket.h>
 
 #ifdef CONFIG_INET
 #include <net/tcp.h>
@@ -175,6 +176,15 @@ static void sock_warn_obsolete_bsdism(const char *name)
        }
 }
 
+static void sock_disable_timestamp(struct sock *sk)
+{      
+       if (sock_flag(sk, SOCK_TIMESTAMP)) { 
+               sock_reset_flag(sk, SOCK_TIMESTAMP);
+               atomic_dec(&netstamp_needed);
+       }
+}
+
+
 /*
  *     This is meant for all protocols to use and covers goings on
  *     at the socket level. Everything here is generic.
@@ -324,9 +334,26 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                        break;
 
                case SO_PASSCRED:
-                       sock->passcred = valbool;
+                       if (valbool)
+                               set_bit(SOCK_PASS_CRED, &sock->flags);
+                       else
+                               clear_bit(SOCK_PASS_CRED, &sock->flags);
                        break;
 
+#if defined(CONFIG_VNET) || defined(CONFIG_VNET_MODULE)
+               case SO_SETXID:
+                       if (current->xid) {
+                               ret = -EPERM;
+                               break;
+                       }
+                       if (val < 0 || val > MAX_S_CONTEXT) {
+                               ret = -EINVAL;
+                               break;
+                       }
+                       sk->sk_xid = val;
+                       break;
+#endif
+
                case SO_TIMESTAMP:
                        sk->sk_rcvtstamp = valbool;
                        if (valbool) 
@@ -548,7 +575,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                        break; 
 
                case SO_PASSCRED:
-                       v.val = sock->passcred;
+                       v.val = test_bit(SOCK_PASS_CRED, &sock->flags)?1:0;
                        break;
 
                case SO_PEERCRED:
@@ -623,6 +650,8 @@ struct sock *sk_alloc(int family, int priority, int zero_it, kmem_cache_t *slab)
                        sock_lock_init(sk);
                }
                sk->sk_slab = slab;
+               sock_vx_init(sk);
+               sock_nx_init(sk);
                
                if (security_sk_alloc(sk, family, priority)) {
                        kmem_cache_free(slab, sk);
@@ -653,6 +682,8 @@ void sk_free(struct sock *sk)
                       __FUNCTION__, atomic_read(&sk->sk_omem_alloc));
 
        security_sk_free(sk);
+       BUG_ON(sk->sk_vx_info);
+       BUG_ON(sk->sk_nx_info);
        kmem_cache_free(sk->sk_slab, sk);
        module_put(owner);
 }
@@ -904,7 +935,7 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
        return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
 }
 
-void __lock_sock(struct sock *sk)
+static void __lock_sock(struct sock *sk)
 {
        DEFINE_WAIT(wait);
 
@@ -920,7 +951,7 @@ void __lock_sock(struct sock *sk)
        finish_wait(&sk->sk_lock.wq, &wait);
 }
 
-void __release_sock(struct sock *sk)
+static void __release_sock(struct sock *sk)
 {
        struct sk_buff *skb = sk->sk_backlog.head;
 
@@ -972,11 +1003,6 @@ EXPORT_SYMBOL(sk_wait_data);
  * function, some default processing is provided.
  */
 
-int sock_no_release(struct socket *sock)
-{
-       return 0;
-}
-
 int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len)
 {
        return -EOPNOTSUPP;
@@ -1195,6 +1221,11 @@ void sock_init_data(struct socket *sock, struct sock *sk)
        sk->sk_stamp.tv_sec     = -1L;
        sk->sk_stamp.tv_usec    = -1L;
 
+       sk->sk_vx_info          =       NULL;
+       sk->sk_xid              =       0;
+       sk->sk_nx_info          =       NULL;
+       sk->sk_nid              =       0;
+
        atomic_set(&sk->sk_refcnt, 1);
 }
 
@@ -1247,15 +1278,6 @@ void sock_enable_timestamp(struct sock *sk)
 }
 EXPORT_SYMBOL(sock_enable_timestamp); 
 
-void sock_disable_timestamp(struct sock *sk)
-{      
-       if (sock_flag(sk, SOCK_TIMESTAMP)) { 
-               sock_reset_flag(sk, SOCK_TIMESTAMP);
-               atomic_dec(&netstamp_needed);
-       }
-}
-EXPORT_SYMBOL(sock_disable_timestamp);
-
 /*
  *     Get a socket option on an socket.
  *
@@ -1343,14 +1365,31 @@ void sk_common_release(struct sock *sk)
 
 EXPORT_SYMBOL(sk_common_release);
 
-EXPORT_SYMBOL(__lock_sock);
-EXPORT_SYMBOL(__release_sock);
+int sk_alloc_slab(struct proto *prot, char *name)
+{
+       prot->slab = kmem_cache_create(name,
+                                      prot->slab_obj_size, 0,
+                                      SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+       return prot->slab != NULL ? 0 : -ENOBUFS;
+}
+
+EXPORT_SYMBOL(sk_alloc_slab);
+
+void sk_free_slab(struct proto *prot)
+{
+       if (prot->slab != NULL) {
+               kmem_cache_destroy(prot->slab);
+               prot->slab = NULL;
+       }
+}
+
+EXPORT_SYMBOL(sk_free_slab);
 EXPORT_SYMBOL(sk_alloc);
 EXPORT_SYMBOL(sk_free);
 EXPORT_SYMBOL(sk_send_sigurg);
 EXPORT_SYMBOL(sock_alloc_send_pskb);
 EXPORT_SYMBOL(sock_alloc_send_skb);
-EXPORT_SYMBOL(sock_getsockopt);
 EXPORT_SYMBOL(sock_init_data);
 EXPORT_SYMBOL(sock_kfree_s);
 EXPORT_SYMBOL(sock_kmalloc);
@@ -1364,14 +1403,12 @@ EXPORT_SYMBOL(sock_no_listen);
 EXPORT_SYMBOL(sock_no_mmap);
 EXPORT_SYMBOL(sock_no_poll);
 EXPORT_SYMBOL(sock_no_recvmsg);
-EXPORT_SYMBOL(sock_no_release);
 EXPORT_SYMBOL(sock_no_sendmsg);
 EXPORT_SYMBOL(sock_no_sendpage);
 EXPORT_SYMBOL(sock_no_setsockopt);
 EXPORT_SYMBOL(sock_no_shutdown);
 EXPORT_SYMBOL(sock_no_socketpair);
 EXPORT_SYMBOL(sock_rfree);
-EXPORT_SYMBOL(sock_rmalloc);
 EXPORT_SYMBOL(sock_setsockopt);
 EXPORT_SYMBOL(sock_wfree);
 EXPORT_SYMBOL(sock_wmalloc);