Annotation of XNU/bsd/netat/ddp.save, revision 1.1.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.