master
  1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 1982, 1986, 1993
  5 *	The Regents of the University of California.  All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 * 3. Neither the name of the University nor the names of its contributors
 16 *    may be used to endorse or promote products derived from this software
 17 *    without specific prior written permission.
 18 *
 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 29 * SUCH DAMAGE.
 30 *
 31 *	@(#)protosw.h	8.1 (Berkeley) 6/2/93
 32 */
 33
 34#ifndef _SYS_PROTOSW_H_
 35#define _SYS_PROTOSW_H_
 36
 37#include <sys/queue.h>
 38
 39/* Forward declare these structures referenced from prototypes below. */
 40struct kaiocb;
 41struct mbuf;
 42struct thread;
 43struct sockaddr;
 44struct socket;
 45struct sockopt;
 46
 47/*#ifdef _KERNEL*/
 48/*
 49 * Protocol switch table.
 50 *
 51 * Each protocol has a handle initializing one of these structures,
 52 * which is used for protocol-protocol and system-protocol communication.
 53 *
 54 * In retrospect, it would be a lot nicer to use an interface
 55 * similar to the vnode VOP interface.
 56 */
 57struct ifnet;
 58struct stat;
 59struct ucred;
 60struct uio;
 61
 62/* USE THESE FOR YOUR PROTOTYPES ! */
 63typedef int	pr_ctloutput_t(struct socket *, struct sockopt *);
 64typedef int	pr_setsbopt_t(struct socket *, struct sockopt *);
 65typedef void	pr_abort_t(struct socket *);
 66typedef int	pr_accept_t(struct socket *, struct sockaddr **);
 67typedef int	pr_attach_t(struct socket *, int, struct thread *);
 68typedef int	pr_bind_t(struct socket *, struct sockaddr *, struct thread *);
 69typedef int	pr_connect_t(struct socket *, struct sockaddr *,
 70		    struct thread *);
 71typedef int	pr_connect2_t(struct socket *, struct socket *);
 72typedef int	pr_control_t(struct socket *, unsigned long, void *,
 73		    struct ifnet *, struct thread *);
 74typedef void	pr_detach_t(struct socket *);
 75typedef int	pr_disconnect_t(struct socket *);
 76typedef int	pr_listen_t(struct socket *, int, struct thread *);
 77typedef int	pr_peeraddr_t(struct socket *, struct sockaddr **);
 78typedef int	pr_rcvd_t(struct socket *, int);
 79typedef int	pr_rcvoob_t(struct socket *, struct mbuf *, int);
 80typedef enum {
 81	PRUS_OOB =		0x1,
 82	PRUS_EOF =		0x2,
 83	PRUS_MORETOCOME =	0x4,
 84	PRUS_NOTREADY =		0x8,
 85	PRUS_IPV6 =		0x10,
 86} pr_send_flags_t;
 87typedef int	pr_send_t(struct socket *, int, struct mbuf *,
 88		    struct sockaddr *, struct mbuf *, struct thread *);
 89typedef int	pr_ready_t(struct socket *, struct mbuf *, int);
 90typedef int	pr_sense_t(struct socket *, struct stat *);
 91typedef int	pr_shutdown_t(struct socket *);
 92typedef int	pr_flush_t(struct socket *, int);
 93typedef int	pr_sockaddr_t(struct socket *, struct sockaddr **);
 94typedef int	pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
 95		    struct mbuf *, struct mbuf *, int, struct thread *);
 96typedef int	pr_soreceive_t(struct socket *, struct sockaddr **,
 97		    struct uio *, struct mbuf **, struct mbuf **, int *);
 98typedef int	pr_sopoll_t(struct socket *, int, struct ucred *,
 99		    struct thread *);
100typedef void	pr_sosetlabel_t(struct socket *);
101typedef void	pr_close_t(struct socket *);
102typedef int	pr_bindat_t(int, struct socket *, struct sockaddr *,
103		    struct thread *);
104typedef int	pr_connectat_t(int, struct socket *, struct sockaddr *,
105		    struct thread *);
106typedef int	pr_aio_queue_t(struct socket *, struct kaiocb *);
107
108struct protosw {
109	short	pr_type;		/* socket type used for */
110	short	pr_protocol;		/* protocol number */
111	short	pr_flags;		/* see below */
112	short	pr_unused;
113	struct	domain	*pr_domain;	/* domain protocol a member of */
114
115	pr_soreceive_t	*pr_soreceive;	/* recv(2) */
116	pr_rcvd_t	*pr_rcvd;	/* soreceive_generic() if PR_WANTRCVD */
117	pr_sosend_t	*pr_sosend;	/* send(2) */
118	pr_send_t	*pr_send;	/* send(2) via sosend_generic() */
119	pr_ready_t	*pr_ready;	/* sendfile/ktls readyness */
120	pr_sopoll_t	*pr_sopoll;	/* poll(2) */
121/* Cache line #2 */
122	pr_attach_t	*pr_attach;	/* creation: socreate(), sonewconn() */
123	pr_detach_t	*pr_detach;	/* destruction: sofree() */
124	pr_connect_t	*pr_connect;	/* connect(2) */
125	pr_disconnect_t	*pr_disconnect;	/* sodisconnect() */
126	pr_close_t	*pr_close;	/* close(2) */
127	pr_shutdown_t	*pr_shutdown;	/* shutdown(2) */
128	pr_abort_t	*pr_abort;	/* abrupt tear down: soabort() */
129	pr_aio_queue_t	*pr_aio_queue;	/* aio(9) */
130/* Cache line #3 */
131	pr_bind_t	*pr_bind;	/* bind(2) */
132	pr_bindat_t	*pr_bindat;	/* bindat(2) */
133	pr_listen_t	*pr_listen;	/* listen(2) */
134	pr_accept_t	*pr_accept;	/* accept(2) */
135	pr_connectat_t	*pr_connectat;	/* connectat(2) */
136	pr_connect2_t	*pr_connect2;	/* socketpair(2) */
137	pr_control_t	*pr_control;	/* ioctl(2) */
138	pr_rcvoob_t	*pr_rcvoob;	/* soreceive_rcvoob() */
139/* Cache line #4 */
140	pr_ctloutput_t	*pr_ctloutput;	/* control output (from above) */
141	pr_peeraddr_t	*pr_peeraddr;	/* getpeername(2) */
142	pr_sockaddr_t	*pr_sockaddr;	/* getsockname(2) */
143	pr_sense_t	*pr_sense;	/* stat(2) */
144	pr_flush_t	*pr_flush;	/* XXXGL: merge with pr_shutdown_t! */
145	pr_sosetlabel_t	*pr_sosetlabel;	/* MAC, XXXGL: remove */
146	pr_setsbopt_t	*pr_setsbopt;	/* Socket buffer ioctls */
147};
148/*#endif*/
149
150/*
151 * Values for pr_flags.
152 * PR_ADDR requires PR_ATOMIC;
153 * PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
154 * PR_IMPLOPCL means that the protocol allows sendto without prior connect,
155 *	and the protocol understands the MSG_EOF flag.  The first property is
156 *	is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed
157 *	anyhow).
158 * PR_SOCKBUF requires protocol to initialize and destroy its socket buffers
159 * in its pr_attach and pr_detach.
160 */
161#define	PR_ATOMIC	0x01		/* exchange atomic messages only */
162#define	PR_ADDR		0x02		/* addresses given with messages */
163#define	PR_CONNREQUIRED	0x04		/* connection required by protocol */
164#define	PR_WANTRCVD	0x08		/* want PRU_RCVD calls */
165#define	PR_RIGHTS	0x10		/* passes capabilities */
166#define PR_IMPLOPCL	0x20		/* implied open/close */
167/* was	PR_LASTHDR	0x40		   enforce ipsec policy; last header */
168#define	PR_CAPATTACH	0x80		/* socket can attach in cap mode */
169#define	PR_SOCKBUF	0x100		/* private implementation of buffers */
170
171/*
172 * The arguments to ctloutput are:
173 *	(*protosw[].pr_ctloutput)(req, so, level, optname, optval, p);
174 * req is one of the actions listed below, so is a (struct socket *),
175 * level is an indication of which protocol layer the option is intended.
176 * optname is a protocol dependent socket option request,
177 * optval is a pointer to a mbuf-chain pointer, for value-return results.
178 * The protocol is responsible for disposal of the mbuf chain *optval
179 * if supplied,
180 * the caller is responsible for any space held by *optval, when returned.
181 * A non-zero return from ctloutput gives an
182 * UNIX error number which should be passed to higher level software.
183 */
184#define	PRCO_GETOPT	0
185#define	PRCO_SETOPT	1
186
187#define	PRCO_NCMDS	2
188
189#ifdef PRCOREQUESTS
190char	*prcorequests[] = {
191	"GETOPT", "SETOPT",
192};
193#endif
194
195#ifdef _KERNEL
196struct domain *pffinddomain(int family);
197struct protosw *pffindproto(int family, int type, int proto);
198int protosw_register(struct domain *, struct protosw *);
199int protosw_unregister(struct protosw *);
200
201/* Domains that are known to be avaliable for protosw_register(). */
202extern struct domain inetdomain;
203extern struct domain inet6domain;
204#endif
205
206#endif