xref: /original-bsd/sys/netiso/iso_proto.c (revision c3e32dec)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)iso_proto.c	7.13 (Berkeley) 06/04/93
8  */
9 
10 /***********************************************************
11 		Copyright IBM Corporation 1987
12 
13                       All Rights Reserved
14 
15 Permission to use, copy, modify, and distribute this software and its
16 documentation for any purpose and without fee is hereby granted,
17 provided that the above copyright notice appear in all copies and that
18 both that copyright notice and this permission notice appear in
19 supporting documentation, and that the name of IBM not be
20 used in advertising or publicity pertaining to distribution of the
21 software without specific, written prior permission.
22 
23 IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
24 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
25 IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
26 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
27 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
28 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
29 SOFTWARE.
30 
31 ******************************************************************/
32 
33 /*
34  * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
35  */
36 /* $Header: iso_proto.c,v 4.4 88/09/08 08:38:42 hagens Exp $
37  * $Source: /usr/argo/sys/netiso/RCS/iso_proto.c,v $
38  *
39  * iso_proto.c : protocol switch tables in the ISO domain
40  *
41  * ISO protocol family includes TP, CLTP, CLNP, 8208
42  * TP and CLNP are implemented here.
43  */
44 
45 #ifdef	ISO
46 #include <sys/param.h>
47 #include <sys/socket.h>
48 #include <sys/protosw.h>
49 #include <sys/domain.h>
50 #include <sys/mbuf.h>
51 
52 #include <net/radix.h>
53 
54 #include <netiso/iso.h>
55 
56 int clnp_output(), clnp_init(),clnp_slowtimo(),clnp_drain();
57 int rclnp_input(), rclnp_output(), rclnp_ctloutput(), raw_usrreq();
58 int	clnp_usrreq();
59 
60 int	tp_ctloutput(), tpclnp_ctlinput(), tpclnp_input(), tp_usrreq();
61 int	tp_init(), tp_fasttimo(), tp_slowtimo(), tp_drain();
62 int	cons_init(), tpcons_input();
63 
64 int isis_input();
65 int	esis_input(), esis_ctlinput(), esis_init(), esis_usrreq();
66 int	idrp_input(), idrp_init(), idrp_usrreq();
67 int	cltp_input(), cltp_ctlinput(), cltp_init(), cltp_usrreq(), cltp_output();
68 
69 #ifdef TUBA
70 int	tuba_usrreq(), tuba_ctloutput(), tuba_init(), tuba_tcpinput();
71 int	tuba_slowtimo(), tuba_fasttimo();
72 #endif
73 
74 struct protosw isosw[] = {
75 /*
76  *  We need a datagram entry through which net mgmt programs can get
77  *	to the iso_control procedure (iso ioctls). Thus, a minimal
78  *	SOCK_DGRAM interface is provided here.
79  *  THIS ONE MUST BE FIRST: Kludge city : socket() says if(!proto) call
80  *  pffindtype, which gets the first entry that matches the type.
81  *  sigh.
82  */
83 { SOCK_DGRAM,	&isodomain,		ISOPROTO_CLTP,		PR_ATOMIC|PR_ADDR,
84 	0,			cltp_output,	0,					0,
85 	cltp_usrreq,
86 	cltp_init,	0, 				0,					0
87 },
88 
89 /*
90  *	A datagram interface for clnp cannot co-exist with TP/CLNP
91  *  because CLNP has no way to discriminate incoming TP packets from
92  *  packets coming in for any other higher layer protocol.
93  *  Old way: set it up so that pffindproto(... dgm, clnp) fails.
94  *  New way: let pffindproto work (for x.25, thank you) but create
95  *  	a clnp_usrreq() that returns error on PRU_ATTACH.
96  */
97 {SOCK_DGRAM,	&isodomain,		ISOPROTO_CLNP,		0,
98  0,				clnp_output,	0,					0,
99  clnp_usrreq,
100  clnp_init,		0,				clnp_slowtimo, 		clnp_drain,
101 },
102 
103 /* raw clnp */
104 { SOCK_RAW,		&isodomain,		ISOPROTO_RAW,		PR_ATOMIC|PR_ADDR,
105   rclnp_input,	rclnp_output,	0,					rclnp_ctloutput,
106   clnp_usrreq,
107   0,			0,				0,					0
108 },
109 
110 /* ES-IS protocol */
111 { SOCK_DGRAM,	&isodomain,		ISOPROTO_ESIS,		PR_ATOMIC|PR_ADDR,
112   esis_input,	0,				esis_ctlinput,		0,
113   esis_usrreq,
114   esis_init,	0,				0,					0
115 },
116 
117 /* ISOPROTO_INTRAISIS */
118 { SOCK_DGRAM,	&isodomain,		ISOPROTO_INTRAISIS,	PR_ATOMIC|PR_ADDR,
119   isis_input,	0,				0,					0,
120   esis_usrreq,
121   0,			0,				0,					0
122 },
123 
124 /* ISOPROTO_IDRP */
125 { SOCK_DGRAM,	&isodomain,		ISOPROTO_IDRP,		PR_ATOMIC|PR_ADDR,
126   idrp_input,	0,				0,					0,
127   idrp_usrreq,
128   idrp_init,	0,				0,					0
129 },
130 
131 /* ISOPROTO_TP */
132 { SOCK_SEQPACKET,	&isodomain,	ISOPROTO_TP,		PR_CONNREQUIRED|PR_WANTRCVD,
133   tpclnp_input,	0,				tpclnp_ctlinput,	tp_ctloutput,
134   tp_usrreq,
135   tp_init,		tp_fasttimo,	tp_slowtimo,		tp_drain,
136 },
137 
138 #ifdef TUBA
139 { SOCK_STREAM,	&isodomain,		ISOPROTO_TCP,		PR_CONNREQUIRED|PR_WANTRCVD,
140   tuba_tcpinput,	0,			0,					tuba_ctloutput,
141   tuba_usrreq,
142   tuba_init,	tuba_fasttimo,	tuba_fasttimo,		0
143 },
144 #endif
145 
146 #ifdef TPCONS
147 /* ISOPROTO_TP */
148 { SOCK_SEQPACKET,	&isodomain,	ISOPROTO_TP0,		PR_CONNREQUIRED|PR_WANTRCVD,
149   tpcons_input,		0,			0,					tp_ctloutput,
150   tp_usrreq,
151   cons_init,		0,			0,					0,
152 },
153 #endif
154 
155 };
156 
157 
158 struct domain isodomain = {
159     AF_ISO, 			/* family */
160 	"iso-domain", 		/* name */
161 	0,					/* initialize routine */
162 	0,					/* externalize access rights */
163 	0,					/* dispose of internalized rights */
164 	isosw,				/* protosw */
165 	&isosw[sizeof(isosw)/sizeof(isosw[0])], /* NPROTOSW */
166 	0,					/* next */
167 	rn_inithead,		/* rtattach */
168 	48,					/* rtoffset */
169 	sizeof(struct sockaddr_iso) /* maxkeylen */
170 };
171 #endif	/* ISO */
172