Annotation of xinu/sys/finput.c, revision 1.1

1.1     ! root        1: /* finput.c - finput, sendack, sendnack, sendsack */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <frame.h>
        !             6: 
        !             7: /*------------------------------------------------------------------------
        !             8:  *  finput  -- read frames and enqueue for local machine or forwarding
        !             9:  *------------------------------------------------------------------------
        !            10:  */
        !            11: PROCESS        finput(netid)
        !            12:        int     netid;
        !            13: {
        !            14:        int     len;                    /* length of actual data        */
        !            15:        int     to, from;               /* "to" and "from" addresses    */
        !            16:        struct  fglob   *fgptr;
        !            17:        struct  frame   *fptr, *fptr2;
        !            18:        char    *t, *f;                 /* used to copy broadcast frames*/
        !            19: 
        !            20:        fgptr = &fdata[netid];
        !            21:        fptr = getbuf(frbpool);
        !            22:        for (fgptr->fiseq = fgptr->fifails = 0 ; TRUE ; ) {
        !            23:                len = read(fgptr->findev, fptr, FRMAXLEN);
        !            24:                if (len < FRMINLEN || len != getflen(fptr))
        !            25:                        sendnack(fgptr);
        !            26:                else if ( (int)fptr->frseq != fgptr->fiseq)
        !            27:                        sendsack(fgptr);
        !            28:                else {
        !            29:                        to = getfto(fptr->fraddr);
        !            30:                        from = getfrom(fptr->fraddr);
        !            31:                        if (to == FRBCAST) {    /* broadcast */
        !            32:                                if (from == fgptr->fmachid) {
        !            33:                                        psend(fgptr->fiport, fptr);
        !            34:                                        fptr = getbuf(frbpool);
        !            35:                                } else {
        !            36:                                        fptr2 = getbuf(frbpool);
        !            37:                                        for (f=fptr,t=fptr2; len-->0; )
        !            38:                                                *t++ = *f++;
        !            39:                                        psend(fgptr->fiport, fptr);
        !            40:                                        psend(fgptr->ffport, fptr2);
        !            41:                                        signal(fgptr->fosem);
        !            42:                                        fptr = getbuf(frbpool);
        !            43:                                }
        !            44:                        } else if (to == fgptr->fmachid) {
        !            45:                                psend(fgptr->fiport, fptr);
        !            46:                                fptr = getbuf(frbpool);
        !            47:                        } else if (from == fgptr->fmachid) {
        !            48:                                printf("Can't deliver to %d\n", to);
        !            49:                        } else {
        !            50:                                psend(fgptr->ffport, fptr);
        !            51:                                signal(fgptr->fosem); /* bug fix to text */
        !            52:                                fptr = getbuf(frbpool);
        !            53:                        }
        !            54:                        sendack(fgptr);
        !            55:                }
        !            56:        }
        !            57: }
        !            58: 
        !            59: /*------------------------------------------------------------------------
        !            60:  *  sendack  --  send a positive acknowledgement with sequence number
        !            61:  *------------------------------------------------------------------------
        !            62:  */
        !            63: LOCAL  sendack(fgptr)
        !            64:        struct  fglob   *fgptr;
        !            65: {
        !            66:        fgptr->fifails = 0;
        !            67:        if (++fgptr->fiseq > FRMAXSEQ)
        !            68:                fgptr->fiseq = 0;
        !            69:        putc(fgptr->findev, FRACK | fgptr->fiseq);
        !            70: }
        !            71: 
        !            72: /*------------------------------------------------------------------------
        !            73:  *  sendnack --  send a negative acknowledgement with sequence number
        !            74:  *------------------------------------------------------------------------
        !            75:  */
        !            76: LOCAL  sendnack(fgptr)
        !            77:        struct  fglob   *fgptr;
        !            78: {
        !            79:        putc(fgptr->findev, FRNACK | fgptr->fiseq);
        !            80: }
        !            81: 
        !            82: /*------------------------------------------------------------------------
        !            83:  *  sendsack --  send a negative acknowledgement and restart sequence
        !            84:  *------------------------------------------------------------------------
        !            85:  */
        !            86: LOCAL  sendsack(fgptr)
        !            87:        struct  fglob   *fgptr;
        !            88: {
        !            89:        if (++fgptr->fifails >= FRFAIL) {
        !            90:                fgptr->fiseq = 0;
        !            91:                fgptr->fifails = 0;
        !            92:                putc(fgptr->findev, FRSACK);
        !            93:        } else
        !            94:                putc(fgptr->findev, FRNACK);
        !            95: }

unix.superglobalmegacorp.com

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