/* include/linux/net.h */

struct socket
{
    socket_state            state;

    unsigned long           flags;
    struct proto_ops        *ops;
    struct inode            *inode;
    struct fasync_struct    *fasync_list;   /* Asynchronous wake up list
    */
    struct file             *file;          /* File back pointer for gc
    */
    struct sock             *sk;
    wait_queue_head_t       wait;

    short                   type;
    unsigned char           passcred;
};


typedef enum
{
    SS_FREE = 0,                          /* not allocated                */
    SS_UNCONNECTED,                       /* unconnected to any socket    */
    SS_CONNECTING,                        /* in process of connecting     */
    SS_CONNECTED,                         /* connected to socket          */
    SS_DISCONNECTING                      /* in process of disconnecting  */
}
socket_state;


struct proto_ops
{
    int   family;

    int   (*release)      (struct socket *sock);
    int   (*bind)         (struct socket *sock, struct sockaddr *umyaddr,
                           int sockaddr_len);
    int   (*connect)      (struct socket *sock, struct sockaddr *uservaddr,
                           int sockaddr_len, int flags);
    int   (*socketpair)   (struct socket *sock1, struct socket *sock2);
    int   (*accept)       (struct socket *sock, struct socket *newsock,
                           int flags);
    int   (*getname)      (struct socket *sock, struct sockaddr *uaddr,
                           int *usockaddr_len, int peer);
    unsigned int (*poll)  (struct file *file, struct socket *sock, struct poll_table_struct *wait);
    int   (*ioctl)        (struct socket *sock, unsigned int cmd,
                           unsigned long arg);
    int   (*listen)       (struct socket *sock, int len);
    int   (*shutdown)     (struct socket *sock, int flags);
    int   (*setsockopt)   (struct socket *sock, int level, int optname,
                           char *optval, int optlen);
    int   (*getsockopt)   (struct socket *sock, int level, int optname,
                           char *optval, int *optlen);
    int   (*sendmsg)      (struct socket *sock, struct msghdr *m, int total_len, struct scm_cookie *scm);
    int   (*recvmsg)      (struct socket *sock, struct msghdr *m, int total_len, int flags, struct scm_cookie *scm);
    int   (*mmap)         (struct file *file, struct socket *sock, struct vm_area_struct * vma);
};