mmc: core: SDXC speed class support
[linux-2.6.git] / include / linux / net.h
index 152fa65..b299230 100644 (file)
 #ifndef _LINUX_NET_H
 #define _LINUX_NET_H
 
-#include <linux/config.h>
-#include <linux/wait.h>
-#include <linux/stringify.h>
+#include <linux/socket.h>
 #include <asm/socket.h>
 
-struct poll_table_struct;
-struct inode;
-
-#define NPROTO         32              /* should be enough for now..   */
+#define NPROTO         AF_MAX
 
 #define SYS_SOCKET     1               /* sys_socket(2)                */
 #define SYS_BIND       2               /* sys_bind(2)                  */
@@ -45,6 +40,9 @@ struct inode;
 #define SYS_GETSOCKOPT 15              /* sys_getsockopt(2)            */
 #define SYS_SENDMSG    16              /* sys_sendmsg(2)               */
 #define SYS_RECVMSG    17              /* sys_recvmsg(2)               */
+#define SYS_ACCEPT4    18              /* sys_accept4(2)               */
+#define SYS_RECVMMSG   19              /* sys_recvmmsg(2)              */
+#define SYS_SENDMMSG   20              /* sys_sendmmsg(2)              */
 
 typedef enum {
        SS_FREE = 0,                    /* not allocated                */
@@ -57,11 +55,23 @@ typedef enum {
 #define __SO_ACCEPTCON (1 << 16)       /* performed a listen           */
 
 #ifdef __KERNEL__
+#include <linux/stringify.h>
+#include <linux/random.h>
+#include <linux/wait.h>
+#include <linux/fcntl.h>       /* For O_CLOEXEC and O_NONBLOCK */
+#include <linux/kmemcheck.h>
+#include <linux/rcupdate.h>
+
+struct poll_table_struct;
+struct pipe_inode_info;
+struct inode;
+struct net;
 
 #define SOCK_ASYNC_NOSPACE     0
 #define SOCK_ASYNC_WAITDATA    1
 #define SOCK_NOSPACE           2
 #define SOCK_PASSCRED          3
+#define SOCK_PASSSEC           4
 
 #ifndef ARCH_HAS_SOCKET_TYPES
 /**
@@ -90,29 +100,55 @@ enum sock_type {
 };
 
 #define SOCK_MAX (SOCK_PACKET + 1)
+/* Mask which covers at least up to SOCK_MASK-1.  The
+ * remaining bits are used as flags. */
+#define SOCK_TYPE_MASK 0xf
+
+/* Flags for socket, socketpair, accept4 */
+#define SOCK_CLOEXEC   O_CLOEXEC
+#ifndef SOCK_NONBLOCK
+#define SOCK_NONBLOCK  O_NONBLOCK
+#endif
 
 #endif /* ARCH_HAS_SOCKET_TYPES */
 
+enum sock_shutdown_cmd {
+       SHUT_RD         = 0,
+       SHUT_WR         = 1,
+       SHUT_RDWR       = 2,
+};
+
+struct socket_wq {
+       /* Note: wait MUST be first field of socket_wq */
+       wait_queue_head_t       wait;
+       struct fasync_struct    *fasync_list;
+       struct rcu_head         rcu;
+} ____cacheline_aligned_in_smp;
+
 /**
  *  struct socket - general BSD socket
  *  @state: socket state (%SS_CONNECTED, etc)
+ *  @type: socket type (%SOCK_STREAM, etc)
  *  @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)
  *  @ops: protocol specific socket operations
- *  @fasync_list: Asynchronous wake up list
  *  @file: File back pointer for gc
  *  @sk: internal networking protocol agnostic socket representation
- *  @wait: wait queue for several uses
- *  @type: socket type (%SOCK_STREAM, etc)
+ *  @wq: wait queue for several uses
  */
 struct socket {
        socket_state            state;
+
+       kmemcheck_bitfield_begin(type);
+       short                   type;
+       kmemcheck_bitfield_end(type);
+
        unsigned long           flags;
-       const struct proto_ops  *ops;
-       struct fasync_struct    *fasync_list;
+
+       struct socket_wq __rcu  *wq;
+
        struct file             *file;
        struct sock             *sk;
-       wait_queue_head_t       wait;
-       short                   type;
+       const struct proto_ops  *ops;
 };
 
 struct vm_area_struct;
@@ -143,16 +179,22 @@ struct proto_ops {
                                      struct poll_table_struct *wait);
        int             (*ioctl)     (struct socket *sock, unsigned int cmd,
                                      unsigned long arg);
+#ifdef CONFIG_COMPAT
+       int             (*compat_ioctl) (struct socket *sock, unsigned int cmd,
+                                     unsigned long arg);
+#endif
        int             (*listen)    (struct socket *sock, int len);
        int             (*shutdown)  (struct socket *sock, int flags);
        int             (*setsockopt)(struct socket *sock, int level,
-                                     int optname, char __user *optval, int optlen);
+                                     int optname, char __user *optval, unsigned int optlen);
        int             (*getsockopt)(struct socket *sock, int level,
                                      int optname, char __user *optval, int __user *optlen);
+#ifdef CONFIG_COMPAT
        int             (*compat_setsockopt)(struct socket *sock, int level,
-                                     int optname, char __user *optval, int optlen);
+                                     int optname, char __user *optval, unsigned int optlen);
        int             (*compat_getsockopt)(struct socket *sock, int level,
                                      int optname, char __user *optval, int __user *optlen);
+#endif
        int             (*sendmsg)   (struct kiocb *iocb, struct socket *sock,
                                      struct msghdr *m, size_t total_len);
        int             (*recvmsg)   (struct kiocb *iocb, struct socket *sock,
@@ -162,25 +204,35 @@ struct proto_ops {
                                      struct vm_area_struct * vma);
        ssize_t         (*sendpage)  (struct socket *sock, struct page *page,
                                      int offset, size_t size, int flags);
+       ssize_t         (*splice_read)(struct socket *sock,  loff_t *ppos,
+                                      struct pipe_inode_info *pipe, size_t len, unsigned int flags);
 };
 
+#define DECLARE_SOCKADDR(type, dst, src)       \
+       type dst = ({ __sockaddr_check_size(sizeof(*dst)); (type) src; })
+
 struct net_proto_family {
        int             family;
-       int             (*create)(struct socket *sock, int protocol);
-       /* These are counters for the number of different methods of
-          each we support */
-       short           authentication;
-       short           encryption;
-       short           encrypt_net;
+       int             (*create)(struct net *net, struct socket *sock,
+                                 int protocol, int kern);
        struct module   *owner;
 };
 
 struct iovec;
 struct kvec;
 
+enum {
+       SOCK_WAKE_IO,
+       SOCK_WAKE_WAITD,
+       SOCK_WAKE_SPACE,
+       SOCK_WAKE_URG,
+};
+
 extern int          sock_wake_async(struct socket *sk, int how, int band);
-extern int          sock_register(struct net_proto_family *fam);
-extern int          sock_unregister(int family);
+extern int          sock_register(const struct net_proto_family *fam);
+extern void         sock_unregister(int family);
+extern int          __sock_create(struct net *net, int family, int type, int proto,
+                                struct socket **res, int kern);
 extern int          sock_create(int family, int type, int proto,
                                 struct socket **res);
 extern int          sock_create_kern(int family, int type, int proto,
@@ -192,13 +244,13 @@ extern int             sock_sendmsg(struct socket *sock, struct msghdr *msg,
                                  size_t len);
 extern int          sock_recvmsg(struct socket *sock, struct msghdr *msg,
                                  size_t size, int flags);
-extern int          sock_map_fd(struct socket *sock);
+extern int          sock_map_fd(struct socket *sock, int flags);
 extern struct socket *sockfd_lookup(int fd, int *err);
 #define                     sockfd_put(sock) fput(sock->file)
 extern int          net_ratelimit(void);
-extern unsigned long net_random(void);
-extern void         net_srandom(unsigned long);
-extern void         net_random_init(void);
+
+#define net_random()           random32()
+#define net_srandom(seed)      srandom32((__force u32)seed)
 
 extern int          kernel_sendmsg(struct socket *sock, struct msghdr *msg,
                                    struct kvec *vec, size_t num, size_t len);
@@ -206,84 +258,26 @@ extern int             kernel_recvmsg(struct socket *sock, struct msghdr *msg,
                                    struct kvec *vec, size_t num,
                                    size_t len, int flags);
 
-#ifndef CONFIG_SMP
-#define SOCKOPS_WRAPPED(name) name
-#define SOCKOPS_WRAP(name, fam)
-#else
-
-#define SOCKOPS_WRAPPED(name) __unlocked_##name
-
-#define SOCKCALL_WRAP(name, call, parms, args)         \
-static int __lock_##name##_##call  parms               \
-{                                                      \
-       int ret;                                        \
-       lock_kernel();                                  \
-       ret = __unlocked_##name##_ops.call  args ;\
-       unlock_kernel();                                \
-       return ret;                                     \
-}
-
-#define SOCKCALL_UWRAP(name, call, parms, args)                \
-static unsigned int __lock_##name##_##call  parms      \
-{                                                      \
-       int ret;                                        \
-       lock_kernel();                                  \
-       ret = __unlocked_##name##_ops.call  args ;\
-       unlock_kernel();                                \
-       return ret;                                     \
-}
-
-
-#define SOCKOPS_WRAP(name, fam)                                        \
-SOCKCALL_WRAP(name, release, (struct socket *sock), (sock))    \
-SOCKCALL_WRAP(name, bind, (struct socket *sock, struct sockaddr *uaddr, int addr_len), \
-             (sock, uaddr, addr_len))                          \
-SOCKCALL_WRAP(name, connect, (struct socket *sock, struct sockaddr * uaddr, \
-                             int addr_len, int flags),         \
-             (sock, uaddr, addr_len, flags))                   \
-SOCKCALL_WRAP(name, socketpair, (struct socket *sock1, struct socket *sock2), \
-             (sock1, sock2))                                   \
-SOCKCALL_WRAP(name, accept, (struct socket *sock, struct socket *newsock, \
-                        int flags), (sock, newsock, flags)) \
-SOCKCALL_WRAP(name, getname, (struct socket *sock, struct sockaddr *uaddr, \
-                        int *addr_len, int peer), (sock, uaddr, addr_len, peer)) \
-SOCKCALL_UWRAP(name, poll, (struct file *file, struct socket *sock, struct poll_table_struct *wait), \
-             (file, sock, wait)) \
-SOCKCALL_WRAP(name, ioctl, (struct socket *sock, unsigned int cmd, \
-                        unsigned long arg), (sock, cmd, arg)) \
-SOCKCALL_WRAP(name, listen, (struct socket *sock, int len), (sock, len)) \
-SOCKCALL_WRAP(name, shutdown, (struct socket *sock, int flags), (sock, flags)) \
-SOCKCALL_WRAP(name, setsockopt, (struct socket *sock, int level, int optname, \
-                        char __user *optval, int optlen), (sock, level, optname, optval, optlen)) \
-SOCKCALL_WRAP(name, getsockopt, (struct socket *sock, int level, int optname, \
-                        char __user *optval, int __user *optlen), (sock, level, optname, optval, optlen)) \
-SOCKCALL_WRAP(name, sendmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len), \
-             (iocb, sock, m, len)) \
-SOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len, int flags), \
-             (iocb, sock, m, len, flags)) \
-SOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \
-             (file, sock, vma)) \
-             \
-static const struct proto_ops name##_ops = {                   \
-       .family         = fam,                          \
-       .owner          = THIS_MODULE,                  \
-       .release        = __lock_##name##_release,      \
-       .bind           = __lock_##name##_bind,         \
-       .connect        = __lock_##name##_connect,      \
-       .socketpair     = __lock_##name##_socketpair,   \
-       .accept         = __lock_##name##_accept,       \
-       .getname        = __lock_##name##_getname,      \
-       .poll           = __lock_##name##_poll,         \
-       .ioctl          = __lock_##name##_ioctl,        \
-       .listen         = __lock_##name##_listen,       \
-       .shutdown       = __lock_##name##_shutdown,     \
-       .setsockopt     = __lock_##name##_setsockopt,   \
-       .getsockopt     = __lock_##name##_getsockopt,   \
-       .sendmsg        = __lock_##name##_sendmsg,      \
-       .recvmsg        = __lock_##name##_recvmsg,      \
-       .mmap           = __lock_##name##_mmap,         \
-};
-#endif
+extern int kernel_bind(struct socket *sock, struct sockaddr *addr,
+                      int addrlen);
+extern int kernel_listen(struct socket *sock, int backlog);
+extern int kernel_accept(struct socket *sock, struct socket **newsock,
+                        int flags);
+extern int kernel_connect(struct socket *sock, struct sockaddr *addr,
+                         int addrlen, int flags);
+extern int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
+                             int *addrlen);
+extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
+                             int *addrlen);
+extern int kernel_getsockopt(struct socket *sock, int level, int optname,
+                            char *optval, int *optlen);
+extern int kernel_setsockopt(struct socket *sock, int level, int optname,
+                            char *optval, unsigned int optlen);
+extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
+                          size_t size, int flags);
+extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
+extern int kernel_sock_shutdown(struct socket *sock,
+                               enum sock_shutdown_cmd how);
 
 #define MODULE_ALIAS_NETPROTO(proto) \
        MODULE_ALIAS("net-pf-" __stringify(proto))
@@ -291,12 +285,9 @@ static const struct proto_ops name##_ops = {                       \
 #define MODULE_ALIAS_NET_PF_PROTO(pf, proto) \
        MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto))
 
-#ifdef CONFIG_SYSCTL
-#include <linux/sysctl.h>
-extern ctl_table net_table[];
-extern int net_msg_cost;
-extern int net_msg_burst;
-#endif
+#define MODULE_ALIAS_NET_PF_PROTO_TYPE(pf, proto, type) \
+       MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto) \
+                    "-type-" __stringify(type))
 
 #endif /* __KERNEL__ */
 #endif /* _LINUX_NET_H */