Annotation of researchv9/sys/inet/udp_ld.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * udp line discipline; only one, to be pushed on /dev/ip17.
                      3:  */
                      4: 
                      5: #include "udp.h"
                      6: #include "../h/param.h"
                      7: #include "../h/systm.h"
                      8: #include "../h/stream.h"
                      9: #include "../h/ttyio.h"
                     10: #include "../h/ttyld.h"
                     11: #include "../h/map.h"
                     12: #include "../h/buf.h"
                     13: /*#include "../h/ubavar.h"*/
                     14: #include "../h/conf.h"
                     15: 
                     16: #include "../h/inet/in.h"
                     17: #include "../h/inet/ip.h"
                     18: #include "../h/inet/ip_var.h"
                     19: #include "../h/inet/udp.h"
                     20: #include "../h/inet/udp_var.h"
                     21: #include "../h/inet/mbuf.h"
                     22: 
                     23: struct queue *udpqueue;
                     24: 
                     25: int    udpopen(), udpiput(), udpisrv(), udpclose();
                     26: int    udposrv(), udpoput();
                     27: static struct qinit udprinit = { udpiput, udpisrv, udpopen, udpclose, 
                     28:                                  UDP_MSG_LIMIT, 512 };
                     29: static struct qinit udpwinit = { putq, udposrv, udpopen, udpclose, 
                     30:                                  UDP_MSG_LIMIT, 64 };
                     31: struct streamtab udpinfo = { &udprinit, &udpwinit };
                     32: 
                     33: udpopen(q, dev)
                     34: register struct queue *q;
                     35: {
                     36:        if (q->ptr)
                     37:                return(0);
                     38:        udpqueue = q;   /* RD queue */
                     39:        q->flag |= QDELIM;
                     40:        WR(q)->flag |= QDELIM;
                     41:        q->ptr = (caddr_t)1;
                     42:        WR(q)->ptr = (caddr_t)1;
                     43:        q->flag |= QNOENB;      /* ipiput calls qenable() */
                     44:        return(1);
                     45: }
                     46: 
                     47: udpclose(q)
                     48: register struct queue *q;
                     49: {
                     50:        if(udpqueue == q)
                     51:                udpqueue = 0;
                     52: }
                     53: 
                     54: udpisrv(q)
                     55: register struct queue *q;
                     56: {
                     57:        register struct block *bp, *head, *tail;
                     58: 
                     59:        /* there is now a whole packet waiting
                     60:         * on this queue; strip it off and pass to udp_input().
                     61:         * things other than data or delims are forwarded directly
                     62:         * by udpiput().
                     63:         */
                     64:        head = tail = (struct block *) 0;
                     65:        while(bp = getq(q)){
                     66:                if(bp->type == M_DELIM){
                     67:                        freeb(bp);
                     68:                        if(head){
                     69:                                MCHECK(head);
                     70:                                udp_input(head);
                     71:                        } else {
                     72:                                printf("udpisrv: no data\n");
                     73:                        }
                     74:                        head = tail = (struct block *) 0;
                     75:                } else if(bp->type == M_DATA){
                     76:                        bp->next = (struct block *) 0;
                     77:                        if(head == (struct block *) 0){
                     78:                                head = bp;
                     79:                        } else {
                     80:                                tail->next = bp;
                     81:                        }
                     82:                        tail = bp;
                     83:                } else {
                     84:                        printf("udpisrv: weird type %d\n", bp->type);
                     85:                        (*q->next->qinfo->putp)(q->next, bp);
                     86:                }       
                     87:        }
                     88:        if (head)
                     89:                bp_putback(q, head);
                     90: }
                     91: 
                     92: 
                     93: udpiput(q, bp)
                     94: register struct queue *q;
                     95: register struct block *bp;
                     96: {
                     97:        switch(bp->type){
                     98:        case M_DATA:
                     99:                putq(q, bp);    /* putq does compression into blocks */
                    100:                break;
                    101:        case M_DELIM:
                    102:                putq(q, bp);
                    103:                qenable(q);
                    104:                break;
                    105:        default:
                    106:                (*q->next->qinfo->putp)(q->next, bp);
                    107:                break;
                    108:        }
                    109:                
                    110: }
                    111: 
                    112: udposrv(q)
                    113: register struct queue *q;
                    114: {
                    115:        register union stmsg *sp;
                    116:        register struct block *bp;
                    117: 
                    118:        while(bp = getq(q)){
                    119:                if(bp->type == M_IOCTL){
                    120:                        (*q->next->qinfo->putp)(q->next, bp);
                    121:                } else {
                    122:                        (*q->next->qinfo->putp)(q->next, bp);
                    123:                }
                    124:        }
                    125: }
                    126: 
                    127: udp_ldout(bp)
                    128: register struct block *bp;
                    129: {
                    130:        register struct block *bp1;
                    131:        register struct queue *q;
                    132: 
                    133:        if(udpqueue == 0){
                    134:                bp_free(bp);
                    135:                return(1);
                    136:        }
                    137:        q = WR(udpqueue);
                    138:        if(q->next->flag&QFULL){
                    139:                printf("udp_ldout: QFULL\n");
                    140:                bp_free(bp);
                    141:                return(1);
                    142:        }
                    143:        MCHECK(bp);
                    144:        while(bp){
                    145:                bp1 = bp->next;
                    146:                (*q->next->qinfo->putp)(q->next, bp);
                    147:                bp = bp1;
                    148:        }
                    149: /*
                    150:  * send delim
                    151:  */
                    152: 
                    153:        putctl(q->next, M_DELIM);
                    154: }

unix.superglobalmegacorp.com

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