Annotation of XNU/bsd/netinet/if_atm.c, revision 1.1

1.1     ! root        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: /*      $NetBSD: if_atm.c,v 1.6 1996/10/13 02:03:01 christos Exp $       */
        !            23: 
        !            24: /*
        !            25:  *
        !            26:  * Copyright (c) 1996 Charles D. Cranor and Washington University.
        !            27:  * 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 Charles D. Cranor and 
        !            40:  *     Washington University.
        !            41:  * 4. The name of the author may not be used to endorse or promote products
        !            42:  *    derived from this software without specific prior written permission.
        !            43:  *
        !            44:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            45:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            46:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            47:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            48:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            49:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            50:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            51:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            52:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            53:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            54:  */
        !            55: 
        !            56: /*
        !            57:  * IP <=> ATM address resolution.
        !            58:  */
        !            59: 
        !            60: #include "opt_inet.h"
        !            61: #include "opt_natm.h"
        !            62: 
        !            63: #if defined(INET) || defined(INET6)
        !            64: 
        !            65: #include <sys/param.h>
        !            66: #include <sys/systm.h>
        !            67: #include <sys/queue.h>
        !            68: #include <sys/mbuf.h>
        !            69: #include <sys/socket.h>
        !            70: #include <sys/sockio.h>
        !            71: #include <sys/syslog.h>
        !            72: 
        !            73: #include <net/if.h>
        !            74: #include <net/if_dl.h>
        !            75: #include <net/route.h>
        !            76: #include <net/if_atm.h>
        !            77: 
        !            78: #include <netinet/in.h>
        !            79: #include <netinet/if_atm.h>
        !            80: #include <net/dlil.h>
        !            81: 
        !            82: 
        !            83: #if NATM
        !            84: #include <netnatm/natm.h>
        !            85: #endif
        !            86: 
        !            87: 
        !            88: #define SDL(s) ((struct sockaddr_dl *)s)
        !            89: 
        !            90: /*
        !            91:  * atm_rtrequest: handle ATM rt request (in support of generic code)
        !            92:  *   inputs: "req" = request code
        !            93:  *           "rt" = route entry
        !            94:  *           "sa" = sockaddr
        !            95:  */
        !            96: 
        !            97: void
        !            98: atm_rtrequest(req, rt, sa)
        !            99:        int req;
        !           100:        register struct rtentry *rt;
        !           101:        struct sockaddr *sa;
        !           102: {
        !           103:        register struct sockaddr *gate = rt->rt_gateway;
        !           104:        struct atm_pseudoioctl api;
        !           105: #if NATM
        !           106:        struct sockaddr_in *sin;
        !           107:        struct natmpcb *npcb = NULL;
        !           108:        struct atm_pseudohdr *aph;
        !           109: #endif
        !           110:        static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK};
        !           111: 
        !           112:        if (rt->rt_flags & RTF_GATEWAY)   /* link level requests only */
        !           113:                return;
        !           114: 
        !           115:        switch (req) {
        !           116: 
        !           117:        case RTM_RESOLVE: /* resolve: only happens when cloning */
        !           118:                printf("atm_rtrequest: RTM_RESOLVE request detected?\n");
        !           119:                break;
        !           120: 
        !           121:        case RTM_ADD:
        !           122: 
        !           123:                /*
        !           124:                 * route added by a command (e.g. ifconfig, route, arp...).
        !           125:                 *
        !           126:                 * first check to see if this is not a host route, in which
        !           127:                 * case we are being called via "ifconfig" to set the address.
        !           128:                 */
        !           129: 
        !           130:                if ((rt->rt_flags & RTF_HOST) == 0) { 
        !           131:                        rt_setgate(rt,rt_key(rt),(struct sockaddr *)&null_sdl);
        !           132:                        gate = rt->rt_gateway;
        !           133:                        SDL(gate)->sdl_type = rt->rt_ifp->if_type;
        !           134:                        SDL(gate)->sdl_index = rt->rt_ifp->if_index;
        !           135:                        break;
        !           136:                }
        !           137: 
        !           138:                if ((rt->rt_flags & RTF_CLONING) != 0) {
        !           139:                        printf("atm_rtrequest: cloning route detected?\n");
        !           140:                        break;
        !           141:                }
        !           142:                if (gate->sa_family != AF_LINK ||
        !           143:                    gate->sa_len < sizeof(null_sdl)) {
        !           144:                        log(LOG_DEBUG, "atm_rtrequest: bad gateway value");
        !           145:                        break;
        !           146:                }
        !           147: 
        !           148: #if DIAGNOSTIC
        !           149:                if (rt->rt_ifp->if_ioctl == NULL) panic("atm null ioctl");
        !           150: #endif
        !           151: 
        !           152: #if NATM
        !           153:                /*
        !           154:                 * let native ATM know we are using this VCI/VPI
        !           155:                 * (i.e. reserve it)
        !           156:                 */
        !           157:                sin = (struct sockaddr_in *) rt_key(rt);
        !           158:                if (sin->sin_family != AF_INET)
        !           159:                        goto failed;
        !           160:                aph = (struct atm_pseudohdr *) LLADDR(SDL(gate));
        !           161:                npcb = npcb_add(NULL, rt->rt_ifp, ATM_PH_VCI(aph), 
        !           162:                                                ATM_PH_VPI(aph));
        !           163:                if (npcb == NULL) 
        !           164:                        goto failed;
        !           165:                npcb->npcb_flags |= NPCB_IP;
        !           166:                npcb->ipaddr.s_addr = sin->sin_addr.s_addr;
        !           167:                /* XXX: move npcb to llinfo when ATM ARP is ready */
        !           168:                rt->rt_llinfo = (caddr_t) npcb;
        !           169:                rt->rt_flags |= RTF_LLINFO;
        !           170: #endif
        !           171:                /*
        !           172:                 * let the lower level know this circuit is active
        !           173:                 */
        !           174:                bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
        !           175:                api.rxhand = NULL;
        !           176:                if (dlil_ioctl(0, rt->rt_ifp, SIOCATMENA, 
        !           177:                                                        (caddr_t)&api) != 0) {
        !           178:                        printf("atm: couldn't add VC\n");
        !           179:                        goto failed;
        !           180:                }
        !           181: 
        !           182:                SDL(gate)->sdl_type = rt->rt_ifp->if_type;
        !           183:                SDL(gate)->sdl_index = rt->rt_ifp->if_index;
        !           184: 
        !           185:                break;
        !           186: 
        !           187: failed:
        !           188: #if NATM
        !           189:                if (npcb) {
        !           190:                        npcb_free(npcb, NPCB_DESTROY);
        !           191:                        rt->rt_llinfo = NULL;
        !           192:                        rt->rt_flags &= ~RTF_LLINFO;
        !           193:                }
        !           194: #endif
        !           195:                rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
        !           196:                        rt_mask(rt), 0, (struct rtentry **) 0);
        !           197:                break;
        !           198: 
        !           199:        case RTM_DELETE:
        !           200: 
        !           201: #if NATM
        !           202:                /*
        !           203:                 * tell native ATM we are done with this VC
        !           204:                 */
        !           205: 
        !           206:                if (rt->rt_flags & RTF_LLINFO) {
        !           207:                        npcb_free((struct natmpcb *)rt->rt_llinfo, 
        !           208:                                                                NPCB_DESTROY);
        !           209:                        rt->rt_llinfo = NULL;
        !           210:                        rt->rt_flags &= ~RTF_LLINFO;
        !           211:                }
        !           212: #endif
        !           213:                /*
        !           214:                 * tell the lower layer to disable this circuit
        !           215:                 */
        !           216: 
        !           217:                bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
        !           218:                api.rxhand = NULL;
        !           219:                dlil_ioctl(0, rt->rt_ifp, SIOCATMDIS, 
        !           220:                                                        (caddr_t)&api);
        !           221: 
        !           222:                break;
        !           223:        }
        !           224: }
        !           225: 
        !           226: /*
        !           227:  * atmresolve:
        !           228:  *   inputs:
        !           229:  *     [1] "rt" = the link level route to use (or null if need to look one up)
        !           230:  *     [2] "m" = mbuf containing the data to be sent
        !           231:  *     [3] "dst" = sockaddr_in (IP) address of dest.
        !           232:  *   output:
        !           233:  *     [4] "desten" = ATM pseudo header which we will fill in VPI/VCI info
        !           234:  *   return: 
        !           235:  *     0 == resolve FAILED; note that "m" gets m_freem'd in this case
        !           236:  *     1 == resolve OK; desten contains result
        !           237:  *
        !           238:  *   XXX: will need more work if we wish to support ATMARP in the kernel,
        !           239:  *   but this is enough for PVCs entered via the "route" command.
        !           240:  */
        !           241: 
        !           242: int
        !           243: atmresolve(rt, m, dst, desten)
        !           244: 
        !           245: register struct rtentry *rt;
        !           246: struct mbuf *m;
        !           247: register struct sockaddr *dst;
        !           248: register struct atm_pseudohdr *desten; /* OUT */
        !           249: 
        !           250: {
        !           251:        struct sockaddr_dl *sdl;
        !           252: 
        !           253:        if (m->m_flags & (M_BCAST|M_MCAST)) {
        !           254:                log(LOG_INFO, "atmresolve: BCAST/MCAST packet detected/dumped");
        !           255:                goto bad;
        !           256:        }
        !           257: 
        !           258:        if (rt == NULL) {
        !           259:                rt = RTALLOC1(dst, 0);
        !           260:                if (rt == NULL) goto bad; /* failed */
        !           261:                rt->rt_refcnt--;        /* don't keep LL references */
        !           262:                if ((rt->rt_flags & RTF_GATEWAY) != 0 || 
        !           263:                        (rt->rt_flags & RTF_LLINFO) == 0 ||
        !           264:                        /* XXX: are we using LLINFO? */
        !           265:                        rt->rt_gateway->sa_family != AF_LINK) {
        !           266:                                goto bad;
        !           267:                }
        !           268:        }
        !           269: 
        !           270:        /*
        !           271:         * note that rt_gateway is a sockaddr_dl which contains the 
        !           272:         * atm_pseudohdr data structure for this route.   we currently
        !           273:         * don't need any rt_llinfo info (but will if we want to support
        !           274:         * ATM ARP [c.f. if_ether.c]).
        !           275:         */
        !           276: 
        !           277:        sdl = SDL(rt->rt_gateway);
        !           278: 
        !           279:        /*
        !           280:         * Check the address family and length is valid, the address
        !           281:         * is resolved; otherwise, try to resolve.
        !           282:         */
        !           283: 
        !           284: 
        !           285:        if (sdl->sdl_family == AF_LINK && sdl->sdl_alen == sizeof(*desten)) {
        !           286:                bcopy(LLADDR(sdl), desten, sdl->sdl_alen);
        !           287:                return(1);      /* ok, go for it! */
        !           288:        }
        !           289: 
        !           290:        /*
        !           291:         * we got an entry, but it doesn't have valid link address
        !           292:         * info in it (it is prob. the interface route, which has
        !           293:         * sdl_alen == 0).    dump packet.  (fall through to "bad").
        !           294:         */
        !           295: 
        !           296: bad:
        !           297:        m_freem(m);
        !           298:        return(0);
        !           299: }
        !           300: #endif /* INET */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.