Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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  *  1003.1g requires sa_family_t and that sa_data is char.
0032  */
0033 
0034 struct sockaddr {
0035     sa_family_t sa_family;  /* address family, AF_xxx   */
0036     char        sa_data[14];    /* 14 bytes of protocol address */
0037 };
0038 
0039 struct linger {
0040     int     l_onoff;    /* Linger active        */
0041     int     l_linger;   /* How long to linger for   */
0042 };
0043 
0044 #define sockaddr_storage __kernel_sockaddr_storage
0045 
0046 /*
0047  *  As we do 4.4BSD message passing we use a 4.4BSD message passing
0048  *  system, not 4.3. Thus msg_accrights(len) are now missing. They
0049  *  belong in an obscure libc emulation or the bin.
0050  */
0051 
0052 struct msghdr {
0053     void        *msg_name;  /* ptr to socket address structure */
0054     int     msg_namelen;    /* size of socket address structure */
0055 
0056     int     msg_inq;    /* output, data left in socket */
0057 
0058     struct iov_iter msg_iter;   /* data */
0059 
0060     /*
0061      * Ancillary data. msg_control_user is the user buffer used for the
0062      * recv* side when msg_control_is_user is set, msg_control is the kernel
0063      * buffer used for all other cases.
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;/* return INQ after receive */
0071     unsigned int    msg_flags;  /* flags on received message */
0072     __kernel_size_t msg_controllen; /* ancillary data buffer length */
0073     struct kiocb    *msg_iocb;  /* ptr to iocb for async requests */
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;   /* ptr to socket address structure */
0081     int     msg_namelen;        /* size of socket address structure */
0082     struct iovec    __user *msg_iov;    /* scatter/gather array */
0083     __kernel_size_t msg_iovlen;     /* # elements in msg_iov */
0084     void        __user *msg_control;    /* ancillary data */
0085     __kernel_size_t msg_controllen;     /* ancillary data buffer length */
0086     unsigned int    msg_flags;      /* flags on received message */
0087 };
0088 
0089 /* For recvmmsg/sendmmsg */
0090 struct mmsghdr {
0091     struct user_msghdr  msg_hdr;
0092     unsigned int        msg_len;
0093 };
0094 
0095 /*
0096  *  POSIX 1003.1g - ancillary data object information
0097  *  Ancillary data consists of a sequence of pairs of
0098  *  (cmsghdr, cmsg_data[])
0099  */
0100 
0101 struct cmsghdr {
0102     __kernel_size_t cmsg_len;   /* data byte count, including hdr */
0103         int     cmsg_level; /* originating protocol */
0104         int     cmsg_type;  /* protocol-specific type */
0105 };
0106 
0107 /*
0108  *  Ancillary data object information MACROS
0109  *  Table 5-14 of POSIX 1003.1g
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  *  Get the next cmsg header
0139  *
0140  *  PLEASE, do not touch this function. If you think, that it is
0141  *  incorrect, grep kernel sources and think about consequences
0142  *  before trying to improve it.
0143  *
0144  *  Now it always returns valid, not truncated ancillary object
0145  *  HEADER. But caller still MUST check, that cmsg->cmsg_len is
0146  *  inside range, given by msg->msg_controllen before using
0147  *  ancillary object DATA.              --ANK (980731)
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 /* "Socket"-level control message types: */
0173 
0174 #define SCM_RIGHTS  0x01        /* rw: access rights (array of int) */
0175 #define SCM_CREDENTIALS 0x02        /* rw: struct ucred     */
0176 #define SCM_SECURITY    0x03        /* rw: security label       */
0177 
0178 struct ucred {
0179     __u32   pid;
0180     __u32   uid;
0181     __u32   gid;
0182 };
0183 
0184 /* Supported address families. */
0185 #define AF_UNSPEC   0
0186 #define AF_UNIX     1   /* Unix domain sockets      */
0187 #define AF_LOCAL    1   /* POSIX name for AF_UNIX   */
0188 #define AF_INET     2   /* Internet IP Protocol     */
0189 #define AF_AX25     3   /* Amateur Radio AX.25      */
0190 #define AF_IPX      4   /* Novell IPX           */
0191 #define AF_APPLETALK    5   /* AppleTalk DDP        */
0192 #define AF_NETROM   6   /* Amateur Radio NET/ROM    */
0193 #define AF_BRIDGE   7   /* Multiprotocol bridge     */
0194 #define AF_ATMPVC   8   /* ATM PVCs         */
0195 #define AF_X25      9   /* Reserved for X.25 project    */
0196 #define AF_INET6    10  /* IP version 6         */
0197 #define AF_ROSE     11  /* Amateur Radio X.25 PLP   */
0198 #define AF_DECnet   12  /* Reserved for DECnet project  */
0199 #define AF_NETBEUI  13  /* Reserved for 802.2LLC project*/
0200 #define AF_SECURITY 14  /* Security callback pseudo AF */
0201 #define AF_KEY      15      /* PF_KEY key management API */
0202 #define AF_NETLINK  16
0203 #define AF_ROUTE    AF_NETLINK /* Alias to emulate 4.4BSD */
0204 #define AF_PACKET   17  /* Packet family        */
0205 #define AF_ASH      18  /* Ash              */
0206 #define AF_ECONET   19  /* Acorn Econet         */
0207 #define AF_ATMSVC   20  /* ATM SVCs         */
0208 #define AF_RDS      21  /* RDS sockets          */
0209 #define AF_SNA      22  /* Linux SNA Project (nutters!) */
0210 #define AF_IRDA     23  /* IRDA sockets         */
0211 #define AF_PPPOX    24  /* PPPoX sockets        */
0212 #define AF_WANPIPE  25  /* Wanpipe API Sockets */
0213 #define AF_LLC      26  /* Linux LLC            */
0214 #define AF_IB       27  /* Native InfiniBand address    */
0215 #define AF_MPLS     28  /* MPLS */
0216 #define AF_CAN      29  /* Controller Area Network      */
0217 #define AF_TIPC     30  /* TIPC sockets         */
0218 #define AF_BLUETOOTH    31  /* Bluetooth sockets        */
0219 #define AF_IUCV     32  /* IUCV sockets         */
0220 #define AF_RXRPC    33  /* RxRPC sockets        */
0221 #define AF_ISDN     34  /* mISDN sockets        */
0222 #define AF_PHONET   35  /* Phonet sockets       */
0223 #define AF_IEEE802154   36  /* IEEE802154 sockets       */
0224 #define AF_CAIF     37  /* CAIF sockets         */
0225 #define AF_ALG      38  /* Algorithm sockets        */
0226 #define AF_NFC      39  /* NFC sockets          */
0227 #define AF_VSOCK    40  /* vSockets         */
0228 #define AF_KCM      41  /* Kernel Connection Multiplexor*/
0229 #define AF_QIPCRTR  42  /* Qualcomm IPC Router          */
0230 #define AF_SMC      43  /* smc sockets: reserve number for
0231                  * PF_SMC protocol family that
0232                  * reuses AF_INET address family
0233                  */
0234 #define AF_XDP      44  /* XDP sockets          */
0235 #define AF_MCTP     45  /* Management component
0236                  * transport protocol
0237                  */
0238 
0239 #define AF_MAX      46  /* For now.. */
0240 
0241 /* Protocol families, same as address families. */
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 /* Maximum queue length specifiable by listen.  */
0293 #define SOMAXCONN   4096
0294 
0295 /* Flags we can use with send/ and recv.
0296    Added those for 1003.1g not all are supported yet
0297  */
0298 
0299 #define MSG_OOB     1
0300 #define MSG_PEEK    2
0301 #define MSG_DONTROUTE   4
0302 #define MSG_TRYHARD     4       /* Synonym for MSG_DONTROUTE for DECnet */
0303 #define MSG_CTRUNC  8
0304 #define MSG_PROBE   0x10    /* Do not send. Only probe path f.e. for MTU */
0305 #define MSG_TRUNC   0x20
0306 #define MSG_DONTWAIT    0x40    /* Nonblocking io        */
0307 #define MSG_EOR         0x80    /* End of record */
0308 #define MSG_WAITALL 0x100   /* Wait for a full request */
0309 #define MSG_FIN         0x200
0310 #define MSG_SYN     0x400
0311 #define MSG_CONFIRM 0x800   /* Confirm path validity */
0312 #define MSG_RST     0x1000
0313 #define MSG_ERRQUEUE    0x2000  /* Fetch message from error queue */
0314 #define MSG_NOSIGNAL    0x4000  /* Do not generate SIGPIPE */
0315 #define MSG_MORE    0x8000  /* Sender will send more */
0316 #define MSG_WAITFORONE  0x10000 /* recvmmsg(): block until 1+ packets avail */
0317 #define MSG_SENDPAGE_NOPOLICY 0x10000 /* sendpage() internal : do no apply policy */
0318 #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */
0319 #define MSG_BATCH   0x40000 /* sendmmsg(): more messages coming */
0320 #define MSG_EOF         MSG_FIN
0321 #define MSG_NO_SHARED_FRAGS 0x80000 /* sendpage() internal : page frags are not shared */
0322 #define MSG_SENDPAGE_DECRYPTED  0x100000 /* sendpage() internal : page may carry
0323                       * plain text and require encryption
0324                       */
0325 
0326 #define MSG_ZEROCOPY    0x4000000   /* Use user data in kernel path */
0327 #define MSG_FASTOPEN    0x20000000  /* Send data in TCP SYN */
0328 #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exec for file
0329                        descriptor received through
0330                        SCM_RIGHTS */
0331 #if defined(CONFIG_COMPAT)
0332 #define MSG_CMSG_COMPAT 0x80000000  /* This message needs 32 bit fixups */
0333 #else
0334 #define MSG_CMSG_COMPAT 0       /* We never have 32 bit fixups */
0335 #endif
0336 
0337 
0338 /* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
0339 #define SOL_IP      0
0340 /* #define SOL_ICMP 1   No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */
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     /* UDP-Lite (RFC 3828) */
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 /* ATM layer (cell level) */
0357 #define SOL_AAL     265 /* ATM Adaption Layer (packet level) */
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 /* IPX options */
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 /* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
0398  * forbid_cmsg_compat==false
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 /* helpers which do the actual work for syscalls */
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 /* _LINUX_SOCKET_H */