1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * NET An implementation of the SOCKET network access protocol. 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is the master header file for the Linux NET layer, 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or, in plain English: the networking handling part of the 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * kernel. 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Version: @(#)net.h 1.0.3 05/25/93 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Authors: Orest Zborowski, <obz@Kodak.COM> 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Ross Biro 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * modify it under the terms of the GNU General Public License 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * as published by the Free Software Foundation; either version 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 2 of the License, or (at your option) any later version. 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_NET_H 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_NET_H 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/wait.h> 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/socket.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct poll_table_struct; 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct inode; 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define NPROTO 32 /* should be enough for now.. */ 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SOCKET 1 /* sys_socket(2) */ 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_BIND 2 /* sys_bind(2) */ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_CONNECT 3 /* sys_connect(2) */ 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_LISTEN 4 /* sys_listen(2) */ 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_ACCEPT 5 /* sys_accept(2) */ 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_GETSOCKNAME 6 /* sys_getsockname(2) */ 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_GETPEERNAME 7 /* sys_getpeername(2) */ 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SOCKETPAIR 8 /* sys_socketpair(2) */ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SEND 9 /* sys_send(2) */ 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_RECV 10 /* sys_recv(2) */ 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SENDTO 11 /* sys_sendto(2) */ 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_RECVFROM 12 /* sys_recvfrom(2) */ 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SHUTDOWN 13 /* sys_shutdown(2) */ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SETSOCKOPT 14 /* sys_setsockopt(2) */ 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_SENDMSG 16 /* sys_sendmsg(2) */ 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SYS_RECVMSG 17 /* sys_recvmsg(2) */ 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef enum { 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SS_FREE = 0, /* not allocated */ 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SS_UNCONNECTED, /* unconnected to any socket */ 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SS_CONNECTING, /* in process of connecting */ 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SS_CONNECTED, /* connected to socket */ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SS_DISCONNECTING /* in process of disconnecting */ 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} socket_state; 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define __SO_ACCEPTCON (1 << 16) /* performed a listen */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/stringify.h> 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_ASYNC_NOSPACE 0 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_ASYNC_WAITDATA 1 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_NOSPACE 2 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_PASSCRED 3 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_PASSSEC 4 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef ARCH_HAS_SOCKET_TYPES 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * enum sock_type - Socket types 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_STREAM: stream (connection) socket 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_DGRAM: datagram (conn.less) socket 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_RAW: raw socket 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_RDM: reliably-delivered message 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_SEQPACKET: sequential packet socket 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_DCCP: Datagram Congestion Control Protocol socket 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @SOCK_PACKET: linux specific way of getting packets at the dev level. 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * For writing rarp and other similar things on the user level. 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * When adding some new socket type please 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * grep ARCH_HAS_SOCKET_TYPE include/asm-* /socket.h, at least MIPS 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * overrides this enum for binary compat reasons. 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum sock_type { 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_STREAM = 1, 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_DGRAM = 2, 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_RAW = 3, 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_RDM = 4, 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_SEQPACKET = 5, 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_DCCP = 6, 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru SOCK_PACKET = 10, 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCK_MAX (SOCK_PACKET + 1) 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* ARCH_HAS_SOCKET_TYPES */ 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct socket - general BSD socket 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @state: socket state (%SS_CONNECTED, etc) 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc) 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @ops: protocol specific socket operations 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @fasync_list: Asynchronous wake up list 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @file: File back pointer for gc 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @sk: internal networking protocol agnostic socket representation 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @wait: wait queue for several uses 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @type: socket type (%SOCK_STREAM, etc) 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct socket { 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru socket_state state; 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long flags; 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct proto_ops *ops; 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct fasync_struct *fasync_list; 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file *file; 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sock *sk; 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru wait_queue_head_t wait; 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru short type; 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct vm_area_struct; 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct page; 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct kiocb; 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct sockaddr; 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct msghdr; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct module; 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct proto_ops { 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int family; 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module *owner; 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*release) (struct socket *sock); 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*bind) (struct socket *sock, 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sockaddr *myaddr, 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int sockaddr_len); 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*connect) (struct socket *sock, 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sockaddr *vaddr, 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int sockaddr_len, int flags); 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*socketpair)(struct socket *sock1, 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct socket *sock2); 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*accept) (struct socket *sock, 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct socket *newsock, int flags); 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*getname) (struct socket *sock, 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct sockaddr *addr, 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int *sockaddr_len, int peer); 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int (*poll) (struct file *file, struct socket *sock, 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct poll_table_struct *wait); 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*ioctl) (struct socket *sock, unsigned int cmd, 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long arg); 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*compat_ioctl) (struct socket *sock, unsigned int cmd, 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long arg); 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*listen) (struct socket *sock, int len); 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*shutdown) (struct socket *sock, int flags); 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*setsockopt)(struct socket *sock, int level, 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int optname, char __user *optval, int optlen); 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*getsockopt)(struct socket *sock, int level, 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int optname, char __user *optval, int __user *optlen); 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*compat_setsockopt)(struct socket *sock, int level, 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int optname, char __user *optval, int optlen); 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*compat_getsockopt)(struct socket *sock, int level, 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int optname, char __user *optval, int __user *optlen); 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*sendmsg) (struct kiocb *iocb, struct socket *sock, 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct msghdr *m, size_t total_len); 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*recvmsg) (struct kiocb *iocb, struct socket *sock, 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct msghdr *m, size_t total_len, 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int flags); 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*mmap) (struct file *file, struct socket *sock, 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct vm_area_struct * vma); 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*sendpage) (struct socket *sock, struct page *page, 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int offset, size_t size, int flags); 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct net_proto_family { 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int family; 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*create)(struct socket *sock, int protocol); 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* These are counters for the number of different methods of 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru each we support */ 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru short authentication; 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru short encryption; 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru short encrypt_net; 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module *owner; 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct iovec; 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct kvec; 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_wake_async(struct socket *sk, int how, int band); 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_register(struct net_proto_family *fam); 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_unregister(int family); 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_create(int family, int type, int proto, 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct socket **res); 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_create_kern(int family, int type, int proto, 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct socket **res); 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_create_lite(int family, int type, int proto, 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct socket **res); 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void sock_release(struct socket *sock); 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_sendmsg(struct socket *sock, struct msghdr *msg, 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t len); 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_recvmsg(struct socket *sock, struct msghdr *msg, 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t size, int flags); 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int sock_map_fd(struct socket *sock); 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct socket *sockfd_lookup(int fd, int *err); 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define sockfd_put(sock) fput(sock->file) 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int net_ratelimit(void); 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long net_random(void); 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void net_srandom(unsigned long); 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void net_random_init(void); 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int kernel_sendmsg(struct socket *sock, struct msghdr *msg, 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kvec *vec, size_t num, size_t len); 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int kernel_recvmsg(struct socket *sock, struct msghdr *msg, 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kvec *vec, size_t num, 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru size_t len, int flags); 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef CONFIG_SMP 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKOPS_WRAPPED(name) name 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKOPS_WRAP(name, fam) 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKOPS_WRAPPED(name) __unlocked_##name 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKCALL_WRAP(name, call, parms, args) \ 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic int __lock_##name##_##call parms \ 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ \ 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ret; \ 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock_kernel(); \ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = __unlocked_##name##_ops.call args ;\ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unlock_kernel(); \ 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; \ 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKCALL_UWRAP(name, call, parms, args) \ 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic unsigned int __lock_##name##_##call parms \ 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ \ 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int ret; \ 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru lock_kernel(); \ 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ret = __unlocked_##name##_ops.call args ;\ 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unlock_kernel(); \ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return ret; \ 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SOCKOPS_WRAP(name, fam) \ 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, release, (struct socket *sock), (sock)) \ 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, bind, (struct socket *sock, struct sockaddr *uaddr, int addr_len), \ 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (sock, uaddr, addr_len)) \ 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, connect, (struct socket *sock, struct sockaddr * uaddr, \ 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int addr_len, int flags), \ 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (sock, uaddr, addr_len, flags)) \ 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, socketpair, (struct socket *sock1, struct socket *sock2), \ 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (sock1, sock2)) \ 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, accept, (struct socket *sock, struct socket *newsock, \ 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int flags), (sock, newsock, flags)) \ 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, getname, (struct socket *sock, struct sockaddr *uaddr, \ 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int *addr_len, int peer), (sock, uaddr, addr_len, peer)) \ 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_UWRAP(name, poll, (struct file *file, struct socket *sock, struct poll_table_struct *wait), \ 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (file, sock, wait)) \ 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, ioctl, (struct socket *sock, unsigned int cmd, \ 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long arg), (sock, cmd, arg)) \ 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, compat_ioctl, (struct socket *sock, unsigned int cmd, \ 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long arg), (sock, cmd, arg)) \ 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, listen, (struct socket *sock, int len), (sock, len)) \ 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, shutdown, (struct socket *sock, int flags), (sock, flags)) \ 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, setsockopt, (struct socket *sock, int level, int optname, \ 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char __user *optval, int optlen), (sock, level, optname, optval, optlen)) \ 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, getsockopt, (struct socket *sock, int level, int optname, \ 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char __user *optval, int __user *optlen), (sock, level, optname, optval, optlen)) \ 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, sendmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len), \ 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (iocb, sock, m, len)) \ 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, recvmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len, int flags), \ 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (iocb, sock, m, len, flags)) \ 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste QueruSOCKCALL_WRAP(name, mmap, (struct file *file, struct socket *sock, struct vm_area_struct *vma), \ 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru (file, sock, vma)) \ 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru \ 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic const struct proto_ops name##_ops = { \ 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .family = fam, \ 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .owner = THIS_MODULE, \ 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .release = __lock_##name##_release, \ 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .bind = __lock_##name##_bind, \ 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .connect = __lock_##name##_connect, \ 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .socketpair = __lock_##name##_socketpair, \ 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .accept = __lock_##name##_accept, \ 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .getname = __lock_##name##_getname, \ 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .poll = __lock_##name##_poll, \ 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .ioctl = __lock_##name##_ioctl, \ 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .compat_ioctl = __lock_##name##_compat_ioctl, \ 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .listen = __lock_##name##_listen, \ 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .shutdown = __lock_##name##_shutdown, \ 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .setsockopt = __lock_##name##_setsockopt, \ 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .getsockopt = __lock_##name##_getsockopt, \ 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .sendmsg = __lock_##name##_sendmsg, \ 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .recvmsg = __lock_##name##_recvmsg, \ 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru .mmap = __lock_##name##_mmap, \ 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MODULE_ALIAS_NETPROTO(proto) \ 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MODULE_ALIAS("net-pf-" __stringify(proto)) 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MODULE_ALIAS_NET_PF_PROTO(pf, proto) \ 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MODULE_ALIAS("net-pf-" __stringify(pf) "-proto-" __stringify(proto)) 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SYSCTL 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/sysctl.h> 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern ctl_table net_table[]; 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int net_msg_cost; 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int net_msg_burst; 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_NET_H */ 309