xref: /freebsd-14-stable/sys/sys/protosw.h (revision da44138dc2adefb698bd34c9cff73e1a5588ef26)
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/_types.h>
38 #include <sys/queue.h>
39 
40 /* Forward declare these structures referenced from prototypes below. */
41 struct kaiocb;
42 struct mbuf;
43 struct thread;
44 struct sockaddr;
45 struct socket;
46 struct sockopt;
47 
48 /*#ifdef _KERNEL*/
49 /*
50  * Protocol switch table.
51  *
52  * Each protocol has a handle initializing one of these structures,
53  * which is used for protocol-protocol and system-protocol communication.
54  *
55  * In retrospect, it would be a lot nicer to use an interface
56  * similar to the vnode VOP interface.
57  */
58 struct ifnet;
59 struct stat;
60 struct ucred;
61 struct uio;
62 
63 /* USE THESE FOR YOUR PROTOTYPES ! */
64 typedef int	pr_ctloutput_t(struct socket *, struct sockopt *);
65 typedef int	pr_setsbopt_t(struct socket *, struct sockopt *);
66 typedef void	pr_abort_t(struct socket *);
67 typedef int	pr_accept_t(struct socket *, struct sockaddr **);
68 typedef int	pr_attach_t(struct socket *, int, struct thread *);
69 typedef int	pr_bind_t(struct socket *, struct sockaddr *, struct thread *);
70 typedef int	pr_connect_t(struct socket *, struct sockaddr *,
71 		    struct thread *);
72 typedef int	pr_connect2_t(struct socket *, struct socket *);
73 typedef int	pr_control_t(struct socket *, unsigned long, void *,
74 		    struct ifnet *, struct thread *);
75 typedef void	pr_detach_t(struct socket *);
76 typedef int	pr_disconnect_t(struct socket *);
77 typedef int	pr_listen_t(struct socket *, int, struct thread *);
78 typedef int	pr_peeraddr_t(struct socket *, struct sockaddr **);
79 typedef int	pr_rcvd_t(struct socket *, int);
80 typedef int	pr_rcvoob_t(struct socket *, struct mbuf *, int);
81 typedef enum {
82 	PRUS_OOB =		0x1,
83 	PRUS_EOF =		0x2,
84 	PRUS_MORETOCOME =	0x4,
85 	PRUS_NOTREADY =		0x8,
86 	PRUS_IPV6 =		0x10,
87 } pr_send_flags_t;
88 typedef int	pr_send_t(struct socket *, int, struct mbuf *,
89 		    struct sockaddr *, struct mbuf *, struct thread *);
90 typedef int	pr_ready_t(struct socket *, struct mbuf *, int);
91 typedef int	pr_sense_t(struct socket *, struct stat *);
92 typedef int	pr_shutdown_t(struct socket *);
93 typedef int	pr_flush_t(struct socket *, int);
94 typedef int	pr_sockaddr_t(struct socket *, struct sockaddr **);
95 typedef int	pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
96 		    struct mbuf *, struct mbuf *, int, struct thread *);
97 typedef int	pr_soreceive_t(struct socket *, struct sockaddr **,
98 		    struct uio *, struct mbuf **, struct mbuf **, int *);
99 typedef int	pr_sopoll_t(struct socket *, int, struct ucred *,
100 		    struct thread *);
101 typedef void	pr_sosetlabel_t(struct socket *);
102 typedef void	pr_close_t(struct socket *);
103 typedef int	pr_bindat_t(int, struct socket *, struct sockaddr *,
104 		    struct thread *);
105 typedef int	pr_connectat_t(int, struct socket *, struct sockaddr *,
106 		    struct thread *);
107 typedef int	pr_aio_queue_t(struct socket *, struct kaiocb *);
108 typedef int	pr_chmod_t(struct socket *, __mode_t, struct ucred *,
109 		    struct thread *);
110 
111 struct protosw {
112 	short	pr_type;		/* socket type used for */
113 	short	pr_protocol;		/* protocol number */
114 	short	pr_flags;		/* see below */
115 	short	pr_unused;
116 	struct	domain	*pr_domain;	/* domain protocol a member of */
117 
118 	pr_soreceive_t	*pr_soreceive;	/* recv(2) */
119 	pr_rcvd_t	*pr_rcvd;	/* soreceive_generic() if PR_WANTRCVD */
120 	pr_sosend_t	*pr_sosend;	/* send(2) */
121 	pr_send_t	*pr_send;	/* send(2) via sosend_generic() */
122 	pr_ready_t	*pr_ready;	/* sendfile/ktls readyness */
123 	pr_sopoll_t	*pr_sopoll;	/* poll(2) */
124 /* Cache line #2 */
125 	pr_attach_t	*pr_attach;	/* creation: socreate(), sonewconn() */
126 	pr_detach_t	*pr_detach;	/* destruction: sofree() */
127 	pr_connect_t	*pr_connect;	/* connect(2) */
128 	pr_disconnect_t	*pr_disconnect;	/* sodisconnect() */
129 	pr_close_t	*pr_close;	/* close(2) */
130 	pr_shutdown_t	*pr_shutdown;	/* shutdown(2) */
131 	pr_abort_t	*pr_abort;	/* abrupt tear down: soabort() */
132 	pr_aio_queue_t	*pr_aio_queue;	/* aio(9) */
133 /* Cache line #3 */
134 	pr_bind_t	*pr_bind;	/* bind(2) */
135 	pr_bindat_t	*pr_bindat;	/* bindat(2) */
136 	pr_listen_t	*pr_listen;	/* listen(2) */
137 	pr_accept_t	*pr_accept;	/* accept(2) */
138 	pr_connectat_t	*pr_connectat;	/* connectat(2) */
139 	pr_connect2_t	*pr_connect2;	/* socketpair(2) */
140 	pr_control_t	*pr_control;	/* ioctl(2) */
141 	pr_rcvoob_t	*pr_rcvoob;	/* soreceive_rcvoob() */
142 /* Cache line #4 */
143 	pr_ctloutput_t	*pr_ctloutput;	/* control output (from above) */
144 	pr_peeraddr_t	*pr_peeraddr;	/* getpeername(2) */
145 	pr_sockaddr_t	*pr_sockaddr;	/* getsockname(2) */
146 	pr_sense_t	*pr_sense;	/* stat(2) */
147 	pr_flush_t	*pr_flush;	/* XXXGL: merge with pr_shutdown_t! */
148 	pr_sosetlabel_t	*pr_sosetlabel;	/* MAC, XXXGL: remove */
149 	pr_setsbopt_t	*pr_setsbopt;	/* Socket buffer ioctls */
150 	pr_chmod_t	*pr_chmod;	/* fchmod(2) */
151 };
152 /*#endif*/
153 
154 /*
155  * Values for pr_flags.
156  * PR_ADDR requires PR_ATOMIC;
157  * PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
158  * PR_IMPLOPCL means that the protocol allows sendto without prior connect,
159  *	and the protocol understands the MSG_EOF flag.  The first property is
160  *	is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed
161  *	anyhow).
162  * PR_SOCKBUF requires protocol to initialize and destroy its socket buffers
163  * in its pr_attach and pr_detach.
164  */
165 #define	PR_ATOMIC	0x01		/* exchange atomic messages only */
166 #define	PR_ADDR		0x02		/* addresses given with messages */
167 #define	PR_CONNREQUIRED	0x04		/* connection required by protocol */
168 #define	PR_WANTRCVD	0x08		/* want PRU_RCVD calls */
169 #define	PR_RIGHTS	0x10		/* passes capabilities */
170 #define PR_IMPLOPCL	0x20		/* implied open/close */
171 /* was	PR_LASTHDR	0x40		   enforce ipsec policy; last header */
172 #define	PR_CAPATTACH	0x80		/* socket can attach in cap mode */
173 #define	PR_SOCKBUF	0x100		/* private implementation of buffers */
174 
175 /*
176  * The arguments to ctloutput are:
177  *	(*protosw[].pr_ctloutput)(req, so, level, optname, optval, p);
178  * req is one of the actions listed below, so is a (struct socket *),
179  * level is an indication of which protocol layer the option is intended.
180  * optname is a protocol dependent socket option request,
181  * optval is a pointer to a mbuf-chain pointer, for value-return results.
182  * The protocol is responsible for disposal of the mbuf chain *optval
183  * if supplied,
184  * the caller is responsible for any space held by *optval, when returned.
185  * A non-zero return from ctloutput gives an
186  * UNIX error number which should be passed to higher level software.
187  */
188 #define	PRCO_GETOPT	0
189 #define	PRCO_SETOPT	1
190 
191 #define	PRCO_NCMDS	2
192 
193 #ifdef PRCOREQUESTS
194 char	*prcorequests[] = {
195 	"GETOPT", "SETOPT",
196 };
197 #endif
198 
199 #ifdef _KERNEL
200 struct domain *pffinddomain(int family);
201 struct protosw *pffindproto(int family, int type, int proto);
202 int protosw_register(struct domain *, struct protosw *);
203 int protosw_unregister(struct protosw *);
204 
205 /* Domains that are known to be avaliable for protosw_register(). */
206 extern struct domain inetdomain;
207 extern struct domain inet6domain;
208 #endif
209 
210 #endif
211