| .. | .. |
|---|
| 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 */ |
|---|