xref: /OK3568_Linux_fs/kernel/tools/perf/trace/beauty/include/linux/socket.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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 int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
425*4882a593Smuzhiyun 			 int __user *upeer_addrlen, int flags);
426*4882a593Smuzhiyun extern int __sys_socket(int family, int type, int protocol);
427*4882a593Smuzhiyun extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
428*4882a593Smuzhiyun extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
429*4882a593Smuzhiyun 			      int addrlen, int file_flags);
430*4882a593Smuzhiyun extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
431*4882a593Smuzhiyun 			 int addrlen);
432*4882a593Smuzhiyun extern int __sys_listen(int fd, int backlog);
433*4882a593Smuzhiyun extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
434*4882a593Smuzhiyun 			     int __user *usockaddr_len);
435*4882a593Smuzhiyun extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
436*4882a593Smuzhiyun 			     int __user *usockaddr_len);
437*4882a593Smuzhiyun extern int __sys_socketpair(int family, int type, int protocol,
438*4882a593Smuzhiyun 			    int __user *usockvec);
439*4882a593Smuzhiyun extern int __sys_shutdown(int fd, int how);
440*4882a593Smuzhiyun #endif /* _LINUX_SOCKET_H */
441