123438Smckusick /* 2*66141Sbostic * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 361064Sbostic * The Regents of the University of California. All rights reserved. 423438Smckusick * 544523Sbostic * %sccs.include.redist.c% 633186Sbostic * 7*66141Sbostic * @(#)socket.h 8.3 (Berkeley) 02/17/94 823438Smckusick */ 94658Swnj 1065420Sbostic #ifndef _SYS_SOCKET_H_ 1165420Sbostic #define _SYS_SOCKET_H_ 1259439Smckusick 134658Swnj /* 1412787Ssam * Definitions related to sockets: types, address families, options. 154658Swnj */ 164892Swnj 174892Swnj /* 1812787Ssam * Types 194892Swnj */ 204930Swnj #define SOCK_STREAM 1 /* stream socket */ 214930Swnj #define SOCK_DGRAM 2 /* datagram socket */ 224930Swnj #define SOCK_RAW 3 /* raw-protocol interface */ 234930Swnj #define SOCK_RDM 4 /* reliably-delivered message */ 2412787Ssam #define SOCK_SEQPACKET 5 /* sequenced packet stream */ 254658Swnj 264812Swnj /* 274812Swnj * Option flags per-socket. 284812Swnj */ 2927192Skarels #define SO_DEBUG 0x0001 /* turn on debugging info recording */ 3027192Skarels #define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 3127192Skarels #define SO_REUSEADDR 0x0004 /* allow local address reuse */ 3227192Skarels #define SO_KEEPALIVE 0x0008 /* keep connections alive */ 3327192Skarels #define SO_DONTROUTE 0x0010 /* just use interface addresses */ 3427192Skarels #define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ 3527192Skarels #define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ 3627192Skarels #define SO_LINGER 0x0080 /* linger on close if data present */ 3727192Skarels #define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ 3855346Ssklower #define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ 394930Swnj 404930Swnj /* 4117552Skarels * Additional options, not kept in so_options. 4217552Skarels */ 4317552Skarels #define SO_SNDBUF 0x1001 /* send buffer size */ 4417552Skarels #define SO_RCVBUF 0x1002 /* receive buffer size */ 4517552Skarels #define SO_SNDLOWAT 0x1003 /* send low-water mark */ 4617552Skarels #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ 4717552Skarels #define SO_SNDTIMEO 0x1005 /* send timeout */ 4817552Skarels #define SO_RCVTIMEO 0x1006 /* receive timeout */ 4924825Skarels #define SO_ERROR 0x1007 /* get error status and clear */ 5025503Skarels #define SO_TYPE 0x1008 /* get socket type */ 5117552Skarels 5217552Skarels /* 5317160Ssam * Structure used for manipulating linger option. 5417052Skarels */ 5517160Ssam struct linger { 5617160Ssam int l_onoff; /* option on/off */ 5717160Ssam int l_linger; /* linger time */ 5817160Ssam }; 5917052Skarels 6017052Skarels /* 6117160Ssam * Level number for (get/set)sockopt() to apply to socket itself. 6217160Ssam */ 6317160Ssam #define SOL_SOCKET 0xffff /* options for socket level */ 6417160Ssam 6517160Ssam /* 6612787Ssam * Address families. 674930Swnj */ 6812787Ssam #define AF_UNSPEC 0 /* unspecified */ 69*66141Sbostic #define AF_LOCAL 1 /* local to host (pipes, portals) */ 70*66141Sbostic #define AF_UNIX AF_LOCAL /* backward compatibility */ 7112787Ssam #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ 7212787Ssam #define AF_IMPLINK 3 /* arpanet imp addresses */ 7312787Ssam #define AF_PUP 4 /* pup protocols: e.g. BSP */ 7412787Ssam #define AF_CHAOS 5 /* mit CHAOS protocols */ 7512787Ssam #define AF_NS 6 /* XEROX NS protocols */ 7636353Ssklower #define AF_ISO 7 /* ISO protocols */ 7740764Skarels #define AF_OSI AF_ISO 7812787Ssam #define AF_ECMA 8 /* european computer manufacturers */ 7912787Ssam #define AF_DATAKIT 9 /* datakit protocols */ 8012787Ssam #define AF_CCITT 10 /* CCITT protocols, X.25 etc */ 8112787Ssam #define AF_SNA 11 /* IBM SNA */ 8223751Skarels #define AF_DECnet 12 /* DECnet */ 8340764Skarels #define AF_DLI 13 /* DEC Direct data link interface */ 8423751Skarels #define AF_LAT 14 /* LAT */ 8523751Skarels #define AF_HYLINK 15 /* NSC Hyperchannel */ 8628881Skarels #define AF_APPLETALK 16 /* Apple Talk */ 8736353Ssklower #define AF_ROUTE 17 /* Internal Routing Protocol */ 8840764Skarels #define AF_LINK 18 /* Link layer interface */ 8940764Skarels #define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ 9051008Skarels #define AF_COIP 20 /* connection-oriented IP, aka ST II */ 9153622Ssklower #define AF_CNT 21 /* Computer Network Technology */ 9259012Ssklower #define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ 9359012Ssklower #define AF_IPX 23 /* Novell Internet Protocol */ 9459012Ssklower #define AF_SIP 24 /* Simple Internet Protocol */ 9559012Ssklower #define pseudo_AF_PIP 25 /* Help Identify PIP packets */ 964930Swnj 9759012Ssklower #define AF_MAX 26 984930Swnj 994930Swnj /* 10012787Ssam * Structure used by kernel to store most 10112787Ssam * addresses. 1024930Swnj */ 1034930Swnj struct sockaddr { 10435796Ssklower u_char sa_len; /* total length */ 10535796Ssklower u_char sa_family; /* address family */ 10636353Ssklower char sa_data[14]; /* actually longer; address value */ 10735796Ssklower }; 1084930Swnj 1094930Swnj /* 11012787Ssam * Structure used by kernel to pass protocol 11112787Ssam * information in raw sockets. 1124930Swnj */ 11312787Ssam struct sockproto { 11412787Ssam u_short sp_family; /* address family */ 11512787Ssam u_short sp_protocol; /* protocol */ 11612787Ssam }; 1176620Ssam 11812787Ssam /* 11912787Ssam * Protocol families, same as address families for now. 12012787Ssam */ 12112787Ssam #define PF_UNSPEC AF_UNSPEC 122*66141Sbostic #define PF_LOCAL AF_LOCAL 123*66141Sbostic #define PF_UNIX PF_LOCAL /* backward compatibility */ 12412787Ssam #define PF_INET AF_INET 12512787Ssam #define PF_IMPLINK AF_IMPLINK 12612787Ssam #define PF_PUP AF_PUP 12712787Ssam #define PF_CHAOS AF_CHAOS 12812787Ssam #define PF_NS AF_NS 12936353Ssklower #define PF_ISO AF_ISO 13040764Skarels #define PF_OSI AF_ISO 13112787Ssam #define PF_ECMA AF_ECMA 13212787Ssam #define PF_DATAKIT AF_DATAKIT 13312787Ssam #define PF_CCITT AF_CCITT 13412787Ssam #define PF_SNA AF_SNA 13523751Skarels #define PF_DECnet AF_DECnet 13623751Skarels #define PF_DLI AF_DLI 13723751Skarels #define PF_LAT AF_LAT 13823751Skarels #define PF_HYLINK AF_HYLINK 13928881Skarels #define PF_APPLETALK AF_APPLETALK 14036353Ssklower #define PF_ROUTE AF_ROUTE 14140764Skarels #define PF_LINK AF_LINK 14240764Skarels #define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ 14351008Skarels #define PF_COIP AF_COIP 14453622Ssklower #define PF_CNT AF_CNT 14559012Ssklower #define PF_SIP AF_SIP 14659012Ssklower #define PF_IPX AF_IPX /* same format as AF_NS */ 14759012Ssklower #define PF_RTIP pseudo_AF_FTIP /* same format as AF_INET */ 14859012Ssklower #define PF_PIP pseudo_AF_PIP 1498274Sroot 15023751Skarels #define PF_MAX AF_MAX 15112787Ssam 15212787Ssam /* 15357838Smckusick * Definitions for network related sysctl, CTL_NET. 15457838Smckusick * 15557838Smckusick * Second level is protocol family. 15657838Smckusick * Third level is protocol number. 15757838Smckusick * 15857838Smckusick * Further levels are defined by the individual families below. 15957838Smckusick */ 16058896Smckusick #define NET_MAXID AF_MAX 16158896Smckusick 16258896Smckusick #define CTL_NET_NAMES { \ 16359137Smckusick { 0, 0 }, \ 16459137Smckusick { "unix", CTLTYPE_NODE }, \ 16559137Smckusick { "inet", CTLTYPE_NODE }, \ 16659137Smckusick { "implink", CTLTYPE_NODE }, \ 16759137Smckusick { "pup", CTLTYPE_NODE }, \ 16859137Smckusick { "chaos", CTLTYPE_NODE }, \ 16959137Smckusick { "xerox_ns", CTLTYPE_NODE }, \ 17059137Smckusick { "iso", CTLTYPE_NODE }, \ 17159137Smckusick { "emca", CTLTYPE_NODE }, \ 17259137Smckusick { "datakit", CTLTYPE_NODE }, \ 17359137Smckusick { "ccitt", CTLTYPE_NODE }, \ 17459137Smckusick { "ibm_sna", CTLTYPE_NODE }, \ 17559137Smckusick { "decnet", CTLTYPE_NODE }, \ 17659137Smckusick { "dec_dli", CTLTYPE_NODE }, \ 17759137Smckusick { "lat", CTLTYPE_NODE }, \ 17859137Smckusick { "hylink", CTLTYPE_NODE }, \ 17959137Smckusick { "appletalk", CTLTYPE_NODE }, \ 18059137Smckusick { "route", CTLTYPE_NODE }, \ 18159137Smckusick { "link_layer", CTLTYPE_NODE }, \ 18259137Smckusick { "xtp", CTLTYPE_NODE }, \ 18359137Smckusick { "coip", CTLTYPE_NODE }, \ 18459137Smckusick { "cnt", CTLTYPE_NODE }, \ 18559137Smckusick { "rtip", CTLTYPE_NODE }, \ 18659137Smckusick { "ipx", CTLTYPE_NODE }, \ 18759137Smckusick { "sip", CTLTYPE_NODE }, \ 18859137Smckusick { "pip", CTLTYPE_NODE }, \ 18958896Smckusick } 19058896Smckusick 19157838Smckusick /* 19257838Smckusick * PF_ROUTE - Routing table 19357838Smckusick * 19457838Smckusick * Three additional levels are defined: 19557838Smckusick * Fourth: address family, 0 is wildcard 19657838Smckusick * Fifth: type of info, defined below 19757838Smckusick * Sixth: flag(s) to mask with for NET_RT_FLAGS 19857838Smckusick */ 19957838Smckusick #define NET_RT_DUMP 1 /* dump; may limit to a.f. */ 20057838Smckusick #define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ 20157838Smckusick #define NET_RT_IFLIST 3 /* survey interface list */ 20259137Smckusick #define NET_RT_MAXID 4 20357838Smckusick 20457838Smckusick #define CTL_NET_RT_NAMES { \ 20559137Smckusick { 0, 0 }, \ 20659137Smckusick { "dump", CTLTYPE_STRUCT }, \ 20759137Smckusick { "flags", CTLTYPE_STRUCT }, \ 20859137Smckusick { "iflist", CTLTYPE_STRUCT }, \ 20957838Smckusick } 21057838Smckusick 21157838Smckusick /* 21212787Ssam * Maximum queue length specifiable by listen. 21312787Ssam */ 21412787Ssam #define SOMAXCONN 5 21512787Ssam 21612787Ssam /* 21712787Ssam * Message header for recvmsg and sendmsg calls. 21835796Ssklower * Used value-result for recvmsg, value only for sendmsg. 21912787Ssam */ 22012787Ssam struct msghdr { 22112787Ssam caddr_t msg_name; /* optional address */ 22242464Ssklower u_int msg_namelen; /* size of address */ 22312787Ssam struct iovec *msg_iov; /* scatter/gather array */ 22442464Ssklower u_int msg_iovlen; /* # elements in msg_iov */ 22540764Skarels caddr_t msg_control; /* ancillary data, see below */ 22642464Ssklower u_int msg_controllen; /* ancillary data buffer len */ 22735796Ssklower int msg_flags; /* flags on received message */ 22812787Ssam }; 22912787Ssam 23012787Ssam #define MSG_OOB 0x1 /* process out-of-band data */ 23112787Ssam #define MSG_PEEK 0x2 /* peek at incoming message */ 23212787Ssam #define MSG_DONTROUTE 0x4 /* send without using routing tables */ 23335796Ssklower #define MSG_EOR 0x8 /* data completes record */ 23435796Ssklower #define MSG_TRUNC 0x10 /* data discarded before delivery */ 23535796Ssklower #define MSG_CTRUNC 0x20 /* control data lost before delivery */ 23640764Skarels #define MSG_WAITALL 0x40 /* wait for full request or error */ 23751753Smckusick #define MSG_DONTWAIT 0x80 /* this message should be nonblocking */ 23812787Ssam 23935796Ssklower /* 24040764Skarels * Header for ancillary data objects in msg_control buffer. 24140764Skarels * Used for additional information with/about a datagram 24240764Skarels * not expressible by flags. The format is a sequence 24340764Skarels * of message elements headed by cmsghdr structures. 24440764Skarels */ 24540764Skarels struct cmsghdr { 24640764Skarels u_int cmsg_len; /* data byte count, including hdr */ 24742464Ssklower int cmsg_level; /* originating protocol */ 24842464Ssklower int cmsg_type; /* protocol-specific type */ 24940764Skarels /* followed by u_char cmsg_data[]; */ 25040764Skarels }; 25140764Skarels 25260017Sandrew /* given pointer to struct cmsghdr, return pointer to data */ 25340764Skarels #define CMSG_DATA(cmsg) ((u_char *)((cmsg) + 1)) 25440764Skarels 25560017Sandrew /* given pointer to struct cmsghdr, return pointer to next cmsghdr */ 25640764Skarels #define CMSG_NXTHDR(mhdr, cmsg) \ 25740764Skarels (((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \ 25840764Skarels (mhdr)->msg_control + (mhdr)->msg_controllen) ? \ 25940764Skarels (struct cmsghdr *)NULL : \ 26040764Skarels (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len))) 26140764Skarels 26240764Skarels #define CMSG_FIRSTHDR(mhdr) ((struct cmsghdr *)(mhdr)->msg_control) 26340764Skarels 26440764Skarels /* "Socket"-level control message types: */ 26540764Skarels #define SCM_RIGHTS 0x01 /* access rights (array of int) */ 26640764Skarels 26740764Skarels /* 26840764Skarels * 4.3 compat sockaddr, move to compat file later 26940764Skarels */ 27040764Skarels struct osockaddr { 27140764Skarels u_short sa_family; /* address family */ 27240764Skarels char sa_data[14]; /* up to 14 bytes of direct address */ 27340764Skarels }; 27440764Skarels 27540764Skarels /* 27635796Ssklower * 4.3-compat message header (move to compat file later). 27735796Ssklower */ 27835796Ssklower struct omsghdr { 27935796Ssklower caddr_t msg_name; /* optional address */ 28035796Ssklower int msg_namelen; /* size of address */ 28135796Ssklower struct iovec *msg_iov; /* scatter/gather array */ 28235796Ssklower int msg_iovlen; /* # elements in msg_iov */ 28335796Ssklower caddr_t msg_accrights; /* access rights sent/received */ 28435796Ssklower int msg_accrightslen; 28535796Ssklower }; 28646577Sdonn 28746577Sdonn #ifndef KERNEL 28846577Sdonn 28946577Sdonn #include <sys/cdefs.h> 29046577Sdonn 29146577Sdonn __BEGIN_DECLS 29246577Sdonn int accept __P((int, struct sockaddr *, int *)); 29346577Sdonn int bind __P((int, const struct sockaddr *, int)); 29446577Sdonn int connect __P((int, const struct sockaddr *, int)); 29546577Sdonn int getpeername __P((int, struct sockaddr *, int *)); 29646577Sdonn int getsockname __P((int, struct sockaddr *, int *)); 29746577Sdonn int getsockopt __P((int, int, int, void *, int *)); 29846577Sdonn int listen __P((int, int)); 29946577Sdonn int recv __P((int, void *, int, int)); 30046577Sdonn int recvfrom __P((int, void *, int, int, 30146577Sdonn struct sockaddr *, int *)); 30248387Skarels int recvmsg __P((int, struct msghdr *, int)); 30346577Sdonn int send __P((int, const void *, int, int)); 30446972Sbostic int sendto __P((int, const void *, int, int, const struct sockaddr *, int)); 30546577Sdonn int sendmsg __P((int, const struct msghdr *, int)); 30646577Sdonn int setsockopt __P((int, int, int, const void *, int)); 30746577Sdonn int shutdown __P((int, int)); 30846577Sdonn int socket __P((int, int, int)); 30946577Sdonn int socketpair __P((int, int, int, int *)); 31046577Sdonn __END_DECLS 31146577Sdonn 312*66141Sbostic #endif /* !KERNEL */ 31365420Sbostic #endif /* !_SYS_SOCKET_H_ */ 314