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

unix.superglobalmegacorp.com

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