diff options
Diffstat (limited to 'sys/netiso/clnp_raw.c')
-rw-r--r-- | sys/netiso/clnp_raw.c | 365 |
1 files changed, 0 insertions, 365 deletions
diff --git a/sys/netiso/clnp_raw.c b/sys/netiso/clnp_raw.c deleted file mode 100644 index 77e5a4c6dd4..00000000000 --- a/sys/netiso/clnp_raw.c +++ /dev/null @@ -1,365 +0,0 @@ -/* $OpenBSD: clnp_raw.c,v 1.7 2004/01/03 14:08:54 espie Exp $ */ -/* $NetBSD: clnp_raw.c,v 1.9 1996/02/13 22:08:42 christos Exp $ */ - -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)clnp_raw.c 8.1 (Berkeley) 6/10/93 - */ - -/*********************************************************** - Copyright IBM Corporation 1987 - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of IBM not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -/* - * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison - */ - -#include <sys/param.h> -#include <sys/mbuf.h> -#include <sys/domain.h> -#include <sys/protosw.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/systm.h> - -#include <net/if.h> -#include <net/route.h> -#include <net/raw_cb.h> - -#include <netiso/iso.h> -#include <netiso/iso_pcb.h> -#include <netiso/clnp.h> -#include <netiso/clnp_stat.h> -#include <netiso/argo_debug.h> - -#include <netiso/tp_user.h> /* XXX -- defines SOL_NETWORK */ - -#include <sys/stdarg.h> - -struct sockproto rclnp_proto = {PF_ISO, 0}; -/* - * FUNCTION: rclnp_input - * - * PURPOSE: Setup generic address an protocol structures for - * raw input routine, then pass them along with the - * mbuf chain. - * - * RETURNS: none - * - * SIDE EFFECTS: - * - * NOTES: The protocol field of rclnp_proto is set to zero - * indicating no protocol. - */ -void -rclnp_input(struct mbuf *m, ...) -{ - struct sockaddr_iso *src; /* ptr to src address */ - struct sockaddr_iso *dst; /* ptr to dest address */ - int hdrlen; /* length (in bytes) of clnp header */ - va_list ap; - - va_start(ap, m); - src = va_arg(ap, struct sockaddr_iso *); - dst = va_arg(ap, struct sockaddr_iso *); - hdrlen = va_arg(ap, int); - va_end(ap); -#ifdef TROLL - if (trollctl.tr_ops & TR_CHUCK) { - m_freem(m); - return; - } -#endif /* TROLL */ - - raw_input(m, &rclnp_proto, sisotosa(src), sisotosa(dst)); -} - -/* - * FUNCTION: rclnp_output - * - * PURPOSE: Prepare to send a raw clnp packet. Setup src and dest - * addresses, count the number of bytes to send, and - * call clnp_output. - * - * RETURNS: success - 0 - * failure - an appropriate error code - * - * SIDE EFFECTS: - * - * NOTES: - */ -int -rclnp_output(struct mbuf *m0, ...) -{ - struct socket *so; /* socket to send from */ - struct rawisopcb *rp; /* ptr to raw cb */ - int error; /* return value of function */ - int flags; /* flags for clnp_output */ - va_list ap; - - va_start(ap, m0); - so = va_arg(ap, struct socket *); - va_end(ap); - rp = sotorawisopcb(so); - - if ((m0->m_flags & M_PKTHDR) == 0) - return (EINVAL); - /* - * Set up src address. If user has bound socket to an address, use it. - * Otherwise, do not specify src (clnp_output will fill it in). - */ - if (rp->risop_rcb.rcb_laddr) { - if (rp->risop_isop.isop_sladdr.siso_family != AF_ISO) { - bad: - m_freem(m0); - return (EAFNOSUPPORT); - } - } - /* set up dest address */ - if (rp->risop_rcb.rcb_faddr == 0) - goto bad; - rp->risop_isop.isop_sfaddr = *satosiso(rp->risop_rcb.rcb_faddr); - rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr; - - /* get flags and ship it off */ - flags = rp->risop_flags & CLNP_VFLAGS; - - error = clnp_output(m0, &rp->risop_isop, m0->m_pkthdr.len, - flags | CLNP_NOCACHE); - - return (error); -} - -/* - * FUNCTION: rclnp_ctloutput - * - * PURPOSE: Raw clnp socket option processing - * All options are stored inside an mbuf. - * - * RETURNS: success - 0 - * failure - unix error code - * - * SIDE EFFECTS: If the options mbuf does not exist, it the mbuf passed - * is used. - * - * NOTES: - */ -int -rclnp_ctloutput(op, so, level, optname, m) - int op; /* type of operation */ - struct socket *so; /* ptr to socket */ - int level; /* level of option */ - int optname;/* name of option */ - struct mbuf **m; /* ptr to ptr to option data */ -{ - int error = 0; - struct rawisopcb *rp = sotorawisopcb(so); /* raw cb ptr */ - -#ifdef ARGO_DEBUG - if (argo_debug[D_CTLOUTPUT]) { - printf("rclnp_ctloutput: op = x%x, level = x%x, name = x%x\n", - op, level, optname); - if (*m != NULL) { - printf("rclnp_ctloutput: %d bytes of mbuf data\n", (*m)->m_len); - dump_buf(mtod((*m), caddr_t), (*m)->m_len); - } - } -#endif - -#ifdef SOL_NETWORK - if (level != SOL_NETWORK) - error = EINVAL; - else - switch (op) { -#else - switch (op) { -#endif /* SOL_NETWORK */ - case PRCO_SETOPT: - switch (optname) { - case CLNPOPT_FLAGS:{ - u_short usr_flags; - /* - * Insure that the data passed has exactly - * one short in it - */ - if ((*m == NULL) || ((*m)->m_len != sizeof(short))) { - error = EINVAL; - break; - } - /* - * Don't allow invalid flags to be set - */ - usr_flags = (*mtod((*m), short *)); - - if ((usr_flags & (CLNP_VFLAGS)) != usr_flags) { - error = EINVAL; - } else - rp->risop_flags |= usr_flags; - - } break; - - case CLNPOPT_OPTS: - error = clnp_set_opts(&rp->risop_isop.isop_options, m); - if (error) - break; - rp->risop_isop.isop_optindex = m_get(M_WAIT, MT_SOOPTS); - (void) clnp_opt_sanity(rp->risop_isop.isop_options, - mtod(rp->risop_isop.isop_options, caddr_t), - rp->risop_isop.isop_options->m_len, - mtod(rp->risop_isop.isop_optindex, - struct clnp_optidx *)); - break; - } - break; - - case PRCO_GETOPT: -#ifdef notdef - /* commented out to keep hi C quiet */ - switch (optname) { - default: - error = EINVAL; - break; - } -#endif /* notdef */ - break; - default: - error = EINVAL; - break; - } - if (op == PRCO_SETOPT) { - /* note: m_freem does not barf is *m is NULL */ - m_freem(*m); - *m = NULL; - } - return error; -} - -/* ARGSUSED */ -int -clnp_usrreq(so, req, m, nam, control) - struct socket *so; - int req; - struct mbuf *m, *nam, *control; -{ - int error = 0; - struct rawisopcb *rp = sotorawisopcb(so); - - rp = sotorawisopcb(so); - switch (req) { - - case PRU_ATTACH: - if (rp) - panic("rip_attach"); - MALLOC(rp, struct rawisopcb *, sizeof *rp, M_PCB, M_WAITOK); - bzero(rp, sizeof *rp); - so->so_pcb = rp; - break; - - case PRU_DETACH: - if (rp == 0) - panic("rip_detach"); - if (rp->risop_isop.isop_options) - m_freem(rp->risop_isop.isop_options); - if (rp->risop_isop.isop_route.ro_rt) - RTFREE(rp->risop_isop.isop_route.ro_rt); - if (rp->risop_rcb.rcb_laddr) - rp->risop_rcb.rcb_laddr = 0; - /* free clnp cached hdr if necessary */ - if (rp->risop_isop.isop_clnpcache != NULL) { - struct clnp_cache *clcp = - mtod(rp->risop_isop.isop_clnpcache, struct clnp_cache *); - if (clcp->clc_hdr != NULL) { - m_free(clcp->clc_hdr); - } - m_free(rp->risop_isop.isop_clnpcache); - } - if (rp->risop_isop.isop_optindex != NULL) - m_free(rp->risop_isop.isop_optindex); - - break; - - case PRU_BIND: - { - struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *); - - if (nam->m_len != sizeof(*addr)) - return (EINVAL); - if ((ifnet.tqh_first == 0) || - (addr->siso_family != AF_ISO) || - (addr->siso_addr.isoa_len && - ifa_ifwithaddr(sisotosa(addr)) == 0)) - return (EADDRNOTAVAIL); - rp->risop_isop.isop_sladdr = *addr; - rp->risop_rcb.rcb_laddr = sisotosa( - (rp->risop_isop.isop_laddr = &rp->risop_isop.isop_sladdr)); - return (0); - } - case PRU_CONNECT: - { - struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *); - - if ((nam->m_len > sizeof(*addr)) || (addr->siso_len > sizeof(*addr))) - return (EINVAL); - if (ifnet.tqh_first == 0) - return (EADDRNOTAVAIL); - if (addr->siso_family != AF_ISO) - rp->risop_isop.isop_sfaddr = *addr; - rp->risop_rcb.rcb_faddr = sisotosa( - (rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr)); - soisconnected(so); - return (0); - } - } - error = raw_usrreq(so, req, m, nam, control); - - if (error && req == PRU_ATTACH && so->so_pcb) - free((caddr_t) rp, M_PCB); - return (error); -} |