|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /*- ! 26: * Copyright (c) 1991, 1993 ! 27: * The Regents of the University of California. All rights reserved. ! 28: * ! 29: * Redistribution and use in source and binary forms, with or without ! 30: * modification, are permitted provided that the following conditions ! 31: * are met: ! 32: * 1. Redistributions of source code must retain the above copyright ! 33: * notice, this list of conditions and the following disclaimer. ! 34: * 2. Redistributions in binary form must reproduce the above copyright ! 35: * notice, this list of conditions and the following disclaimer in the ! 36: * documentation and/or other materials provided with the distribution. ! 37: * 3. All advertising materials mentioning features or use of this software ! 38: * must display the following acknowledgement: ! 39: * This product includes software developed by the University of ! 40: * California, Berkeley and its contributors. ! 41: * 4. Neither the name of the University nor the names of its contributors ! 42: * may be used to endorse or promote products derived from this software ! 43: * without specific prior written permission. ! 44: * ! 45: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 46: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 47: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 48: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 49: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 50: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 51: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 52: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 53: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 54: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 55: * SUCH DAMAGE. ! 56: * ! 57: * @(#)clnp_raw.c 8.1 (Berkeley) 6/10/93 ! 58: */ ! 59: ! 60: /*********************************************************** ! 61: Copyright IBM Corporation 1987 ! 62: ! 63: All Rights Reserved ! 64: ! 65: Permission to use, copy, modify, and distribute this software and its ! 66: documentation for any purpose and without fee is hereby granted, ! 67: provided that the above copyright notice appear in all copies and that ! 68: both that copyright notice and this permission notice appear in ! 69: supporting documentation, and that the name of IBM not be ! 70: used in advertising or publicity pertaining to distribution of the ! 71: software without specific, written prior permission. ! 72: ! 73: IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 74: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 75: IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 76: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 77: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 78: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 79: SOFTWARE. ! 80: ! 81: ******************************************************************/ ! 82: ! 83: /* ! 84: * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison ! 85: */ ! 86: ! 87: #include <sys/param.h> ! 88: #include <sys/mbuf.h> ! 89: #include <sys/domain.h> ! 90: #include <sys/protosw.h> ! 91: #include <sys/socket.h> ! 92: #include <sys/socketvar.h> ! 93: #include <sys/errno.h> ! 94: #include <sys/time.h> ! 95: #include <sys/malloc.h> ! 96: ! 97: #include <net/if.h> ! 98: #include <net/route.h> ! 99: #include <net/raw_cb.h> ! 100: ! 101: #include <netiso/iso.h> ! 102: #include <netiso/iso_pcb.h> ! 103: #include <netiso/clnp.h> ! 104: #include <netiso/clnp_stat.h> ! 105: #include <netiso/argo_debug.h> ! 106: ! 107: #include <netiso/tp_user.h> /* XXX -- defines SOL_NETWORK */ ! 108: ! 109: struct sockproto rclnp_proto = { PF_ISO, 0 }; ! 110: /* ! 111: * FUNCTION: rclnp_input ! 112: * ! 113: * PURPOSE: Setup generic address an protocol structures for ! 114: * raw input routine, then pass them along with the ! 115: * mbuf chain. ! 116: * ! 117: * RETURNS: none ! 118: * ! 119: * SIDE EFFECTS: ! 120: * ! 121: * NOTES: The protocol field of rclnp_proto is set to zero indicating ! 122: * no protocol. ! 123: */ ! 124: rclnp_input(m, src, dst, hdrlen) ! 125: struct mbuf *m; /* ptr to packet */ ! 126: struct sockaddr_iso *src; /* ptr to src address */ ! 127: struct sockaddr_iso *dst; /* ptr to dest address */ ! 128: int hdrlen; /* length (in bytes) of clnp header */ ! 129: { ! 130: #ifdef TROLL ! 131: if (trollctl.tr_ops & TR_CHUCK) { ! 132: m_freem(m); ! 133: return; ! 134: } ! 135: #endif /* TROLL */ ! 136: ! 137: raw_input(m, &rclnp_proto, (struct sockaddr *)src, (struct sockaddr *)dst); ! 138: } ! 139: ! 140: /* ! 141: * FUNCTION: rclnp_output ! 142: * ! 143: * PURPOSE: Prepare to send a raw clnp packet. Setup src and dest ! 144: * addresses, count the number of bytes to send, and ! 145: * call clnp_output. ! 146: * ! 147: * RETURNS: success - 0 ! 148: * failure - an appropriate error code ! 149: * ! 150: * SIDE EFFECTS: ! 151: * ! 152: * NOTES: ! 153: */ ! 154: rclnp_output(m0, so) ! 155: struct mbuf *m0; /* packet to send */ ! 156: struct socket *so; /* socket to send from */ ! 157: { ! 158: register struct mbuf *m; /* used to scan a chain */ ! 159: int len = 0; /* store length of chain here */ ! 160: struct rawisopcb *rp = sotorawisopcb(so); /* ptr to raw cb */ ! 161: int error; /* return value of function */ ! 162: int flags; /* flags for clnp_output */ ! 163: ! 164: if (0 == (m0->m_flags & M_PKTHDR)) ! 165: return (EINVAL); ! 166: /* ! 167: * Set up src address. If user has bound socket to an address, use it. ! 168: * Otherwise, do not specify src (clnp_output will fill it in). ! 169: */ ! 170: if (rp->risop_rcb.rcb_laddr) { ! 171: if (rp->risop_isop.isop_sladdr.siso_family != AF_ISO) { ! 172: bad: ! 173: m_freem(m0); ! 174: return(EAFNOSUPPORT); ! 175: } ! 176: } ! 177: /* set up dest address */ ! 178: if (rp->risop_rcb.rcb_faddr == 0) ! 179: goto bad; ! 180: rp->risop_isop.isop_sfaddr = ! 181: *(struct sockaddr_iso *)rp->risop_rcb.rcb_faddr; ! 182: rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr; ! 183: ! 184: /* get flags and ship it off */ ! 185: flags = rp->risop_flags & CLNP_VFLAGS; ! 186: ! 187: error = clnp_output(m0, &rp->risop_isop, m0->m_pkthdr.len, ! 188: flags|CLNP_NOCACHE); ! 189: ! 190: return (error); ! 191: } ! 192: ! 193: /* ! 194: * FUNCTION: rclnp_ctloutput ! 195: * ! 196: * PURPOSE: Raw clnp socket option processing ! 197: * All options are stored inside an mbuf. ! 198: * ! 199: * RETURNS: success - 0 ! 200: * failure - unix error code ! 201: * ! 202: * SIDE EFFECTS: If the options mbuf does not exist, it the mbuf passed ! 203: * is used. ! 204: * ! 205: * NOTES: ! 206: */ ! 207: rclnp_ctloutput(op, so, level, optname, m) ! 208: int op; /* type of operation */ ! 209: struct socket *so; /* ptr to socket */ ! 210: int level; /* level of option */ ! 211: int optname; /* name of option */ ! 212: struct mbuf **m; /* ptr to ptr to option data */ ! 213: { ! 214: int error = 0; ! 215: register struct rawisopcb *rp = sotorawisopcb(so);/* raw cb ptr */ ! 216: ! 217: IFDEBUG(D_CTLOUTPUT) ! 218: printf("rclnp_ctloutput: op = x%x, level = x%x, name = x%x\n", ! 219: op, level, optname); ! 220: if (*m != NULL) { ! 221: printf("rclnp_ctloutput: %d bytes of mbuf data\n", (*m)->m_len); ! 222: dump_buf(mtod((*m), caddr_t), (*m)->m_len); ! 223: } ! 224: ENDDEBUG ! 225: ! 226: #ifdef SOL_NETWORK ! 227: if (level != SOL_NETWORK) ! 228: error = EINVAL; ! 229: else switch (op) { ! 230: #else ! 231: switch (op) { ! 232: #endif /* SOL_NETWORK */ ! 233: case PRCO_SETOPT: ! 234: switch (optname) { ! 235: case CLNPOPT_FLAGS: { ! 236: u_short usr_flags; ! 237: /* ! 238: * Insure that the data passed has exactly one short in it ! 239: */ ! 240: if ((*m == NULL) || ((*m)->m_len != sizeof(short))) { ! 241: error = EINVAL; ! 242: break; ! 243: } ! 244: ! 245: /* ! 246: * Don't allow invalid flags to be set ! 247: */ ! 248: usr_flags = (*mtod((*m), short *)); ! 249: ! 250: if ((usr_flags & (CLNP_VFLAGS)) != usr_flags) { ! 251: error = EINVAL; ! 252: } else ! 253: rp->risop_flags |= usr_flags; ! 254: ! 255: } break; ! 256: ! 257: case CLNPOPT_OPTS: ! 258: if (error = clnp_set_opts(&rp->risop_isop.isop_options, m)) ! 259: break; ! 260: rp->risop_isop.isop_optindex = m_get(M_WAIT, MT_SOOPTS); ! 261: (void) clnp_opt_sanity(rp->risop_isop.isop_options, ! 262: mtod(rp->risop_isop.isop_options, caddr_t), ! 263: rp->risop_isop.isop_options->m_len, ! 264: mtod(rp->risop_isop.isop_optindex, ! 265: struct clnp_optidx *)); ! 266: break; ! 267: } ! 268: break; ! 269: ! 270: case PRCO_GETOPT: ! 271: #ifdef notdef ! 272: /* commented out to keep hi C quiet */ ! 273: switch (optname) { ! 274: default: ! 275: error = EINVAL; ! 276: break; ! 277: } ! 278: #endif /* notdef */ ! 279: break; ! 280: default: ! 281: error = EINVAL; ! 282: break; ! 283: } ! 284: if (op == PRCO_SETOPT) { ! 285: /* note: m_freem does not barf is *m is NULL */ ! 286: m_freem(*m); ! 287: *m = NULL; ! 288: } ! 289: ! 290: return error; ! 291: } ! 292: ! 293: /*ARGSUSED*/ ! 294: clnp_usrreq(so, req, m, nam, control) ! 295: register struct socket *so; ! 296: int req; ! 297: struct mbuf *m, *nam, *control; ! 298: { ! 299: register int error = 0; ! 300: register struct rawisopcb *rp = sotorawisopcb(so); ! 301: ! 302: rp = sotorawisopcb(so); ! 303: switch (req) { ! 304: ! 305: case PRU_ATTACH: ! 306: if (rp) ! 307: panic("rip_attach"); ! 308: MALLOC(rp, struct rawisopcb *, sizeof *rp, M_PCB, M_WAITOK); ! 309: if (rp == 0) ! 310: return (ENOBUFS); ! 311: bzero((caddr_t)rp, sizeof *rp); ! 312: so->so_pcb = (caddr_t)rp; ! 313: break; ! 314: ! 315: case PRU_DETACH: ! 316: if (rp == 0) ! 317: panic("rip_detach"); ! 318: if (rp->risop_isop.isop_options) ! 319: m_freem(rp->risop_isop.isop_options); ! 320: if (rp->risop_isop.isop_route.ro_rt) ! 321: RTFREE(rp->risop_isop.isop_route.ro_rt); ! 322: if (rp->risop_rcb.rcb_laddr) ! 323: rp->risop_rcb.rcb_laddr = 0; ! 324: /* free clnp cached hdr if necessary */ ! 325: if (rp->risop_isop.isop_clnpcache != NULL) { ! 326: struct clnp_cache *clcp = ! 327: mtod(rp->risop_isop.isop_clnpcache, struct clnp_cache *); ! 328: if (clcp->clc_hdr != NULL) { ! 329: m_free(clcp->clc_hdr); ! 330: } ! 331: m_free(rp->risop_isop.isop_clnpcache); ! 332: } ! 333: if (rp->risop_isop.isop_optindex != NULL) ! 334: m_free(rp->risop_isop.isop_optindex); ! 335: ! 336: break; ! 337: ! 338: case PRU_BIND: ! 339: { ! 340: struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *); ! 341: ! 342: if (nam->m_len != sizeof(*addr)) ! 343: return (EINVAL); ! 344: if ((ifnet == 0) || ! 345: (addr->siso_family != AF_ISO) || ! 346: (addr->siso_addr.isoa_len && ! 347: ifa_ifwithaddr((struct sockaddr *)addr) == 0)) ! 348: return (EADDRNOTAVAIL); ! 349: rp->risop_isop.isop_sladdr = *addr; ! 350: rp->risop_rcb.rcb_laddr = (struct sockaddr *) ! 351: (rp->risop_isop.isop_laddr = &rp->risop_isop.isop_sladdr); ! 352: return (0); ! 353: } ! 354: case PRU_CONNECT: ! 355: { ! 356: struct sockaddr_iso *addr = mtod(nam, struct sockaddr_iso *); ! 357: ! 358: if ((nam->m_len > sizeof(*addr)) || (addr->siso_len > sizeof(*addr))) ! 359: return (EINVAL); ! 360: if (ifnet == 0) ! 361: return (EADDRNOTAVAIL); ! 362: if (addr->siso_family != AF_ISO) ! 363: rp->risop_isop.isop_sfaddr = *addr; ! 364: rp->risop_rcb.rcb_faddr = (struct sockaddr *) ! 365: (rp->risop_isop.isop_faddr = &rp->risop_isop.isop_sfaddr); ! 366: soisconnected(so); ! 367: return (0); ! 368: } ! 369: } ! 370: error = raw_usrreq(so, req, m, nam, control); ! 371: ! 372: if (error && req == PRU_ATTACH && so->so_pcb) ! 373: free((caddr_t)rp, M_PCB); ! 374: return (error); ! 375: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.