1 1.26 christos /* $NetBSD: linux_socket.h,v 1.27 2025/06/28 18:47:36 christos Exp $ */ 2 1.4 erh 3 1.4 erh /*- 4 1.6 fvdl * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. 5 1.4 erh * All rights reserved. 6 1.4 erh * 7 1.4 erh * This code is derived from software contributed to The NetBSD Foundation 8 1.6 fvdl * by Frank van der Linden and Eric Haszlakiewicz. 9 1.4 erh * 10 1.4 erh * Redistribution and use in source and binary forms, with or without 11 1.4 erh * modification, are permitted provided that the following conditions 12 1.4 erh * are met: 13 1.4 erh * 1. Redistributions of source code must retain the above copyright 14 1.4 erh * notice, this list of conditions and the following disclaimer. 15 1.4 erh * 2. Redistributions in binary form must reproduce the above copyright 16 1.4 erh * notice, this list of conditions and the following disclaimer in the 17 1.4 erh * documentation and/or other materials provided with the distribution. 18 1.4 erh * 19 1.4 erh * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.4 erh * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.4 erh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.4 erh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.4 erh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.4 erh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.4 erh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.4 erh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.4 erh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.4 erh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.4 erh * POSSIBILITY OF SUCH DAMAGE. 30 1.1 fvdl */ 31 1.1 fvdl 32 1.5 christos #ifndef _LINUX_SOCKET_H 33 1.5 christos #define _LINUX_SOCKET_H 34 1.1 fvdl 35 1.1 fvdl /* 36 1.1 fvdl * Various Linux socket defines. Everything that is not re-defined here 37 1.1 fvdl * is the same as in NetBSD. 38 1.1 fvdl * 39 1.1 fvdl * COMPAT_43 is assumed, and the osockaddr struct is used (it is what 40 1.1 fvdl * Linux uses) 41 1.1 fvdl */ 42 1.1 fvdl 43 1.1 fvdl /* 44 1.1 fvdl * Address families. There are fewer of them, and they're numbered 45 1.1 fvdl * a bit different 46 1.1 fvdl */ 47 1.1 fvdl 48 1.1 fvdl #define LINUX_AF_UNSPEC 0 49 1.1 fvdl #define LINUX_AF_UNIX 1 50 1.1 fvdl #define LINUX_AF_INET 2 51 1.1 fvdl #define LINUX_AF_AX25 3 52 1.1 fvdl #define LINUX_AF_IPX 4 53 1.1 fvdl #define LINUX_AF_APPLETALK 5 54 1.4 erh #define LINUX_AF_NETROM 6 55 1.4 erh #define LINUX_AF_BRIDGE 7 56 1.4 erh #define LINUX_AF_ATMPVC 8 57 1.4 erh #define LINUX_AF_X25 9 58 1.4 erh #define LINUX_AF_INET6 10 59 1.4 erh #define LINUX_AF_ROSE 11 60 1.4 erh #define LINUX_AF_DECnet 12 61 1.4 erh #define LINUX_AF_NETBEUI 13 62 1.4 erh #define LINUX_AF_SECURITY 14 63 1.4 erh #define LINUX_pseudo_AF_KEY 15 64 1.4 erh #define LINUX_AF_NETLINK 16 65 1.4 erh #define LINUX_AF_PACKET 17 66 1.4 erh #define LINUX_AF_ASH 18 67 1.4 erh #define LINUX_AF_ECONET 19 68 1.27 christos #define LINUX_AF_ATMSVC 20 69 1.27 christos #define LINUX_AF_SNA 22 70 1.4 erh #define LINUX_AF_MAX 32 71 1.1 fvdl 72 1.1 fvdl /* 73 1.1 fvdl * Option levels for [gs]etsockopt(2). Only SOL_SOCKET is different, 74 1.1 fvdl * the rest matches IPPROTO_XXX 75 1.1 fvdl */ 76 1.1 fvdl 77 1.21 wiz /* SOL_SOCKET is machine dependent on Linux */ 78 1.1 fvdl #define LINUX_SOL_IP 0 79 1.4 erh #define LINUX_SOL_TCP 6 80 1.4 erh #define LINUX_SOL_UDP 17 81 1.22 njoly #define LINUX_SOL_IPV6 41 82 1.4 erh /* Unused for now: */ 83 1.4 erh #define LINUX_SOL_ICMPV6 58 84 1.4 erh #define LINUX_SOL_RAW 255 85 1.1 fvdl #define LINUX_SOL_IPX 256 86 1.1 fvdl #define LINUX_SOL_AX25 257 87 1.4 erh #define LINUX_SOL_ATALK 258 88 1.4 erh #define LINUX_SOL_NETROM 259 89 1.4 erh #define LINUX_SOL_ROSE 260 90 1.4 erh #define LINUX_SOL_DECNET 261 91 1.4 erh #define LINUX_SOL_X25 262 92 1.4 erh #define LINUX_SOL_PACKET 263 93 1.4 erh #define LINUX_SOL_ATM 264 94 1.4 erh #define LINUX_SOL_AAL 265 95 1.1 fvdl 96 1.1 fvdl /* 97 1.21 wiz * Options for [gs]etsockopt(2), socket level are machine dependent. 98 1.1 fvdl */ 99 1.1 fvdl 100 1.1 fvdl /* 101 1.4 erh * Options for [gs]etsockopt(2), IP level. 102 1.1 fvdl */ 103 1.1 fvdl 104 1.2 mycroft #define LINUX_IP_TOS 1 105 1.2 mycroft #define LINUX_IP_TTL 2 106 1.19 dsl #define LINUX_IP_HDRINCL 3 107 1.27 christos #define LINUX_IP_RECVOPTS 6 108 1.27 christos #define LINUX_IP_RETOPTS 7 109 1.27 christos #define LINUX_IP_PKTINFO 8 110 1.25 ryo #define LINUX_IP_RECVERR 11 111 1.27 christos #define LINUX_IP_FREEBIND 15 112 1.27 christos #define LINUX_IP_MULTICAST_IF 32 113 1.27 christos #define LINUX_IP_MULTICAST_TTL 33 114 1.27 christos #define LINUX_IP_MULTICAST_LOOP 34 115 1.27 christos #define LINUX_IP_ADD_MEMBERSHIP 35 116 1.27 christos #define LINUX_IP_DROP_MEMBERSHIP 36 117 1.27 christos #define LINUX_IP_MULTICAST_ALL 49 118 1.3 mycroft 119 1.3 mycroft /* 120 1.22 njoly * Options for [gs]etsockopt(2), IPV6 level. 121 1.22 njoly */ 122 1.22 njoly 123 1.22 njoly #define LINUX_IPV6_V6ONLY 26 124 1.27 christos #define LINUX_IPV6_MULTICAST_HOPS 18 125 1.27 christos #define LINUX_IPV6_MULTICAST_ALL 29 126 1.22 njoly 127 1.22 njoly /* 128 1.4 erh * Options for [gs]etsockopt(2), TCP level. 129 1.3 mycroft */ 130 1.3 mycroft 131 1.27 christos #define LINUX_TCP_NODELAY 1 132 1.27 christos #define LINUX_TCP_MAXSEG 2 133 1.1 fvdl 134 1.11 jdolecek /* "Socket"-level control message types: */ 135 1.11 jdolecek #define LINUX_SCM_RIGHTS 1 /* same as SCM_RIGHTS */ 136 1.11 jdolecek #define LINUX_SCM_CREDENTIALS 2 /* accepts ucred rather than sockcred */ 137 1.11 jdolecek #define LINUX_SCM_CONNECT 3 /* not supported in NetBSD */ 138 1.11 jdolecek #define LINUX_SCM_TIMESTAMP LINUX_SO_TIMESTAMP 139 1.11 jdolecek /* not actually implemented in Linux 2.5.15? */ 140 1.11 jdolecek 141 1.18 njoly struct linux_msghdr { 142 1.18 njoly void *msg_name; 143 1.18 njoly int msg_namelen; 144 1.18 njoly struct iovec *msg_iov; 145 1.18 njoly size_t msg_iovlen; 146 1.18 njoly void *msg_control; 147 1.18 njoly size_t msg_controllen; 148 1.18 njoly unsigned int msg_flags; 149 1.18 njoly }; 150 1.18 njoly 151 1.23 christos struct linux_mmsghdr { 152 1.23 christos struct linux_msghdr msg_hdr; 153 1.23 christos unsigned int msg_len; 154 1.23 christos }; 155 1.23 christos 156 1.11 jdolecek /* 157 1.11 jdolecek * Message flags (for sendmsg/recvmsg) 158 1.11 jdolecek */ 159 1.11 jdolecek #define LINUX_MSG_OOB 0x001 160 1.11 jdolecek #define LINUX_MSG_PEEK 0x002 161 1.11 jdolecek #define LINUX_MSG_DONTROUTE 0x004 162 1.11 jdolecek #define LINUX_MSG_TRYHARD 0x004 163 1.11 jdolecek #define LINUX_MSG_CTRUNC 0x008 164 1.11 jdolecek #define LINUX_MSG_PROBE 0x010 /* Don't send, only probe path */ 165 1.11 jdolecek #define LINUX_MSG_TRUNC 0x020 166 1.11 jdolecek #define LINUX_MSG_DONTWAIT 0x040 /* this msg should be nonblocking */ 167 1.11 jdolecek #define LINUX_MSG_EOR 0x080 /* data completes record */ 168 1.11 jdolecek #define LINUX_MSG_WAITALL 0x100 /* wait for full request or error */ 169 1.11 jdolecek #define LINUX_MSG_FIN 0x200 170 1.11 jdolecek #define LINUX_MSG_EOF LINUX_MSG_FIN 171 1.11 jdolecek #define LINUX_MSG_SYN 0x400 172 1.11 jdolecek #define LINUX_MSG_CONFIRM 0x800 /* Confirm path validity */ 173 1.11 jdolecek #define LINUX_MSG_RST 0x1000 174 1.11 jdolecek #define LINUX_MSG_ERRQUEUE 0x2000 /* fetch message from error queue */ 175 1.11 jdolecek #define LINUX_MSG_NOSIGNAL 0x4000 /* do not generate SIGPIPE */ 176 1.11 jdolecek #define LINUX_MSG_MORE 0x8000 /* Sender will send more */ 177 1.11 jdolecek 178 1.11 jdolecek /* 179 1.11 jdolecek * Linux alignment requirement for CMSG struct manipulation. 180 1.15 dsl * Linux aligns on (size_t) boundary on all architectures. 181 1.15 dsl * Fortunately for linux, linux_cmsghdr is always size_t aligned ! 182 1.15 dsl * since no padding is added between the header and data. 183 1.15 dsl * XXX: this code isn't right for the compat32 code. 184 1.15 dsl */ 185 1.15 dsl struct linux_cmsghdr { 186 1.15 dsl size_t cmsg_len; /* NB not socklen_t */ 187 1.15 dsl int cmsg_level; 188 1.15 dsl int cmsg_type; 189 1.15 dsl /* unsigned char __cmsg_data[0]; */ 190 1.15 dsl }; 191 1.15 dsl 192 1.11 jdolecek #define LINUX_CMSG_ALIGN(n) \ 193 1.15 dsl (((n) + sizeof(size_t)-1) & ~(sizeof(size_t)-1)) 194 1.15 dsl /* Linux either uses this, or &((cmsg)->__cmsg_data) */ 195 1.11 jdolecek #define LINUX_CMSG_DATA(cmsg) \ 196 1.15 dsl ((u_char *)((struct linux_cmsghdr *)(cmsg) + 1)) 197 1.24 maxv #define LINUX_CMSG_NXTHDR(mhdr, ucmsg, kcmsg) \ 198 1.24 maxv ((((char *)(ucmsg) + LINUX_CMSG_ALIGN((kcmsg)->cmsg_len) + \ 199 1.24 maxv sizeof(*(ucmsg))) > \ 200 1.14 christos (((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \ 201 1.15 dsl (struct linux_cmsghdr *)NULL : \ 202 1.24 maxv (struct linux_cmsghdr *)((char *)(ucmsg) + \ 203 1.24 maxv LINUX_CMSG_ALIGN((kcmsg)->cmsg_len))) 204 1.15 dsl /* This the number of bytes removed from each item (excl. final padding) */ 205 1.15 dsl #define LINUX_CMSG_ALIGN_DELTA \ 206 1.15 dsl (CMSG_ALIGN(sizeof(struct cmsghdr)) - sizeof(struct linux_cmsghdr)) 207 1.15 dsl 208 1.15 dsl #define LINUX_CMSG_FIRSTHDR(mhdr) \ 209 1.15 dsl ((mhdr)->msg_controllen >= sizeof(struct linux_cmsghdr) ? \ 210 1.15 dsl (struct linux_cmsghdr *)(mhdr)->msg_control : NULL) 211 1.15 dsl 212 1.17 njoly #define LINUX_CMSG_SPACE(l) \ 213 1.17 njoly (sizeof(struct linux_cmsghdr) + LINUX_CMSG_ALIGN(l)) 214 1.17 njoly #define LINUX_CMSG_LEN(l) \ 215 1.17 njoly (sizeof(struct linux_cmsghdr) + (l)) 216 1.11 jdolecek 217 1.11 jdolecek /* 218 1.11 jdolecek * Machine specific definitions. 219 1.11 jdolecek */ 220 1.5 christos #if defined(__i386__) 221 1.5 christos #include <compat/linux/arch/i386/linux_socket.h> 222 1.7 itohy #elif defined(__m68k__) 223 1.7 itohy #include <compat/linux/arch/m68k/linux_socket.h> 224 1.5 christos #elif defined(__alpha__) 225 1.5 christos #include <compat/linux/arch/alpha/linux_socket.h> 226 1.8 manu #elif defined(__powerpc__) 227 1.8 manu #include <compat/linux/arch/powerpc/linux_socket.h> 228 1.9 manu #elif defined(__mips__) 229 1.9 manu #include <compat/linux/arch/mips/linux_socket.h> 230 1.25 ryo #elif defined(__aarch64__) 231 1.25 ryo #include <compat/linux/arch/aarch64/linux_socket.h> 232 1.10 bjh21 #elif defined(__arm__) 233 1.10 bjh21 #include <compat/linux/arch/arm/linux_socket.h> 234 1.12 manu #elif defined(__amd64__) 235 1.12 manu #include <compat/linux/arch/amd64/linux_socket.h> 236 1.5 christos #else 237 1.5 christos #error Undefined linux_socket.h machine type. 238 1.5 christos #endif 239 1.5 christos 240 1.20 chs /* 241 1.20 chs * Flags for socket(). 242 1.20 chs * These are provided in the "type" parameter. 243 1.20 chs */ 244 1.20 chs 245 1.20 chs #define LINUX_SOCK_TYPE_MASK 0xf 246 1.20 chs #define LINUX_SOCK_CLOEXEC LINUX_O_CLOEXEC 247 1.20 chs #ifndef LINUX_SOCK_NONBLOCK 248 1.20 chs #define LINUX_SOCK_NONBLOCK LINUX_O_NONBLOCK 249 1.20 chs #endif 250 1.20 chs 251 1.5 christos #endif /* !_LINUX_SOCKET_H */ 252