140dbba57SAssar Westerlund /*-
2*7f2d13d6SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3*7f2d13d6SPedro F. Giffuni  *
440dbba57SAssar Westerlund  * Copyright (c) 2000 Assar Westerlund
540dbba57SAssar Westerlund  * All rights reserved.
640dbba57SAssar Westerlund  *
740dbba57SAssar Westerlund  * Redistribution and use in source and binary forms, with or without
840dbba57SAssar Westerlund  * modification, are permitted provided that the following conditions
940dbba57SAssar Westerlund  * are met:
1040dbba57SAssar Westerlund  * 1. Redistributions of source code must retain the above copyright
1140dbba57SAssar Westerlund  *    notice, this list of conditions and the following disclaimer
1240dbba57SAssar Westerlund  *    in this position and unchanged.
1340dbba57SAssar Westerlund  * 2. Redistributions in binary form must reproduce the above copyright
1440dbba57SAssar Westerlund  *    notice, this list of conditions and the following disclaimer in the
1540dbba57SAssar Westerlund  *    documentation and/or other materials provided with the distribution.
1640dbba57SAssar Westerlund  * 3. The name of the author may not be used to endorse or promote products
1721dc7d4fSJens Schweikhardt  *    derived from this software without specific prior written permission
1840dbba57SAssar Westerlund  *
1940dbba57SAssar Westerlund  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2040dbba57SAssar Westerlund  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2140dbba57SAssar Westerlund  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2240dbba57SAssar Westerlund  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2340dbba57SAssar Westerlund  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2440dbba57SAssar Westerlund  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2540dbba57SAssar Westerlund  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2640dbba57SAssar Westerlund  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2740dbba57SAssar Westerlund  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2840dbba57SAssar Westerlund  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2940dbba57SAssar Westerlund  *
3040dbba57SAssar Westerlund  * $FreeBSD$
3140dbba57SAssar Westerlund  */
3240dbba57SAssar Westerlund 
3340dbba57SAssar Westerlund #ifndef _LINUX_SOCKET_H_
3440dbba57SAssar Westerlund #define _LINUX_SOCKET_H_
3540dbba57SAssar Westerlund 
3640dbba57SAssar Westerlund /* msg flags in recvfrom/recvmsg */
3740dbba57SAssar Westerlund 
3840dbba57SAssar Westerlund #define LINUX_MSG_OOB		0x01
3940dbba57SAssar Westerlund #define LINUX_MSG_PEEK		0x02
4040dbba57SAssar Westerlund #define LINUX_MSG_DONTROUTE	0x04
4140dbba57SAssar Westerlund #define LINUX_MSG_CTRUNC	0x08
4240dbba57SAssar Westerlund #define LINUX_MSG_PROXY		0x10
4340dbba57SAssar Westerlund #define LINUX_MSG_TRUNC		0x20
4440dbba57SAssar Westerlund #define LINUX_MSG_DONTWAIT	0x40
4540dbba57SAssar Westerlund #define LINUX_MSG_EOR		0x80
4640dbba57SAssar Westerlund #define LINUX_MSG_WAITALL	0x100
4740dbba57SAssar Westerlund #define LINUX_MSG_FIN		0x200
4840dbba57SAssar Westerlund #define LINUX_MSG_SYN		0x400
4940dbba57SAssar Westerlund #define LINUX_MSG_CONFIRM	0x800
5040dbba57SAssar Westerlund #define LINUX_MSG_RST		0x1000
5140dbba57SAssar Westerlund #define LINUX_MSG_ERRQUEUE	0x2000
5240dbba57SAssar Westerlund #define LINUX_MSG_NOSIGNAL	0x4000
53e1ff74c0SDmitry Chagin #define LINUX_MSG_WAITFORONE	0x10000
543a72bf04SDmitry Chagin #define LINUX_MSG_CMSG_CLOEXEC	0x40000000
5540dbba57SAssar Westerlund 
5674f5d680SKonstantin Belousov /* Socket-level control message types */
5774f5d680SKonstantin Belousov 
5874f5d680SKonstantin Belousov #define LINUX_SCM_RIGHTS	0x01
59605da56bSAndriy Gapon #define LINUX_SCM_CREDENTIALS	0x02
60bbf392d5SDmitry Chagin #define LINUX_SCM_TIMESTAMP	0x1D
6174f5d680SKonstantin Belousov 
62b7aaa9fdSDmitry Chagin struct l_msghdr {
63b7aaa9fdSDmitry Chagin 	l_uintptr_t	msg_name;
64b7aaa9fdSDmitry Chagin 	l_int		msg_namelen;
65b7aaa9fdSDmitry Chagin 	l_uintptr_t	msg_iov;
66b7aaa9fdSDmitry Chagin 	l_size_t	msg_iovlen;
67b7aaa9fdSDmitry Chagin 	l_uintptr_t	msg_control;
68b7aaa9fdSDmitry Chagin 	l_size_t	msg_controllen;
69b7aaa9fdSDmitry Chagin 	l_uint		msg_flags;
70b7aaa9fdSDmitry Chagin };
71b7aaa9fdSDmitry Chagin 
72e1ff74c0SDmitry Chagin struct l_mmsghdr {
73e1ff74c0SDmitry Chagin 	struct l_msghdr	msg_hdr;
74e1ff74c0SDmitry Chagin 	l_uint		msg_len;
75e1ff74c0SDmitry Chagin 
76e1ff74c0SDmitry Chagin };
77e1ff74c0SDmitry Chagin 
78b7aaa9fdSDmitry Chagin struct l_cmsghdr {
79b7aaa9fdSDmitry Chagin 	l_size_t	cmsg_len;
80b7aaa9fdSDmitry Chagin 	l_int		cmsg_level;
81b7aaa9fdSDmitry Chagin 	l_int		cmsg_type;
82b7aaa9fdSDmitry Chagin };
83b7aaa9fdSDmitry Chagin 
841ce4275dSPedro F. Giffuni /* Ancillary data object information macros */
8574f5d680SKonstantin Belousov 
8674f5d680SKonstantin Belousov #define LINUX_CMSG_ALIGN(len)	roundup2(len, sizeof(l_ulong))
8774f5d680SKonstantin Belousov #define LINUX_CMSG_DATA(cmsg)	((void *)((char *)(cmsg) + \
8874f5d680SKonstantin Belousov 				    LINUX_CMSG_ALIGN(sizeof(struct l_cmsghdr))))
8974f5d680SKonstantin Belousov #define LINUX_CMSG_SPACE(len)	(LINUX_CMSG_ALIGN(sizeof(struct l_cmsghdr)) + \
9074f5d680SKonstantin Belousov 				    LINUX_CMSG_ALIGN(len))
9174f5d680SKonstantin Belousov #define LINUX_CMSG_LEN(len)	(LINUX_CMSG_ALIGN(sizeof(struct l_cmsghdr)) + \
9274f5d680SKonstantin Belousov 				    (len))
9374f5d680SKonstantin Belousov #define LINUX_CMSG_FIRSTHDR(msg) \
9474f5d680SKonstantin Belousov 				((msg)->msg_controllen >= \
9574f5d680SKonstantin Belousov 				    sizeof(struct l_cmsghdr) ? \
96605da56bSAndriy Gapon 				    (struct l_cmsghdr *) \
97605da56bSAndriy Gapon 				        PTRIN((msg)->msg_control) : \
9874f5d680SKonstantin Belousov 				    (struct l_cmsghdr *)(NULL))
9974f5d680SKonstantin Belousov #define LINUX_CMSG_NXTHDR(msg, cmsg) \
10074f5d680SKonstantin Belousov 				((((char *)(cmsg) + \
10174f5d680SKonstantin Belousov 				    LINUX_CMSG_ALIGN((cmsg)->cmsg_len) + \
10274f5d680SKonstantin Belousov 				    sizeof(*(cmsg))) > \
103605da56bSAndriy Gapon 				    (((char *)PTRIN((msg)->msg_control)) + \
10474f5d680SKonstantin Belousov 				    (msg)->msg_controllen)) ? \
10574f5d680SKonstantin Belousov 				    (struct l_cmsghdr *) NULL : \
10674f5d680SKonstantin Belousov 				    (struct l_cmsghdr *)((char *)(cmsg) + \
10774f5d680SKonstantin Belousov 				    LINUX_CMSG_ALIGN((cmsg)->cmsg_len)))
10874f5d680SKonstantin Belousov 
10974f5d680SKonstantin Belousov #define CMSG_HDRSZ		CMSG_LEN(0)
11074f5d680SKonstantin Belousov #define L_CMSG_HDRSZ		LINUX_CMSG_LEN(0)
11174f5d680SKonstantin Belousov 
11213f20d7eSDmitry Chagin /* Supported address families */
11313f20d7eSDmitry Chagin 
11413f20d7eSDmitry Chagin #define	LINUX_AF_UNSPEC		0
11513f20d7eSDmitry Chagin #define	LINUX_AF_UNIX		1
11613f20d7eSDmitry Chagin #define	LINUX_AF_INET		2
11713f20d7eSDmitry Chagin #define	LINUX_AF_AX25		3
11813f20d7eSDmitry Chagin #define	LINUX_AF_IPX		4
11913f20d7eSDmitry Chagin #define	LINUX_AF_APPLETALK	5
12013f20d7eSDmitry Chagin #define	LINUX_AF_INET6		10
12113f20d7eSDmitry Chagin 
122eeb63e51SDmitry Chagin /* Supported socket types */
123eeb63e51SDmitry Chagin 
124eeb63e51SDmitry Chagin #define	LINUX_SOCK_STREAM	1
125eeb63e51SDmitry Chagin #define	LINUX_SOCK_DGRAM	2
126eeb63e51SDmitry Chagin #define	LINUX_SOCK_RAW		3
127eeb63e51SDmitry Chagin #define	LINUX_SOCK_RDM		4
128eeb63e51SDmitry Chagin #define	LINUX_SOCK_SEQPACKET	5
129eeb63e51SDmitry Chagin 
130eeb63e51SDmitry Chagin #define	LINUX_SOCK_MAX		LINUX_SOCK_SEQPACKET
131eeb63e51SDmitry Chagin 
1323933bde2SDmitry Chagin #define	LINUX_SOCK_TYPE_MASK	0xf
1333933bde2SDmitry Chagin 
1343933bde2SDmitry Chagin /* Flags for socket, socketpair, accept4 */
1353933bde2SDmitry Chagin 
1363933bde2SDmitry Chagin #define	LINUX_SOCK_CLOEXEC	LINUX_O_CLOEXEC
1373933bde2SDmitry Chagin #define	LINUX_SOCK_NONBLOCK	LINUX_O_NONBLOCK
1383933bde2SDmitry Chagin 
139d4dd69c4SDmitry Chagin struct l_ucred {
140d4dd69c4SDmitry Chagin 	uint32_t	pid;
141d4dd69c4SDmitry Chagin 	uint32_t	uid;
142d4dd69c4SDmitry Chagin 	uint32_t	gid;
143d4dd69c4SDmitry Chagin };
144d4dd69c4SDmitry Chagin 
145a12b9b3dSDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
146a12b9b3dSDmitry Chagin struct linux_accept_args {
14756fba8e6SDmitry Chagin 	register_t s;
14856fba8e6SDmitry Chagin 	register_t addr;
14956fba8e6SDmitry Chagin 	register_t namelen;
150a12b9b3dSDmitry Chagin };
151a12b9b3dSDmitry Chagin 
152a12b9b3dSDmitry Chagin int linux_accept(struct thread *td, struct linux_accept_args *args);
153a12b9b3dSDmitry Chagin 
154d825ce0aSJohn Baldwin /* Operations for socketcall */
155d825ce0aSJohn Baldwin #define	LINUX_SOCKET		1
156d825ce0aSJohn Baldwin #define	LINUX_BIND		2
157d825ce0aSJohn Baldwin #define	LINUX_CONNECT		3
158d825ce0aSJohn Baldwin #define	LINUX_LISTEN		4
159d825ce0aSJohn Baldwin #define	LINUX_ACCEPT		5
160d825ce0aSJohn Baldwin #define	LINUX_GETSOCKNAME	6
161d825ce0aSJohn Baldwin #define	LINUX_GETPEERNAME	7
162d825ce0aSJohn Baldwin #define	LINUX_SOCKETPAIR	8
163d825ce0aSJohn Baldwin #define	LINUX_SEND		9
164d825ce0aSJohn Baldwin #define	LINUX_RECV		10
165d825ce0aSJohn Baldwin #define	LINUX_SENDTO		11
166d825ce0aSJohn Baldwin #define	LINUX_RECVFROM		12
167d825ce0aSJohn Baldwin #define	LINUX_SHUTDOWN		13
168d825ce0aSJohn Baldwin #define	LINUX_SETSOCKOPT	14
169d825ce0aSJohn Baldwin #define	LINUX_GETSOCKOPT	15
170d825ce0aSJohn Baldwin #define	LINUX_SENDMSG		16
171d825ce0aSJohn Baldwin #define	LINUX_RECVMSG		17
172d825ce0aSJohn Baldwin #define	LINUX_ACCEPT4		18
173e1ff74c0SDmitry Chagin #define	LINUX_RECVMMSG		19
174e1ff74c0SDmitry Chagin #define	LINUX_SENDMMSG		20
175c1c8a121SDmitry Chagin #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
176d825ce0aSJohn Baldwin 
17785712939SDmitry Chagin /* Socket defines */
17885712939SDmitry Chagin #define	LINUX_SOL_SOCKET	1
17985712939SDmitry Chagin #define	LINUX_SOL_IP		0
18085712939SDmitry Chagin #define	LINUX_SOL_TCP		6
18185712939SDmitry Chagin #define	LINUX_SOL_UDP		17
18285712939SDmitry Chagin #define	LINUX_SOL_IPV6		41
18385712939SDmitry Chagin #define	LINUX_SOL_IPX		256
18485712939SDmitry Chagin #define	LINUX_SOL_AX25		257
18585712939SDmitry Chagin 
18685712939SDmitry Chagin #define	LINUX_SO_DEBUG		1
18785712939SDmitry Chagin #define	LINUX_SO_REUSEADDR	2
18885712939SDmitry Chagin #define	LINUX_SO_TYPE		3
18985712939SDmitry Chagin #define	LINUX_SO_ERROR		4
19085712939SDmitry Chagin #define	LINUX_SO_DONTROUTE	5
19185712939SDmitry Chagin #define	LINUX_SO_BROADCAST	6
19285712939SDmitry Chagin #define	LINUX_SO_SNDBUF		7
19385712939SDmitry Chagin #define	LINUX_SO_RCVBUF		8
19485712939SDmitry Chagin #define	LINUX_SO_KEEPALIVE	9
19585712939SDmitry Chagin #define	LINUX_SO_OOBINLINE	10
19685712939SDmitry Chagin #define	LINUX_SO_NO_CHECK	11
19785712939SDmitry Chagin #define	LINUX_SO_PRIORITY	12
19885712939SDmitry Chagin #define	LINUX_SO_LINGER		13
19985712939SDmitry Chagin #ifndef LINUX_SO_PASSCRED	/* powerpc differs */
20085712939SDmitry Chagin #define	LINUX_SO_PASSCRED	16
20185712939SDmitry Chagin #define	LINUX_SO_PEERCRED	17
20285712939SDmitry Chagin #define	LINUX_SO_RCVLOWAT	18
20385712939SDmitry Chagin #define	LINUX_SO_SNDLOWAT	19
20485712939SDmitry Chagin #define	LINUX_SO_RCVTIMEO	20
20585712939SDmitry Chagin #define	LINUX_SO_SNDTIMEO	21
20685712939SDmitry Chagin #endif
20785712939SDmitry Chagin #define	LINUX_SO_TIMESTAMP	29
20885712939SDmitry Chagin #define	LINUX_SO_ACCEPTCONN	30
20985712939SDmitry Chagin 
210d825ce0aSJohn Baldwin /* Socket options */
211d825ce0aSJohn Baldwin #define	LINUX_IP_TOS		1
212d825ce0aSJohn Baldwin #define	LINUX_IP_TTL		2
213d825ce0aSJohn Baldwin #define	LINUX_IP_HDRINCL	3
214d825ce0aSJohn Baldwin #define	LINUX_IP_OPTIONS	4
215d825ce0aSJohn Baldwin 
216d825ce0aSJohn Baldwin #define	LINUX_IP_MULTICAST_IF		32
217d825ce0aSJohn Baldwin #define	LINUX_IP_MULTICAST_TTL		33
218d825ce0aSJohn Baldwin #define	LINUX_IP_MULTICAST_LOOP		34
219d825ce0aSJohn Baldwin #define	LINUX_IP_ADD_MEMBERSHIP		35
220d825ce0aSJohn Baldwin #define	LINUX_IP_DROP_MEMBERSHIP	36
221d825ce0aSJohn Baldwin 
22286a9058bSAndrey V. Elsukov #define	LINUX_IPV6_CHECKSUM		7
22386a9058bSAndrey V. Elsukov #define	LINUX_IPV6_NEXTHOP		9
22486a9058bSAndrey V. Elsukov #define	LINUX_IPV6_UNICAST_HOPS		16
22586a9058bSAndrey V. Elsukov #define	LINUX_IPV6_MULTICAST_IF		17
22686a9058bSAndrey V. Elsukov #define	LINUX_IPV6_MULTICAST_HOPS	18
22786a9058bSAndrey V. Elsukov #define	LINUX_IPV6_MULTICAST_LOOP	19
22886a9058bSAndrey V. Elsukov #define	LINUX_IPV6_ADD_MEMBERSHIP	20
22986a9058bSAndrey V. Elsukov #define	LINUX_IPV6_DROP_MEMBERSHIP	21
23086a9058bSAndrey V. Elsukov #define	LINUX_IPV6_V6ONLY		26
23186a9058bSAndrey V. Elsukov 
23286a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVPKTINFO		49
23386a9058bSAndrey V. Elsukov #define	LINUX_IPV6_PKTINFO		50
23486a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVHOPLIMIT		51
23586a9058bSAndrey V. Elsukov #define	LINUX_IPV6_HOPLIMIT		52
23686a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVHOPOPTS		53
23786a9058bSAndrey V. Elsukov #define	LINUX_IPV6_HOPOPTS		54
23886a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RTHDRDSTOPTS		55
23986a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVRTHDR		56
24086a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RTHDR		57
24186a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVDSTOPTS		58
24286a9058bSAndrey V. Elsukov #define	LINUX_IPV6_DSTOPTS		59
24386a9058bSAndrey V. Elsukov #define	LINUX_IPV6_RECVPATHMTU		60
24486a9058bSAndrey V. Elsukov #define	LINUX_IPV6_PATHMTU		61
24586a9058bSAndrey V. Elsukov #define	LINUX_IPV6_DONTFRAG		62
24686a9058bSAndrey V. Elsukov 
247d825ce0aSJohn Baldwin #define	LINUX_TCP_NODELAY	1
248d825ce0aSJohn Baldwin #define	LINUX_TCP_MAXSEG	2
249d825ce0aSJohn Baldwin #define	LINUX_TCP_KEEPIDLE	4
250d825ce0aSJohn Baldwin #define	LINUX_TCP_KEEPINTVL	5
251d825ce0aSJohn Baldwin #define	LINUX_TCP_KEEPCNT	6
252d825ce0aSJohn Baldwin #define	LINUX_TCP_MD5SIG	14
253d825ce0aSJohn Baldwin 
25440dbba57SAssar Westerlund #endif /* _LINUX_SOCKET_H_ */
255