|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1982, 1986 The Regents of the University of California. ! 3: * 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 7.8 (Berkeley) 4/28/91 ! 34: */ ! 35: ! 36: /* ! 37: * Protocol switch table. ! 38: * ! 39: * Each protocol has a handle initializing one of these structures, ! 40: * which is used for protocol-protocol and system-protocol communication. ! 41: * ! 42: * A protocol is called through the pr_init entry before any other. ! 43: * Thereafter it is called every 200ms through the pr_fasttimo entry and ! 44: * every 500ms through the pr_slowtimo for timer based actions. ! 45: * The system will call the pr_drain entry if it is low on space and ! 46: * this should throw away any non-critical data. ! 47: * ! 48: * Protocols pass data between themselves as chains of mbufs using ! 49: * the pr_input and pr_output hooks. Pr_input passes data up (towards ! 50: * UNIX) and pr_output passes it down (towards the imps); control ! 51: * information passes up and down on pr_ctlinput and pr_ctloutput. ! 52: * The protocol is responsible for the space occupied by any the ! 53: * arguments to these entries and must dispose it. ! 54: * ! 55: * The userreq routine interfaces protocols to the system and is ! 56: * described below. ! 57: */ ! 58: struct protosw { ! 59: short pr_type; /* socket type used for */ ! 60: struct domain *pr_domain; /* domain protocol a member of */ ! 61: short pr_protocol; /* protocol number */ ! 62: short pr_flags; /* see below */ ! 63: /* protocol-protocol hooks */ ! 64: int (*pr_input)(); /* input to protocol (from below) */ ! 65: int (*pr_output)(); /* output to protocol (from above) */ ! 66: int (*pr_ctlinput)(); /* control input (from below) */ ! 67: int (*pr_ctloutput)(); /* control output (from above) */ ! 68: /* user-protocol hook */ ! 69: int (*pr_usrreq)(); /* user request: see list below */ ! 70: /* utility hooks */ ! 71: int (*pr_init)(); /* initialization hook */ ! 72: int (*pr_fasttimo)(); /* fast timeout (200ms) */ ! 73: int (*pr_slowtimo)(); /* slow timeout (500ms) */ ! 74: int (*pr_drain)(); /* flush any excess space possible */ ! 75: }; ! 76: ! 77: #define PR_SLOWHZ 2 /* 2 slow timeouts per second */ ! 78: #define PR_FASTHZ 5 /* 5 fast timeouts per second */ ! 79: ! 80: /* ! 81: * Values for pr_flags. ! 82: * PR_ADDR requires PR_ATOMIC; ! 83: * PR_ADDR and PR_CONNREQUIRED are mutually exclusive. ! 84: */ ! 85: #define PR_ATOMIC 0x01 /* exchange atomic messages only */ ! 86: #define PR_ADDR 0x02 /* addresses given with messages */ ! 87: #define PR_CONNREQUIRED 0x04 /* connection required by protocol */ ! 88: #define PR_WANTRCVD 0x08 /* want PRU_RCVD calls */ ! 89: #define PR_RIGHTS 0x10 /* passes capabilities */ ! 90: ! 91: /* ! 92: * The arguments to usrreq are: ! 93: * (*protosw[].pr_usrreq)(up, req, m, nam, opt); ! 94: * where up is a (struct socket *), req is one of these requests, ! 95: * m is a optional mbuf chain containing a message, ! 96: * nam is an optional mbuf chain containing an address, ! 97: * and opt is a pointer to a socketopt structure or nil. ! 98: * The protocol is responsible for disposal of the mbuf chain m, ! 99: * the caller is responsible for any space held by nam and opt. ! 100: * A non-zero return from usrreq gives an ! 101: * UNIX error number which should be passed to higher level software. ! 102: */ ! 103: #define PRU_ATTACH 0 /* attach protocol to up */ ! 104: #define PRU_DETACH 1 /* detach protocol from up */ ! 105: #define PRU_BIND 2 /* bind socket to address */ ! 106: #define PRU_LISTEN 3 /* listen for connection */ ! 107: #define PRU_CONNECT 4 /* establish connection to peer */ ! 108: #define PRU_ACCEPT 5 /* accept connection from peer */ ! 109: #define PRU_DISCONNECT 6 /* disconnect from peer */ ! 110: #define PRU_SHUTDOWN 7 /* won't send any more data */ ! 111: #define PRU_RCVD 8 /* have taken data; more room now */ ! 112: #define PRU_SEND 9 /* send this data */ ! 113: #define PRU_ABORT 10 /* abort (fast DISCONNECT, DETATCH) */ ! 114: #define PRU_CONTROL 11 /* control operations on protocol */ ! 115: #define PRU_SENSE 12 /* return status into m */ ! 116: #define PRU_RCVOOB 13 /* retrieve out of band data */ ! 117: #define PRU_SENDOOB 14 /* send out of band data */ ! 118: #define PRU_SOCKADDR 15 /* fetch socket's address */ ! 119: #define PRU_PEERADDR 16 /* fetch peer's address */ ! 120: #define PRU_CONNECT2 17 /* connect two sockets */ ! 121: /* begin for protocols internal use */ ! 122: #define PRU_FASTTIMO 18 /* 200ms timeout */ ! 123: #define PRU_SLOWTIMO 19 /* 500ms timeout */ ! 124: #define PRU_PROTORCV 20 /* receive from below */ ! 125: #define PRU_PROTOSEND 21 /* send to below */ ! 126: ! 127: #define PRU_NREQ 21 ! 128: ! 129: #ifdef PRUREQUESTS ! 130: char *prurequests[] = { ! 131: "ATTACH", "DETACH", "BIND", "LISTEN", ! 132: "CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN", ! 133: "RCVD", "SEND", "ABORT", "CONTROL", ! 134: "SENSE", "RCVOOB", "SENDOOB", "SOCKADDR", ! 135: "PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO", ! 136: "PROTORCV", "PROTOSEND", ! 137: }; ! 138: #endif ! 139: ! 140: /* ! 141: * The arguments to the ctlinput routine are ! 142: * (*protosw[].pr_ctlinput)(cmd, sa, arg); ! 143: * where cmd is one of the commands below, sa is a pointer to a sockaddr, ! 144: * and arg is an optional caddr_t argument used within a protocol family. ! 145: */ ! 146: #define PRC_IFDOWN 0 /* interface transition */ ! 147: #define PRC_ROUTEDEAD 1 /* select new route if possible ??? */ ! 148: #define PRC_QUENCH2 3 /* DEC congestion bit says slow down */ ! 149: #define PRC_QUENCH 4 /* some one said to slow down */ ! 150: #define PRC_MSGSIZE 5 /* message size forced drop */ ! 151: #define PRC_HOSTDEAD 6 /* host appears to be down */ ! 152: #define PRC_HOSTUNREACH 7 /* deprecated (use PRC_UNREACH_HOST) */ ! 153: #define PRC_UNREACH_NET 8 /* no route to network */ ! 154: #define PRC_UNREACH_HOST 9 /* no route to host */ ! 155: #define PRC_UNREACH_PROTOCOL 10 /* dst says bad protocol */ ! 156: #define PRC_UNREACH_PORT 11 /* bad port # */ ! 157: /* was PRC_UNREACH_NEEDFRAG 12 (use PRC_MSGSIZE) */ ! 158: #define PRC_UNREACH_SRCFAIL 13 /* source route failed */ ! 159: #define PRC_REDIRECT_NET 14 /* net routing redirect */ ! 160: #define PRC_REDIRECT_HOST 15 /* host routing redirect */ ! 161: #define PRC_REDIRECT_TOSNET 16 /* redirect for type of service & net */ ! 162: #define PRC_REDIRECT_TOSHOST 17 /* redirect for tos & host */ ! 163: #define PRC_TIMXCEED_INTRANS 18 /* packet lifetime expired in transit */ ! 164: #define PRC_TIMXCEED_REASS 19 /* lifetime expired on reass q */ ! 165: #define PRC_PARAMPROB 20 /* header incorrect */ ! 166: ! 167: #define PRC_NCMDS 21 ! 168: ! 169: #define PRC_IS_REDIRECT(cmd) \ ! 170: ((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST) ! 171: ! 172: #ifdef PRCREQUESTS ! 173: char *prcrequests[] = { ! 174: "IFDOWN", "ROUTEDEAD", "#2", "DEC-BIT-QUENCH2", ! 175: "QUENCH", "MSGSIZE", "HOSTDEAD", "#7", ! 176: "NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH", ! 177: "#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT", ! 178: "TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS", ! 179: "PARAMPROB" ! 180: }; ! 181: #endif ! 182: ! 183: /* ! 184: * The arguments to ctloutput are: ! 185: * (*protosw[].pr_ctloutput)(req, so, level, optname, optval); ! 186: * req is one of the actions listed below, so is a (struct socket *), ! 187: * level is an indication of which protocol layer the option is intended. ! 188: * optname is a protocol dependent socket option request, ! 189: * optval is a pointer to a mbuf-chain pointer, for value-return results. ! 190: * The protocol is responsible for disposal of the mbuf chain *optval ! 191: * if supplied, ! 192: * the caller is responsible for any space held by *optval, when returned. ! 193: * A non-zero return from usrreq gives an ! 194: * UNIX error number which should be passed to higher level software. ! 195: */ ! 196: #define PRCO_GETOPT 0 ! 197: #define PRCO_SETOPT 1 ! 198: ! 199: #define PRCO_NCMDS 2 ! 200: ! 201: #ifdef PRCOREQUESTS ! 202: char *prcorequests[] = { ! 203: "GETOPT", "SETOPT", ! 204: }; ! 205: #endif ! 206: ! 207: #ifdef KERNEL ! 208: extern struct protosw *pffindproto(), *pffindtype(); ! 209: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.