| plan 9 kernel history: overview | file list | diff list |
1992/0321/port/tcpif.c (diff list | history)
| port/tcpif.c on 1991/0424 | ||
| 1991/0424 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1991/0424 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1991/0424 | #include "arp.h" #include "ipdat.h" extern int tcpdbg; #define DPRINT if(tcpdbg) print void state_upcall(Ipconv *s, char oldstate, char newstate) { Block *bp; int len; | |
| 1992/0303 | Tcpctl *tcb = &s->tcpctl; | |
| 1991/0424 | ||
| 1992/0111 | DPRINT("state_upcall: %s -> %s err %s\n", | |
| 1991/0424 | tcpstate[oldstate], tcpstate[newstate], s->err); if(oldstate == newstate) return; switch(newstate) { | |
| 1991/12171 | case Closed: | |
| 1991/0424 | s->psrc = 0; s->pdst = 0; s->dst = 0; | |
| 1991/1126 | /* NO break */ | |
| 1991/12171 | case Close_wait: /* Remote closes */ | |
| 1991/0424 | if(s->err) { | |
| 1992/0111 | len = strlen(s->err); | |
| 1991/0424 | bp = allocb(len); | |
| 1992/0111 | strcpy((char *)bp->wptr, s->err); | |
| 1991/1120 | bp->wptr += len; | |
| 1991/0424 | } else bp = allocb(0); | |
| 1991/1120 | bp->flags |= S_DELIM; bp->type = M_HANGUP; | |
| 1992/0223 | qlock(s); if(s->readq == 0) freeb(bp); else PUTNEXT(s->readq, bp); qunlock(s); | |
| 1991/1120 | break; | |
| 1991/0424 | } | |
| 1992/0303 | if(oldstate == Syn_sent) wakeup(&tcb->syner); | |
| 1991/0424 | } | |
| 1992/0303 | static int notsyner(void *ic) { return ((Tcpctl*)ic)->state != Syn_sent; } | |
| 1991/0424 | void | |
| 1991/1014 | tcpstart(Ipconv *s, int mode, ushort window, char tos) | |
| 1991/0424 | { Tcpctl *tcb = &s->tcpctl; | |
| 1991/12171 | if(tcb->state != Closed) | |
| 1991/0424 | return; init_tcpctl(s); tcb->window = tcb->rcv.wnd = window; tcb->tos = tos; switch(mode){ case TCP_PASSIVE: tcb->flags |= CLONE; | |
| 1991/12171 | setstate(s, Listen); | |
| 1991/0424 | break; case TCP_ACTIVE: /* Send SYN, go into SYN_SENT state */ tcb->flags |= ACTIVE; qlock(tcb); send_syn(tcb); | |
| 1991/12171 | setstate(s, Syn_sent); | |
| 1991/0424 | tcp_output(s); qunlock(tcb); | |
| 1992/0303 | sleep(&tcb->syner, notsyner, tcb); if(tcb->state != Established && tcb->state != Syn_received) error(Etimedout); | |
| 1991/0424 | break; } } | |