Annotation of kernel/bsd/netat/ddp_rtmp.c, revision 1.1

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) 1993-1998 Apple Computer, Inc.
        !            27:  *     All Rights Reserved.
        !            28:  *
        !            29:  *     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF APPLE COMPUTER, INC.
        !            30:  *     The copyright notice above does not evidence any actual or
        !            31:  *     intended publication of such source code.
        !            32:  */
        !            33: 
        !            34: #include <sysglue.h>
        !            35: 
        !            36: #include <at/appletalk.h>
        !            37: #include <at/ddp.h>
        !            38: #include <rtmp.h>
        !            39: #include <lap.h>
        !            40: 
        !            41: #include <at/at_lap.h>
        !            42: #include <at_ddp.h>
        !            43: #include <at_zip.h>
        !            44: #include <routing_tables.h>
        !            45: #include <atlog.h>
        !            46: 
        !            47: extern void *atalk_timeout();
        !            48: extern void atalk_untimeout();
        !            49: extern void rtmp_router_input();
        !            50: 
        !            51: /****************************************************************/
        !            52: /*                                                             */
        !            53: /*                                                             */
        !            54: /*                     RTMP Protocol                           */
        !            55: /*                                                             */
        !            56: /*                                                             */
        !            57: /****************************************************************/
        !            58: 
        !            59: 
        !            60: /* rtmp.c: , 1.6; 2/26/93; Apple Computer, Inc." */
        !            61: 
        !            62: 
        !            63: #define        NROUTERS2TRAK   8
        !            64: #define        FIFTYSECS       10
        !            65: #define NODE(r)                ((r)->ifARouter.atalk_node)
        !            66: #define NET(r)         ((r)->ifARouter.atalk_net)
        !            67: #define        INUSE(r)        (NODE(r))
        !            68: 
        !            69: void ddp_age_router();
        !            70: 
        !            71: 
        !            72: 
        !            73: static struct routerinfo {
        !            74:        struct atalk_addr ifARouter;
        !            75:        at_if_t           *ifID;
        !            76:        void              *tmo;
        !            77: } trackedrouters[NROUTERS2TRAK];
        !            78: 
        !            79: void trackrouter_rem_if(ifID)
        !            80: register at_if_t *ifID;
        !            81: {
        !            82:        register i;
        !            83:        register struct routerinfo *router;
        !            84: 
        !            85:        for (i = NROUTERS2TRAK; --i >= 0;) {
        !            86:                router = &trackedrouters[i];
        !            87:                if (trackedrouters[i].ifID == ifID) {
        !            88:                        atalk_untimeout(ddp_age_router, (caddr_t) router, router->tmo);
        !            89:                        break;
        !            90:                }
        !            91:        }
        !            92: }
        !            93: 
        !            94: 
        !            95: void routershutdown()
        !            96: {
        !            97:        register i;
        !            98: 
        !            99:        for (i = NROUTERS2TRAK; --i >= 0;) {
        !           100:                register struct routerinfo *router;
        !           101: 
        !           102:                router = &trackedrouters[i];
        !           103:                if (INUSE(router)) {
        !           104:                        atalk_untimeout(ddp_age_router, (caddr_t) router, router->tmo);
        !           105:                        bzero((caddr_t) router, sizeof(struct routerinfo));
        !           106:                }
        !           107:        }
        !           108: }
        !           109: 
        !           110: int router_added  = 0;
        !           111: int router_killed = 0;
        !           112: 
        !           113: 
        !           114: 
        !           115: void trackrouter(ifID, net, node)
        !           116: register at_if_t *ifID;
        !           117: register unsigned short        net;
        !           118: register unsigned char node;
        !           119: {
        !           120:        register struct routerinfo *unused = NULL;
        !           121:        register i;
        !           122: 
        !           123:        for (i = NROUTERS2TRAK; --i >= 0;) {
        !           124:                register struct routerinfo *router;
        !           125: 
        !           126:                router = &trackedrouters[(i + node) & (NROUTERS2TRAK-1)];
        !           127:                if ((NODE(router) == node) && (NET_VALUE(NET(router)) == net)) {
        !           128:                        atalk_untimeout(ddp_age_router, (caddr_t) router, router->tmo);
        !           129:                        router->tmo = atalk_timeout(ddp_age_router, (caddr_t) router, 50*SYS_HZ);
        !           130:                        unused = NULL;
        !           131:                        break;
        !           132:                }
        !           133:                else if (!INUSE(router) && !unused)
        !           134:                        unused = router;
        !           135:        }
        !           136:        if (unused) {
        !           137:                router_added++;
        !           138: 
        !           139:                unused->ifID = ifID;
        !           140:                NET_ASSIGN(NET(unused),  net);
        !           141:                NODE(unused) = node;
        !           142:                unused->tmo = atalk_timeout(ddp_age_router, (caddr_t) unused, 50*SYS_HZ);
        !           143:                if (NET_EQUAL0(NET(ifID)) && NODE(ifID) == 0) {
        !           144:                        NET_ASSIGN(NET(ifID), net);
        !           145:                        NODE(ifID) = node;
        !           146:                        ifID->ifRouterState = ROUTER_AROUND;
        !           147:                }
        !           148:        }
        !           149: }
        !           150: 
        !           151: 
        !           152: 
        !           153: void ddp_age_router(deadrouter)
        !           154: register struct routerinfo *deadrouter;
        !           155: {
        !           156:        register at_if_t *ourrouter = deadrouter->ifID;
        !           157: 
        !           158:        dPrintf(D_M_RTMP, D_L_INFO, 
        !           159:                ("ddp_age_router called deadrouter=%d:%d\n", NODE(deadrouter), NET(deadrouter)));
        !           160: 
        !           161:        router_killed++;
        !           162: 
        !           163:        if (NODE(ourrouter) == NODE(deadrouter) && 
        !           164:                        NET_EQUAL(NET(ourrouter), NET(deadrouter))) {
        !           165:                register unsigned long  atrandom = random();
        !           166:                register struct routerinfo *newrouter;
        !           167:                register i;
        !           168: 
        !           169:                bzero((caddr_t) deadrouter, sizeof(struct routerinfo));
        !           170:                for (i = NROUTERS2TRAK; --i >= 0;) {
        !           171:                        newrouter = &trackedrouters[(i + atrandom) & (NROUTERS2TRAK-1)];
        !           172:                        if (INUSE(newrouter))
        !           173:                                break;
        !           174:                        else
        !           175:                                newrouter = NULL;
        !           176:                }
        !           177:                if (newrouter) {
        !           178:                        NET_NET(NET(ourrouter), NET(newrouter));
        !           179:                        NODE(ourrouter) = NODE(newrouter);
        !           180:                }
        !           181:                else {
        !           182:                        void gorouterless();
        !           183:                        gorouterless(ourrouter);
        !           184:                }
        !           185:        } else
        !           186:                bzero((caddr_t) deadrouter, sizeof(struct routerinfo));
        !           187: }
        !           188: 
        !           189: 
        !           190: 
        !           191: /*
        !           192:  * This is the timeout function that is called after 50 seconds, 
        !           193:  * if no router packets come in. That way we won't send extended 
        !           194:  * frames to something that is not there. Untimeout is called if 
        !           195:  * an RTMP packet comes in so this routine will not be called.
        !           196:  */
        !           197: 
        !           198: static void gorouterless(int_ifID)
        !           199: {
        !           200:        register at_if_t   *ifID = (at_if_t *)int_ifID;
        !           201: 
        !           202:        ATTRACE(AT_MID_DDP, AT_SID_TIMERS, AT_LV_WARNING, FALSE,
        !           203:                "ddp_age_router entry : ARouter = 0x%x, RouterState = 0x%x",
        !           204:                ATALK_VALUE(ifID->ifARouter), ifID->ifRouterState, 0);
        !           205: 
        !           206:                switch (ifID->ifRouterState) {
        !           207:                case ROUTER_AROUND :
        !           208:                        ATALK_ASSIGN(ifID->ifARouter, 0, 0, 0);
        !           209:                        dPrintf(D_M_RTMP,D_L_INFO,
        !           210:                                ("rtmp.c Gorouterless!!!!!!!!\n"));
        !           211:                        ifID->ifThisCableStart = 2;
        !           212:                        ifID->ifThisCableEnd = 0xfffd;
        !           213:                        ifID->ifRouterState = NO_ROUTER;
        !           214:                        zip_control (ifID, ZIP_NO_ROUTER);
        !           215:                        break;
        !           216:                case ROUTER_WARNING :
        !           217:                        /* there was a router that we were ignoring...
        !           218:                         * now, even that's gone.  But we want to tackle the
        !           219:                         * case where another router may come up after all
        !           220:                         * of them have died...
        !           221:                         */
        !           222:                        ifID->ifRouterState = NO_ROUTER;
        !           223:                        break;
        !           224:                }
        !           225: }
        !           226: 
        !           227: 
        !           228: 
        !           229: void
        !           230: rtmp_input (mp, ifID)
        !           231: register gbuf_t        *mp;
        !           232: register at_if_t       *ifID;
        !           233: {
        !           234:        register at_net_al      this_net;
        !           235:        register at_net_al      range_start, range_end;
        !           236:        register at_ddp_t       *ddp = (at_ddp_t *)gbuf_rptr(mp);
        !           237:                                /* NOTE: there is an assumption here that the 
        !           238:                                 * DATA follows the header. */
        !           239:        register at_rtmp        *rtmp = (at_rtmp *)ddp->data;
        !           240: 
        !           241:        if (gbuf_type(mp) != MSG_DATA) {
        !           242:                /* If this is a M_ERROR message, DDP is shutting down, 
        !           243:                 * nothing to do here...If it's something else, we don't 
        !           244:                 * understand what it is
        !           245:                 */
        !           246:                gbuf_freem(mp);
        !           247:                return;
        !           248:        }
        !           249: 
        !           250:        if (!ifID) {
        !           251:                gbuf_freem(mp);
        !           252:                return;
        !           253:        }
        !           254:        if (gbuf_len(mp) < (DDP_X_HDR_SIZE + sizeof(at_rtmp))) {
        !           255:                gbuf_freem(mp);
        !           256:                return;
        !           257:        }
        !           258:        this_net = NET_VALUE(ifID->ifThisNode.atalk_net);
        !           259:        if (rtmp->at_rtmp_id_length  != 8) {
        !           260:                gbuf_freem(mp);
        !           261:                return;
        !           262:        }
        !           263: 
        !           264:        {
        !           265:                at_rtmp_tuple *tp;
        !           266:                tp = ((at_rtmp_tuple *)&rtmp->at_rtmp_id[1]);
        !           267:                range_start = NET_VALUE(tp->at_rtmp_net);
        !           268:                tp = ((at_rtmp_tuple *)&rtmp->at_rtmp_id[4]);
        !           269:                range_end = NET_VALUE(tp->at_rtmp_net);
        !           270: 
        !           271:                if (ifID->ifRouterState == ROUTER_AROUND) {
        !           272:                        if ((ifID->ifThisCableStart == range_start) &&
        !           273:                            (ifID->ifThisCableEnd == range_end)) {
        !           274:                                trackrouter(
        !           275:                                        ifID,
        !           276:                                        NET_VALUE(rtmp->at_rtmp_this_net),
        !           277:                                        rtmp->at_rtmp_id[0]
        !           278:                                );
        !           279:                        }
        !           280:                } else {
        !           281:                        /* There was no router around earlier, one
        !           282:                         * probably just came up.
        !           283:                         */
        !           284:                        if ((this_net >= DDP_STARTUP_LOW) && 
        !           285:                            (this_net <= DDP_STARTUP_HIGH)) {
        !           286:                                /* we're operating in the startup range,
        !           287:                                 * ignore the presence of router
        !           288:                                 */
        !           289:                                if (ifID->ifRouterState == NO_ROUTER) {
        !           290:                                        dPrintf(D_M_RTMP, D_L_STARTUP,
        !           291:                                                ("Warning: new router came up: invalid startup net/node\n"));
        !           292:                                        trackrouter(
        !           293:                                                ifID,
        !           294:                                                NET_VALUE(rtmp->at_rtmp_this_net),
        !           295:                                                rtmp->at_rtmp_id[0]
        !           296:                                        );
        !           297:                                        ifID->ifRouterState = ROUTER_WARNING;
        !           298:                                }
        !           299:                        } else {
        !           300:                                /* our address
        !           301:                                 * is not in startup range; Is our
        !           302:                                 * address good for the cable??
        !           303:                                 */
        !           304:                                if ((this_net >= range_start) &&
        !           305:                                    (this_net <= range_end)) {
        !           306:                                        /* Our address is in the range
        !           307:                                         * valid for this cable... Note
        !           308:                                         * the router address and then
        !           309:                                         * get ZIP rolling to get the
        !           310:                                         * zone info.
        !           311:                                         */
        !           312:                                        ifID->ifThisCableStart = range_start;
        !           313:                                        ifID->ifThisCableEnd = range_end;
        !           314:                                        trackrouter(
        !           315:                                                ifID,
        !           316:                                                NET_VALUE(rtmp->at_rtmp_this_net),
        !           317:                                                rtmp->at_rtmp_id[0]
        !           318:                                        );
        !           319:                                        zip_control(ifID, ZIP_LATE_ROUTER);
        !           320:                                } else {
        !           321:                                        /* Our address is not in the
        !           322:                                         * range valid for this cable..
        !           323:                                         * ignore presence of the 
        !           324:                                         * router
        !           325:                                         */
        !           326:                                        if (ifID->ifRouterState == NO_ROUTER) {
        !           327:                                                dPrintf(D_M_RTMP,D_L_ERROR, 
        !           328:                                                        ("Warning: new router came up: invalid net/node\n"));
        !           329:                                                trackrouter(
        !           330:                                                        ifID,
        !           331:                                                        NET_VALUE(rtmp->at_rtmp_this_net),
        !           332:                                                        rtmp->at_rtmp_id[0]
        !           333:                                                );
        !           334:                                                ifID->ifRouterState = 
        !           335:                                                        ROUTER_WARNING;
        !           336:                                        }
        !           337:                                }
        !           338:                        }
        !           339:                }
        !           340:        }
        !           341: 
        !           342:        gbuf_freem(mp);
        !           343:        return;
        !           344: }
        !           345: 
        !           346: 
        !           347: int    rtmp_init()
        !           348: {
        !           349:        bzero((caddr_t) trackedrouters, sizeof(struct routerinfo)*NROUTERS2TRAK);
        !           350: 
        !           351:        if (!ROUTING_MODE) 
        !           352:                return((int)rtmp_input);
        !           353: 
        !           354:        else 
        !           355:                return ((int)rtmp_router_input);
        !           356: }
        !           357: 
        !           358: 

unix.superglobalmegacorp.com

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