]>
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");