0001
0002 #ifndef _LINUX_SOCKET_H
0003 #define _LINUX_SOCKET_H
0004
0005
0006 #include <asm/socket.h> /* arch-dependent defines */
0007 #include <linux/sockios.h> /* the SIOCxxx I/O controls */
0008 #include <linux/uio.h> /* iovec support */
0009 #include <linux/types.h> /* pid_t */
0010 #include <linux/compiler.h> /* __user */
0011 #include <uapi/linux/socket.h>
0012
0013 struct file;
0014 struct pid;
0015 struct cred;
0016 struct socket;
0017 struct sock;
0018 struct sk_buff;
0019
0020 #define __sockaddr_check_size(size) \
0021 BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))
0022
0023 #ifdef CONFIG_PROC_FS
0024 struct seq_file;
0025 extern void socket_seq_show(struct seq_file *seq);
0026 #endif
0027
0028 typedef __kernel_sa_family_t sa_family_t;
0029
0030
0031
0032
0033
0034 struct sockaddr {
0035 sa_family_t sa_family;
0036 char sa_data[14];
0037 };
0038
0039 struct linger {
0040 int l_onoff;
0041 int l_linger;
0042 };
0043
0044 #define sockaddr_storage __kernel_sockaddr_storage
0045
0046
0047
0048
0049
0050
0051
0052 struct msghdr {
0053 void *msg_name;
0054 int msg_namelen;
0055
0056 int msg_inq;
0057
0058 struct iov_iter msg_iter;
0059
0060
0061
0062
0063
0064
0065 union {
0066 void *msg_control;
0067 void __user *msg_control_user;
0068 };
0069 bool msg_control_is_user : 1;
0070 bool msg_get_inq : 1;
0071 unsigned int msg_flags;
0072 __kernel_size_t msg_controllen;
0073 struct kiocb *msg_iocb;
0074 struct ubuf_info *msg_ubuf;
0075 int (*sg_from_iter)(struct sock *sk, struct sk_buff *skb,
0076 struct iov_iter *from, size_t length);
0077 };
0078
0079 struct user_msghdr {
0080 void __user *msg_name;
0081 int msg_namelen;
0082 struct iovec __user *msg_iov;
0083 __kernel_size_t msg_iovlen;
0084 void __user *msg_control;
0085 __kernel_size_t msg_controllen;
0086 unsigned int msg_flags;
0087 };
0088
0089
0090 struct mmsghdr {
0091 struct user_msghdr msg_hdr;
0092 unsigned int msg_len;
0093 };
0094
0095
0096
0097
0098
0099
0100
0101 struct cmsghdr {
0102 __kernel_size_t cmsg_len;
0103 int cmsg_level;
0104 int cmsg_type;
0105 };
0106
0107
0108
0109
0110
0111
0112 #define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
0113 #define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
0114
0115 #define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
0116
0117 #define CMSG_DATA(cmsg) \
0118 ((void *)(cmsg) + sizeof(struct cmsghdr))
0119 #define CMSG_USER_DATA(cmsg) \
0120 ((void __user *)(cmsg) + sizeof(struct cmsghdr))
0121 #define CMSG_SPACE(len) (sizeof(struct cmsghdr) + CMSG_ALIGN(len))
0122 #define CMSG_LEN(len) (sizeof(struct cmsghdr) + (len))
0123
0124 #define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \
0125 (struct cmsghdr *)(ctl) : \
0126 (struct cmsghdr *)NULL)
0127 #define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
0128 #define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && \
0129 (cmsg)->cmsg_len <= (unsigned long) \
0130 ((mhdr)->msg_controllen - \
0131 ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
0132 #define for_each_cmsghdr(cmsg, msg) \
0133 for (cmsg = CMSG_FIRSTHDR(msg); \
0134 cmsg; \
0135 cmsg = CMSG_NXTHDR(msg, cmsg))
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
0151 struct cmsghdr *__cmsg)
0152 {
0153 struct cmsghdr * __ptr;
0154
0155 __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len));
0156 if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
0157 return (struct cmsghdr *)0;
0158
0159 return __ptr;
0160 }
0161
0162 static inline struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
0163 {
0164 return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
0165 }
0166
0167 static inline size_t msg_data_left(struct msghdr *msg)
0168 {
0169 return iov_iter_count(&msg->msg_iter);
0170 }
0171
0172
0173
0174 #define SCM_RIGHTS 0x01
0175 #define SCM_CREDENTIALS 0x02
0176 #define SCM_SECURITY 0x03
0177
0178 struct ucred {
0179 __u32 pid;
0180 __u32 uid;
0181 __u32 gid;
0182 };
0183
0184
0185 #define AF_UNSPEC 0
0186 #define AF_UNIX 1
0187 #define AF_LOCAL 1
0188 #define AF_INET 2
0189 #define AF_AX25 3
0190 #define AF_IPX 4
0191 #define AF_APPLETALK 5
0192 #define AF_NETROM 6
0193 #define AF_BRIDGE 7
0194 #define AF_ATMPVC 8
0195 #define AF_X25 9
0196 #define AF_INET6 10
0197 #define AF_ROSE 11
0198 #define AF_DECnet 12
0199 #define AF_NETBEUI 13
0200 #define AF_SECURITY 14
0201 #define AF_KEY 15
0202 #define AF_NETLINK 16
0203 #define AF_ROUTE AF_NETLINK
0204 #define AF_PACKET 17
0205 #define AF_ASH 18
0206 #define AF_ECONET 19
0207 #define AF_ATMSVC 20
0208 #define AF_RDS 21
0209 #define AF_SNA 22
0210 #define AF_IRDA 23
0211 #define AF_PPPOX 24
0212 #define AF_WANPIPE 25
0213 #define AF_LLC 26
0214 #define AF_IB 27
0215 #define AF_MPLS 28
0216 #define AF_CAN 29
0217 #define AF_TIPC 30
0218 #define AF_BLUETOOTH 31
0219 #define AF_IUCV 32
0220 #define AF_RXRPC 33
0221 #define AF_ISDN 34
0222 #define AF_PHONET 35
0223 #define AF_IEEE802154 36
0224 #define AF_CAIF 37
0225 #define AF_ALG 38
0226 #define AF_NFC 39
0227 #define AF_VSOCK 40
0228 #define AF_KCM 41
0229 #define AF_QIPCRTR 42
0230 #define AF_SMC 43
0231
0232
0233
0234 #define AF_XDP 44
0235 #define AF_MCTP 45
0236
0237
0238
0239 #define AF_MAX 46
0240
0241
0242 #define PF_UNSPEC AF_UNSPEC
0243 #define PF_UNIX AF_UNIX
0244 #define PF_LOCAL AF_LOCAL
0245 #define PF_INET AF_INET
0246 #define PF_AX25 AF_AX25
0247 #define PF_IPX AF_IPX
0248 #define PF_APPLETALK AF_APPLETALK
0249 #define PF_NETROM AF_NETROM
0250 #define PF_BRIDGE AF_BRIDGE
0251 #define PF_ATMPVC AF_ATMPVC
0252 #define PF_X25 AF_X25
0253 #define PF_INET6 AF_INET6
0254 #define PF_ROSE AF_ROSE
0255 #define PF_DECnet AF_DECnet
0256 #define PF_NETBEUI AF_NETBEUI
0257 #define PF_SECURITY AF_SECURITY
0258 #define PF_KEY AF_KEY
0259 #define PF_NETLINK AF_NETLINK
0260 #define PF_ROUTE AF_ROUTE
0261 #define PF_PACKET AF_PACKET
0262 #define PF_ASH AF_ASH
0263 #define PF_ECONET AF_ECONET
0264 #define PF_ATMSVC AF_ATMSVC
0265 #define PF_RDS AF_RDS
0266 #define PF_SNA AF_SNA
0267 #define PF_IRDA AF_IRDA
0268 #define PF_PPPOX AF_PPPOX
0269 #define PF_WANPIPE AF_WANPIPE
0270 #define PF_LLC AF_LLC
0271 #define PF_IB AF_IB
0272 #define PF_MPLS AF_MPLS
0273 #define PF_CAN AF_CAN
0274 #define PF_TIPC AF_TIPC
0275 #define PF_BLUETOOTH AF_BLUETOOTH
0276 #define PF_IUCV AF_IUCV
0277 #define PF_RXRPC AF_RXRPC
0278 #define PF_ISDN AF_ISDN
0279 #define PF_PHONET AF_PHONET
0280 #define PF_IEEE802154 AF_IEEE802154
0281 #define PF_CAIF AF_CAIF
0282 #define PF_ALG AF_ALG
0283 #define PF_NFC AF_NFC
0284 #define PF_VSOCK AF_VSOCK
0285 #define PF_KCM AF_KCM
0286 #define PF_QIPCRTR AF_QIPCRTR
0287 #define PF_SMC AF_SMC
0288 #define PF_XDP AF_XDP
0289 #define PF_MCTP AF_MCTP
0290 #define PF_MAX AF_MAX
0291
0292
0293 #define SOMAXCONN 4096
0294
0295
0296
0297
0298
0299 #define MSG_OOB 1
0300 #define MSG_PEEK 2
0301 #define MSG_DONTROUTE 4
0302 #define MSG_TRYHARD 4
0303 #define MSG_CTRUNC 8
0304 #define MSG_PROBE 0x10
0305 #define MSG_TRUNC 0x20
0306 #define MSG_DONTWAIT 0x40
0307 #define MSG_EOR 0x80
0308 #define MSG_WAITALL 0x100
0309 #define MSG_FIN 0x200
0310 #define MSG_SYN 0x400
0311 #define MSG_CONFIRM 0x800
0312 #define MSG_RST 0x1000
0313 #define MSG_ERRQUEUE 0x2000
0314 #define MSG_NOSIGNAL 0x4000
0315 #define MSG_MORE 0x8000
0316 #define MSG_WAITFORONE 0x10000
0317 #define MSG_SENDPAGE_NOPOLICY 0x10000
0318 #define MSG_SENDPAGE_NOTLAST 0x20000
0319 #define MSG_BATCH 0x40000
0320 #define MSG_EOF MSG_FIN
0321 #define MSG_NO_SHARED_FRAGS 0x80000
0322 #define MSG_SENDPAGE_DECRYPTED 0x100000
0323
0324
0325
0326 #define MSG_ZEROCOPY 0x4000000
0327 #define MSG_FASTOPEN 0x20000000
0328 #define MSG_CMSG_CLOEXEC 0x40000000
0329
0330
0331 #if defined(CONFIG_COMPAT)
0332 #define MSG_CMSG_COMPAT 0x80000000
0333 #else
0334 #define MSG_CMSG_COMPAT 0
0335 #endif
0336
0337
0338
0339 #define SOL_IP 0
0340
0341 #define SOL_TCP 6
0342 #define SOL_UDP 17
0343 #define SOL_IPV6 41
0344 #define SOL_ICMPV6 58
0345 #define SOL_SCTP 132
0346 #define SOL_UDPLITE 136
0347 #define SOL_RAW 255
0348 #define SOL_IPX 256
0349 #define SOL_AX25 257
0350 #define SOL_ATALK 258
0351 #define SOL_NETROM 259
0352 #define SOL_ROSE 260
0353 #define SOL_DECNET 261
0354 #define SOL_X25 262
0355 #define SOL_PACKET 263
0356 #define SOL_ATM 264
0357 #define SOL_AAL 265
0358 #define SOL_IRDA 266
0359 #define SOL_NETBEUI 267
0360 #define SOL_LLC 268
0361 #define SOL_DCCP 269
0362 #define SOL_NETLINK 270
0363 #define SOL_TIPC 271
0364 #define SOL_RXRPC 272
0365 #define SOL_PPPOL2TP 273
0366 #define SOL_BLUETOOTH 274
0367 #define SOL_PNPIPE 275
0368 #define SOL_RDS 276
0369 #define SOL_IUCV 277
0370 #define SOL_CAIF 278
0371 #define SOL_ALG 279
0372 #define SOL_NFC 280
0373 #define SOL_KCM 281
0374 #define SOL_TLS 282
0375 #define SOL_XDP 283
0376 #define SOL_MPTCP 284
0377 #define SOL_MCTP 285
0378 #define SOL_SMC 286
0379
0380
0381 #define IPX_TYPE 1
0382
0383 extern int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr_storage *kaddr);
0384 extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
0385
0386 struct timespec64;
0387 struct __kernel_timespec;
0388 struct old_timespec32;
0389
0390 struct scm_timestamping_internal {
0391 struct timespec64 ts[3];
0392 };
0393
0394 extern void put_cmsg_scm_timestamping64(struct msghdr *msg, struct scm_timestamping_internal *tss);
0395 extern void put_cmsg_scm_timestamping(struct msghdr *msg, struct scm_timestamping_internal *tss);
0396
0397
0398
0399
0400 extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
0401 unsigned int flags, bool forbid_cmsg_compat);
0402 extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
0403 unsigned int flags, bool forbid_cmsg_compat);
0404 extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
0405 unsigned int vlen, unsigned int flags,
0406 struct __kernel_timespec __user *timeout,
0407 struct old_timespec32 __user *timeout32);
0408 extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
0409 unsigned int vlen, unsigned int flags,
0410 bool forbid_cmsg_compat);
0411 extern long __sys_sendmsg_sock(struct socket *sock, struct msghdr *msg,
0412 unsigned int flags);
0413 extern long __sys_recvmsg_sock(struct socket *sock, struct msghdr *msg,
0414 struct user_msghdr __user *umsg,
0415 struct sockaddr __user *uaddr,
0416 unsigned int flags);
0417 extern int sendmsg_copy_msghdr(struct msghdr *msg,
0418 struct user_msghdr __user *umsg, unsigned flags,
0419 struct iovec **iov);
0420 extern int recvmsg_copy_msghdr(struct msghdr *msg,
0421 struct user_msghdr __user *umsg, unsigned flags,
0422 struct sockaddr __user **uaddr,
0423 struct iovec **iov);
0424 extern int __copy_msghdr(struct msghdr *kmsg,
0425 struct user_msghdr *umsg,
0426 struct sockaddr __user **save_addr);
0427
0428
0429 extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
0430 unsigned int flags, struct sockaddr __user *addr,
0431 int __user *addr_len);
0432 extern int __sys_sendto(int fd, void __user *buff, size_t len,
0433 unsigned int flags, struct sockaddr __user *addr,
0434 int addr_len);
0435 extern struct file *do_accept(struct file *file, unsigned file_flags,
0436 struct sockaddr __user *upeer_sockaddr,
0437 int __user *upeer_addrlen, int flags);
0438 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
0439 int __user *upeer_addrlen, int flags);
0440 extern int __sys_socket(int family, int type, int protocol);
0441 extern struct file *__sys_socket_file(int family, int type, int protocol);
0442 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
0443 extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
0444 int addrlen, int file_flags);
0445 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
0446 int addrlen);
0447 extern int __sys_listen(int fd, int backlog);
0448 extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
0449 int __user *usockaddr_len);
0450 extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
0451 int __user *usockaddr_len);
0452 extern int __sys_socketpair(int family, int type, int protocol,
0453 int __user *usockvec);
0454 extern int __sys_shutdown_sock(struct socket *sock, int how);
0455 extern int __sys_shutdown(int fd, int how);
0456 #endif