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