source: rtems/c/src/lib/libnetworking/sys/protosw.h @ 39e6e65a

4.104.114.84.95
Last change on this file since 39e6e65a was 39e6e65a, checked in by Joel Sherrill <joel.sherrill@…>, on 08/19/98 at 21:32:28

Base files

  • Property mode set to 100644
File size: 11.9 KB
Line 
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. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 *      @(#)protosw.h   8.1 (Berkeley) 6/2/93
34 * $Id$
35 */
36
37#ifndef _SYS_PROTOSW_H_
38#define _SYS_PROTOSW_H_
39
40struct ifnet;
41struct mbuf;
42struct sockaddr;
43struct socket;
44struct sockproto;
45struct stat;
46
47/*
48 * Protocol switch table.
49 *
50 * Each protocol has a handle initializing one of these structures,
51 * which is used for protocol-protocol and system-protocol communication.
52 *
53 * A protocol is called through the pr_init entry before any other.
54 * Thereafter it is called every 200ms through the pr_fasttimo entry and
55 * every 500ms through the pr_slowtimo for timer based actions.
56 * The system will call the pr_drain entry if it is low on space and
57 * this should throw away any non-critical data.
58 *
59 * Protocols pass data between themselves as chains of mbufs using
60 * the pr_input and pr_output hooks.  Pr_input passes data up (towards
61 * UNIX) and pr_output passes it down (towards the imps); control
62 * information passes up and down on pr_ctlinput and pr_ctloutput.
63 * The protocol is responsible for the space occupied by any the
64 * arguments to these entries and must dispose it.
65 *
66 * The userreq routine interfaces protocols to the system and is
67 * described below.
68 */
69struct protosw {
70        short   pr_type;                /* socket type used for */
71        struct  domain *pr_domain;      /* domain protocol a member of */
72        short   pr_protocol;            /* protocol number */
73        short   pr_flags;               /* see below */
74/* protocol-protocol hooks */
75        void    (*pr_input) __P((struct mbuf *, int len));
76                                        /* input to protocol (from below) */
77        int     (*pr_output)    __P((struct mbuf *m, struct socket *so));
78                                        /* output to protocol (from above) */
79        void    (*pr_ctlinput)__P((int, struct sockaddr *, void *));
80                                        /* control input (from below) */
81        int     (*pr_ctloutput)__P((int, struct socket *, int, int,
82                                    struct mbuf **));
83                                        /* control output (from above) */
84/* user-protocol hook */
85        int     (*pr_ousrreq) __P((struct socket *, int, struct mbuf *,
86                                   struct mbuf *, struct mbuf *));
87                                        /* user request: see list below */
88/* utility hooks */
89        void    (*pr_init) __P((void)); /* initialization hook */
90        void    (*pr_fasttimo) __P((void));
91                                        /* fast timeout (200ms) */
92        void    (*pr_slowtimo) __P((void));
93                                        /* slow timeout (500ms) */
94        void    (*pr_drain) __P((void));
95                                        /* flush any excess space possible */
96        struct  pr_usrreqs *pr_usrreqs; /* supersedes pr_usrreq() */
97};
98
99#define PR_SLOWHZ       2               /* 2 slow timeouts per second */
100#define PR_FASTHZ       5               /* 5 fast timeouts per second */
101
102/*
103 * Values for pr_flags.
104 * PR_ADDR requires PR_ATOMIC;
105 * PR_ADDR and PR_CONNREQUIRED are mutually exclusive.
106 * PR_IMPLOPCL means that the protocol allows sendto without prior connect,
107 *      and the protocol understands the MSG_EOF flag.  The first property is
108 *      is only relevant if PR_CONNREQUIRED is set (otherwise sendto is allowed
109 *      anyhow).
110 */
111#define PR_ATOMIC       0x01            /* exchange atomic messages only */
112#define PR_ADDR         0x02            /* addresses given with messages */
113#define PR_CONNREQUIRED 0x04            /* connection required by protocol */
114#define PR_WANTRCVD     0x08            /* want PRU_RCVD calls */
115#define PR_RIGHTS       0x10            /* passes capabilities */
116#define PR_IMPLOPCL     0x20            /* implied open/close */
117
118/*
119 * The arguments to usrreq are:
120 *      (*protosw[].pr_usrreq)(up, req, m, nam, opt);
121 * where up is a (struct socket *), req is one of these requests,
122 * m is a optional mbuf chain containing a message,
123 * nam is an optional mbuf chain containing an address,
124 * and opt is a pointer to a socketopt structure or nil.
125 * The protocol is responsible for disposal of the mbuf chain m,
126 * the caller is responsible for any space held by nam and opt.
127 * A non-zero return from usrreq gives an
128 * UNIX error number which should be passed to higher level software.
129 */
130#define PRU_ATTACH              0       /* attach protocol to up */
131#define PRU_DETACH              1       /* detach protocol from up */
132#define PRU_BIND                2       /* bind socket to address */
133#define PRU_LISTEN              3       /* listen for connection */
134#define PRU_CONNECT             4       /* establish connection to peer */
135#define PRU_ACCEPT              5       /* accept connection from peer */
136#define PRU_DISCONNECT          6       /* disconnect from peer */
137#define PRU_SHUTDOWN            7       /* won't send any more data */
138#define PRU_RCVD                8       /* have taken data; more room now */
139#define PRU_SEND                9       /* send this data */
140#define PRU_ABORT               10      /* abort (fast DISCONNECT, DETATCH) */
141#define PRU_CONTROL             11      /* control operations on protocol */
142#define PRU_SENSE               12      /* return status into m */
143#define PRU_RCVOOB              13      /* retrieve out of band data */
144#define PRU_SENDOOB             14      /* send out of band data */
145#define PRU_SOCKADDR            15      /* fetch socket's address */
146#define PRU_PEERADDR            16      /* fetch peer's address */
147#define PRU_CONNECT2            17      /* connect two sockets */
148/* begin for protocols internal use */
149#define PRU_FASTTIMO            18      /* 200ms timeout */
150#define PRU_SLOWTIMO            19      /* 500ms timeout */
151#define PRU_PROTORCV            20      /* receive from below */
152#define PRU_PROTOSEND           21      /* send to below */
153/* end for protocol's internal use */
154#define PRU_SEND_EOF            22      /* send and close */
155#define PRU_NREQ                22
156
157#ifdef PRUREQUESTS
158char *prurequests[] = {
159        "ATTACH",       "DETACH",       "BIND",         "LISTEN",
160        "CONNECT",      "ACCEPT",       "DISCONNECT",   "SHUTDOWN",
161        "RCVD",         "SEND",         "ABORT",        "CONTROL",
162        "SENSE",        "RCVOOB",       "SENDOOB",      "SOCKADDR",
163        "PEERADDR",     "CONNECT2",     "FASTTIMO",     "SLOWTIMO",
164        "PROTORCV",     "PROTOSEND",
165        "SEND_EOF",
166};
167#endif
168
169#ifdef  KERNEL                  /* users shouldn't see this decl */
170struct stat;
171struct ifnet;
172
173/*
174 * If the ordering here looks odd, that's because it's alphabetical.
175 */
176struct pr_usrreqs {
177        int     (*pru_abort) __P((struct socket *so));
178        int     (*pru_accept) __P((struct socket *so, struct mbuf *nam));
179        int     (*pru_attach) __P((struct socket *so, int proto));
180        int     (*pru_bind) __P((struct socket *so, struct mbuf *nam));
181        int     (*pru_connect) __P((struct socket *so, struct mbuf *nam));
182        int     (*pru_connect2) __P((struct socket *so1, struct socket *so2));
183        int     (*pru_control) __P((struct socket *so, int cmd, caddr_t data,
184                                    struct ifnet *ifp));
185        int     (*pru_detach) __P((struct socket *so));
186        int     (*pru_disconnect) __P((struct socket *so));
187        int     (*pru_listen) __P((struct socket *so));
188        int     (*pru_peeraddr) __P((struct socket *so, struct mbuf *nam));
189        int     (*pru_rcvd) __P((struct socket *so, int flags));
190        int     (*pru_rcvoob) __P((struct socket *so, struct mbuf *m,
191                                   int flags));
192        /*
193         * The `m' parameter here is almost certainly going to become a
194         * `struct uio' at some point in the future.  Similar changes
195         * will probably happen for the receive entry points.
196         */
197        int     (*pru_send) __P((struct socket *so, int flags, struct mbuf *m,
198                              struct mbuf *addr, struct mbuf *control));
199#define PRUS_OOB        0x1
200#define PRUS_EOF        0x2
201        int     (*pru_sense) __P((struct socket *so, struct stat *sb));
202        int     (*pru_shutdown) __P((struct socket *so));
203        int     (*pru_sockaddr) __P((struct socket *so, struct mbuf *nam));
204};
205
206int     pru_accept_notsupp __P((struct socket *so, struct mbuf *nam));
207int     pru_connect2_notsupp __P((struct socket *so1, struct socket *so2));
208int     pru_control_notsupp __P((struct socket *so, int cmd, caddr_t data,
209                                 struct ifnet *ifp));
210int     pru_listen_notsupp __P((struct socket *so));
211int     pru_rcvd_notsupp __P((struct socket *so, int flags));
212int     pru_rcvoob_notsupp __P((struct socket *so, struct mbuf *m, int flags));
213int     pru_sense_null __P((struct socket *so, struct stat *sb));
214
215#define PRU_OLDSTYLE
216
217#ifdef PRU_OLDSTYLE
218/*
219 * Protocols which don't yet implement pr_usrreqs can point it to this
220 * structure, which will call the old pr_usrreq() entry point with the
221 * appropriate arguments.
222 */
223extern  struct pr_usrreqs pru_oldstyle;
224#endif /* PRU_OLDSTYLE */
225
226#endif /* KERNEL */
227
228/*
229 * The arguments to the ctlinput routine are
230 *      (*protosw[].pr_ctlinput)(cmd, sa, arg);
231 * where cmd is one of the commands below, sa is a pointer to a sockaddr,
232 * and arg is a `void *' argument used within a protocol family.
233 */
234#define PRC_IFDOWN              0       /* interface transition */
235#define PRC_ROUTEDEAD           1       /* select new route if possible ??? */
236#define PRC_QUENCH2             3       /* DEC congestion bit says slow down */
237#define PRC_QUENCH              4       /* some one said to slow down */
238#define PRC_MSGSIZE             5       /* message size forced drop */
239#define PRC_HOSTDEAD            6       /* host appears to be down */
240#define PRC_HOSTUNREACH         7       /* deprecated (use PRC_UNREACH_HOST) */
241#define PRC_UNREACH_NET         8       /* no route to network */
242#define PRC_UNREACH_HOST        9       /* no route to host */
243#define PRC_UNREACH_PROTOCOL    10      /* dst says bad protocol */
244#define PRC_UNREACH_PORT        11      /* bad port # */
245/* was  PRC_UNREACH_NEEDFRAG    12         (use PRC_MSGSIZE) */
246#define PRC_UNREACH_SRCFAIL     13      /* source route failed */
247#define PRC_REDIRECT_NET        14      /* net routing redirect */
248#define PRC_REDIRECT_HOST       15      /* host routing redirect */
249#define PRC_REDIRECT_TOSNET     16      /* redirect for type of service & net */
250#define PRC_REDIRECT_TOSHOST    17      /* redirect for tos & host */
251#define PRC_TIMXCEED_INTRANS    18      /* packet lifetime expired in transit */
252#define PRC_TIMXCEED_REASS      19      /* lifetime expired on reass q */
253#define PRC_PARAMPROB           20      /* header incorrect */
254
255#define PRC_NCMDS               21
256
257#define PRC_IS_REDIRECT(cmd)    \
258        ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST)
259
260#ifdef PRCREQUESTS
261char    *prcrequests[] = {
262        "IFDOWN", "ROUTEDEAD", "#2", "DEC-BIT-QUENCH2",
263        "QUENCH", "MSGSIZE", "HOSTDEAD", "#7",
264        "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH",
265        "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT",
266        "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS",
267        "PARAMPROB"
268};
269#endif
270
271/*
272 * The arguments to ctloutput are:
273 *      (*protosw[].pr_ctloutput)(req, so, level, optname, optval);
274 * req is one of the actions listed below, so is a (struct socket *),
275 * level is an indication of which protocol layer the option is intended.
276 * optname is a protocol dependent socket option request,
277 * optval is a pointer to a mbuf-chain pointer, for value-return results.
278 * The protocol is responsible for disposal of the mbuf chain *optval
279 * if supplied,
280 * the caller is responsible for any space held by *optval, when returned.
281 * A non-zero return from usrreq gives an
282 * UNIX error number which should be passed to higher level software.
283 */
284#define PRCO_GETOPT     0
285#define PRCO_SETOPT     1
286
287#define PRCO_NCMDS      2
288
289#ifdef PRCOREQUESTS
290char    *prcorequests[] = {
291        "GETOPT", "SETOPT",
292};
293#endif
294
295#ifdef KERNEL
296struct protosw *pffindproto __P((int family, int protocol, int type));
297struct protosw *pffindtype __P((int family, int type));
298#endif
299
300#endif
Note: See TracBrowser for help on using the repository browser.