]> git.saurik.com Git - apple/xnu.git/blob - bsd/netiso/idrp_usrreq.c
xnu-201.42.3.tar.gz
[apple/xnu.git] / bsd / netiso / idrp_usrreq.c
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22 /*
23 * Copyright (c) 1992, 1993
24 * The Regents of the University of California. All rights reserved.
25 *
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
28 * are met:
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. All advertising materials mentioning features or use of this software
35 * must display the following acknowledgement:
36 * This product includes software developed by the University of
37 * California, Berkeley and its contributors.
38 * 4. Neither the name of the University nor the names of its contributors
39 * may be used to endorse or promote products derived from this software
40 * without specific prior written permission.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 *
54 * @(#)idrp_usrreq.c 8.1 (Berkeley) 6/10/93
55 */
56
57 #include <sys/param.h>
58 #include <sys/proc.h>
59 #include <sys/systm.h>
60 #include <sys/malloc.h>
61 #include <sys/mbuf.h>
62 #include <sys/socket.h>
63 #include <sys/socketvar.h>
64 #include <sys/protosw.h>
65 #include <sys/errno.h>
66
67 #include <net/route.h>
68 #include <net/if.h>
69
70 #include <netiso/argo_debug.h>
71 #include <netiso/iso.h>
72 #include <netiso/clnp.h>
73 #include <netiso/clnl.h>
74 #include <netiso/iso_pcb.h>
75 #include <netiso/iso_var.h>
76
77 int idrp_input();
78 struct isopcb idrp_isop;
79 static struct sockaddr_iso idrp_addrs[2] =
80 { { sizeof(idrp_addrs), AF_ISO, }, { sizeof(idrp_addrs[1]), AF_ISO, } };
81 /*
82 * IDRP initialization
83 */
84 idrp_init()
85 {
86 extern struct clnl_protosw clnl_protox[256];
87
88 idrp_isop.isop_next = idrp_isop.isop_prev = &idrp_isop;
89 idrp_isop.isop_faddr = &idrp_isop.isop_sfaddr;
90 idrp_isop.isop_laddr = &idrp_isop.isop_sladdr;
91 idrp_isop.isop_sladdr = idrp_addrs[1];
92 idrp_isop.isop_sfaddr = idrp_addrs[1];
93 clnl_protox[ISO10747_IDRP].clnl_input = idrp_input;
94 }
95
96 /*
97 * CALLED FROM:
98 * tpclnp_input().
99 * FUNCTION and ARGUMENTS:
100 * Take a packet (m) from clnp, strip off the clnp header
101 * and mke suitable for the idrp socket.
102 * No return value.
103 */
104 idrp_input(m, src, dst)
105 register struct mbuf *m;
106 struct sockaddr_iso *src, *dst;
107 {
108 if (idrp_isop.isop_socket == 0) {
109 bad: m_freem(m);
110 return 0;
111 }
112 bzero(idrp_addrs[0].siso_data, sizeof(idrp_addrs[0].siso_data));
113 bcopy((caddr_t)&(src->siso_addr), (caddr_t)&idrp_addrs[0].siso_addr,
114 1 + src->siso_nlen);
115 bzero(idrp_addrs[1].siso_data, sizeof(idrp_addrs[1].siso_data));
116 bcopy((caddr_t)&(dst->siso_addr), (caddr_t)&idrp_addrs[1].siso_addr,
117 1 + dst->siso_nlen);
118 if (sbappendaddr(&idrp_isop.isop_socket->so_rcv,
119 (struct sockaddr *)idrp_addrs, m, (struct mbuf *)0) == 0)
120 goto bad;
121 sorwakeup(idrp_isop.isop_socket);
122 return 0;
123 }
124
125 idrp_output(m, addr)
126 struct mbuf *m, *addr;
127 {
128 register struct sockaddr_iso *siso = mtod(addr, struct sockaddr_iso *);
129 int s = splnet(), i;
130
131 bcopy((caddr_t)&(siso->siso_addr),
132 (caddr_t)&idrp_isop.isop_sfaddr.siso_addr, 1 + siso->siso_nlen);
133 siso++;
134 bcopy((caddr_t)&(siso->siso_addr),
135 (caddr_t)&idrp_isop.isop_sladdr.siso_addr, 1 + siso->siso_nlen);
136 i = clnp_output(m, idrp_isop, m->m_pkthdr.len, 0);
137 splx(s);
138 return (i);
139 }
140
141 u_long idrp_sendspace = 3072; /* really max datagram size */
142 u_long idrp_recvspace = 40 * 1024; /* 40 1K datagrams */
143
144 /*ARGSUSED*/
145 idrp_usrreq(so, req, m, addr, control)
146 struct socket *so;
147 int req;
148 struct mbuf *m, *addr, *control;
149 {
150 int error = 0;
151
152 /* Note: need to block idrp_input while changing
153 * the udp pcb queue and/or pcb addresses.
154 */
155 switch (req) {
156
157 case PRU_ATTACH:
158 if (idrp_isop.isop_socket != NULL) {
159 error = ENXIO;
160 break;
161 }
162 idrp_isop.isop_socket = so;
163 error = soreserve(so, idrp_sendspace, idrp_recvspace);
164 break;
165
166 case PRU_SHUTDOWN:
167 socantsendmore(so);
168 break;
169
170 case PRU_SEND:
171 return (idrp_output(m, addr));
172
173 case PRU_ABORT:
174 soisdisconnected(so);
175 case PRU_DETACH:
176 idrp_isop.isop_socket = 0;
177 break;
178
179
180 case PRU_SENSE:
181 /*
182 * stat: don't bother with a blocksize.
183 */
184 return (0);
185
186 default:
187 return (EOPNOTSUPP); /* do not free mbuf's */
188 }
189
190 release:
191 if (control) {
192 printf("idrp control data unexpectedly retained\n");
193 m_freem(control);
194 }
195 if (m)
196 m_freem(m);
197 return (error);
198 }