]>
git.saurik.com Git - apple/xnu.git/blob - bsd/netiso/idrp_usrreq.c
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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.
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
20 * @APPLE_LICENSE_HEADER_END@
23 * Copyright (c) 1992, 1993
24 * The Regents of the University of California. All rights reserved.
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
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.
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
54 * @(#)idrp_usrreq.c 8.1 (Berkeley) 6/10/93
57 #include <sys/param.h>
59 #include <sys/systm.h>
60 #include <sys/malloc.h>
62 #include <sys/socket.h>
63 #include <sys/socketvar.h>
64 #include <sys/protosw.h>
65 #include <sys/errno.h>
67 #include <net/route.h>
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>
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
, } };
86 extern struct clnl_protosw clnl_protox
[256];
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
;
99 * FUNCTION and ARGUMENTS:
100 * Take a packet (m) from clnp, strip off the clnp header
101 * and mke suitable for the idrp socket.
104 idrp_input(m
, src
, dst
)
105 register struct mbuf
*m
;
106 struct sockaddr_iso
*src
, *dst
;
108 if (idrp_isop
.isop_socket
== 0) {
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
,
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
,
118 if (sbappendaddr(&idrp_isop
.isop_socket
->so_rcv
,
119 (struct sockaddr
*)idrp_addrs
, m
, (struct mbuf
*)0) == 0)
121 sorwakeup(idrp_isop
.isop_socket
);
126 struct mbuf
*m
, *addr
;
128 register struct sockaddr_iso
*siso
= mtod(addr
, struct sockaddr_iso
*);
131 bcopy((caddr_t
)&(siso
->siso_addr
),
132 (caddr_t
)&idrp_isop
.isop_sfaddr
.siso_addr
, 1 + siso
->siso_nlen
);
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);
141 u_long idrp_sendspace
= 3072; /* really max datagram size */
142 u_long idrp_recvspace
= 40 * 1024; /* 40 1K datagrams */
145 idrp_usrreq(so
, req
, m
, addr
, control
)
148 struct mbuf
*m
, *addr
, *control
;
152 /* Note: need to block idrp_input while changing
153 * the udp pcb queue and/or pcb addresses.
158 if (idrp_isop
.isop_socket
!= NULL
) {
162 idrp_isop
.isop_socket
= so
;
163 error
= soreserve(so
, idrp_sendspace
, idrp_recvspace
);
171 return (idrp_output(m
, addr
));
174 soisdisconnected(so
);
176 idrp_isop
.isop_socket
= 0;
182 * stat: don't bother with a blocksize.
187 return (EOPNOTSUPP
); /* do not free mbuf's */
192 printf("idrp control data unexpectedly retained\n");