| .. | .. | 
|---|
| 10 | 10 | #include <linux/compiler.h>		/* __user			*/ | 
|---|
| 11 | 11 | #include <uapi/linux/socket.h> | 
|---|
| 12 | 12 |  | 
|---|
|  | 13 | +struct file; | 
|---|
| 13 | 14 | struct pid; | 
|---|
| 14 | 15 | struct cred; | 
|---|
|  | 16 | +struct socket; | 
|---|
| 15 | 17 |  | 
|---|
| 16 | 18 | #define __sockaddr_check_size(size)	\ | 
|---|
| 17 | 19 | BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage))) | 
|---|
| .. | .. | 
|---|
| 49 | 51 | void		*msg_name;	/* ptr to socket address structure */ | 
|---|
| 50 | 52 | int		msg_namelen;	/* size of socket address structure */ | 
|---|
| 51 | 53 | struct iov_iter	msg_iter;	/* data */ | 
|---|
| 52 |  | -	void		*msg_control;	/* ancillary data */ | 
|---|
|  | 54 | + | 
|---|
|  | 55 | +	/* | 
|---|
|  | 56 | +	 * Ancillary data. msg_control_user is the user buffer used for the | 
|---|
|  | 57 | +	 * recv* side when msg_control_is_user is set, msg_control is the kernel | 
|---|
|  | 58 | +	 * buffer used for all other cases. | 
|---|
|  | 59 | +	 */ | 
|---|
|  | 60 | +	union { | 
|---|
|  | 61 | +		void		*msg_control; | 
|---|
|  | 62 | +		void __user	*msg_control_user; | 
|---|
|  | 63 | +	}; | 
|---|
|  | 64 | +	bool		msg_control_is_user : 1; | 
|---|
| 53 | 65 | __kernel_size_t	msg_controllen;	/* ancillary data buffer length */ | 
|---|
| 54 | 66 | unsigned int	msg_flags;	/* flags on received message */ | 
|---|
| 55 | 67 | struct kiocb	*msg_iocb;	/* ptr to iocb for async requests */ | 
|---|
| .. | .. | 
|---|
| 93 | 105 |  | 
|---|
| 94 | 106 | #define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) ) | 
|---|
| 95 | 107 |  | 
|---|
| 96 |  | -#define CMSG_DATA(cmsg)	((void *)((char *)(cmsg) + sizeof(struct cmsghdr))) | 
|---|
|  | 108 | +#define CMSG_DATA(cmsg) \ | 
|---|
|  | 109 | +	((void *)(cmsg) + sizeof(struct cmsghdr)) | 
|---|
|  | 110 | +#define CMSG_USER_DATA(cmsg) \ | 
|---|
|  | 111 | +	((void __user *)(cmsg) + sizeof(struct cmsghdr)) | 
|---|
| 97 | 112 | #define CMSG_SPACE(len) (sizeof(struct cmsghdr) + CMSG_ALIGN(len)) | 
|---|
| 98 | 113 | #define CMSG_LEN(len) (sizeof(struct cmsghdr) + (len)) | 
|---|
| 99 | 114 |  | 
|---|
| .. | .. | 
|---|
| 262 | 277 | #define PF_MAX		AF_MAX | 
|---|
| 263 | 278 |  | 
|---|
| 264 | 279 | /* Maximum queue length specifiable by listen.  */ | 
|---|
| 265 |  | -#define SOMAXCONN	128 | 
|---|
|  | 280 | +#define SOMAXCONN	4096 | 
|---|
| 266 | 281 |  | 
|---|
| 267 | 282 | /* Flags we can use with send/ and recv. | 
|---|
| 268 | 283 | Added those for 1003.1g not all are supported yet | 
|---|
| .. | .. | 
|---|
| 286 | 301 | #define MSG_NOSIGNAL	0x4000	/* Do not generate SIGPIPE */ | 
|---|
| 287 | 302 | #define MSG_MORE	0x8000	/* Sender will send more */ | 
|---|
| 288 | 303 | #define MSG_WAITFORONE	0x10000	/* recvmmsg(): block until 1+ packets avail */ | 
|---|
|  | 304 | +#define MSG_SENDPAGE_NOPOLICY 0x10000 /* sendpage() internal : do no apply policy */ | 
|---|
| 289 | 305 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | 
|---|
| 290 | 306 | #define MSG_BATCH	0x40000 /* sendmmsg(): more messages coming */ | 
|---|
| 291 | 307 | #define MSG_EOF         MSG_FIN | 
|---|
| 292 | 308 | #define MSG_NO_SHARED_FRAGS 0x80000 /* sendpage() internal : page frags are not shared */ | 
|---|
|  | 309 | +#define MSG_SENDPAGE_DECRYPTED	0x100000 /* sendpage() internal : page may carry | 
|---|
|  | 310 | +					  * plain text and require encryption | 
|---|
|  | 311 | +					  */ | 
|---|
| 293 | 312 |  | 
|---|
| 294 | 313 | #define MSG_ZEROCOPY	0x4000000	/* Use user data in kernel path */ | 
|---|
| 295 | 314 | #define MSG_FASTOPEN	0x20000000	/* Send data in TCP SYN */ | 
|---|
| .. | .. | 
|---|
| 348 | 367 | extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr); | 
|---|
| 349 | 368 | extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | 
|---|
| 350 | 369 |  | 
|---|
| 351 |  | -struct timespec; | 
|---|
|  | 370 | +struct timespec64; | 
|---|
|  | 371 | +struct __kernel_timespec; | 
|---|
|  | 372 | +struct old_timespec32; | 
|---|
|  | 373 | + | 
|---|
|  | 374 | +struct scm_timestamping_internal { | 
|---|
|  | 375 | +	struct timespec64 ts[3]; | 
|---|
|  | 376 | +}; | 
|---|
|  | 377 | + | 
|---|
|  | 378 | +extern void put_cmsg_scm_timestamping64(struct msghdr *msg, struct scm_timestamping_internal *tss); | 
|---|
|  | 379 | +extern void put_cmsg_scm_timestamping(struct msghdr *msg, struct scm_timestamping_internal *tss); | 
|---|
| 352 | 380 |  | 
|---|
| 353 | 381 | /* The __sys_...msg variants allow MSG_CMSG_COMPAT iff | 
|---|
| 354 | 382 | * forbid_cmsg_compat==false | 
|---|
| .. | .. | 
|---|
| 357 | 385 | unsigned int flags, bool forbid_cmsg_compat); | 
|---|
| 358 | 386 | extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, | 
|---|
| 359 | 387 | unsigned int flags, bool forbid_cmsg_compat); | 
|---|
| 360 |  | -extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | 
|---|
| 361 |  | -			  unsigned int flags, struct timespec *timeout); | 
|---|
|  | 388 | +extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, | 
|---|
|  | 389 | +			  unsigned int vlen, unsigned int flags, | 
|---|
|  | 390 | +			  struct __kernel_timespec __user *timeout, | 
|---|
|  | 391 | +			  struct old_timespec32 __user *timeout32); | 
|---|
| 362 | 392 | extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, | 
|---|
| 363 | 393 | unsigned int vlen, unsigned int flags, | 
|---|
| 364 | 394 | bool forbid_cmsg_compat); | 
|---|
|  | 395 | +extern long __sys_sendmsg_sock(struct socket *sock, struct msghdr *msg, | 
|---|
|  | 396 | +			       unsigned int flags); | 
|---|
|  | 397 | +extern long __sys_recvmsg_sock(struct socket *sock, struct msghdr *msg, | 
|---|
|  | 398 | +			       struct user_msghdr __user *umsg, | 
|---|
|  | 399 | +			       struct sockaddr __user *uaddr, | 
|---|
|  | 400 | +			       unsigned int flags); | 
|---|
|  | 401 | +extern int sendmsg_copy_msghdr(struct msghdr *msg, | 
|---|
|  | 402 | +			       struct user_msghdr __user *umsg, unsigned flags, | 
|---|
|  | 403 | +			       struct iovec **iov); | 
|---|
|  | 404 | +extern int recvmsg_copy_msghdr(struct msghdr *msg, | 
|---|
|  | 405 | +			       struct user_msghdr __user *umsg, unsigned flags, | 
|---|
|  | 406 | +			       struct sockaddr __user **uaddr, | 
|---|
|  | 407 | +			       struct iovec **iov); | 
|---|
|  | 408 | +extern int __copy_msghdr_from_user(struct msghdr *kmsg, | 
|---|
|  | 409 | +				   struct user_msghdr __user *umsg, | 
|---|
|  | 410 | +				   struct sockaddr __user **save_addr, | 
|---|
|  | 411 | +				   struct iovec __user **uiov, size_t *nsegs); | 
|---|
| 365 | 412 |  | 
|---|
| 366 | 413 | /* helpers which do the actual work for syscalls */ | 
|---|
| 367 | 414 | extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size, | 
|---|
| .. | .. | 
|---|
| 370 | 417 | extern int __sys_sendto(int fd, void __user *buff, size_t len, | 
|---|
| 371 | 418 | unsigned int flags, struct sockaddr __user *addr, | 
|---|
| 372 | 419 | int addr_len); | 
|---|
|  | 420 | +extern int __sys_accept4_file(struct file *file, unsigned file_flags, | 
|---|
|  | 421 | +			struct sockaddr __user *upeer_sockaddr, | 
|---|
|  | 422 | +			 int __user *upeer_addrlen, int flags, | 
|---|
|  | 423 | +			 unsigned long nofile); | 
|---|
|  | 424 | +extern struct file *do_accept(struct file *file, unsigned file_flags, | 
|---|
|  | 425 | +			      struct sockaddr __user *upeer_sockaddr, | 
|---|
|  | 426 | +			      int __user *upeer_addrlen, int flags); | 
|---|
| 373 | 427 | extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, | 
|---|
| 374 | 428 | int __user *upeer_addrlen, int flags); | 
|---|
| 375 | 429 | extern int __sys_socket(int family, int type, int protocol); | 
|---|
| 376 | 430 | extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen); | 
|---|
|  | 431 | +extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr, | 
|---|
|  | 432 | +			      int addrlen, int file_flags); | 
|---|
| 377 | 433 | extern int __sys_connect(int fd, struct sockaddr __user *uservaddr, | 
|---|
| 378 | 434 | int addrlen); | 
|---|
| 379 | 435 | extern int __sys_listen(int fd, int backlog); | 
|---|
| .. | .. | 
|---|
| 383 | 439 | int __user *usockaddr_len); | 
|---|
| 384 | 440 | extern int __sys_socketpair(int family, int type, int protocol, | 
|---|
| 385 | 441 | int __user *usockvec); | 
|---|
|  | 442 | +extern int __sys_shutdown_sock(struct socket *sock, int how); | 
|---|
| 386 | 443 | extern int __sys_shutdown(int fd, int how); | 
|---|
| 387 | 444 | #endif /* _LINUX_SOCKET_H */ | 
|---|