Annotation of researchv8dc/sys/inet/tcp_ld.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * tcp line discipline; only one, to be pushed on /dev/ip6.
                      3:  */
                      4: 
                      5: #include "tcp.h"
                      6: #if NTCP > 0
                      7: #include "../h/param.h"
                      8: #include "../h/systm.h"
                      9: #include "../h/stream.h"
                     10: #include "../h/ioctl.h"
                     11: #include "../h/ttyld.h"
                     12: #include "../h/map.h"
                     13: #include "../h/buf.h"
                     14: #include "../h/ubavar.h"
                     15: #include "../h/conf.h"
                     16: 
                     17: extern int tcp_busy;   /* set to discourage timers */
                     18: int tcp_maxseg = 1024; /* dynamic size of t_maxseg; was 512 originally*/
                     19: struct queue *tcpqueue;
                     20: 
                     21: int    tcpopen(), tcpiput(), tcpisrv(), tcpclose();
                     22: int    tcposrv(), tcpoput();
                     23: static struct qinit tcprinit = { tcpiput, tcpisrv, tcpopen, tcpclose, 1024, 64 };
                     24:                /* was 512, 64 */
                     25: static struct qinit tcpwinit = { putq, tcposrv, tcpopen, tcpclose, 1024, 64 };
                     26:                /* was 512, 64 */
                     27: struct streamtab tcpinfo = { &tcprinit, &tcpwinit };
                     28: 
                     29: tcpopen(q, dev)
                     30: register struct queue *q;
                     31: {
                     32:        static int timing;
                     33: 
                     34:        if (q->ptr)
                     35:                return(0);
                     36:        tcpqueue = q;   /* RD queue */
                     37:        if(!timing){
                     38:                timing = 1;
                     39:                tcp_fasttimo();
                     40:                tcp_slowtimo();
                     41:        }
                     42:        q->flag |= QDELIM;
                     43:        WR(q)->flag |= QDELIM;
                     44:        q->ptr = (caddr_t)1;
                     45:        WR(q)->ptr = (caddr_t)1;
                     46:        q->flag |= QNOENB;      /* ipiput calls qenable() */
                     47:        return(1);
                     48: }
                     49: 
                     50: tcpclose(q)
                     51: register struct queue *q;
                     52: {
                     53:        if(tcpqueue == q)
                     54:                tcpqueue = 0;
                     55: }
                     56: 
                     57: tcpisrv(q)
                     58: register struct queue *q;
                     59: {
                     60:        register struct block *bp, *head, *tail;
                     61: 
                     62:        /* there is now a whole packet waiting
                     63:         * on this queue; strip it off and pass to tcp_input().
                     64:         * things other than data or delims are forwarded directly
                     65:         * by tcpiput().
                     66:         */
                     67:        head = tail = (struct block *) 0;
                     68:        while(bp = getq(q)){
                     69:                if(bp->type == M_DELIM){
                     70:                        freeb(bp);
                     71:                        if(head){
                     72:                                tcp_busy++;
                     73:                                tcp_input(head);
                     74:                                --tcp_busy;
                     75:                        } else {
                     76:                                printf("tcpisrv: delim, no data\n");
                     77:                        }
                     78:                        head = tail = (struct block *) 0;
                     79:                } else if(bp->type == M_DATA){
                     80:                        bp->next = (struct block *) 0;
                     81:                        if(head == (struct block *) 0){
                     82:                                head = bp;
                     83:                        } else {
                     84:                                tail->next = bp;
                     85:                        }
                     86:                        tail = bp;
                     87:                } else {
                     88:                        printf("weird type 0%o in tcpisrv\n", bp->type);
                     89:                        (*q->next->qinfo->putp)(q->next, bp);
                     90:                }       
                     91:        }
                     92:        if(head || tail){
                     93:                printf("tcpisrv: data & no dELIM\n");
                     94:        }
                     95: }
                     96: 
                     97: 
                     98: tcpiput(q, bp)
                     99: register struct queue *q;
                    100: register struct block *bp;
                    101: {
                    102:        switch(bp->type){
                    103:        case M_DATA:
                    104:                putq(q, bp);    /* putq does compression into blocks */
                    105:                break;
                    106:        case M_DELIM:
                    107:                putq(q, bp);
                    108:                qenable(q);
                    109:                break;
                    110:        default:
                    111:                (*q->next->qinfo->putp)(q->next, bp);
                    112:                break;
                    113:        }
                    114:                
                    115: }
                    116: 
                    117: tcposrv(q)
                    118: register struct queue *q;
                    119: {
                    120:        register union stmsg *sp;
                    121:        register struct block *bp;
                    122: 
                    123:        register int *intp;
                    124: 
                    125:        while(bp = getq(q)){
                    126:                if(bp->type == M_IOCTL){
                    127:                        sp = (union stmsg *)bp->rptr;
                    128:                        switch(sp->ioc0.com){
                    129:                        case TCPIOMAXSEG:
                    130:                                intp = (int *)(sp->iocx.xxx);
                    131:                                tcp_maxseg = *intp;
                    132:                                bp->type = M_IOCACK;
                    133:                                qreply(q, bp);
                    134:                                break;
                    135:                        default:
                    136:                                (*q->next->qinfo->putp)(q->next, bp);
                    137:                                break;
                    138:                        }
                    139:                } else {
                    140:                        (*q->next->qinfo->putp)(q->next, bp);
                    141:                }
                    142:        }
                    143: }
                    144: 
                    145: tcp_ldout(bp)
                    146: register struct block *bp;
                    147: {
                    148:        register struct block *bp1;
                    149:        register struct queue *q;
                    150: 
                    151:        if(tcpqueue == 0){
                    152:                bp_free(bp);
                    153:                return(1);
                    154:        }
                    155:        q = WR(tcpqueue);
                    156:        if(q->next->flag&QFULL){
                    157:                printf("tcp_ldout: QFULL\n");
                    158:                bp_free(bp);
                    159:                return(1);
                    160:        }
                    161:        while(bp){
                    162:                bp1 = bp->next;
                    163:                (*q->next->qinfo->putp)(q->next, bp);
                    164:                bp = bp1;
                    165:        }
                    166:        bp1 = allocb(0);
                    167:        if(bp1){
                    168:                bp1->type = M_DELIM;
                    169:                (*q->next->qinfo->putp)(q->next, bp1);
                    170:        } else {
                    171:                printf("tcp_ldout: no allocb for delim\n");
                    172:                return(1);
                    173:        }
                    174:        return(0);
                    175: }
                    176: #endif

unix.superglobalmegacorp.com

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