socketvar.h revision 52070
116359Sasami/*- 216359Sasami * Copyright (c) 1982, 1986, 1990, 1993 316359Sasami * The Regents of the University of California. All rights reserved. 450518Snyan * 550518Snyan * Redistribution and use in source and binary forms, with or without 616359Sasami * modification, are permitted provided that the following conditions 750518Snyan * are met: 850518Snyan * 1. Redistributions of source code must retain the above copyright 950518Snyan * notice, this list of conditions and the following disclaimer. 1050518Snyan * 2. Redistributions in binary form must reproduce the above copyright 1150518Snyan * notice, this list of conditions and the following disclaimer in the 1250518Snyan * documentation and/or other materials provided with the distribution. 1350518Snyan * 3. All advertising materials mentioning features or use of this software 1450518Snyan * must display the following acknowledgement: 1550518Snyan * This product includes software developed by the University of 1617973Sasami * California, Berkeley and its contributors. 1717973Sasami * 4. Neither the name of the University nor the names of its contributors 1850477Speter * may be used to endorse or promote products derived from this software 1916359Sasami * without specific prior written permission. 2020192Skato * 2116359Sasami * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2246044Skato * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2346044Skato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2446044Skato * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2546044Skato * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2646044Skato * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2746044Skato * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2838832Skato * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2916359Sasami * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3046044Skato * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3145783Skato * SUCH DAMAGE. 3250518Snyan * 3350518Snyan * @(#)socketvar.h 8.3 (Berkeley) 2/19/95 3450518Snyan * $FreeBSD: head/sys/sys/socketvar.h 52070 1999-10-09 20:42:17Z green $ 3550518Snyan */ 3650518Snyan 3754877Skato#ifndef _SYS_SOCKETVAR_H_ 3853744Snyan#define _SYS_SOCKETVAR_H_ 3950518Snyan 4050518Snyan#include <sys/queue.h> /* for TAILQ macros */ 4150518Snyan#include <sys/select.h> /* for struct selinfo */ 4250518Snyan 4350518Snyan/* 4450518Snyan * Kernel structure per socket. 4550518Snyan * Contains send and receive buffer queues, 4650518Snyan * handle on protocol and pointer to protocol 4750518Snyan * private data and error information. 4850518Snyan */ 4950518Snyantypedef u_quad_t so_gen_t; 5050518Snyan 5150518Snyanstruct socket { 5250518Snyan struct vm_zone *so_zone; /* zone we were allocated from */ 5350518Snyan short so_type; /* generic type, see socket.h */ 5452833Snyan short so_options; /* from socket call, see socket.h */ 5552833Snyan short so_linger; /* time to linger while closing */ 5652833Snyan short so_state; /* internal state flags SS_*, below */ 5718846Sasami caddr_t so_pcb; /* protocol control block */ 5842157Skato struct protosw *so_proto; /* protocol handle */ 5950518Snyan/* 6050518Snyan * Variables for connection queuing. 6142157Skato * Socket where accepts occur is so_head in all subsidiary sockets. 6250518Snyan * If so_head is 0, socket is not related to an accept. 6350518Snyan * For head socket so_q0 queues partially completed connections, 6450518Snyan * while so_q is a queue of connections ready to be accepted. 6550518Snyan * If a connection is aborted and it has so_head set, then 6642157Skato * it has to be pulled out of either so_q0 or so_q. 6750518Snyan * We allow connections to queue up based on current queue lengths 6850518Snyan * and limit on number of queued connections for this socket. 6916359Sasami */ 7050518Snyan struct socket *so_head; /* back pointer to accept socket */ 7146049Skato TAILQ_HEAD(, socket) so_incomp; /* queue of partial unaccepted connections */ 7252829Snyan TAILQ_HEAD(, socket) so_comp; /* queue of complete unaccepted connections */ 7352829Snyan TAILQ_ENTRY(socket) so_list; /* list of unaccepted connections */ 7452829Snyan short so_qlen; /* number of unaccepted connections */ 7552829Snyan short so_incqlen; /* number of unaccepted incomplete 7616359Sasami connections */ 7750518Snyan short so_qlimit; /* max number queued connections */ 7846049Skato short so_timeo; /* connection timeout */ 7952829Snyan u_short so_error; /* error affecting connection */ 8052829Snyan struct sigio *so_sigio; /* information for async I/O or 8152829Snyan out of band data (SIGURG) */ 8252829Snyan u_long so_oobmark; /* chars to oob mark */ 8316359Sasami/* 8450518Snyan * Variables for socket buffering. 8544821Skato */ 8653120Snyan struct sockbuf { 8750518Snyan u_long sb_cc; /* actual chars in buffer */ 8816359Sasami u_long sb_hiwat; /* max actual char count */ 8950518Snyan u_long sb_mbcnt; /* chars of mbufs used */ 9053817Snyan u_long sb_mbmax; /* max chars of mbufs to use */ 9144084Skato long sb_lowat; /* low water mark */ 9253817Snyan struct mbuf *sb_mb; /* the mbuf chain */ 9350518Snyan struct selinfo sb_sel; /* process selecting read/write */ 9451222Skato short sb_flags; /* flags, see below */ 9550518Snyan short sb_timeo; /* timeout for read/write */ 9653817Snyan } so_rcv, so_snd; 9755086Skato#define SB_MAX (256*1024) /* default for max chars in sockbuf */ 9818846Sasami#define SB_LOCK 0x01 /* lock on data queue */ 9920128Sasami#define SB_WANT 0x02 /* someone is waiting to lock */ 10020128Sasami#define SB_WAIT 0x04 /* someone is waiting for data/space */ 10120128Sasami#define SB_SEL 0x08 /* someone is selecting */ 10220128Sasami#define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ 10320128Sasami#define SB_UPCALL 0x20 /* someone wants an upcall */ 10420128Sasami#define SB_NOINTR 0x40 /* operations not interruptible */ 10520128Sasami 10646049Skato void (*so_upcall) __P((struct socket *, void *, int)); 10720128Sasami void *so_upcallarg; 10846049Skato struct ucred *so_cred; /* user credentials */ 10920128Sasami /* NB: generation count must not be first; easiest to make it last. */ 11046049Skato so_gen_t so_gencnt; /* generation count */ 11120128Sasami void *so_emuldata; /* private data for emulators */ 11246049Skato}; 11320128Sasami 11446049Skato/* 11521272Skato * Socket state bits. 11646049Skato */ 11720128Sasami#define SS_NOFDREF 0x0001 /* no file table ref any more */ 11850518Snyan#define SS_ISCONNECTED 0x0002 /* socket connected to a peer */ 11950518Snyan#define SS_ISCONNECTING 0x0004 /* in process of connecting to peer */ 12050518Snyan#define SS_ISDISCONNECTING 0x0008 /* in process of disconnecting */ 12150518Snyan#define SS_CANTSENDMORE 0x0010 /* can't send more data to peer */ 12250518Snyan#define SS_CANTRCVMORE 0x0020 /* can't receive more data from peer */ 12350518Snyan#define SS_RCVATMARK 0x0040 /* at mark on input */ 12450518Snyan 12516359Sasami#define SS_NBIO 0x0100 /* non-blocking ops */ 12654030Snyan#define SS_ASYNC 0x0200 /* async i/o notify */ 12754030Snyan#define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */ 12854030Snyan 12954030Snyan#define SS_INCOMP 0x0800 /* unaccepted, incomplete connection */ 13042795Skato#define SS_COMP 0x1000 /* unaccepted, complete connection */ 13146049Skato#define SS_ISDISCONNECTED 0x2000 /* socket disconnected from peer */ 13253120Snyan 13316359Sasami/* 13442795Skato * Externalized form of struct socket used by the sysctl(3) interface. 13542795Skato */ 13645783Skatostruct xsocket { 13745783Skato size_t xso_len; /* length of this structure */ 13842795Skato struct socket *xso_so; /* makes a convenient handle sometimes */ 13953120Snyan short so_type; 14046049Skato short so_options; 14142795Skato short so_linger; 14250518Snyan short so_state; 14345783Skato caddr_t so_pcb; /* another convenient handle */ 14416359Sasami int xso_protocol; 14550518Snyan int xso_family; 14654030Snyan short so_qlen; 14724432Skato short so_incqlen; 14816359Sasami short so_qlimit; 14930768Skato short so_timeo; 15053120Snyan u_short so_error; 15153120Snyan pid_t so_pgid; 15216359Sasami u_long so_oobmark; 15350518Snyan struct xsockbuf { 15442730Skato u_long sb_cc; 15553120Snyan u_long sb_hiwat; 15653120Snyan u_long sb_mbcnt; 15742730Skato u_long sb_mbmax; 15846049Skato long sb_lowat; 15942730Skato short sb_flags; 16046049Skato short sb_timeo; 16142730Skato } so_rcv, so_snd; 16246049Skato uid_t so_uid; /* XXX */ 16346049Skato}; 16442730Skato 16546049Skato/* 16642730Skato * Macros for sockets and socket buffering. 16746049Skato */ 16846049Skato 16942730Skato/* 17046049Skato * Do we need to notify the other side when I/O is possible? 17146049Skato */ 17242730Skato#define sb_notify(sb) (((sb)->sb_flags & (SB_WAIT|SB_SEL|SB_ASYNC|SB_UPCALL)) != 0) 17346049Skato 17446049Skato/* 17542730Skato * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? 17646049Skato * This is problematical if the fields are unsigned, as the space might 17746049Skato * still be negative (cc > hiwat or mbcnt > mbmax). Should detect 17842730Skato * overflow and return 0. Should use "lmin" but it doesn't exist now. 17953120Snyan */ 18046049Skato#define sbspace(sb) \ 18116359Sasami ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ 18246049Skato (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) 18350518Snyan 18448006Skato/* do we have to send all at once on a socket? */ 18548551Snyan#define sosendallatonce(so) \ 18653120Snyan ((so)->so_proto->pr_flags & PR_ATOMIC) 18753120Snyan 18853120Snyan/* can we read something from so? */ 18953120Snyan#define soreadable(so) \ 19053120Snyan ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ 19148006Skato ((so)->so_state & SS_CANTRCVMORE) || \ 19248006Skato (so)->so_comp.tqh_first || (so)->so_error) 19348551Snyan 19416359Sasami/* can we write something to so? */ 19550513Skato#define sowriteable(so) \ 19650518Snyan ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 19749115Skato (((so)->so_state&SS_ISCONNECTED) || \ 19849115Skato ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ 19951222Skato ((so)->so_state & SS_CANTSENDMORE) || \ 20051222Skato (so)->so_error) 20151222Skato 20251222Skato/* adjust counters in sb reflecting allocation of m */ 20351222Skato#define sballoc(sb, m) { \ 20455326Snyan (sb)->sb_cc += (m)->m_len; \ 20549115Skato (sb)->sb_mbcnt += MSIZE; \ 20649115Skato if ((m)->m_flags & M_EXT) \ 20753056Snyan (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ 20850518Snyan} 20949115Skato 21051542Skato/* adjust counters in sb reflecting freeing of m */ 21149115Skato#define sbfree(sb, m) { \ 21249115Skato (sb)->sb_cc -= (m)->m_len; \ 21316359Sasami (sb)->sb_mbcnt -= MSIZE; \ 21453056Snyan if ((m)->m_flags & M_EXT) \ 21518095Sasami (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ 21618095Sasami} 21740071Skato 21840071Skato/* 21918095Sasami * Set lock on sockbuf sb; sleep if lock is already held. 22018095Sasami * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. 22118095Sasami * Returns error without lock if sleep is interrupted. 22218095Sasami */ 22318095Sasami#define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \ 22418095Sasami (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \ 22518095Sasami ((sb)->sb_flags |= SB_LOCK), 0) 22618846Sasami 22718846Sasami/* release lock on sockbuf sb */ 22853120Snyan#define sbunlock(sb) { \ 22953120Snyan (sb)->sb_flags &= ~SB_LOCK; \ 23053120Snyan if ((sb)->sb_flags & SB_WANT) { \ 23144267Skato (sb)->sb_flags &= ~SB_WANT; \ 23232519Skato wakeup((caddr_t)&(sb)->sb_flags); \ 23318095Sasami } \ 23444267Skato} 23544267Skato 23655107Skato#define sorwakeup(so) do { \ 23755107Skato if (sb_notify(&(so)->so_rcv)) \ 23855107Skato sowakeup((so), &(so)->so_rcv); \ 23955107Skato } while (0) 24055107Skato 24155107Skato#define sowwakeup(so) do { \ 24255107Skato if (sb_notify(&(so)->so_snd)) \ 24355107Skato sowakeup((so), &(so)->so_snd); \ 24455107Skato } while (0) 24555107Skato 24655107Skato#ifdef KERNEL 24755106Skato 24855326Snyan/* 24955326Snyan * Argument structure for sosetopt et seq. This is in the KERNEL 25055326Snyan * section because it will never be visible to user code. 25155326Snyan */ 25255326Snyanenum sopt_dir { SOPT_GET, SOPT_SET }; 25355326Snyanstruct sockopt { 25454877Skato enum sopt_dir sopt_dir; /* is this a get or a set? */ 25554877Skato int sopt_level; /* second arg of [gs]etsockopt */ 25655326Snyan int sopt_name; /* third arg of [gs]etsockopt */ 25755326Snyan void *sopt_val; /* fourth arg of [gs]etsockopt */ 25855086Skato size_t sopt_valsize; /* (almost) fifth arg of [gs]etsockopt */ 25954877Skato struct proc *sopt_p; /* calling process or null if kernel */ 26054877Skato}; 26154877Skato 26218095Sasamistruct sf_buf { 26316359Sasami SLIST_ENTRY(sf_buf) free_list; /* list of free buffer slots */ 26440593Sbde int refcnt; /* reference count */ 26518095Sasami struct vm_page *m; /* currently mapped page */ 26618095Sasami vm_offset_t kva; /* va of mapping */ 26718095Sasami}; 26853120Snyan 26940593Sbde#ifdef MALLOC_DECLARE 27053120SnyanMALLOC_DECLARE(M_PCB); 27116359SasamiMALLOC_DECLARE(M_SONAME); 27250518Snyan#endif 27350518Snyan 27450518Snyanextern int maxsockets; 27550518Snyanextern u_long sb_max; 27650518Snyanextern struct vm_zone *socket_zone; 27750804Skatoextern so_gen_t so_gencnt; 27850518Snyan 27953744Snyanstruct file; 28017256Sasamistruct filedesc; 28149519Skatostruct mbuf; 28249519Skatostruct sockaddr; 28349827Sphkstruct stat; 28450551Sphkstruct ucred; 28553120Snyanstruct uio; 28655326Snyan 28755326Snyan/* 28855326Snyan * File operations on sockets. 28955326Snyan */ 29055326Snyanint soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred, 29155326Snyan int flags, struct proc *p)); 29255326Snyanint soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred, 29355326Snyan int flags, struct proc *p)); 29455326Snyanint soo_close __P((struct file *fp, struct proc *p)); 29555326Snyanint soo_ioctl __P((struct file *fp, u_long cmd, caddr_t data, 29655326Snyan struct proc *p)); 29755326Snyanint soo_poll __P((struct file *fp, int events, struct ucred *cred, 298 struct proc *p)); 299int soo_stat __P((struct socket *so, struct stat *ub)); 300 301/* 302 * From uipc_socket and friends 303 */ 304struct sockaddr *dup_sockaddr __P((struct sockaddr *sa, int canwait)); 305int getsock __P((struct filedesc *fdp, int fdes, struct file **fpp)); 306int sockargs __P((struct mbuf **mp, caddr_t buf, int buflen, int type)); 307int getsockaddr __P((struct sockaddr **namp, caddr_t uaddr, size_t len)); 308void sbappend __P((struct sockbuf *sb, struct mbuf *m)); 309int sbappendaddr __P((struct sockbuf *sb, struct sockaddr *asa, 310 struct mbuf *m0, struct mbuf *control)); 311int sbappendcontrol __P((struct sockbuf *sb, struct mbuf *m0, 312 struct mbuf *control)); 313void sbappendrecord __P((struct sockbuf *sb, struct mbuf *m0)); 314void sbcheck __P((struct sockbuf *sb)); 315void sbcompress __P((struct sockbuf *sb, struct mbuf *m, struct mbuf *n)); 316struct mbuf * 317 sbcreatecontrol __P((caddr_t p, int size, int type, int level)); 318void sbdrop __P((struct sockbuf *sb, int len)); 319void sbdroprecord __P((struct sockbuf *sb)); 320void sbflush __P((struct sockbuf *sb)); 321void sbinsertoob __P((struct sockbuf *sb, struct mbuf *m0)); 322void sbrelease __P((struct sockbuf *sb, struct socket *so)); 323int sbreserve __P((struct sockbuf *sb, u_long cc, struct socket *so, 324 struct proc *p)); 325void sbtoxsockbuf __P((struct sockbuf *sb, struct xsockbuf *xsb)); 326int sbwait __P((struct sockbuf *sb)); 327int sb_lock __P((struct sockbuf *sb)); 328int soabort __P((struct socket *so)); 329int soaccept __P((struct socket *so, struct sockaddr **nam)); 330struct socket *soalloc __P((int waitok)); 331int sobind __P((struct socket *so, struct sockaddr *nam, struct proc *p)); 332void socantrcvmore __P((struct socket *so)); 333void socantsendmore __P((struct socket *so)); 334int soclose __P((struct socket *so)); 335int soconnect __P((struct socket *so, struct sockaddr *nam, struct proc *p)); 336int soconnect2 __P((struct socket *so1, struct socket *so2)); 337int socreate __P((int dom, struct socket **aso, int type, int proto, 338 struct proc *p)); 339void sodealloc __P((struct socket *so)); 340int sodisconnect __P((struct socket *so)); 341void sofree __P((struct socket *so)); 342int sogetopt __P((struct socket *so, struct sockopt *sopt)); 343void sohasoutofband __P((struct socket *so)); 344void soisconnected __P((struct socket *so)); 345void soisconnecting __P((struct socket *so)); 346void soisdisconnected __P((struct socket *so)); 347void soisdisconnecting __P((struct socket *so)); 348int solisten __P((struct socket *so, int backlog, struct proc *p)); 349struct socket * 350 sodropablereq __P((struct socket *head)); 351struct socket * 352 sonewconn __P((struct socket *head, int connstatus)); 353struct socket * 354 sonewconn3 __P((struct socket *head, int connstatus, struct proc *p)); 355int sooptcopyin __P((struct sockopt *sopt, void *buf, size_t len, 356 size_t minlen)); 357int sooptcopyout __P((struct sockopt *sopt, void *buf, size_t len)); 358int sopoll __P((struct socket *so, int events, struct ucred *cred, 359 struct proc *p)); 360int soreceive __P((struct socket *so, struct sockaddr **paddr, 361 struct uio *uio, struct mbuf **mp0, 362 struct mbuf **controlp, int *flagsp)); 363int soreserve __P((struct socket *so, u_long sndcc, u_long rcvcc)); 364void sorflush __P((struct socket *so)); 365int sosend __P((struct socket *so, struct sockaddr *addr, struct uio *uio, 366 struct mbuf *top, struct mbuf *control, int flags, 367 struct proc *p)); 368int sosetopt __P((struct socket *so, struct sockopt *sopt)); 369int soshutdown __P((struct socket *so, int how)); 370void sotoxsocket __P((struct socket *so, struct xsocket *xso)); 371void sowakeup __P((struct socket *so, struct sockbuf *sb)); 372 373#endif /* KERNEL */ 374 375#endif /* !_SYS_SOCKETVAR_H_ */ 376