1139825Simp/*- 21541Srgrimes * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 31541Srgrimes * The Regents of the University of California. All rights reserved. 41541Srgrimes * 51541Srgrimes * Redistribution and use in source and binary forms, with or without 61541Srgrimes * modification, are permitted provided that the following conditions 71541Srgrimes * are met: 81541Srgrimes * 1. Redistributions of source code must retain the above copyright 91541Srgrimes * notice, this list of conditions and the following disclaimer. 101541Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111541Srgrimes * notice, this list of conditions and the following disclaimer in the 121541Srgrimes * documentation and/or other materials provided with the distribution. 131541Srgrimes * 4. Neither the name of the University nor the names of its contributors 141541Srgrimes * may be used to endorse or promote products derived from this software 151541Srgrimes * without specific prior written permission. 161541Srgrimes * 171541Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 181541Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191541Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201541Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 211541Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221541Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231541Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241541Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251541Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261541Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271541Srgrimes * SUCH DAMAGE. 281541Srgrimes * 291541Srgrimes * @(#)socket.h 8.4 (Berkeley) 2/21/94 3050477Speter * $FreeBSD$ 311541Srgrimes */ 321541Srgrimes 331541Srgrimes#ifndef _SYS_SOCKET_H_ 341541Srgrimes#define _SYS_SOCKET_H_ 351541Srgrimes 36104983Smike#include <sys/cdefs.h> 3795099Smike#include <sys/_types.h> 38108366Sphk#include <sys/_iovec.h> 39196994Sphk#include <machine/_align.h> 4068498Sasmodai 411541Srgrimes/* 421541Srgrimes * Definitions related to sockets: types, address families, options. 431541Srgrimes */ 441541Srgrimes 451541Srgrimes/* 4653678Sphk * Data types. 4753678Sphk */ 48104983Smike#if __BSD_VISIBLE 49104983Smike#ifndef _GID_T_DECLARED 50104983Smiketypedef __gid_t gid_t; 51104983Smike#define _GID_T_DECLARED 52104983Smike#endif 53104983Smike 54104983Smike#ifndef _OFF_T_DECLARED 55104983Smiketypedef __off_t off_t; 56104983Smike#define _OFF_T_DECLARED 57104983Smike#endif 58104983Smike 59104983Smike#ifndef _PID_T_DECLARED 60104983Smiketypedef __pid_t pid_t; 61104983Smike#define _PID_T_DECLARED 62104983Smike#endif 63104983Smike#endif 64104983Smike 65102227Smike#ifndef _SA_FAMILY_T_DECLARED 66102227Smiketypedef __sa_family_t sa_family_t; 67102227Smike#define _SA_FAMILY_T_DECLARED 6895099Smike#endif 6995099Smike 70102227Smike#ifndef _SOCKLEN_T_DECLARED 71102227Smiketypedef __socklen_t socklen_t; 72102227Smike#define _SOCKLEN_T_DECLARED 7372510Sume#endif 7453678Sphk 75104983Smike#ifndef _SSIZE_T_DECLARED 76104983Smiketypedef __ssize_t ssize_t; 77104983Smike#define _SSIZE_T_DECLARED 78104983Smike#endif 79104983Smike 80104983Smike#if __BSD_VISIBLE 81104983Smike#ifndef _UID_T_DECLARED 82104983Smiketypedef __uid_t uid_t; 83104983Smike#define _UID_T_DECLARED 84104983Smike#endif 85104983Smike#endif 86104983Smike 8753678Sphk/* 881541Srgrimes * Types 891541Srgrimes */ 901541Srgrimes#define SOCK_STREAM 1 /* stream socket */ 911541Srgrimes#define SOCK_DGRAM 2 /* datagram socket */ 921541Srgrimes#define SOCK_RAW 3 /* raw-protocol interface */ 93104983Smike#if __BSD_VISIBLE 941541Srgrimes#define SOCK_RDM 4 /* reliably-delivered message */ 95104983Smike#endif 961541Srgrimes#define SOCK_SEQPACKET 5 /* sequenced packet stream */ 971541Srgrimes 98248534Sjilles#if __BSD_VISIBLE 991541Srgrimes/* 100248534Sjilles * Creation flags, OR'ed into socket() and socketpair() type argument. 101248534Sjilles */ 102248534Sjilles#define SOCK_CLOEXEC 0x10000000 103248534Sjilles#define SOCK_NONBLOCK 0x20000000 104248534Sjilles#endif 105248534Sjilles 106248534Sjilles/* 1071541Srgrimes * Option flags per-socket. 1081541Srgrimes */ 1091541Srgrimes#define SO_DEBUG 0x0001 /* turn on debugging info recording */ 1101541Srgrimes#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 1111541Srgrimes#define SO_REUSEADDR 0x0004 /* allow local address reuse */ 1121541Srgrimes#define SO_KEEPALIVE 0x0008 /* keep connections alive */ 1131541Srgrimes#define SO_DONTROUTE 0x0010 /* just use interface addresses */ 1141541Srgrimes#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ 115104983Smike#if __BSD_VISIBLE 1161541Srgrimes#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ 117104983Smike#endif 1181541Srgrimes#define SO_LINGER 0x0080 /* linger on close if data present */ 1191541Srgrimes#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ 120104983Smike#if __BSD_VISIBLE 1211541Srgrimes#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ 12215701Swollman#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ 12398499Salfred#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ 12461837Salfred#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ 125125264Sphk#define SO_BINTIME 0x2000 /* timestamp received dgram traffic */ 126104983Smike#endif 127174560Skmacy#define SO_NO_OFFLOAD 0x4000 /* socket cannot be offloaded */ 128174560Skmacy#define SO_NO_DDP 0x8000 /* disable direct data placement */ 1291541Srgrimes 1301541Srgrimes/* 1311541Srgrimes * Additional options, not kept in so_options. 1321541Srgrimes */ 13398212Srwatson#define SO_SNDBUF 0x1001 /* send buffer size */ 13498212Srwatson#define SO_RCVBUF 0x1002 /* receive buffer size */ 13598212Srwatson#define SO_SNDLOWAT 0x1003 /* send low-water mark */ 13698212Srwatson#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ 13798212Srwatson#define SO_SNDTIMEO 0x1005 /* send timeout */ 13898212Srwatson#define SO_RCVTIMEO 0x1006 /* receive timeout */ 1391541Srgrimes#define SO_ERROR 0x1007 /* get error status and clear */ 1401541Srgrimes#define SO_TYPE 0x1008 /* get socket type */ 141104983Smike#if __BSD_VISIBLE 14298213Srwatson#define SO_LABEL 0x1009 /* socket's MAC label */ 14398213Srwatson#define SO_PEERLABEL 0x1010 /* socket's peer's MAC label */ 144150302Srwatson#define SO_LISTENQLIMIT 0x1011 /* socket's backlog limit */ 145150302Srwatson#define SO_LISTENQLEN 0x1012 /* socket's complete queue length */ 146150302Srwatson#define SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue length */ 147178888Sjulian#define SO_SETFIB 0x1014 /* use this FIB to route */ 148215178Sluigi#define SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ 149232179Skib#define SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */ 150232179Skib#define SO_PROTOTYPE SO_PROTOCOL /* alias for SO_PROTOCOL (SunOS name) */ 151104983Smike#endif 1521541Srgrimes 1531541Srgrimes/* 154246210Sjhb * Space reserved for new socket options added by third-party vendors. 155246210Sjhb * This range applies to all socket option levels. New socket options 156246210Sjhb * in FreeBSD should always use an option value less than SO_VENDOR. 157246210Sjhb */ 158246210Sjhb#if __BSD_VISIBLE 159246210Sjhb#define SO_VENDOR 0x80000000 160246210Sjhb#endif 161246210Sjhb 162246210Sjhb/* 1631541Srgrimes * Structure used for manipulating linger option. 1641541Srgrimes */ 16583045Sobrienstruct linger { 1661541Srgrimes int l_onoff; /* option on/off */ 1671541Srgrimes int l_linger; /* linger time */ 1681541Srgrimes}; 1691541Srgrimes 170104983Smike#if __BSD_VISIBLE 17183045Sobrienstruct accept_filter_arg { 17261837Salfred char af_name[16]; 17361837Salfred char af_arg[256-16]; 17461837Salfred}; 175104983Smike#endif 17661837Salfred 1771541Srgrimes/* 1781541Srgrimes * Level number for (get/set)sockopt() to apply to socket itself. 1791541Srgrimes */ 1801541Srgrimes#define SOL_SOCKET 0xffff /* options for socket level */ 1811541Srgrimes 1821541Srgrimes/* 1831541Srgrimes * Address families. 1841541Srgrimes */ 1851541Srgrimes#define AF_UNSPEC 0 /* unspecified */ 186104983Smike#if __BSD_VISIBLE 187106847Smike#define AF_LOCAL AF_UNIX /* local to host (pipes, portals) */ 188104983Smike#endif 189106847Smike#define AF_UNIX 1 /* standardized name for AF_LOCAL */ 1901541Srgrimes#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ 191104983Smike#if __BSD_VISIBLE 1921541Srgrimes#define AF_IMPLINK 3 /* arpanet imp addresses */ 1931541Srgrimes#define AF_PUP 4 /* pup protocols: e.g. BSP */ 1941541Srgrimes#define AF_CHAOS 5 /* mit CHAOS protocols */ 195111926Speter#define AF_NETBIOS 6 /* SMB protocols */ 1961541Srgrimes#define AF_ISO 7 /* ISO protocols */ 1971541Srgrimes#define AF_OSI AF_ISO 19813765Smpp#define AF_ECMA 8 /* European computer manufacturers */ 1991541Srgrimes#define AF_DATAKIT 9 /* datakit protocols */ 2001541Srgrimes#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ 2011541Srgrimes#define AF_SNA 11 /* IBM SNA */ 2021541Srgrimes#define AF_DECnet 12 /* DECnet */ 2031541Srgrimes#define AF_DLI 13 /* DEC Direct data link interface */ 2041541Srgrimes#define AF_LAT 14 /* LAT */ 2051541Srgrimes#define AF_HYLINK 15 /* NSC Hyperchannel */ 2061541Srgrimes#define AF_APPLETALK 16 /* Apple Talk */ 2071541Srgrimes#define AF_ROUTE 17 /* Internal Routing Protocol */ 2081541Srgrimes#define AF_LINK 18 /* Link layer interface */ 2091541Srgrimes#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ 2101541Srgrimes#define AF_COIP 20 /* connection-oriented IP, aka ST II */ 2111541Srgrimes#define AF_CNT 21 /* Computer Network Technology */ 2121541Srgrimes#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ 2131541Srgrimes#define AF_IPX 23 /* Novell Internet Protocol */ 2141541Srgrimes#define AF_SIP 24 /* Simple Internet Protocol */ 2155413Sse#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ 2165413Sse#define AF_ISDN 26 /* Integrated Services Digital Network*/ 2175413Sse#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ 21816368Swollman#define pseudo_AF_KEY 27 /* Internal key-management function */ 219104983Smike#endif 22017938Speter#define AF_INET6 28 /* IPv6 */ 221104983Smike#if __BSD_VISIBLE 22225609Skjc#define AF_NATM 29 /* native ATM access */ 22339271Sphk#define AF_ATM 30 /* ATM */ 22452248Smsmith#define pseudo_AF_HDRCMPLT 31 /* Used by BPF to not rewrite headers 22552248Smsmith * in interface output routine 22652248Smsmith */ 22752424Sjulian#define AF_NETGRAPH 32 /* Netgraph sockets */ 22875847Sgrog#define AF_SLOW 33 /* 802.3ad slow protocol */ 22975847Sgrog#define AF_SCLUSTER 34 /* Sitara cluster protocol */ 230126937Smdodd#define AF_ARP 35 231129079Semax#define AF_BLUETOOTH 36 /* Bluetooth sockets */ 232160690Ssam#define AF_IEEE80211 37 /* IEEE 802.11 protocol */ 233254122Sjeff#define AF_INET_SDP 40 /* OFED Socket Direct Protocol ipv4 */ 234254122Sjeff#define AF_INET6_SDP 42 /* OFED Socket Direct Protocol ipv6 */ 235254122Sjeff#define AF_MAX 42 236172217Salfred/* 237172217Salfred * When allocating a new AF_ constant, please only allocate 238172217Salfred * even numbered constants for FreeBSD until 134 as odd numbered AF_ 239172217Salfred * constants 39-133 are now reserved for vendors. 240172217Salfred */ 241172217Salfred#define AF_VENDOR00 39 242172217Salfred#define AF_VENDOR01 41 243172217Salfred#define AF_VENDOR02 43 244172217Salfred#define AF_VENDOR03 45 245172217Salfred#define AF_VENDOR04 47 246172217Salfred#define AF_VENDOR05 49 247172217Salfred#define AF_VENDOR06 51 248172217Salfred#define AF_VENDOR07 53 249172217Salfred#define AF_VENDOR08 55 250172217Salfred#define AF_VENDOR09 57 251172217Salfred#define AF_VENDOR10 59 252172217Salfred#define AF_VENDOR11 61 253172217Salfred#define AF_VENDOR12 63 254172217Salfred#define AF_VENDOR13 65 255172217Salfred#define AF_VENDOR14 67 256172217Salfred#define AF_VENDOR15 69 257172217Salfred#define AF_VENDOR16 71 258172217Salfred#define AF_VENDOR17 73 259172217Salfred#define AF_VENDOR18 75 260172217Salfred#define AF_VENDOR19 77 261172217Salfred#define AF_VENDOR20 79 262172217Salfred#define AF_VENDOR21 81 263172217Salfred#define AF_VENDOR22 83 264172217Salfred#define AF_VENDOR23 85 265172217Salfred#define AF_VENDOR24 87 266172217Salfred#define AF_VENDOR25 89 267172217Salfred#define AF_VENDOR26 91 268172217Salfred#define AF_VENDOR27 93 269172217Salfred#define AF_VENDOR28 95 270172217Salfred#define AF_VENDOR29 97 271172217Salfred#define AF_VENDOR30 99 272172217Salfred#define AF_VENDOR31 101 273172217Salfred#define AF_VENDOR32 103 274172217Salfred#define AF_VENDOR33 105 275172217Salfred#define AF_VENDOR34 107 276172217Salfred#define AF_VENDOR35 109 277172217Salfred#define AF_VENDOR36 111 278172217Salfred#define AF_VENDOR37 113 279172217Salfred#define AF_VENDOR38 115 280172217Salfred#define AF_VENDOR39 117 281172217Salfred#define AF_VENDOR40 119 282172217Salfred#define AF_VENDOR41 121 283172217Salfred#define AF_VENDOR42 123 284172217Salfred#define AF_VENDOR43 125 285172217Salfred#define AF_VENDOR44 127 286172217Salfred#define AF_VENDOR45 129 287172217Salfred#define AF_VENDOR46 131 288172217Salfred#define AF_VENDOR47 133 289104983Smike#endif 2901541Srgrimes 2911541Srgrimes/* 2921541Srgrimes * Structure used by kernel to store most 2931541Srgrimes * addresses. 2941541Srgrimes */ 2951541Srgrimesstruct sockaddr { 296104983Smike unsigned char sa_len; /* total length */ 29753678Sphk sa_family_t sa_family; /* address family */ 29853678Sphk char sa_data[14]; /* actually longer; address value */ 2991541Srgrimes}; 300104983Smike#if __BSD_VISIBLE 30128270Swollman#define SOCK_MAXADDRLEN 255 /* longest possible addresses */ 3021541Srgrimes 3031541Srgrimes/* 3041541Srgrimes * Structure used by kernel to pass protocol 3051541Srgrimes * information in raw sockets. 3061541Srgrimes */ 3071541Srgrimesstruct sockproto { 308104983Smike unsigned short sp_family; /* address family */ 309104983Smike unsigned short sp_protocol; /* protocol */ 3101541Srgrimes}; 311104983Smike#endif 3121541Srgrimes 313196967Sphk#include <sys/_sockaddr_storage.h> 31452904Sshin 315104983Smike#if __BSD_VISIBLE 31652904Sshin/* 3171541Srgrimes * Protocol families, same as address families for now. 3181541Srgrimes */ 3191541Srgrimes#define PF_UNSPEC AF_UNSPEC 3201541Srgrimes#define PF_LOCAL AF_LOCAL 3211541Srgrimes#define PF_UNIX PF_LOCAL /* backward compatibility */ 3221541Srgrimes#define PF_INET AF_INET 3231541Srgrimes#define PF_IMPLINK AF_IMPLINK 3241541Srgrimes#define PF_PUP AF_PUP 3251541Srgrimes#define PF_CHAOS AF_CHAOS 326111926Speter#define PF_NETBIOS AF_NETBIOS 3271541Srgrimes#define PF_ISO AF_ISO 3281541Srgrimes#define PF_OSI AF_ISO 3291541Srgrimes#define PF_ECMA AF_ECMA 3301541Srgrimes#define PF_DATAKIT AF_DATAKIT 3311541Srgrimes#define PF_CCITT AF_CCITT 3321541Srgrimes#define PF_SNA AF_SNA 3331541Srgrimes#define PF_DECnet AF_DECnet 3341541Srgrimes#define PF_DLI AF_DLI 3351541Srgrimes#define PF_LAT AF_LAT 3361541Srgrimes#define PF_HYLINK AF_HYLINK 3371541Srgrimes#define PF_APPLETALK AF_APPLETALK 3381541Srgrimes#define PF_ROUTE AF_ROUTE 3391541Srgrimes#define PF_LINK AF_LINK 3401541Srgrimes#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ 3411541Srgrimes#define PF_COIP AF_COIP 3421541Srgrimes#define PF_CNT AF_CNT 3431541Srgrimes#define PF_SIP AF_SIP 344111926Speter#define PF_IPX AF_IPX 34517603Sjdp#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ 3461541Srgrimes#define PF_PIP pseudo_AF_PIP 3475413Sse#define PF_ISDN AF_ISDN 34816480Swollman#define PF_KEY pseudo_AF_KEY 34917938Speter#define PF_INET6 AF_INET6 35025609Skjc#define PF_NATM AF_NATM 35139271Sphk#define PF_ATM AF_ATM 35252419Sjulian#define PF_NETGRAPH AF_NETGRAPH 35375847Sgrog#define PF_SLOW AF_SLOW 35475847Sgrog#define PF_SCLUSTER AF_SCLUSTER 355126937Smdodd#define PF_ARP AF_ARP 356129079Semax#define PF_BLUETOOTH AF_BLUETOOTH 357251673Skevlo#define PF_IEEE80211 AF_IEEE80211 358254122Sjeff#define PF_INET_SDP AF_INET_SDP 359254122Sjeff#define PF_INET6_SDP AF_INET6_SDP 3601541Srgrimes 3611541Srgrimes#define PF_MAX AF_MAX 3621541Srgrimes 3631541Srgrimes/* 3641541Srgrimes * Definitions for network related sysctl, CTL_NET. 3651541Srgrimes * 3661541Srgrimes * Second level is protocol family. 3671541Srgrimes * Third level is protocol number. 3681541Srgrimes * 3691541Srgrimes * Further levels are defined by the individual families below. 3701541Srgrimes */ 3711541Srgrimes#define NET_MAXID AF_MAX 3721541Srgrimes 3731541Srgrimes/* 3741541Srgrimes * PF_ROUTE - Routing table 3751541Srgrimes * 3761541Srgrimes * Three additional levels are defined: 3771541Srgrimes * Fourth: address family, 0 is wildcard 3781541Srgrimes * Fifth: type of info, defined below 3791541Srgrimes * Sixth: flag(s) to mask with for NET_RT_FLAGS 3801541Srgrimes */ 3811541Srgrimes#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ 3821541Srgrimes#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ 3831541Srgrimes#define NET_RT_IFLIST 3 /* survey interface list */ 384122685Sbms#define NET_RT_IFMALIST 4 /* return multicast address list */ 385231505Sbz#define NET_RT_IFLISTL 5 /* Survey interface list, using 'l'en 386231505Sbz * versions of msghdr structs. */ 387231505Sbz#define NET_RT_MAXID 6 3881541Srgrimes 389104983Smike#endif /* __BSD_VISIBLE */ 3901541Srgrimes 3911541Srgrimes/* 3921541Srgrimes * Maximum queue length specifiable by listen. 3931541Srgrimes */ 39413258Sdg#define SOMAXCONN 128 3951541Srgrimes 3961541Srgrimes/* 3971541Srgrimes * Message header for recvmsg and sendmsg calls. 3981541Srgrimes * Used value-result for recvmsg, value only for sendmsg. 3991541Srgrimes */ 4001541Srgrimesstruct msghdr { 40153678Sphk void *msg_name; /* optional address */ 40253678Sphk socklen_t msg_namelen; /* size of address */ 40353678Sphk struct iovec *msg_iov; /* scatter/gather array */ 40453678Sphk int msg_iovlen; /* # elements in msg_iov */ 40553678Sphk void *msg_control; /* ancillary data, see below */ 40653678Sphk socklen_t msg_controllen; /* ancillary data buffer len */ 40753678Sphk int msg_flags; /* flags on received message */ 4081541Srgrimes}; 4091541Srgrimes 4101541Srgrimes#define MSG_OOB 0x1 /* process out-of-band data */ 4111541Srgrimes#define MSG_PEEK 0x2 /* peek at incoming message */ 4121541Srgrimes#define MSG_DONTROUTE 0x4 /* send without using routing tables */ 4131541Srgrimes#define MSG_EOR 0x8 /* data completes record */ 4141541Srgrimes#define MSG_TRUNC 0x10 /* data discarded before delivery */ 4151541Srgrimes#define MSG_CTRUNC 0x20 /* control data lost before delivery */ 4161541Srgrimes#define MSG_WAITALL 0x40 /* wait for full request or error */ 417248932Sjilles#if __POSIX_VISIBLE >= 200809 418248932Sjilles#define MSG_NOSIGNAL 0x20000 /* do not generate SIGPIPE on EOF */ 419248932Sjilles#endif 420104983Smike#if __BSD_VISIBLE 4211541Srgrimes#define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ 4226223Swollman#define MSG_EOF 0x100 /* data completes connection */ 423248932Sjilles#define MSG_NOTIFICATION 0x2000 /* SCTP notification */ 424129911Struckman#define MSG_NBIO 0x4000 /* FIONBIO mode, used by fifofs */ 425129929Struckman#define MSG_COMPAT 0x8000 /* used in sendit() */ 426248932Sjilles#define MSG_CMSG_CLOEXEC 0x40000 /* make received fds close-on-exec */ 427104983Smike#endif 428138206Sps#ifdef _KERNEL 429138206Sps#define MSG_SOCALLBCK 0x10000 /* for use by socket callbacks - soreceive (TCP) */ 430138206Sps#endif 4311541Srgrimes 4321541Srgrimes/* 4331541Srgrimes * Header for ancillary data objects in msg_control buffer. 4341541Srgrimes * Used for additional information with/about a datagram 4351541Srgrimes * not expressible by flags. The format is a sequence 4361541Srgrimes * of message elements headed by cmsghdr structures. 4371541Srgrimes */ 4381541Srgrimesstruct cmsghdr { 43953678Sphk socklen_t cmsg_len; /* data byte count, including hdr */ 44053678Sphk int cmsg_level; /* originating protocol */ 44153678Sphk int cmsg_type; /* protocol-specific type */ 4421541Srgrimes/* followed by u_char cmsg_data[]; */ 4431541Srgrimes}; 4441541Srgrimes 445104983Smike#if __BSD_VISIBLE 44624083Swpaul/* 44724083Swpaul * While we may have more groups than this, the cmsgcred struct must 448201955Sbrooks * be able to fit in an mbuf and we have historically supported a 449201955Sbrooks * maximum of 16 groups. 45024083Swpaul*/ 45124083Swpaul#define CMGROUP_MAX 16 45224083Swpaul 45324083Swpaul/* 45424083Swpaul * Credentials structure, used to verify the identity of a peer 45524083Swpaul * process that has sent us a message. This is allocated by the 45624083Swpaul * peer process but filled in by the kernel. This prevents the 45724083Swpaul * peer from lying about its identity. (Note that cmcred_groups[0] 45824083Swpaul * is the effective GID.) 45924083Swpaul */ 46024083Swpaulstruct cmsgcred { 46124083Swpaul pid_t cmcred_pid; /* PID of sending process */ 46224083Swpaul uid_t cmcred_uid; /* real UID of sending process */ 46324083Swpaul uid_t cmcred_euid; /* effective UID of sending process */ 46424083Swpaul gid_t cmcred_gid; /* real GID of sending process */ 46524083Swpaul short cmcred_ngroups; /* number or groups */ 46624083Swpaul gid_t cmcred_groups[CMGROUP_MAX]; /* groups */ 46724083Swpaul}; 468144978Smdodd 469144978Smdodd/* 470144978Smdodd * Socket credentials. 471144978Smdodd */ 472144978Smdoddstruct sockcred { 473144978Smdodd uid_t sc_uid; /* real user id */ 474144978Smdodd uid_t sc_euid; /* effective user id */ 475144978Smdodd gid_t sc_gid; /* real group id */ 476144978Smdodd gid_t sc_egid; /* effective group id */ 477144978Smdodd int sc_ngroups; /* number of supplemental groups */ 478144978Smdodd gid_t sc_groups[1]; /* variable length */ 479144978Smdodd}; 480144978Smdodd 481144978Smdodd/* 482144978Smdodd * Compute size of a sockcred structure with groups. 483144978Smdodd */ 484144978Smdodd#define SOCKCREDSIZE(ngrps) \ 485144978Smdodd (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1))) 486144978Smdodd 487104983Smike#endif /* __BSD_VISIBLE */ 48824083Swpaul 4891541Srgrimes/* given pointer to struct cmsghdr, return pointer to data */ 490104983Smike#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + \ 49178137Sume _ALIGN(sizeof(struct cmsghdr))) 4921541Srgrimes 4931541Srgrimes/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ 4941541Srgrimes#define CMSG_NXTHDR(mhdr, cmsg) \ 495168867Smtm ((char *)(cmsg) == NULL ? CMSG_FIRSTHDR(mhdr) : \ 496168867Smtm ((char *)(cmsg) + _ALIGN(((struct cmsghdr *)(cmsg))->cmsg_len) + \ 49778137Sume _ALIGN(sizeof(struct cmsghdr)) > \ 498104983Smike (char *)(mhdr)->msg_control + (mhdr)->msg_controllen) ? \ 499132258Sharti (struct cmsghdr *)0 : \ 500220742Sjilles (struct cmsghdr *)(void *)((char *)(cmsg) + \ 501168867Smtm _ALIGN(((struct cmsghdr *)(cmsg))->cmsg_len))) 5021541Srgrimes 503133478Sandre/* 504133478Sandre * RFC 2292 requires to check msg_controllen, in case that the kernel returns 505133478Sandre * an empty list for some reasons. 506133478Sandre */ 507133478Sandre#define CMSG_FIRSTHDR(mhdr) \ 508133478Sandre ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ 509133478Sandre (struct cmsghdr *)(mhdr)->msg_control : \ 510133478Sandre (struct cmsghdr *)NULL) 5111541Srgrimes 512104983Smike#if __BSD_VISIBLE 51366255Sasmodai/* RFC 2292 additions */ 51478137Sume#define CMSG_SPACE(l) (_ALIGN(sizeof(struct cmsghdr)) + _ALIGN(l)) 51578137Sume#define CMSG_LEN(l) (_ALIGN(sizeof(struct cmsghdr)) + (l)) 516104983Smike#endif 51752904Sshin 51878137Sume#ifdef _KERNEL 51978137Sume#define CMSG_ALIGN(n) _ALIGN(n) 52078137Sume#endif 52178064Sume 5221541Srgrimes/* "Socket"-level control message types: */ 5231541Srgrimes#define SCM_RIGHTS 0x01 /* access rights (array of int) */ 524104983Smike#if __BSD_VISIBLE 52515701Swollman#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */ 52624083Swpaul#define SCM_CREDS 0x03 /* process creds (struct cmsgcred) */ 527125264Sphk#define SCM_BINTIME 0x04 /* timestamp (struct bintime) */ 528104983Smike#endif 5291541Srgrimes 530104983Smike#if __BSD_VISIBLE 5311541Srgrimes/* 5321541Srgrimes * 4.3 compat sockaddr, move to compat file later 5331541Srgrimes */ 5341541Srgrimesstruct osockaddr { 535104983Smike unsigned short sa_family; /* address family */ 5361541Srgrimes char sa_data[14]; /* up to 14 bytes of direct address */ 5371541Srgrimes}; 5381541Srgrimes 5391541Srgrimes/* 5401541Srgrimes * 4.3-compat message header (move to compat file later). 5411541Srgrimes */ 5421541Srgrimesstruct omsghdr { 543104983Smike char *msg_name; /* optional address */ 5441541Srgrimes int msg_namelen; /* size of address */ 5451541Srgrimes struct iovec *msg_iov; /* scatter/gather array */ 5461541Srgrimes int msg_iovlen; /* # elements in msg_iov */ 547104983Smike char *msg_accrights; /* access rights sent/received */ 5481541Srgrimes int msg_accrightslen; 5491541Srgrimes}; 550104983Smike#endif 5511541Srgrimes 55239114Swollman/* 55339114Swollman * howto arguments for shutdown(2), specified by Posix.1g. 55439114Swollman */ 55539114Swollman#define SHUT_RD 0 /* shut down the reading side */ 55639114Swollman#define SHUT_WR 1 /* shut down the writing side */ 55739114Swollman#define SHUT_RDWR 2 /* shut down both sides */ 55839114Swollman 559248932Sjilles#if __BSD_VISIBLE 560248932Sjilles/* for SCTP */ 561178200Srrs/* we cheat and use the SHUT_XX defines for these */ 562178200Srrs#define PRU_FLUSH_RD SHUT_RD 563178200Srrs#define PRU_FLUSH_WR SHUT_WR 564178200Srrs#define PRU_FLUSH_RDWR SHUT_RDWR 565248932Sjilles#endif 566178200Srrs 567178200Srrs 568104983Smike#if __BSD_VISIBLE 56940931Sdg/* 57040931Sdg * sendfile(2) header/trailer struct 57140931Sdg */ 57240931Sdgstruct sf_hdtr { 57340931Sdg struct iovec *headers; /* pointer to an array of header struct iovec's */ 57440931Sdg int hdr_cnt; /* number of header iovec's */ 57540931Sdg struct iovec *trailers; /* pointer to an array of trailer struct iovec's */ 57640931Sdg int trl_cnt; /* number of trailer iovec's */ 57740931Sdg}; 578125586Ssilby 579125586Ssilby/* 580125586Ssilby * Sendfile-specific flag(s) 581125586Ssilby */ 582163913Sandre#define SF_NODISKIO 0x00000001 583163913Sandre#define SF_MNOWAIT 0x00000002 584175941Sphk#define SF_SYNC 0x00000004 58540931Sdg 586254356Sglebius#ifdef _KERNEL 587254356Sglebius#define SFK_COMPAT 0x00000001 588254356Sglebius#endif /* _KERNEL */ 589254356Sglebius#endif /* __BSD_VISIBLE */ 590254356Sglebius 59155205Speter#ifndef _KERNEL 5921541Srgrimes 5931541Srgrimes#include <sys/cdefs.h> 5941541Srgrimes 5951541Srgrimes__BEGIN_DECLS 596123811Salfredint accept(int, struct sockaddr * __restrict, socklen_t * __restrict); 59792719Salfredint bind(int, const struct sockaddr *, socklen_t); 598248932Sjillesint connect(int, const struct sockaddr *, socklen_t); 599248932Sjilles#if __BSD_VISIBLE 600250154Sjillesint accept4(int, struct sockaddr * __restrict, socklen_t * __restrict, int); 601247667Spjdint bindat(int, int, const struct sockaddr *, socklen_t); 602247667Spjdint connectat(int, int, const struct sockaddr *, socklen_t); 603248932Sjilles#endif 604123811Salfredint getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); 605123811Salfredint getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); 606123811Salfredint getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); 60792719Salfredint listen(int, int); 60892719Salfredssize_t recv(int, void *, size_t, int); 609123811Salfredssize_t recvfrom(int, void *, size_t, int, struct sockaddr * __restrict, socklen_t * __restrict); 61092719Salfredssize_t recvmsg(int, struct msghdr *, int); 61192719Salfredssize_t send(int, const void *, size_t, int); 61292719Salfredssize_t sendto(int, const void *, 61392719Salfred size_t, int, const struct sockaddr *, socklen_t); 61492719Salfredssize_t sendmsg(int, const struct msghdr *, int); 615104983Smike#if __BSD_VISIBLE 61692719Salfredint sendfile(int, int, off_t, size_t, struct sf_hdtr *, off_t *, int); 617181440Sdelphijint setfib(int); 618104983Smike#endif 61992719Salfredint setsockopt(int, int, int, const void *, socklen_t); 62092719Salfredint shutdown(int, int); 621107872Sfennerint sockatmark(int); 62292719Salfredint socket(int, int, int); 62392719Salfredint socketpair(int, int, int, int *); 6241541Srgrimes__END_DECLS 6251541Srgrimes 62655205Speter#endif /* !_KERNEL */ 62731927Sbde 628180641Skmacy#ifdef _KERNEL 629180641Skmacystruct socket; 630180641Skmacy 631180641Skmacystruct tcpcb *so_sototcpcb(struct socket *so); 632180641Skmacystruct inpcb *so_sotoinpcb(struct socket *so); 633180641Skmacystruct sockbuf *so_sockbuf_snd(struct socket *); 634180641Skmacystruct sockbuf *so_sockbuf_rcv(struct socket *); 635180641Skmacy 636180641Skmacyint so_state_get(const struct socket *); 637180641Skmacyvoid so_state_set(struct socket *, int); 638180641Skmacy 639180641Skmacyint so_options_get(const struct socket *); 640180641Skmacyvoid so_options_set(struct socket *, int); 641180641Skmacy 642180641Skmacyint so_error_get(const struct socket *); 643180641Skmacyvoid so_error_set(struct socket *, int); 644180641Skmacy 645180641Skmacyint so_linger_get(const struct socket *); 646180641Skmacyvoid so_linger_set(struct socket *, int); 647180641Skmacy 648180641Skmacystruct protosw *so_protosw_get(const struct socket *); 649180641Skmacyvoid so_protosw_set(struct socket *, struct protosw *); 650180641Skmacy 651180641Skmacyvoid so_sorwakeup_locked(struct socket *so); 652180641Skmacyvoid so_sowwakeup_locked(struct socket *so); 653180641Skmacy 654180641Skmacyvoid so_sorwakeup(struct socket *so); 655180641Skmacyvoid so_sowwakeup(struct socket *so); 656180641Skmacy 657180641Skmacyvoid so_lock(struct socket *so); 658180641Skmacyvoid so_unlock(struct socket *so); 659180641Skmacy 660180641Skmacyvoid so_listeners_apply_all(struct socket *so, void (*func)(struct socket *, void *), void *arg); 661180641Skmacy 662180641Skmacy#endif 663180641Skmacy 664180641Skmacy 6651541Srgrimes#endif /* !_SYS_SOCKET_H_ */ 666