Annotation of lucent/sys/src/9/port/tcpif.c, revision 1.1

1.1     ! root        1: #include       "u.h"
        !             2: #include       "../port/lib.h"
        !             3: #include       "mem.h"
        !             4: #include       "dat.h"
        !             5: #include       "fns.h"
        !             6: #include       "../port/error.h"
        !             7: #include       "arp.h"
        !             8: #include       "../port/ipdat.h"
        !             9: 
        !            10: extern int tcpdbg;
        !            11: #define DPRINT if(tcpdbg) print
        !            12: 
        !            13: void
        !            14: tcpxstate(Ipconv *s, char oldstate, char newstate)
        !            15: {
        !            16:        int len;
        !            17:        Block *bp;
        !            18:        Tcpctl *tcb;
        !            19: 
        !            20:        if(oldstate == newstate)
        !            21:                return;
        !            22: 
        !            23:        tcb = &s->tcpctl;
        !            24:        switch(newstate) {
        !            25:        case Closed:
        !            26:                s->psrc = 0;            /* This connection is toast */
        !            27:                s->pdst = 0;
        !            28:                s->dst = 0;
        !            29:                /* fall through */
        !            30: 
        !            31:        case Close_wait:                /* Remote closes */
        !            32:                if(s->err) {
        !            33:                        len = strlen(s->err);
        !            34:                        bp = allocb(len);
        !            35:                        strcpy((char *)bp->wptr, s->err);
        !            36:                        bp->wptr += len;
        !            37:                }
        !            38:                else
        !            39:                        bp = allocb(0);
        !            40: 
        !            41:                bp->flags |= S_DELIM;
        !            42:                bp->type = M_HANGUP;
        !            43:                qlock(s);
        !            44:                if(waserror()) {
        !            45:                        qunlock(s);
        !            46:                        nexterror();
        !            47:                }
        !            48:                if(s->readq == 0) {
        !            49:                        if(newstate == Close_wait)
        !            50:                                putb(&tcb->rcvq, bp);
        !            51:                        else
        !            52:                                freeb(bp);
        !            53:                } else
        !            54:                        PUTNEXT(s->readq, bp);
        !            55:                if(tcb){
        !            56:                        tcb->sndfull = 0;
        !            57:                        wakeup(&tcb->sndr);
        !            58:                }
        !            59:                poperror();
        !            60:                qunlock(s);
        !            61:                break;
        !            62:        }
        !            63: 
        !            64:        if(oldstate == Syn_sent)
        !            65:                wakeup(&tcb->syner);
        !            66: }
        !            67: 
        !            68: static int
        !            69: notsyner(void *ic)
        !            70: {
        !            71:        return ((Tcpctl*)ic)->state != Syn_sent;
        !            72: }
        !            73: 
        !            74: void
        !            75: tcpstart(Ipconv *s, int mode, ushort window, char tos)
        !            76: {
        !            77:        Tcpctl *tcb;
        !            78: 
        !            79:        tcb = &s->tcpctl;
        !            80:        if(tcb->state != Closed || tcb->sndq != 0){
        !            81:                print("tcpstart: %lux %d sndq %lux dest %d.%d.%d.%d %d to %d\n",
        !            82:                        s, tcb->state, tcb->sndq, fmtaddr(s->dst), s->pdst, s->psrc);
        !            83:                error(Einuse);
        !            84:        }
        !            85: 
        !            86:        init_tcpctl(s);
        !            87: 
        !            88:        tcb->window = window;
        !            89:        tcb->rcv.wnd = window;
        !            90:        tcb->tos = tos;
        !            91: 
        !            92:        switch(mode){
        !            93:        case TCP_PASSIVE:
        !            94:                tcb->flags |= CLONE;
        !            95:                tcpsetstate(s, Listen);
        !            96:                break;
        !            97: 
        !            98:        case TCP_ACTIVE:
        !            99:                /* Send SYN, go into SYN_SENT state */
        !           100:                tcb->flags |= ACTIVE;
        !           101:                qlock(tcb);
        !           102:                if(waserror()) {
        !           103:                        qunlock(tcb);
        !           104:                        nexterror();
        !           105:                }
        !           106:                tcpsndsyn(tcb);
        !           107:                tcpsetstate(s, Syn_sent);
        !           108:                tcpoutput(s);
        !           109:                poperror();
        !           110:                qunlock(tcb);
        !           111:                tsleep(&tcb->syner, notsyner, tcb, 120*1000);
        !           112:                if(tcb->state != Established && tcb->state != Syn_received){
        !           113:                        if(s->err)
        !           114:                                error(s->err);
        !           115:                        error(Etimedout);
        !           116:                }
        !           117:                break;
        !           118:        }
        !           119: }

unix.superglobalmegacorp.com

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