Annotation of XNU/bsd/netat/ddp.save, revision 1.1

1.1     ! root        1: /* From ddp.c:
        !             2: 
        !             3:        ddp_shrink_hdr()
        !             4:        ddp_extend_hdr()
        !             5: 
        !             6:        Saved from xnu/bsd/bsd/netat/ddp.c on 4/14/99.
        !             7: */
        !             8: 
        !             9: #ifdef NOT_USED
        !            10: /* This routine shrinks the ddp header from long to short, 
        !            11:  * It also prepends ALAP header and fills up some of the
        !            12:  * fields as appropriate.
        !            13:  */
        !            14: static at_ddp_short_t  *ddp_shrink_hdr (mp)
        !            15: register gbuf_t        *mp;
        !            16: {
        !            17:        register at_ddp_t       *ddp;
        !            18:        register at_ddp_short_t *ddp_short;
        !            19:        register at_llap_hdr_t  *llap;
        !            20:        gbuf_t *newmp;
        !            21: 
        !            22:        if ((newmp = (gbuf_t *)gbuf_copym((gbuf_t *) mp)) == (gbuf_t *)NULL)
        !            23:            return ((at_ddp_short_t *)NULL);
        !            24:        gbuf_freem(mp);
        !            25:        mp = newmp;
        !            26: 
        !            27:        ddp = (at_ddp_t *)gbuf_rptr(mp);
        !            28:        gbuf_rinc(mp,((DDP_X_HDR_SIZE - DDP_HDR_SIZE) - LLAP_HDR_SIZE));
        !            29:        llap = (at_llap_hdr_t *)gbuf_rptr(mp);
        !            30:        ddp_short = (at_ddp_short_t *)(gbuf_rptr(mp) + LLAP_HDR_SIZE);
        !            31: 
        !            32:        llap->destination = ddp->dst_node;
        !            33:        llap->type = LLAP_TYPE_DDP;
        !            34:        ddp_short->length = ddp->length - (DDP_X_HDR_SIZE - DDP_HDR_SIZE);
        !            35:        ddp_short->unused = 0;
        !            36:        return ((at_ddp_short_t *)mp);
        !            37: }
        !            38: 
        !            39: 
        !            40: /* mp points to message of the form {llap, short ddp, ...}.
        !            41:  * Get rid of llap, extend ddp header to make it of the form
        !            42:  * {extended ddp, ... }
        !            43:  */
        !            44: static gbuf_t  *ddp_extend_hdr(mp)
        !            45: register gbuf_t        *mp;
        !            46: {
        !            47:        register at_llap_hdr_t  *llap;
        !            48:        register at_ddp_short_t *ddp_short;
        !            49:        register at_ddp_t       *ddp;
        !            50:        char            buf[DDP_HDR_SIZE + LLAP_HDR_SIZE];
        !            51:        gbuf_t          *m1, *m2;
        !            52: 
        !            53:        /* We need to remove the llap header from the packet and extend the
        !            54:         * short DDP header in to a long one.  5 bytes of additional space
        !            55:         * is required in effect, but we can not afford to put these 5 bytes
        !            56:         * in a separate buffer, since the ddp buffer would end up being
        !            57:         * fragmented into two pieces, which is a no-no.  So, we first get
        !            58:         * rid of the llap and ddp short headers and then add the extended
        !            59:         * header.
        !            60:         */
        !            61:        
        !            62:        /* Assuming that the llap and ddp short headers are placed next
        !            63:         * to each other in the same buffer
        !            64:         */
        !            65:        bcopy(gbuf_rptr(mp), buf, LLAP_HDR_SIZE + DDP_HDR_SIZE);
        !            66:        m1 = ddp_adjmsg(mp, LLAP_HDR_SIZE+DDP_HDR_SIZE) ? mp : 0;
        !            67: 
        !            68:        /* If the message did not contain any ddp data bytes, then m would
        !            69:         * be NULL at this point... and we can't just grow a NULL message, 
        !            70:         * we need to ALLOC a new one.
        !            71:         */
        !            72:        if (m1) {
        !            73:                if ((m2 = (gbuf_t *)ddp_growmsg(m1, -DDP_X_HDR_SIZE)) == NULL) {
        !            74:                        dPrintf(D_M_DDP, D_L_WARNING,
        !            75:                                ("Dropping packet - no bufs to extend hdr"));
        !            76:                        at_ddp_stats.rcv_dropped_nobuf++;
        !            77:                        gbuf_freem(m1);
        !            78:                        return(NULL);
        !            79:                }
        !            80:        } else
        !            81:                /* Original message mp has already been freed by ddp_adjmsg if we
        !            82:                 * managed to arrive here... this case occurs only when the
        !            83:                 * message mp did not contain any ddp data bytes, only lap and
        !            84:                 * ddp headers
        !            85:                 */
        !            86:                if ((m2 = gbuf_alloc(AT_WR_OFFSET+DDP_X_HDR_SIZE, PRI_MED)) == NULL) {
        !            87:                        dPrintf(D_M_DDP,D_L_WARNING,
        !            88:                                ("Packet (no data) dropped - no bufs to extend hdr"));
        !            89:                        at_ddp_stats.rcv_dropped_nobuf++;
        !            90:                        return(NULL);
        !            91:                } else {
        !            92:                        gbuf_rinc(m2,AT_WR_OFFSET);
        !            93:                        gbuf_wset(m2,DDP_X_HDR_SIZE);
        !            94:                }
        !            95:        
        !            96:        /* By the time we arrive here, m2 points to message of the form
        !            97:         * {Extended DDP, ... }
        !            98:         * mp and m1 are either non-existent or irrelevant.
        !            99:         */
        !           100:        ddp = (at_ddp_t *)gbuf_rptr(m2);
        !           101:        llap = (at_llap_hdr_t *)buf;
        !           102:        ddp_short = (at_ddp_short_t *)(buf + LLAP_HDR_SIZE);
        !           103: 
        !           104:        ddp->unused = ddp->hopcount = 0;
        !           105:        ddp->length = ddp_short->length + DDP_X_HDR_SIZE - DDP_HDR_SIZE;
        !           106:        UAS_ASSIGN(ddp->checksum, 0);
        !           107:        NET_NET(ddp->dst_net, ifID_home->ifThisNode.atalk_net);
        !           108:        NET_NET(ddp->src_net, ifID_home->ifThisNode.atalk_net);
        !           109:        ddp->src_node = llap->source;
        !           110:        ddp->dst_node = llap->destination;
        !           111:        ddp->dst_socket = ddp_short->dst_socket;
        !           112:        ddp->src_socket = ddp_short->src_socket;
        !           113:        ddp->type = ddp_short->type;
        !           114:        return (m2);
        !           115: }
        !           116: #endif
        !           117: 
        !           118: From sys_dep.c:
        !           119: 
        !           120: #ifdef _AIX  /* This AIX code (to the end of this file) is no longer supported. */
        !           121: 
        !           122: int ATsocket(proto)  /* AIX version */
        !           123:        int proto;
        !           124: {
        !           125:        int err, rc = -1;
        !           126: 
        !           127:        if (sys_ATsocket)
        !           128:                rc = (*sys_ATsocket)(proto, &err, 0);
        !           129:        else
        !           130:                err = ENXIO;
        !           131:        if (err)
        !           132:                setuerror(err);
        !           133:        return rc;
        !           134: }
        !           135: 
        !           136: int ATgetmsg(fd, ctlptr, datptr, flags)  /* AIX version */
        !           137:        int fd;
        !           138:        void *ctlptr;
        !           139:        void *datptr;
        !           140:        int *flags;
        !           141: {
        !           142:        int err, rc = -1;
        !           143: 
        !           144:        if (sys_ATgetmsg)
        !           145:                rc = (*sys_ATgetmsg)(fd, ctlptr, datptr, flags, &err, 0);
        !           146:        else
        !           147:                err = ENXIO;
        !           148:        if (err)
        !           149:                setuerror(err);
        !           150:        return rc;
        !           151: }
        !           152: 
        !           153: int ATputmsg(fd, ctlptr, datptr, flags)  /* AIX version */
        !           154:        int fd;
        !           155:        void *ctlptr;
        !           156:        void *datptr;
        !           157:        int flags;
        !           158: {
        !           159:        int err, rc = -1;
        !           160: 
        !           161:        if (sys_ATputmsg)
        !           162:                rc = (*sys_ATputmsg)(fd, ctlptr, datptr, flags, &err, 0);
        !           163:        else
        !           164:                err = ENXIO;
        !           165:        if (err)
        !           166:                setuerror(err);
        !           167:        return rc;
        !           168: }
        !           169: 
        !           170: int ATPsndreq(fd, buf, len, nowait)   /* AIX version */
        !           171:        int fd;
        !           172:        unsigned char *buf;
        !           173:        int len;
        !           174:        int nowait;
        !           175: {
        !           176:        int err, rc = -1;
        !           177: 
        !           178:        if (sys_ATPsndreq)
        !           179:                rc = (*sys_ATPsndreq)(fd, buf, len, nowait, &err, 0);
        !           180:        else
        !           181:                err = ENXIO;
        !           182:        if (err)
        !           183:                setuerror(err);
        !           184:        return rc;
        !           185: }
        !           186: 
        !           187: int ATPsndrsp(fd, respbuff, resplen, datalen)   /* AIX version */
        !           188:        int fd;
        !           189:        unsigned char *respbuff;
        !           190:        int resplen;
        !           191:        int datalen;
        !           192: {
        !           193:        int err, rc = -1;
        !           194: 
        !           195:        if (sys_ATPsndrsp)
        !           196:                rc = (*sys_ATPsndrsp)(fd, respbuff, resplen, datalen, &err, 0);
        !           197:        else
        !           198:                err = ENXIO;
        !           199:        if (err)
        !           200:                setuerror(err);
        !           201:        return rc;
        !           202: }
        !           203: 
        !           204: int ATPgetreq(fd, buf, buflen)  /* AIX version */
        !           205:        int fd;
        !           206:        unsigned char *buf;
        !           207:        int buflen;
        !           208: {
        !           209:        int err, rc = -1;
        !           210: 
        !           211:        if (sys_ATPgetreq)
        !           212:                rc = (*sys_ATPgetreq)(fd, buf, buflen, &err, 0);
        !           213:        else
        !           214:                err = ENXIO;
        !           215:        if (err)
        !           216:                setuerror(err);
        !           217:        return rc;
        !           218: }
        !           219: 
        !           220: int ATPgetrsp(fd, bdsp)  /* AIX version */
        !           221:        int fd;
        !           222:        unsigned char *bdsp;
        !           223: {
        !           224:        int err, rc = -1;
        !           225: 
        !           226:        if (sys_ATPgetrsp)
        !           227:                rc = (*sys_ATPgetrsp)(fd, bdsp, &err, 0);
        !           228:        else
        !           229:                err = ENXIO;
        !           230:        if (err)
        !           231:                setuerror(err);
        !           232:        return rc;
        !           233: }
        !           234: 
        !           235: void *atalk_kalloc(size)   /* AIX version */
        !           236:        int size;
        !           237: {
        !           238:      return (void *)xmalloc(size, 2, pinned_heap);
        !           239: }
        !           240: 
        !           241: void atalk_kfree(buf)   /* AIX version */
        !           242:        void *buf;
        !           243: {
        !           244:        xmfree(buf, pinned_heap);
        !           245: }
        !           246: 
        !           247: int atalk_closeref(fp, grefp)   /* AIX version */
        !           248:        struct file *fp;
        !           249:        gref_t **grefp;
        !           250: {
        !           251:        *grefp = (gref_t *)fp->f_data;
        !           252:        fp->f_data = 0;
        !           253:        return 0;
        !           254: }
        !           255: 
        !           256: int atalk_openref(gref, retfd, proc)  /* AIX version */
        !           257:        gref_t *gref;
        !           258:        int *retfd;
        !           259:        void *proc;
        !           260: {
        !           261: extern int _ATrw(), _ATioctl(), _ATselect(), _ATclose(), _ATstat();
        !           262: static struct fileops fileops = {_ATrw, _ATioctl, _ATselect, _ATclose, _ATstat};
        !           263:        int err, fd;
        !           264:        struct file *fp;
        !           265:        void *crp;
        !           266: 
        !           267:        crp = (void *)crref();
        !           268: #ifdef _AIX
        !           269:        if ((err = ufdcreate(FREAD|FWRITE,
        !           270:                        &fileops, 0, DTYPE_OTHER, &fd, crp)) != 0)
        !           271: #else
        !           272:        if ((err = ufdcreate(FREAD|FWRITE,
        !           273:                        &fileops, 0, DTYPE_ATALK, &fd, crp)) != 0)
        !           274: #endif
        !           275:                return err;
        !           276:        *retfd = fd;
        !           277:        fp = U.U_ufd[fd].fp;
        !           278:        fp->f_data = (void *)gref;
        !           279:        gref->next = (void *)fp;
        !           280:        return 0;
        !           281: }
        !           282: 
        !           283: int atalk_getref(fp, fd, grefp, proc)  /* AIX version */
        !           284:        struct file *fp;
        !           285:        int fd;
        !           286:        gref_t **grefp;
        !           287:        struct proc *proc;
        !           288: {
        !           289:        if (fp == 0) {
        !           290:                if ((fd < 0) || (fd > U.U_maxofile) || ((fp = U.U_ufd[fd].fp) == 0)) {
        !           291:                        *grefp = (gref_t *)0;
        !           292:                        return EBADF;
        !           293:                }
        !           294:        }
        !           295:        if ((*grefp = (gref_t *)fp->f_data) == 0)
        !           296:                return EBADF;
        !           297:        return 0;
        !           298: }
        !           299: 
        !           300: gbuf_t *gbuf_alloc(size, pri)  /* AIX version */
        !           301:        int size;
        !           302:        int pri;
        !           303: {
        !           304:        gbuf_t *m;
        !           305: 
        !           306:        m = (size > MHLEN) ? (gbuf_t *)m_getclustm(M_DONTWAIT, MSG_DATA, size)
        !           307:                : (gbuf_t *)m_gethdr(M_DONTWAIT, MSG_DATA);
        !           308: #ifdef APPLETALK_DEBUG
        !           309:        kprintf("gbuf_alloc: for size = %d m=%x\n", size, m);
        !           310: #endif
        !           311:        gbuf_next(m) = 0;
        !           312:        gbuf_cont(m) = 0;
        !           313:        gbuf_wset(m,0);
        !           314:        return m;
        !           315: }
        !           316: 
        !           317: void gbuf_freeb(m)  /* AIX version */
        !           318:        gbuf_t *m;
        !           319: {
        !           320:        if (m)
        !           321:                m_free(m);
        !           322: }
        !           323: 
        !           324: static struct trb *trb_freehead = 0;
        !           325: static struct trb *trb_freetail = 0;
        !           326: static struct trb *trb_pendhead = 0;
        !           327: static int trb_cnt = 0;
        !           328: static atlock_t trb_lock;
        !           329: 
        !           330: static void atalk_rem_timeoutcf()  /* AIX version */
        !           331: {
        !           332:        register int s;
        !           333:        register struct trb *trb;
        !           334:        register struct trb *tmp_freehead, *tmp_pendhead;
        !           335: 
        !           336:        ATDISABLE(s, trb_lock);
        !           337:        tmp_freehead = trb_freehead;
        !           338:        trb_freehead = 0;
        !           339:        tmp_pendhead = trb_pendhead;
        !           340:        trb_pendhead = 0;
        !           341:        trb_cnt = 0;
        !           342:        ATENABLE(s, trb_lock);
        !           343:        while ((trb = tmp_pendhead) != 0) {
        !           344:                tmp_pendhead = trb->to_next;
        !           345:                while (tstop(trb));
        !           346:                tfree(trb);
        !           347:        }
        !           348:        while ((trb = tmp_freehead) != 0) {
        !           349:                tmp_freehead = trb->to_next;
        !           350:                tfree(trb);
        !           351:        }
        !           352:        dPrintf(D_M_ATP,D_L_ERROR, "atalk: timer stopped!\n",0,0,0,0,0);
        !           353: }
        !           354: 
        !           355: static void atalk_timeoutcf(cnt)  /* AIX version */
        !           356:        int cnt;
        !           357: {
        !           358:        register int i;
        !           359:        register struct trb *trb;
        !           360: 
        !           361:        if (trb_freehead == 0) {
        !           362:                for (i=0; i < cnt-1; i++) {
        !           363:                        trb = (struct trb *)talloc();
        !           364:                        trb->to_next = trb_freehead;
        !           365:                        trb_freehead = trb;
        !           366:                        if (!i) trb_freetail = trb;
        !           367:                        trb_cnt++;
        !           368:                }
        !           369:        }
        !           370:        ATLOCKINIT(trb_lock);
        !           371: }
        !           372: 
        !           373: static void atalk_clock(trb)  /* AIX version */
        !           374:        register struct trb *trb;
        !           375: {
        !           376:        register int s;
        !           377:        register struct trb *next;
        !           378:        void (*tof)();
        !           379:        void *arg;
        !           380: 
        !           381:        ATDISABLE(s, trb_lock);
        !           382:        if (trb_pendhead && trb->func) {
        !           383:                /*
        !           384:                 * remove the timeout from the pending queue
        !           385:                 */
        !           386:                if (trb_pendhead == trb)
        !           387:                        trb_pendhead = trb->to_next;
        !           388:                else {
        !           389:                        for (next=trb_pendhead; next->to_next; next=next->to_next) {
        !           390:                                if (next->to_next == trb) {
        !           391:                                        next->to_next = trb->to_next;
        !           392:                                        trb->func = 0;
        !           393:                                        break;
        !           394:                                }
        !           395:                        }
        !           396:                        if (trb->func) {
        !           397:                                dPrintf(D_M_ATP,D_L_WARNING,
        !           398:                                        "atalk_clock: %d,%x,%x\n", trb_cnt,trb,trb_pendhead,0,0);
        !           399:                                /*
        !           400:                                 * we have not found the trb in the pending list - something
        !           401:                                 * has gone wrong here. maybe the trb has been returned to
        !           402:                                 * the free list; in which case, we should simply ignore
        !           403:                                 * this timeout event!
        !           404:                                 */
        !           405:                                for (next=trb_freehead; next; next=next->to_next) {
        !           406:                                        if (next == trb)
        !           407:                                        {
        !           408:                                                ATENABLE(s, trb_lock);
        !           409:                                                return;
        !           410:                                        }
        !           411:                                }
        !           412:                                /*
        !           413:                                 * the trb is not in the free list either - something has
        !           414:                                 * really gone wacky here! all we can do now is put the
        !           415:                                 * trb back into the free list and hope that it will be ok.
        !           416:                                 */
        !           417:                                trb->to_next = 0;
        !           418:                                if (trb_freehead)
        !           419:                                        trb_freetail->to_next = trb;
        !           420:                                else
        !           421:                                        trb_freehead = trb;
        !           422:                                trb_freetail = trb;
        !           423:                                trb_cnt++;
        !           424:                                ATENABLE(s, trb_lock);
        !           425:                                return;
        !           426:                        }
        !           427:                }
        !           428: 
        !           429:                /*
        !           430:                 * process the timeout
        !           431:                 */
        !           432:                trb->func = 0;
        !           433:                trb->to_next = 0;
        !           434:                tof = trb->tof;
        !           435:                trb->tof = 0;
        !           436:                arg = (void *)trb->func_data;
        !           437:                trb->func_data = 999;
        !           438:                if (trb_freehead)
        !           439:                        trb_freetail->to_next = trb;
        !           440:                else
        !           441:                        trb_freehead = trb;
        !           442:                trb_freetail = trb;
        !           443:                trb_cnt++;
        !           444:                ATENABLE(s, trb_lock);
        !           445:                if (tof) {
        !           446:                        dPrintf(D_M_ATP,D_L_VERBOSE, "atalk_clock: func=%x, arg=%x, %d\n",
        !           447:                                tof,arg,trb_cnt,0,0);
        !           448:                        (*tof)(arg);
        !           449:                } else {
        !           450:                        dPrintf(D_M_ATP,D_L_ERROR, "atalk_clock: func=%x, arg=%x, %d\n",
        !           451:                                tof,arg,trb_cnt,0,0);
        !           452:                }
        !           453:        } else
        !           454:                ATENABLE(s, trb_lock);
        !           455: }
        !           456: 
        !           457: void *atalk_timeout(func, arg, ticks)  /* AIX version */
        !           458:        void (*func)();
        !           459:        void *arg;
        !           460:        int ticks;
        !           461: {
        !           462:        register int s;
        !           463:        register struct trb *trb;
        !           464: 
        !           465:        dPrintf(D_M_ATP,D_L_VERBOSE,
        !           466:                "atalk_timeout: func=%x,arg=%x,time=%d, %d,%x\n", func,arg,ticks,trb_cnt,trb_pendhead);
        !           467:        /*
        !           468:         * set up the timeout request
        !           469:         */
        !           470:        ATDISABLE(s, trb_lock);
        !           471:        if ((trb = trb_freehead) == 0) {
        !           472:                ATENABLE(s, trb_lock);
        !           473:                dPrintf(D_M_ATP,D_L_WARNING,
        !           474:                        "atalk_timeout: NO TRB! time=%d, %d\n", ticks,trb_cnt,0,0,0);
        !           475:                return 0;
        !           476:        }
        !           477:        trb_freehead = trb->to_next;
        !           478:        trb->to_next = trb_pendhead;
        !           479:        trb_pendhead = trb;
        !           480:        trb_cnt--;
        !           481:        trb->timeout.it_value.tv_sec  =  ticks / HZ;
        !           482:        trb->timeout.it_value.tv_nsec = (ticks % HZ) * (NS_PER_SEC / HZ);
        !           483:        trb->knext     = 0;
        !           484:        trb->kprev     = 0;
        !           485:        trb->flags     = 0;
        !           486:        trb->tof       = func;
        !           487:        trb->func      = (void (*)())atalk_clock;
        !           488:        trb->func_data = (ulong)arg;
        !           489:        trb->ipri      = PL_IMP;
        !           490:        trb->id        = -1;
        !           491: 
        !           492:        /*
        !           493:         * start the timeout
        !           494:         */
        !           495:        ATENABLE(s, trb_lock);
        !           496:        tstart(trb);
        !           497:        return (void *)trb;
        !           498: }
        !           499: 
        !           500: void atalk_untimeout(func, arg, trb)  /* AIX version */
        !           501:        void (*func)();
        !           502:        void *arg;
        !           503:        register struct trb *trb;
        !           504: {
        !           505:        register int s;
        !           506:        register struct trb *next;
        !           507: 
        !           508:        dPrintf(D_M_ATP,D_L_VERBOSE,
        !           509:                "atalk_untimeout: func=%x,arg=%x, %d\n", func,arg,trb_cnt,0,0);
        !           510: 
        !           511:        ATDISABLE(s, trb_lock);
        !           512:        if (trb == 0) {
        !           513:                for (trb=trb_pendhead; trb; trb=trb->to_next) {
        !           514:                        if ((func == trb->tof) && (arg == (void *)trb->func_data))
        !           515:                                break;
        !           516:                }
        !           517:        }
        !           518:        if (trb && (trb->func == (void (*)())atalk_clock)
        !           519:                        && (func == trb->tof) && (arg == (void *)trb->func_data)) {
        !           520:                trb->func_data = 999;
        !           521:                if (!(trb->flags & T_PENDING))
        !           522:                        {
        !           523:                        trb->tof = 0;
        !           524:                        ATENABLE(s, trb_lock);
        !           525:                        return;
        !           526:                        }
        !           527:                trb->func = 0;
        !           528:                while (tstop(trb));
        !           529:                if (trb_pendhead == trb)
        !           530:                        trb_pendhead = trb->to_next;
        !           531:                else {
        !           532:                        for (next=trb_pendhead; next->to_next != trb; next=next->to_next) {
        !           533:                                if (next->to_next == 0) {
        !           534:                                        ATENABLE(s, trb_lock);
        !           535:                                        dPrintf(D_M_ATP,D_L_WARNING,
        !           536:                                                "atalk_untimeout: UNKNOWN TRB %x...\n",trb,0,0,0,0);
        !           537:                                        return;
        !           538:                                }
        !           539:                        }
        !           540:                        next->to_next = trb->to_next;
        !           541:                }
        !           542:                trb->to_next = 0;
        !           543:                trb_freetail->to_next = trb;
        !           544:                trb_freetail = trb;
        !           545:                trb_cnt++;
        !           546:        }
        !           547:        ATENABLE(s, trb_lock);
        !           548: }
        !           549: 
        !           550: int config_atalk(dev, cmd, uiop)  /* AIX only */
        !           551: dev_t dev;
        !           552: int cmd;
        !           553: void *uiop;
        !           554: {
        !           555:        static int loaded = 0;
        !           556:        int err, nest;
        !           557: 
        !           558:        err = 0;
        !           559:        nest = lockl(&kernel_lock, LOCK_SHORT);
        !           560: 
        !           561:        if (cmd == CFG_INIT) {
        !           562:                if (loaded)
        !           563:                        goto out;
        !           564:                vm_protect(0, 4096, 3);
        !           565:                atalk_timeoutcf(256);
        !           566:                atalk_load();
        !           567:                loaded = 1;
        !           568: 
        !           569:        } else if (cmd == CFG_TERM) {
        !           570:                if (!loaded)
        !           571:                        goto out;
        !           572:                atalk_rem_timeoutcf();
        !           573:                atalk_unload();
        !           574:                loaded = 0;
        !           575: 
        !           576:        } else
        !           577:                err =  EINVAL;
        !           578: 
        !           579: out:
        !           580:        if (nest != LOCK_NEST)
        !           581:                unlockl(&kernel_lock);
        !           582:        return(err);
        !           583: }
        !           584: 
        !           585: #endif
        !           586: 
        !           587: From sys_glue.c:
        !           588: 
        !           589: #ifdef _AIX  /* AIX code, to the end of this file, is no longer supported. */
        !           590: 
        !           591: int _ATselect(fp, corl, reqevents, retevents, notify) /* AIX version */
        !           592:        void *fp;
        !           593:        int corl;
        !           594:        unsigned short reqevents;
        !           595:        unsigned short *retevents;
        !           596:        void (*notify)();
        !           597: {
        !           598:        int s, err, rc = 0;
        !           599:        gref_t *gref;
        !           600:        unsigned short sevents = 0;
        !           601: 
        !           602:        if ((err = atalk_getref(fp, 0, &gref, 0)) != 0)
        !           603:                return err;
        !           604: 
        !           605:        ATDISABLE(s, gref->lock);
        !           606:        if (reqevents & POLLIN) {
        !           607:                if (gref->rdhead || (gref->readable && (*gref->readable)(gref)))
        !           608:                        sevents |= POLLIN;
        !           609:        }
        !           610: 
        !           611:        if (reqevents & POLLOUT) {
        !           612:                if (gref->writeable) {
        !           613:                        if ((*gref->writeable)(gref))
        !           614:                                sevents |= POLLOUT;
        !           615:                } else
        !           616:                        sevents |= POLLOUT;
        !           617:        }
        !           618: 
        !           619:        if ((sevents == 0) && ((reqevents & POLLSYNC) == 0)) {
        !           620:                if (rc = selreg(corl, 99, gref, reqevents, notify)) {
        !           621:                        ATENABLE(s, gref->lock);
        !           622:                        goto l_done;
        !           623:                }
        !           624: 
        !           625:           if (reqevents & POLLIN) {
        !           626:                        if (gref->rdhead || (gref->readable && (*gref->readable)(gref)))
        !           627:                                sevents |= POLLIN;
        !           628:                        else
        !           629:                                gref->sevents |= POLLIN;
        !           630:           }
        !           631: 
        !           632:           if (reqevents & POLLOUT) {
        !           633:                        if (gref->writeable) {
        !           634:                                if ((*gref->writeable)(gref))
        !           635:                                        sevents |= POLLOUT;
        !           636:                                else
        !           637:                                        gref->sevents |= POLLOUT;
        !           638:                        } else
        !           639:                                sevents |= POLLOUT;
        !           640:           }
        !           641:      }
        !           642:        ATENABLE(s, gref->lock);
        !           643:      *retevents = sevents;
        !           644: 
        !           645: l_done:
        !           646:        return rc;
        !           647: }
        !           648: #endif  /* end AIX section */
        !           649: 
        !           650: From drv_dep.c:
        !           651: 
        !           652: 
        !           653: 
        !           654: 
        !           655: #ifdef _AIX
        !           656: /* AIX section to end of file (not supported) */
        !           657: 
        !           658: /* from beginning of file ... */
        !           659: #include <sys/cdli.h>
        !           660: #include <sys/ndd.h>
        !           661: static struct ns_8022 elap_link;     /* The SNAP header description */
        !           662: static struct ns_user elap_user;     /* The interface to the demuxer */
        !           663: 
        !           664: int
        !           665: pat_ifpresent(name) /* AIX */
        !           666:        char *name;
        !           667: {
        !           668:        return (int)ifunit(name);
        !           669: }
        !           670: 
        !           671: int 
        !           672: pat_output(pat_id, mlist, dst_addr, type) /* AIX */
        !           673:        int     pat_id;
        !           674:        gbuf_t *mlist;
        !           675:        unsigned char *dst_addr;
        !           676:        int     type;
        !           677: {
        !           678:        int len;
        !           679:        pat_unit_t *patp;
        !           680:        gbuf_t *m, *m_prev, *new_mlist, *m_temp;
        !           681:        struct ndd *nddp;
        !           682:        short size;
        !           683:        enet_header_t *enet_header;
        !           684:        llc_header_t *llc_header;
        !           685: 
        !           686:        patp = (pat_unit_t *)&pat_units[pat_id];
        !           687:        if (patp->state != PAT_ONLINE) {
        !           688:                gbuf_freel(mlist);
        !           689:                return ENOTREADY;
        !           690:        }
        !           691: 
        !           692:        if (patp->xtype == IFTYPE_NULLTALK) {
        !           693:                gbuf_freel(mlist);
        !           694:                return 0;
        !           695:        }
        !           696: 
        !           697:        nddp = (void *)patp->nddp;
        !           698:        new_mlist = 0;
        !           699: 
        !           700:   for (m = mlist; m; m = mlist) {
        !           701:        mlist = gbuf_next(m);
        !           702:        gbuf_next(m) = 0;
        !           703: 
        !           704:        gbuf_prepend(m,ENET_LLC_SIZE);
        !           705:        if (m == 0) {
        !           706:                if (mlist)
        !           707:                        gbuf_freel(mlist);
        !           708:                if (new_mlist)
        !           709:                        gbuf_freel(new_mlist);
        !           710:                return 0;
        !           711:        }
        !           712: 
        !           713:        enet_header = (enet_header_t *)gbuf_rptr(m);
        !           714:        bcopy(dst_addr, enet_header->dst, sizeof(enet_header->dst));
        !           715:        bcopy(patp->xaddr, enet_header->src, sizeof(enet_header->src));
        !           716:        size = gbuf_msgsize(m);
        !           717:        enet_header->len = size - sizeof(enet_header_t);
        !           718:        llc_header = (llc_header_t *)(gbuf_rptr(m)+sizeof(enet_header_t));
        !           719:        *llc_header = (type == AARP_AT_TYPE) ? snap_hdr_aarp : snap_hdr_at;
        !           720: 
        !           721:        m->m_pkthdr.len = size;
        !           722:        m->m_pkthdr.rcvif = 0;
        !           723: 
        !           724:        if (new_mlist)
        !           725:                gbuf_next(m_prev) = m;
        !           726:        else
        !           727:                new_mlist = m;
        !           728:        m_prev = m;
        !           729:        pktsOut++;
        !           730:   }
        !           731: 
        !           732:        if (new_mlist)
        !           733:                (*nddp->ndd_output)(nddp, new_mlist);
        !           734: 
        !           735:        return 0;
        !           736: }
        !           737: 
        !           738: int
        !           739: pat_online (ifName, ifType)  /* AIX */
        !           740:        char    *ifName;
        !           741:        char    *ifType;
        !           742: {
        !           743:        void pat_input();
        !           744:        int pat_id;
        !           745:        pat_unit_t *patp;
        !           746:        struct ndd *nddp;
        !           747:        char ns_name[8];
        !           748: 
        !           749:        if ((pat_id = pat_ID(ifName)) == -1)
        !           750:                return (-1);
        !           751:        patp = &pat_units[pat_id];
        !           752: 
        !           753:        if (patp->xtype == IFTYPE_ETHERTALK) {
        !           754:                ns_name[0] = ifName[0];
        !           755:                ns_name[1] = 'n';
        !           756:                strcpy(&ns_name[2], &ifName[1]);
        !           757:        } else if (patp->xtype == IFTYPE_NULLTALK) {
        !           758:                patp->xaddrlen = 6;
        !           759:                bzero(patp->xaddr, patp->xaddrlen);
        !           760:                if (ifType)
        !           761:                        *ifType = patp->xtype;
        !           762:                patp->nddp = (void *)0;
        !           763:                patp->state  = PAT_ONLINE;
        !           764:                at_statep->flags |= AT_ST_IF_CHANGED;
        !           765:                return (pat_id);
        !           766:        } else
        !           767:                return -1;
        !           768: 
        !           769:        if (ns_alloc(ns_name, &nddp))
        !           770:                return -1;
        !           771: 
        !           772:        bzero(&elap_user, sizeof(elap_user));
        !           773:        elap_user.isr = pat_input;
        !           774:        elap_user.pkt_format = NS_HANDLE_HEADERS|NS_INCLUDE_MAC;
        !           775: 
        !           776:        elap_link.filtertype = NS_8022_LLC_DSAP_SNAP;
        !           777:        elap_link.orgcode[0] = 0;
        !           778:        elap_link.orgcode[2] = 0;
        !           779:        elap_link.dsap = DSAP_SNAP;
        !           780:        elap_link.ethertype = 0x80f3;   /* AARP SNAP code */
        !           781:        if (ns_add_filter(nddp, &elap_link, sizeof(elap_link), &elap_user))
        !           782:                return -1;
        !           783: 
        !           784:        elap_link.orgcode[0] = 0x08;
        !           785:        elap_link.orgcode[2] = 0x07;
        !           786:        elap_link.ethertype = 0x809b;   /* DDP SNAP code */
        !           787:        if (ns_add_filter(nddp, &elap_link, sizeof(elap_link), &elap_user)) {
        !           788:                elap_link.orgcode[0] = 0;
        !           789:                elap_link.orgcode[2] = 0;
        !           790:                elap_link.ethertype = 0x80f3;   /* AARP SNAP code */
        !           791:                (void)ns_del_filter(nddp, &elap_link, sizeof(elap_link));
        !           792:                return -1;
        !           793:        }
        !           794: 
        !           795:        patp->xaddrlen = nddp->ndd_addrlen;
        !           796:        bcopy(nddp->ndd_physaddr, patp->xaddr, patp->xaddrlen);
        !           797: 
        !           798:        if (ifType)
        !           799:                *ifType = patp->xtype;
        !           800: 
        !           801:        patp->nddp = (void *)nddp;
        !           802:        patp->state  = PAT_ONLINE;
        !           803:        at_statep->flags |= AT_ST_IF_CHANGED;
        !           804: 
        !           805:        return (pat_id);
        !           806: }
        !           807: 
        !           808: void
        !           809: pat_offline(pat_id)  /* AIX */
        !           810:        int pat_id;
        !           811: {
        !           812:        pat_unit_t *patp = &pat_units[pat_id];
        !           813: 
        !           814:        if (patp->state == PAT_ONLINE) {
        !           815:          if (patp->xtype != IFTYPE_NULLTALK) {
        !           816:                elap_link.filtertype = NS_8022_LLC_DSAP_SNAP;
        !           817:                elap_link.orgcode[0] = 0;
        !           818:                elap_link.orgcode[2] = 0;
        !           819:                elap_link.dsap = DSAP_SNAP;
        !           820:                elap_link.ethertype = 0x80f3;   /* AARP SNAP code */
        !           821:                (void)ns_del_filter(patp->nddp, &elap_link, sizeof(elap_link));
        !           822:                elap_link.orgcode[0] = 0x08;
        !           823:                elap_link.orgcode[2] = 0x07;
        !           824:                elap_link.ethertype = 0x809b;   /* DDP SNAP code */
        !           825:                (void)ns_del_filter(patp->nddp, &elap_link, sizeof(elap_link));
        !           826:                ns_free(patp->nddp);
        !           827:          }
        !           828:                at_statep->flags |= AT_ST_IF_CHANGED;
        !           829:                bzero(patp, sizeof(pat_unit_t));
        !           830:        }
        !           831: }
        !           832: 
        !           833: int
        !           834: pat_mcast(pat_id, control, data) /* AIX */
        !           835:        int pat_id;
        !           836:        int control;
        !           837:        unsigned char *data;
        !           838: {
        !           839:        struct ndd *nddp;
        !           840: 
        !           841:        nddp = (struct ndd *)pat_units[pat_id].nddp;
        !           842:        return (*nddp->ndd_ctl)(nddp, (control == PAT_REG_MCAST) ?
        !           843:                NDD_ENABLE_ADDRESS : NDD_DISABLE_ADDRESS,
        !           844:                        data, nddp->ndd_addrlen);
        !           845: }
        !           846: 
        !           847: void
        !           848: pat_input(nddp, m, unused)  /* AIX */
        !           849:        struct ndd *nddp;
        !           850:        gbuf_t *m;
        !           851:        void *unused;
        !           852: {
        !           853:        extern int ddprunning_flag;
        !           854:        llc_header_t *llc_header;
        !           855:        int pat_id;
        !           856:        pat_unit_t *patp;
        !           857:        char src[6];
        !           858:        enet_header_t *enet_header = (enet_header_t *)gbuf_rptr(m);
        !           859: 
        !           860:        for (pat_id=0, patp = &pat_units[pat_id];
        !           861:             pat_id < xpatcnt; pat_id++, patp++) {
        !           862:                if ((patp->state == PAT_ONLINE) && (patp->nddp == nddp))
        !           863:                        break;
        !           864:        }
        !           865:        if (pat_id == xpatcnt) {
        !           866:                gbuf_freem(m);
        !           867:                return;
        !           868:        }
        !           869: 
        !           870:        /* Ignore multicast packets from local station */
        !           871:        if (patp->xtype == IFTYPE_ETHERTALK) {
        !           872:                bcopy((char *)enet_header->src, src, sizeof(src));
        !           873:                if ((enet_header->dst[0] & 1) && 
        !           874:                                (bcmp(src, patp->xaddr, sizeof(src)) == 0)) {
        !           875:                        gbuf_freem(m);
        !           876:                        return;
        !           877:                }
        !           878:                llc_header = (llc_header_t *)(enet_header+1);
        !           879:        }
        !           880: 
        !           881:        gbuf_rinc(m,(ENET_LLC_SIZE));
        !           882:        (void)fetch_and_add((atomic_p)&ddprunning_flag, 1);
        !           883:        pktsIn++;
        !           884:        if (LLC_PROTO_EQUAL(llc_header->protocol,snap_proto_aarp)) {
        !           885:                patp->aarp_func(gbuf_rptr(m), patp->context);
        !           886:                gbuf_freem(m);
        !           887:        } else if (LLC_PROTO_EQUAL(llc_header->protocol,snap_proto_ddp)) {
        !           888:                /* if we're a router take all pkts */
        !           889:                if (!ROUTING_MODE) {
        !           890:                        if (patp->addr_check(gbuf_rptr(m), patp->context)
        !           891:                                        == AARP_ERR_NOT_OURS) {
        !           892:                                gbuf_freem(m);
        !           893:                                (void)fetch_and_add((atomic_p)&ddprunning_flag, -1);
        !           894:                                return;
        !           895:                        }
        !           896:                }
        !           897:                gbuf_set_type(m, MSG_DATA);
        !           898:                elap_input(m, patp->context, src);
        !           899:        } else
        !           900:                gbuf_freem(m);
        !           901:        (void)fetch_and_add((atomic_p)&ddprunning_flag, -1);
        !           902: }
        !           903: #endif  /* AIX */

unix.superglobalmegacorp.com

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