Annotation of researchv10no/sys/inet/ip_device.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * ip device driver; each minor device is one protocol.
        !             3:  * so tcp would be placed on top of ip minor device #6.
        !             4:  */
        !             5: 
        !             6: #include "sys/param.h"
        !             7: #include "sys/stream.h"
        !             8: #include "sys/conf.h"
        !             9: #include "sys/inet/in.h"
        !            10: #include "sys/inet/ip_var.h"
        !            11: 
        !            12: extern int ipcnt;              /* number of ip devices */
        !            13: long   ipdopen();
        !            14: int    ipdclose(), ipdput(), ipdosrv();
        !            15: static struct qinit ipdrinit = { noput, NULL, ipdopen, ipdclose, 0, 0 };
        !            16:        struct qinit ipdwinit = { ipdput, ipdosrv, ipdopen, ipdclose,
        !            17:                                  IP_BODY_LIMIT, 129 };
        !            18: struct streamtab ipdinfo = { &ipdrinit, &ipdwinit };
        !            19: 
        !            20: struct cdevsw ipcdev = cstrinit(&ipdinfo);
        !            21: 
        !            22: struct queue *ipdstate[256];
        !            23: int ipprintfs;
        !            24: 
        !            25: long
        !            26: ipdopen(q, dev)
        !            27: register struct queue *q;
        !            28: dev_t dev;
        !            29: {
        !            30:        dev = minor(dev);
        !            31:        if(ipdstate[dev])
        !            32:                return(0);
        !            33:        ipdstate[dev] = q;
        !            34:        q->ptr = (caddr_t)dev;
        !            35:        q->flag |= QDELIM;
        !            36:        WR(q)->ptr = (caddr_t)dev;
        !            37:        WR(q)->flag |= QNOENB;
        !            38:        return(1);
        !            39: }
        !            40: 
        !            41: ipdclose(q)
        !            42: register struct queue *q;
        !            43: {
        !            44:        ipdstate[(int)q->ptr] = 0;
        !            45: }
        !            46: 
        !            47: ipdput(q, bp)
        !            48: register struct queue *q;
        !            49: register struct block *bp;
        !            50: {
        !            51:        struct foo{
        !            52:                u_long dst;
        !            53:                u_long gate;
        !            54:        } foo;
        !            55:        int i;
        !            56:        struct block *bp1;
        !            57: 
        !            58:        switch(bp->type){
        !            59:        case M_DATA:
        !            60:                putq(q, bp);
        !            61:                if (bp->class&S_DELIM)
        !            62:                        qenable(q);
        !            63:                return;
        !            64: 
        !            65:        case M_IOCTL:
        !            66:                bp->type = M_IOCACK;
        !            67:                switch(stiocom(bp)){
        !            68:                case IPIOROUTE:
        !            69:                        bcopy(stiodata(bp), &foo, sizeof(struct foo));
        !            70:                        if(ip_doroute(foo.dst, foo.gate))
        !            71:                                bp->type = M_IOCNAK;
        !            72:                        break;
        !            73:                case IPIOGETIFS:
        !            74:                        i = *(int *)(stiodata(bp));
        !            75:                        if(i>=ipcnt) {
        !            76:                                bp->type = M_IOCNAK;
        !            77:                                break;
        !            78:                        }
        !            79:                        bp1 = allocb(sizeof(struct ipif));
        !            80:                        if (bp1 == 0) {
        !            81:                                bp->type = M_IOCNAK;
        !            82:                                break;
        !            83:                        }
        !            84:                        freeb(bp);
        !            85:                        bp = bp1;
        !            86:                        bp->type = M_IOCACK;
        !            87:                        bp->wptr = (u_char *)stiodata(bp);
        !            88:                        *(struct ipif *)(bp->wptr) = ipif[i];
        !            89:                        bp->wptr += sizeof(struct ipif);
        !            90:                        break;
        !            91:                default:
        !            92:                        bp->type = M_IOCNAK;
        !            93:                        break;
        !            94:                }
        !            95:                qreply(q, bp);
        !            96:                return;
        !            97: 
        !            98:        default:
        !            99:                freeb(bp);
        !           100:                return;
        !           101:        }
        !           102: }
        !           103: 
        !           104: ipdrint(bp, dev)
        !           105: register struct block *bp;
        !           106: unsigned dev;
        !           107: {
        !           108:        register struct block *bp1;
        !           109:        register struct queue *nq;
        !           110: 
        !           111:        if ((nq = ipdstate[dev]) == NULL) {
        !           112:                bp_free(bp);
        !           113:                return;
        !           114:        }
        !           115:        nq = nq->next;  /* optimization */
        !           116:        if(nq->flag&QFULL){
        !           117:                bp_free(bp);
        !           118:                if(ipprintfs)
        !           119:                        printf("ipdrint: QFULL\n");
        !           120:                ipstat.ips_qfull++;
        !           121:                return;
        !           122:        }
        !           123:        while(bp){
        !           124:                bp1 = bp->next;
        !           125:                if (bp1==NULL)
        !           126:                        bp->class |= S_DELIM;
        !           127:                else
        !           128:                        bp->class &=~ S_DELIM;
        !           129:                (*nq->qinfo->putp)(nq, bp);
        !           130:                bp = bp1;
        !           131:        }
        !           132: }
        !           133: 
        !           134: ipdosrv(q)
        !           135: struct queue *q;
        !           136: {
        !           137:        register struct block *bp, *tail, *head;
        !           138: 
        !           139:        head = tail = NULL;
        !           140:        while(bp = getq(q)){
        !           141:                if (bp->type != M_DATA)
        !           142:                        panic("ipdosrv");
        !           143:                bp->next = NULL;
        !           144:                if (head == NULL)
        !           145:                        head = bp;
        !           146:                else
        !           147:                        tail->next = bp;
        !           148:                tail = bp;
        !           149:                if (bp->class&S_DELIM) {
        !           150:                        ip_output(head, (struct block *)0, 0);
        !           151:                        head = tail = NULL;
        !           152:                }
        !           153:        }
        !           154:        if (head)
        !           155:                bp_putback(q, head);
        !           156: }

unix.superglobalmegacorp.com

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