1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _LINUX_SOCKET_H
3*4882a593Smuzhiyun #define _LINUX_SOCKET_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <asm/socket.h> /* arch-dependent defines */
7*4882a593Smuzhiyun #include <linux/sockios.h> /* the SIOCxxx I/O controls */
8*4882a593Smuzhiyun #include <linux/uio.h> /* iovec support */
9*4882a593Smuzhiyun #include <linux/types.h> /* pid_t */
10*4882a593Smuzhiyun #include <linux/compiler.h> /* __user */
11*4882a593Smuzhiyun #include <uapi/linux/socket.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun struct file;
14*4882a593Smuzhiyun struct pid;
15*4882a593Smuzhiyun struct cred;
16*4882a593Smuzhiyun struct socket;
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #define __sockaddr_check_size(size) \
19*4882a593Smuzhiyun BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
22*4882a593Smuzhiyun struct seq_file;
23*4882a593Smuzhiyun extern void socket_seq_show(struct seq_file *seq);
24*4882a593Smuzhiyun #endif
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun typedef __kernel_sa_family_t sa_family_t;
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun * 1003.1g requires sa_family_t and that sa_data is char.
30*4882a593Smuzhiyun */
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun struct sockaddr {
33*4882a593Smuzhiyun sa_family_t sa_family; /* address family, AF_xxx */
34*4882a593Smuzhiyun char sa_data[14]; /* 14 bytes of protocol address */
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun struct linger {
38*4882a593Smuzhiyun int l_onoff; /* Linger active */
39*4882a593Smuzhiyun int l_linger; /* How long to linger for */
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #define sockaddr_storage __kernel_sockaddr_storage
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * As we do 4.4BSD message passing we use a 4.4BSD message passing
46*4882a593Smuzhiyun * system, not 4.3. Thus msg_accrights(len) are now missing. They
47*4882a593Smuzhiyun * belong in an obscure libc emulation or the bin.
48*4882a593Smuzhiyun */
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun struct msghdr {
51*4882a593Smuzhiyun void *msg_name; /* ptr to socket address structure */
52*4882a593Smuzhiyun int msg_namelen; /* size of socket address structure */
53*4882a593Smuzhiyun struct iov_iter msg_iter; /* data */
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /*
56*4882a593Smuzhiyun * Ancillary data. msg_control_user is the user buffer used for the
57*4882a593Smuzhiyun * recv* side when msg_control_is_user is set, msg_control is the kernel
58*4882a593Smuzhiyun * buffer used for all other cases.
59*4882a593Smuzhiyun */
60*4882a593Smuzhiyun union {
61*4882a593Smuzhiyun void *msg_control;
62*4882a593Smuzhiyun void __user *msg_control_user;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun bool msg_control_is_user : 1;
65*4882a593Smuzhiyun __kernel_size_t msg_controllen; /* ancillary data buffer length */
66*4882a593Smuzhiyun unsigned int msg_flags; /* flags on received message */
67*4882a593Smuzhiyun struct kiocb *msg_iocb; /* ptr to iocb for async requests */
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun struct user_msghdr {
71*4882a593Smuzhiyun void __user *msg_name; /* ptr to socket address structure */
72*4882a593Smuzhiyun int msg_namelen; /* size of socket address structure */
73*4882a593Smuzhiyun struct iovec __user *msg_iov; /* scatter/gather array */
74*4882a593Smuzhiyun __kernel_size_t msg_iovlen; /* # elements in msg_iov */
75*4882a593Smuzhiyun void __user *msg_control; /* ancillary data */
76*4882a593Smuzhiyun __kernel_size_t msg_controllen; /* ancillary data buffer length */
77*4882a593Smuzhiyun unsigned int msg_flags; /* flags on received message */
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun /* For recvmmsg/sendmmsg */
81*4882a593Smuzhiyun struct mmsghdr {
82*4882a593Smuzhiyun struct user_msghdr msg_hdr;
83*4882a593Smuzhiyun unsigned int msg_len;
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun /*
87*4882a593Smuzhiyun * POSIX 1003.1g - ancillary data object information
88*4882a593Smuzhiyun * Ancillary data consits of a sequence of pairs of
89*4882a593Smuzhiyun * (cmsghdr, cmsg_data[])
90*4882a593Smuzhiyun */
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun struct cmsghdr {
93*4882a593Smuzhiyun __kernel_size_t cmsg_len; /* data byte count, including hdr */
94*4882a593Smuzhiyun int cmsg_level; /* originating protocol */
95*4882a593Smuzhiyun int cmsg_type; /* protocol-specific type */
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun * Ancillary data object information MACROS
100*4882a593Smuzhiyun * Table 5-14 of POSIX 1003.1g
101*4882a593Smuzhiyun */
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
104*4882a593Smuzhiyun #define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun #define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #define CMSG_DATA(cmsg) \
109*4882a593Smuzhiyun ((void *)(cmsg) + sizeof(struct cmsghdr))
110*4882a593Smuzhiyun #define CMSG_USER_DATA(cmsg) \
111*4882a593Smuzhiyun ((void __user *)(cmsg) + sizeof(struct cmsghdr))
112*4882a593Smuzhiyun #define CMSG_SPACE(len) (sizeof(struct cmsghdr) + CMSG_ALIGN(len))
113*4882a593Smuzhiyun #define CMSG_LEN(len) (sizeof(struct cmsghdr) + (len))
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun #define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \
116*4882a593Smuzhiyun (struct cmsghdr *)(ctl) : \
117*4882a593Smuzhiyun (struct cmsghdr *)NULL)
118*4882a593Smuzhiyun #define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
119*4882a593Smuzhiyun #define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && \
120*4882a593Smuzhiyun (cmsg)->cmsg_len <= (unsigned long) \
121*4882a593Smuzhiyun ((mhdr)->msg_controllen - \
122*4882a593Smuzhiyun ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
123*4882a593Smuzhiyun #define for_each_cmsghdr(cmsg, msg) \
124*4882a593Smuzhiyun for (cmsg = CMSG_FIRSTHDR(msg); \
125*4882a593Smuzhiyun cmsg; \
126*4882a593Smuzhiyun cmsg = CMSG_NXTHDR(msg, cmsg))
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun /*
129*4882a593Smuzhiyun * Get the next cmsg header
130*4882a593Smuzhiyun *
131*4882a593Smuzhiyun * PLEASE, do not touch this function. If you think, that it is
132*4882a593Smuzhiyun * incorrect, grep kernel sources and think about consequences
133*4882a593Smuzhiyun * before trying to improve it.
134*4882a593Smuzhiyun *
135*4882a593Smuzhiyun * Now it always returns valid, not truncated ancillary object
136*4882a593Smuzhiyun * HEADER. But caller still MUST check, that cmsg->cmsg_len is
137*4882a593Smuzhiyun * inside range, given by msg->msg_controllen before using
138*4882a593Smuzhiyun * ancillary object DATA. --ANK (980731)
139*4882a593Smuzhiyun */
140*4882a593Smuzhiyun
__cmsg_nxthdr(void * __ctl,__kernel_size_t __size,struct cmsghdr * __cmsg)141*4882a593Smuzhiyun static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
142*4882a593Smuzhiyun struct cmsghdr *__cmsg)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun struct cmsghdr * __ptr;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len));
147*4882a593Smuzhiyun if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
148*4882a593Smuzhiyun return (struct cmsghdr *)0;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun return __ptr;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
cmsg_nxthdr(struct msghdr * __msg,struct cmsghdr * __cmsg)153*4882a593Smuzhiyun static inline struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
msg_data_left(struct msghdr * msg)158*4882a593Smuzhiyun static inline size_t msg_data_left(struct msghdr *msg)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun return iov_iter_count(&msg->msg_iter);
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* "Socket"-level control message types: */
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun #define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
166*4882a593Smuzhiyun #define SCM_CREDENTIALS 0x02 /* rw: struct ucred */
167*4882a593Smuzhiyun #define SCM_SECURITY 0x03 /* rw: security label */
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun struct ucred {
170*4882a593Smuzhiyun __u32 pid;
171*4882a593Smuzhiyun __u32 uid;
172*4882a593Smuzhiyun __u32 gid;
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /* Supported address families. */
176*4882a593Smuzhiyun #define AF_UNSPEC 0
177*4882a593Smuzhiyun #define AF_UNIX 1 /* Unix domain sockets */
178*4882a593Smuzhiyun #define AF_LOCAL 1 /* POSIX name for AF_UNIX */
179*4882a593Smuzhiyun #define AF_INET 2 /* Internet IP Protocol */
180*4882a593Smuzhiyun #define AF_AX25 3 /* Amateur Radio AX.25 */
181*4882a593Smuzhiyun #define AF_IPX 4 /* Novell IPX */
182*4882a593Smuzhiyun #define AF_APPLETALK 5 /* AppleTalk DDP */
183*4882a593Smuzhiyun #define AF_NETROM 6 /* Amateur Radio NET/ROM */
184*4882a593Smuzhiyun #define AF_BRIDGE 7 /* Multiprotocol bridge */
185*4882a593Smuzhiyun #define AF_ATMPVC 8 /* ATM PVCs */
186*4882a593Smuzhiyun #define AF_X25 9 /* Reserved for X.25 project */
187*4882a593Smuzhiyun #define AF_INET6 10 /* IP version 6 */
188*4882a593Smuzhiyun #define AF_ROSE 11 /* Amateur Radio X.25 PLP */
189*4882a593Smuzhiyun #define AF_DECnet 12 /* Reserved for DECnet project */
190*4882a593Smuzhiyun #define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/
191*4882a593Smuzhiyun #define AF_SECURITY 14 /* Security callback pseudo AF */
192*4882a593Smuzhiyun #define AF_KEY 15 /* PF_KEY key management API */
193*4882a593Smuzhiyun #define AF_NETLINK 16
194*4882a593Smuzhiyun #define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */
195*4882a593Smuzhiyun #define AF_PACKET 17 /* Packet family */
196*4882a593Smuzhiyun #define AF_ASH 18 /* Ash */
197*4882a593Smuzhiyun #define AF_ECONET 19 /* Acorn Econet */
198*4882a593Smuzhiyun #define AF_ATMSVC 20 /* ATM SVCs */
199*4882a593Smuzhiyun #define AF_RDS 21 /* RDS sockets */
200*4882a593Smuzhiyun #define AF_SNA 22 /* Linux SNA Project (nutters!) */
201*4882a593Smuzhiyun #define AF_IRDA 23 /* IRDA sockets */
202*4882a593Smuzhiyun #define AF_PPPOX 24 /* PPPoX sockets */
203*4882a593Smuzhiyun #define AF_WANPIPE 25 /* Wanpipe API Sockets */
204*4882a593Smuzhiyun #define AF_LLC 26 /* Linux LLC */
205*4882a593Smuzhiyun #define AF_IB 27 /* Native InfiniBand address */
206*4882a593Smuzhiyun #define AF_MPLS 28 /* MPLS */
207*4882a593Smuzhiyun #define AF_CAN 29 /* Controller Area Network */
208*4882a593Smuzhiyun #define AF_TIPC 30 /* TIPC sockets */
209*4882a593Smuzhiyun #define AF_BLUETOOTH 31 /* Bluetooth sockets */
210*4882a593Smuzhiyun #define AF_IUCV 32 /* IUCV sockets */
211*4882a593Smuzhiyun #define AF_RXRPC 33 /* RxRPC sockets */
212*4882a593Smuzhiyun #define AF_ISDN 34 /* mISDN sockets */
213*4882a593Smuzhiyun #define AF_PHONET 35 /* Phonet sockets */
214*4882a593Smuzhiyun #define AF_IEEE802154 36 /* IEEE802154 sockets */
215*4882a593Smuzhiyun #define AF_CAIF 37 /* CAIF sockets */
216*4882a593Smuzhiyun #define AF_ALG 38 /* Algorithm sockets */
217*4882a593Smuzhiyun #define AF_NFC 39 /* NFC sockets */
218*4882a593Smuzhiyun #define AF_VSOCK 40 /* vSockets */
219*4882a593Smuzhiyun #define AF_KCM 41 /* Kernel Connection Multiplexor*/
220*4882a593Smuzhiyun #define AF_QIPCRTR 42 /* Qualcomm IPC Router */
221*4882a593Smuzhiyun #define AF_SMC 43 /* smc sockets: reserve number for
222*4882a593Smuzhiyun * PF_SMC protocol family that
223*4882a593Smuzhiyun * reuses AF_INET address family
224*4882a593Smuzhiyun */
225*4882a593Smuzhiyun #define AF_XDP 44 /* XDP sockets */
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun #define AF_MAX 45 /* For now.. */
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /* Protocol families, same as address families. */
230*4882a593Smuzhiyun #define PF_UNSPEC AF_UNSPEC
231*4882a593Smuzhiyun #define PF_UNIX AF_UNIX
232*4882a593Smuzhiyun #define PF_LOCAL AF_LOCAL
233*4882a593Smuzhiyun #define PF_INET AF_INET
234*4882a593Smuzhiyun #define PF_AX25 AF_AX25
235*4882a593Smuzhiyun #define PF_IPX AF_IPX
236*4882a593Smuzhiyun #define PF_APPLETALK AF_APPLETALK
237*4882a593Smuzhiyun #define PF_NETROM AF_NETROM
238*4882a593Smuzhiyun #define PF_BRIDGE AF_BRIDGE
239*4882a593Smuzhiyun #define PF_ATMPVC AF_ATMPVC
240*4882a593Smuzhiyun #define PF_X25 AF_X25
241*4882a593Smuzhiyun #define PF_INET6 AF_INET6
242*4882a593Smuzhiyun #define PF_ROSE AF_ROSE
243*4882a593Smuzhiyun #define PF_DECnet AF_DECnet
244*4882a593Smuzhiyun #define PF_NETBEUI AF_NETBEUI
245*4882a593Smuzhiyun #define PF_SECURITY AF_SECURITY
246*4882a593Smuzhiyun #define PF_KEY AF_KEY
247*4882a593Smuzhiyun #define PF_NETLINK AF_NETLINK
248*4882a593Smuzhiyun #define PF_ROUTE AF_ROUTE
249*4882a593Smuzhiyun #define PF_PACKET AF_PACKET
250*4882a593Smuzhiyun #define PF_ASH AF_ASH
251*4882a593Smuzhiyun #define PF_ECONET AF_ECONET
252*4882a593Smuzhiyun #define PF_ATMSVC AF_ATMSVC
253*4882a593Smuzhiyun #define PF_RDS AF_RDS
254*4882a593Smuzhiyun #define PF_SNA AF_SNA
255*4882a593Smuzhiyun #define PF_IRDA AF_IRDA
256*4882a593Smuzhiyun #define PF_PPPOX AF_PPPOX
257*4882a593Smuzhiyun #define PF_WANPIPE AF_WANPIPE
258*4882a593Smuzhiyun #define PF_LLC AF_LLC
259*4882a593Smuzhiyun #define PF_IB AF_IB
260*4882a593Smuzhiyun #define PF_MPLS AF_MPLS
261*4882a593Smuzhiyun #define PF_CAN AF_CAN
262*4882a593Smuzhiyun #define PF_TIPC AF_TIPC
263*4882a593Smuzhiyun #define PF_BLUETOOTH AF_BLUETOOTH
264*4882a593Smuzhiyun #define PF_IUCV AF_IUCV
265*4882a593Smuzhiyun #define PF_RXRPC AF_RXRPC
266*4882a593Smuzhiyun #define PF_ISDN AF_ISDN
267*4882a593Smuzhiyun #define PF_PHONET AF_PHONET
268*4882a593Smuzhiyun #define PF_IEEE802154 AF_IEEE802154
269*4882a593Smuzhiyun #define PF_CAIF AF_CAIF
270*4882a593Smuzhiyun #define PF_ALG AF_ALG
271*4882a593Smuzhiyun #define PF_NFC AF_NFC
272*4882a593Smuzhiyun #define PF_VSOCK AF_VSOCK
273*4882a593Smuzhiyun #define PF_KCM AF_KCM
274*4882a593Smuzhiyun #define PF_QIPCRTR AF_QIPCRTR
275*4882a593Smuzhiyun #define PF_SMC AF_SMC
276*4882a593Smuzhiyun #define PF_XDP AF_XDP
277*4882a593Smuzhiyun #define PF_MAX AF_MAX
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun /* Maximum queue length specifiable by listen. */
280*4882a593Smuzhiyun #define SOMAXCONN 4096
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun /* Flags we can use with send/ and recv.
283*4882a593Smuzhiyun Added those for 1003.1g not all are supported yet
284*4882a593Smuzhiyun */
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun #define MSG_OOB 1
287*4882a593Smuzhiyun #define MSG_PEEK 2
288*4882a593Smuzhiyun #define MSG_DONTROUTE 4
289*4882a593Smuzhiyun #define MSG_TRYHARD 4 /* Synonym for MSG_DONTROUTE for DECnet */
290*4882a593Smuzhiyun #define MSG_CTRUNC 8
291*4882a593Smuzhiyun #define MSG_PROBE 0x10 /* Do not send. Only probe path f.e. for MTU */
292*4882a593Smuzhiyun #define MSG_TRUNC 0x20
293*4882a593Smuzhiyun #define MSG_DONTWAIT 0x40 /* Nonblocking io */
294*4882a593Smuzhiyun #define MSG_EOR 0x80 /* End of record */
295*4882a593Smuzhiyun #define MSG_WAITALL 0x100 /* Wait for a full request */
296*4882a593Smuzhiyun #define MSG_FIN 0x200
297*4882a593Smuzhiyun #define MSG_SYN 0x400
298*4882a593Smuzhiyun #define MSG_CONFIRM 0x800 /* Confirm path validity */
299*4882a593Smuzhiyun #define MSG_RST 0x1000
300*4882a593Smuzhiyun #define MSG_ERRQUEUE 0x2000 /* Fetch message from error queue */
301*4882a593Smuzhiyun #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */
302*4882a593Smuzhiyun #define MSG_MORE 0x8000 /* Sender will send more */
303*4882a593Smuzhiyun #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */
304*4882a593Smuzhiyun #define MSG_SENDPAGE_NOPOLICY 0x10000 /* sendpage() internal : do no apply policy */
305*4882a593Smuzhiyun #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */
306*4882a593Smuzhiyun #define MSG_BATCH 0x40000 /* sendmmsg(): more messages coming */
307*4882a593Smuzhiyun #define MSG_EOF MSG_FIN
308*4882a593Smuzhiyun #define MSG_NO_SHARED_FRAGS 0x80000 /* sendpage() internal : page frags are not shared */
309*4882a593Smuzhiyun #define MSG_SENDPAGE_DECRYPTED 0x100000 /* sendpage() internal : page may carry
310*4882a593Smuzhiyun * plain text and require encryption
311*4882a593Smuzhiyun */
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun #define MSG_ZEROCOPY 0x4000000 /* Use user data in kernel path */
314*4882a593Smuzhiyun #define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */
315*4882a593Smuzhiyun #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exec for file
316*4882a593Smuzhiyun descriptor received through
317*4882a593Smuzhiyun SCM_RIGHTS */
318*4882a593Smuzhiyun #if defined(CONFIG_COMPAT)
319*4882a593Smuzhiyun #define MSG_CMSG_COMPAT 0x80000000 /* This message needs 32 bit fixups */
320*4882a593Smuzhiyun #else
321*4882a593Smuzhiyun #define MSG_CMSG_COMPAT 0 /* We never have 32 bit fixups */
322*4882a593Smuzhiyun #endif
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun /* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
326*4882a593Smuzhiyun #define SOL_IP 0
327*4882a593Smuzhiyun /* #define SOL_ICMP 1 No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */
328*4882a593Smuzhiyun #define SOL_TCP 6
329*4882a593Smuzhiyun #define SOL_UDP 17
330*4882a593Smuzhiyun #define SOL_IPV6 41
331*4882a593Smuzhiyun #define SOL_ICMPV6 58
332*4882a593Smuzhiyun #define SOL_SCTP 132
333*4882a593Smuzhiyun #define SOL_UDPLITE 136 /* UDP-Lite (RFC 3828) */
334*4882a593Smuzhiyun #define SOL_RAW 255
335*4882a593Smuzhiyun #define SOL_IPX 256
336*4882a593Smuzhiyun #define SOL_AX25 257
337*4882a593Smuzhiyun #define SOL_ATALK 258
338*4882a593Smuzhiyun #define SOL_NETROM 259
339*4882a593Smuzhiyun #define SOL_ROSE 260
340*4882a593Smuzhiyun #define SOL_DECNET 261
341*4882a593Smuzhiyun #define SOL_X25 262
342*4882a593Smuzhiyun #define SOL_PACKET 263
343*4882a593Smuzhiyun #define SOL_ATM 264 /* ATM layer (cell level) */
344*4882a593Smuzhiyun #define SOL_AAL 265 /* ATM Adaption Layer (packet level) */
345*4882a593Smuzhiyun #define SOL_IRDA 266
346*4882a593Smuzhiyun #define SOL_NETBEUI 267
347*4882a593Smuzhiyun #define SOL_LLC 268
348*4882a593Smuzhiyun #define SOL_DCCP 269
349*4882a593Smuzhiyun #define SOL_NETLINK 270
350*4882a593Smuzhiyun #define SOL_TIPC 271
351*4882a593Smuzhiyun #define SOL_RXRPC 272
352*4882a593Smuzhiyun #define SOL_PPPOL2TP 273
353*4882a593Smuzhiyun #define SOL_BLUETOOTH 274
354*4882a593Smuzhiyun #define SOL_PNPIPE 275
355*4882a593Smuzhiyun #define SOL_RDS 276
356*4882a593Smuzhiyun #define SOL_IUCV 277
357*4882a593Smuzhiyun #define SOL_CAIF 278
358*4882a593Smuzhiyun #define SOL_ALG 279
359*4882a593Smuzhiyun #define SOL_NFC 280
360*4882a593Smuzhiyun #define SOL_KCM 281
361*4882a593Smuzhiyun #define SOL_TLS 282
362*4882a593Smuzhiyun #define SOL_XDP 283
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun /* IPX options */
365*4882a593Smuzhiyun #define IPX_TYPE 1
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr);
368*4882a593Smuzhiyun extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun struct timespec64;
371*4882a593Smuzhiyun struct __kernel_timespec;
372*4882a593Smuzhiyun struct old_timespec32;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun struct scm_timestamping_internal {
375*4882a593Smuzhiyun struct timespec64 ts[3];
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun extern void put_cmsg_scm_timestamping64(struct msghdr *msg, struct scm_timestamping_internal *tss);
379*4882a593Smuzhiyun extern void put_cmsg_scm_timestamping(struct msghdr *msg, struct scm_timestamping_internal *tss);
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun /* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
382*4882a593Smuzhiyun * forbid_cmsg_compat==false
383*4882a593Smuzhiyun */
384*4882a593Smuzhiyun extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
385*4882a593Smuzhiyun unsigned int flags, bool forbid_cmsg_compat);
386*4882a593Smuzhiyun extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
387*4882a593Smuzhiyun unsigned int flags, bool forbid_cmsg_compat);
388*4882a593Smuzhiyun extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
389*4882a593Smuzhiyun unsigned int vlen, unsigned int flags,
390*4882a593Smuzhiyun struct __kernel_timespec __user *timeout,
391*4882a593Smuzhiyun struct old_timespec32 __user *timeout32);
392*4882a593Smuzhiyun extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
393*4882a593Smuzhiyun unsigned int vlen, unsigned int flags,
394*4882a593Smuzhiyun bool forbid_cmsg_compat);
395*4882a593Smuzhiyun extern long __sys_sendmsg_sock(struct socket *sock, struct msghdr *msg,
396*4882a593Smuzhiyun unsigned int flags);
397*4882a593Smuzhiyun extern long __sys_recvmsg_sock(struct socket *sock, struct msghdr *msg,
398*4882a593Smuzhiyun struct user_msghdr __user *umsg,
399*4882a593Smuzhiyun struct sockaddr __user *uaddr,
400*4882a593Smuzhiyun unsigned int flags);
401*4882a593Smuzhiyun extern int sendmsg_copy_msghdr(struct msghdr *msg,
402*4882a593Smuzhiyun struct user_msghdr __user *umsg, unsigned flags,
403*4882a593Smuzhiyun struct iovec **iov);
404*4882a593Smuzhiyun extern int recvmsg_copy_msghdr(struct msghdr *msg,
405*4882a593Smuzhiyun struct user_msghdr __user *umsg, unsigned flags,
406*4882a593Smuzhiyun struct sockaddr __user **uaddr,
407*4882a593Smuzhiyun struct iovec **iov);
408*4882a593Smuzhiyun extern int __copy_msghdr_from_user(struct msghdr *kmsg,
409*4882a593Smuzhiyun struct user_msghdr __user *umsg,
410*4882a593Smuzhiyun struct sockaddr __user **save_addr,
411*4882a593Smuzhiyun struct iovec __user **uiov, size_t *nsegs);
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /* helpers which do the actual work for syscalls */
414*4882a593Smuzhiyun extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
415*4882a593Smuzhiyun unsigned int flags, struct sockaddr __user *addr,
416*4882a593Smuzhiyun int __user *addr_len);
417*4882a593Smuzhiyun extern int __sys_sendto(int fd, void __user *buff, size_t len,
418*4882a593Smuzhiyun unsigned int flags, struct sockaddr __user *addr,
419*4882a593Smuzhiyun int addr_len);
420*4882a593Smuzhiyun extern int __sys_accept4_file(struct file *file, unsigned file_flags,
421*4882a593Smuzhiyun struct sockaddr __user *upeer_sockaddr,
422*4882a593Smuzhiyun int __user *upeer_addrlen, int flags,
423*4882a593Smuzhiyun unsigned long nofile);
424*4882a593Smuzhiyun extern struct file *do_accept(struct file *file, unsigned file_flags,
425*4882a593Smuzhiyun struct sockaddr __user *upeer_sockaddr,
426*4882a593Smuzhiyun int __user *upeer_addrlen, int flags);
427*4882a593Smuzhiyun extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
428*4882a593Smuzhiyun int __user *upeer_addrlen, int flags);
429*4882a593Smuzhiyun extern int __sys_socket(int family, int type, int protocol);
430*4882a593Smuzhiyun extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
431*4882a593Smuzhiyun extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
432*4882a593Smuzhiyun int addrlen, int file_flags);
433*4882a593Smuzhiyun extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
434*4882a593Smuzhiyun int addrlen);
435*4882a593Smuzhiyun extern int __sys_listen(int fd, int backlog);
436*4882a593Smuzhiyun extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
437*4882a593Smuzhiyun int __user *usockaddr_len);
438*4882a593Smuzhiyun extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
439*4882a593Smuzhiyun int __user *usockaddr_len);
440*4882a593Smuzhiyun extern int __sys_socketpair(int family, int type, int protocol,
441*4882a593Smuzhiyun int __user *usockvec);
442*4882a593Smuzhiyun extern int __sys_shutdown_sock(struct socket *sock, int how);
443*4882a593Smuzhiyun extern int __sys_shutdown(int fd, int how);
444*4882a593Smuzhiyun #endif /* _LINUX_SOCKET_H */
445