xref: /dragonfly/sys/sys/protosw.h (revision 2eb060caf1c8847fb1043b658a9c8f044e83b5ab)
1 /*-
2  * Copyright (c) 1982, 1986, 1993
3  *        The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *        @(#)protosw.h       8.1 (Berkeley) 6/2/93
30  * $FreeBSD: src/sys/sys/protosw.h,v 1.28.2.2 2001/07/03 11:02:01 ume Exp $
31  */
32 
33 #ifndef _SYS_PROTOSW_H_
34 #define _SYS_PROTOSW_H_
35 
36 #ifndef _SYS_TYPES_H_
37 #include <sys/types.h>
38 #endif
39 
40 /* Forward declare these structures referenced from prototypes below. */
41 struct mbuf;
42 struct thread;
43 struct sockaddr;
44 struct socket;
45 struct sockopt;
46 
47 struct pr_output_info {
48           pid_t     p_pid;
49 };
50 
51 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
52 
53 /*
54  * netmsg_t union of possible netmsgs typically sent to protocol threads.
55  */
56 typedef union netmsg *netmsg_t;
57 
58 /*
59  * Protocol switch table.
60  *
61  * Each protocol has a handle initializing one of these structures,
62  * which is used for protocol-protocol and system-protocol communication.
63  *
64  * A protocol is called through the pr_init entry before any other.
65  * The system will call the pr_drain entry if it is low on space and this
66  * should throw away any non-critical data.
67  *
68  * Protocols pass data between themselves as chains of mbufs using
69  * the pr_input and pr_output hooks.  Pr_input passes data up (towards
70  * the users) and pr_output passes it down (towards the interfaces); control
71  * information passes up and down on pr_ctlinput and pr_ctloutput.
72  * The protocol is responsible for the space occupied by any the
73  * arguments to these entries and must dispose it.
74  *
75  * In retrospect, it would be a lot nicer to use an interface
76  * similar to the vnode VOP interface.
77  */
78 struct protosw {
79           short     pr_type;            /* socket type used for */
80           const struct domain *pr_domain; /* domain protocol a member of */
81           short     pr_protocol;                  /* protocol number */
82           short     pr_flags;           /* see below */
83 
84           struct lwkt_port *(*pr_initport)(void);
85                                                   /* initial msgport */
86 
87           /*
88            * Protocol hooks.  These are typically called directly within the
89            * context of a protocol thread based on the toeplitz hash.
90            *
91            * pr_input() is called using the port supplied by the toeplitz
92            *              hash via the netisr port function.
93            *
94            * pr_ctlinput() is called using the port supplied by pr_ctlport
95            *
96            * pr_ctloutput() and pr_output() are typically called
97            */
98           int       (*pr_input)(struct mbuf **, int *, int);
99                                                   /* input to protocol (from below) */
100           int       (*pr_output)(struct mbuf *, struct socket *, ...);
101                                                   /* output to protocol (from above) */
102           void      (*pr_ctlinput)(netmsg_t);
103                                                   /* control input (from below) */
104           struct netmsg_pr_ctloutput *(*pr_ctloutmsg)(struct sockopt *);
105                                                   /* allocate netmsg for ctloutput */
106           void      (*pr_ctloutput)(netmsg_t);
107                                                   /* control output (from above) */
108           struct lwkt_port *(*pr_ctlport)(int, struct sockaddr *, void *, int *);
109 
110           /*
111            * Utility hooks, not called with any particular context.
112            */
113           void      (*pr_init) (void);  /* initialization hook */
114           void      (*pr_drain) (void); /* flush any excess space possible */
115 
116           struct    pr_usrreqs *pr_usrreqs;       /* messaged requests to proto thread */
117 };
118 
119 #endif
120 
121 #define   PR_SLOWHZ 2                   /* 2 slow timeouts per second */
122 #define   PR_FASTHZ 5                   /* 5 fast timeouts per second */
123 
124 /*
125  * Values for pr_flags.
126  * PR_ADDR requires PR_ATOMIC;
127  * PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
128  * PR_IMPLOPCL means that the protocol allows sendto without prior connect,
129  *        and the protocol understands the MSG_EOF flag.  The first property is
130  *        is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed
131  *        anyhow).
132  */
133 #define   PR_ATOMIC 0x01                /* exchange atomic messages only */
134 #define   PR_ADDR             0x02                /* addresses given with messages */
135 #define   PR_CONNREQUIRED     0x04                /* connection required by protocol */
136 #define   PR_WANTRCVD         0x08                /* want PRU_RCVD calls */
137 #define   PR_RIGHTS 0x10                /* passes capabilities */
138 #define   PR_IMPLOPCL         0x20                /* implied open/close */
139 #define   PR_LASTHDR          0x40                /* enforce ipsec policy; last header */
140 #define   PR_UNUSED07         0x80                /* was: allow addresses during delivery (SCTP) */
141 #define PR_MPSAFE   0x0100              /* protocal is MPSAFE */
142 #define PR_SYNC_PORT          0x0200              /* synchronous port (no proto thrds) */
143 #define PR_ASYNC_SEND         0x0400              /* async pru_send */
144 #define PR_ASYNC_RCVD         0x0800              /* async pru_rcvd */
145 #define PR_ASEND_HOLDTD       0x1000              /* async pru_send hold orig thread */
146 #define PR_ACONN_HOLDTD       0x2000              /* async pru_connect hold orig thread */
147 
148 /*
149  * The arguments to usrreq are:
150  *        (*protosw[].pr_usrreq)(up, req, m, nam, opt);
151  * where up is a (struct socket *), req is one of these requests,
152  * m is a optional mbuf chain containing a message,
153  * nam is an optional mbuf chain containing an address,
154  * and opt is a pointer to a socketopt structure or nil.
155  * The protocol is responsible for disposal of the mbuf chain m,
156  * the caller is responsible for any space held by nam and opt.
157  * A non-zero return from usrreq gives an
158  * UNIX error number which should be passed to higher level software.
159  */
160 #define   PRU_ATTACH                    0         /* attach protocol to up */
161 #define   PRU_DETACH                    1         /* detach protocol from up */
162 #define   PRU_BIND            2         /* bind socket to address */
163 #define   PRU_LISTEN                    3         /* listen for connection */
164 #define   PRU_CONNECT                   4         /* establish connection to peer */
165 #define   PRU_ACCEPT                    5         /* accept connection from peer */
166 #define   PRU_DISCONNECT                6         /* disconnect from peer */
167 #define   PRU_SHUTDOWN                  7         /* won't send any more data */
168 #define   PRU_RCVD            8         /* have taken data; more room now */
169 #define   PRU_SEND            9         /* send this data */
170 #define   PRU_ABORT           10        /* abort (fast DISCONNECT, DETATCH) */
171 #define   PRU_CONTROL                   11        /* control operations on protocol */
172 #define   PRU_SENSE           12        /* return status into m */
173 #define   PRU_RCVOOB                    13        /* retrieve out of band data */
174 #define   PRU_SENDOOB                   14        /* send out of band data */
175 #define   PRU_SOCKADDR                  15        /* fetch socket's address */
176 #define   PRU_PEERADDR                  16        /* fetch peer's address */
177 #define   PRU_CONNECT2                  17        /* connect two sockets */
178 #define PRU_RESERVED1                   18        /* formerly PRU_SOPOLL */
179 /* begin for protocols internal use */
180 #define   PRU_FASTTIMO                  19        /* 200ms timeout */
181 #define   PRU_SLOWTIMO                  20        /* 500ms timeout */
182 #define   PRU_PROTORCV                  21        /* receive from below */
183 #define   PRU_PROTOSEND                 22        /* send to below */
184 /* end for protocol's internal use */
185 #define PRU_SEND_EOF                    23        /* send and close */
186 #define   PRU_PRED            24
187 #define PRU_CTLOUTPUT                   25        /* get/set opts */
188 #define PRU_NREQ              26
189 
190 #ifdef PRUREQUESTS
191 const char *prurequests[] = {
192           "ATTACH", "DETACH", "BIND",             "LISTEN",
193           "CONNECT",          "ACCEPT", "DISCONNECT",       "SHUTDOWN",
194           "RCVD",             "SEND",             "ABORT",  "CONTROL",
195           "SENSE",  "RCVOOB", "SENDOOB",          "SOCKADDR",
196           "PEERADDR",         "CONNECT2",         "",
197           "FASTTIMO",         "SLOWTIMO",         "PROTORCV",         "PROTOSEND",
198           "SEND_EOF",         "PREDICATE"
199 };
200 #endif
201 
202 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
203 
204 struct ifnet;
205 struct stat;
206 struct ucred;
207 struct uio;
208 struct sockbuf;
209 
210 struct pru_attach_info {
211           struct rlimit *sb_rlimit;
212           struct ucred *p_ucred;
213           struct vnode *fd_rdir;
214 };
215 
216 /*
217  * These are netmsg'd requests almost universally in the context of the
218  * appropriate protocol thread.  Exceptions:
219  *
220  *        pru_sosend() - called synchronously from user context, typically
221  *                         runs generic kernel code and then messages via
222  *                         pru_send().
223  *
224  *        pru_soreceive() - called synchronously from user context.  Typically
225  *                              runs generic kernel code and remains synchronous.
226  *
227  *        pru_preconnect() - called synchronously from user context.  Typically
228  *                         prepares for later asynchronous pru_connect, e.g.
229  *                         sets ISCONNECTING.  Non-NULL means asynchronous
230  *                         pru_connect is supported.
231  */
232 struct pr_usrreqs {
233           void      (*pru_abort) (netmsg_t msg);
234           void      (*pru_accept) (netmsg_t msg);
235           void      (*pru_attach) (netmsg_t msg);
236           void      (*pru_bind) (netmsg_t msg);
237           void      (*pru_connect) (netmsg_t msg);
238           void      (*pru_connect2) (netmsg_t msg);
239           void      (*pru_control) (netmsg_t msg);
240           /*
241            * If pru_detach() returns EJUSTRETURN, then protocol will
242            * call sodiscard() and sofree() for soclose().
243            */
244           void      (*pru_detach) (netmsg_t msg);
245           void      (*pru_disconnect) (netmsg_t msg);
246           void      (*pru_listen) (netmsg_t msg);
247           void      (*pru_peeraddr) (netmsg_t msg);
248           void      (*pru_rcvd) (netmsg_t msg);
249           void      (*pru_rcvoob) (netmsg_t msg);
250           void      (*pru_send) (netmsg_t msg);
251           void      (*pru_sense) (netmsg_t msg);
252           void      (*pru_shutdown) (netmsg_t msg);
253           void      (*pru_sockaddr) (netmsg_t msg);
254 
255           /*
256            * These are direct calls.  Note that sosend() will sometimes
257            * be converted into an implied connect (pru_connect) with the
258            * mbufs and flags forwarded in pru_connect's netmsg.  It is
259            * otherwise typically converted to a send (pru_send).
260            *
261            * soreceive() typically remains synchronous in the user's context.
262            *
263            * Any converted calls are netmsg's to the socket's protocol thread.
264            */
265           int       (*pru_sosend) (struct socket *so, struct sockaddr *addr,
266                                            struct uio *uio, struct mbuf *top,
267                                            struct mbuf *control, int flags,
268                                            struct thread *td);
269           int       (*pru_soreceive) (struct socket *so,
270                                               struct sockaddr **paddr,
271                                               struct uio *uio,
272                                               struct sockbuf *sio,
273                                               struct mbuf **controlp, int *flagsp);
274 
275           /*
276            * Synchronously called by protocol thread.  Typically save the
277            * foreign address into socket.so_faddr.
278            */
279           void      (*pru_savefaddr) (struct socket *so,
280                                               const struct sockaddr *addr);
281 
282           /* synchronously called by user thread. */
283           int       (*pru_preconnect) (struct socket *so,
284                                               const struct sockaddr *addr,
285                                               struct thread *td);
286           int       (*pru_preattach) (struct socket *so,
287                                               int, struct pru_attach_info *);
288 };
289 
290 typedef int (*pru_sosend_fn_t) (struct socket *so, struct sockaddr *addr,
291                                                   struct uio *uio, struct mbuf *top,
292                                                   struct mbuf *control, int flags,
293                                                   struct thread *td);
294 typedef int (*pru_soreceive_fn_t) (struct socket *so, struct sockaddr **paddr,
295                                                   struct uio *uio,
296                                                   struct sockbuf *sio,
297                                                   struct mbuf **controlp,
298                                                   int *flagsp);
299 
300 void      pr_generic_notsupp(netmsg_t msg);
301 void      pru_sense_null(netmsg_t msg);
302 
303 int       pru_sosend_notsupp(struct socket *so, struct sockaddr *addr,
304                                         struct uio *uio, struct mbuf *top,
305                                         struct mbuf *control, int flags,
306                                         struct thread *td);
307 int       pru_soreceive_notsupp(struct socket *so,
308                                         struct sockaddr **paddr,
309                                         struct uio *uio,
310                                         struct sockbuf *sio,
311                                         struct mbuf **controlp, int *flagsp);
312 
313 struct lwkt_port *cpu0_soport(struct socket *, struct sockaddr *,
314                                     struct mbuf **);
315 struct lwkt_port *cpu0_ctlport(int, struct sockaddr *, void *, int *);
316 
317 #endif /* _KERNEL || _KERNEL_STRUCTURES */
318 
319 /*
320  * The arguments to the ctlinput routine are
321  *        (*protosw[].pr_ctlinput)(cmd, sa, arg);
322  * where cmd is one of the commands below, sa is a pointer to a sockaddr,
323  * and arg is a `void *' argument used within a protocol family.
324  */
325 #define   PRC_IFDOWN                    0         /* interface transition */
326 #define   PRC_ROUTEDEAD                 1         /* select new route if possible ??? */
327 #define   PRC_IFUP            2         /* interface has come back up */
328 #define   PRC_QUENCH2                   3         /* DEC congestion bit says slow down */
329 #define   PRC_QUENCH                    4         /* some one said to slow down */
330 #define   PRC_MSGSIZE                   5         /* message size forced drop */
331 #define   PRC_HOSTDEAD                  6         /* host appears to be down */
332 #define   PRC_HOSTUNREACH               7         /* deprecated (use PRC_UNREACH_HOST) */
333 #define   PRC_UNREACH_NET               8         /* no route to network */
334 #define   PRC_UNREACH_HOST    9         /* no route to host */
335 #define   PRC_UNREACH_PROTOCOL          10        /* dst says bad protocol */
336 #define   PRC_UNREACH_PORT    11        /* bad port # */
337 /* was    PRC_UNREACH_NEEDFRAG          12           (use PRC_MSGSIZE) */
338 #define   PRC_UNREACH_SRCFAIL 13        /* source route failed */
339 #define   PRC_REDIRECT_NET    14        /* net routing redirect */
340 #define   PRC_REDIRECT_HOST   15        /* host routing redirect */
341 #define   PRC_REDIRECT_TOSNET 16        /* redirect for type of service & net */
342 #define   PRC_REDIRECT_TOSHOST          17        /* redirect for tos & host */
343 #define   PRC_TIMXCEED_INTRANS          18        /* packet lifetime expired in transit */
344 #define   PRC_TIMXCEED_REASS  19        /* lifetime expired on reass q */
345 #define   PRC_PARAMPROB                 20        /* header incorrect */
346 #define   PRC_UNREACH_ADMIN_PROHIB      21        /* packet administrativly prohibited */
347 
348 #define   PRC_NCMDS           22
349 
350 #define   PRC_IS_REDIRECT(cmd)          \
351           ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST)
352 
353 #ifdef PRCREQUESTS
354 const char *prcrequests[] = {
355           "IFDOWN", "ROUTEDEAD", "IFUP", "DEC-BIT-QUENCH2",
356           "QUENCH", "MSGSIZE", "HOSTDEAD", "#7",
357           "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH",
358           "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT",
359           "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS",
360           "PARAMPROB", "ADMIN-UNREACH"
361 };
362 #endif
363 
364 /*
365  * The arguments to ctloutput are:
366  *        (*protosw[].pr_ctloutput)(req, so, level, optname, optval, p);
367  * req is one of the actions listed below, so is a (struct socket *),
368  * level is an indication of which protocol layer the option is intended.
369  * optname is a protocol dependent socket option request,
370  * optval is a pointer to a mbuf-chain pointer, for value-return results.
371  * The protocol is responsible for disposal of the mbuf chain *optval
372  * if supplied,
373  * the caller is responsible for any space held by *optval, when returned.
374  * A non-zero return from usrreq gives an
375  * UNIX error number which should be passed to higher level software.
376  */
377 #define   PRCO_GETOPT         0
378 #define   PRCO_SETOPT         1
379 
380 #define   PRCO_NCMDS          2
381 
382 #ifdef PRCOREQUESTS
383 const char *prcorequests[] = {
384           "GETOPT", "SETOPT",
385 };
386 #endif
387 
388 /*
389  * Kernel prototypes
390  */
391 #ifdef _KERNEL
392 
393 void      kpfctlinput (int, struct sockaddr *);
394 void      kpfctlinput_direct (int, struct sockaddr *);
395 void      kpfctlinput2 (int, struct sockaddr *, void *);
396 struct protosw *pffindproto (int family, int protocol, int type);
397 struct protosw *pffindtype (int family, int type);
398 
399 #define PR_GET_MPLOCK(_pr) \
400 do { \
401           if (((_pr)->pr_flags & PR_MPSAFE) == 0) \
402                     get_mplock(); \
403 } while (0)
404 
405 #define PR_REL_MPLOCK(_pr) \
406 do { \
407           if (((_pr)->pr_flags & PR_MPSAFE) == 0) \
408                     rel_mplock(); \
409 } while (0)
410 
411 #endif    /* _KERNEL */
412 
413 #endif    /* _SYS_PROTOSW_H_ */
414