| plan 9 kernel history: overview | file list | diff list |
1990/0321/port/sturp.c (diff list | history)
| 1990/0315/sys/src/9/port/sturp.c:39,50 – 1990/0321/sys/src/9/port/sturp.c:39,51 (short | long | prev | next) | ||
| 1990/0312 | Rendez r; /* process waiting for close */ | |
| 1990/0227 | /* input */ | |
| 1990/0321 | QLock ack; /* ack lock */ | |
| 1990/0312 | Queue *rq; /* input queue */ | |
| 1990/0227 | uchar iseq; /* last good input sequence number */ uchar lastecho; /* last echo/rej sent */ uchar trbuf[3]; /* trailer being collected */ short trx; /* # bytes in trailer being collected */ | |
| 1990/0321 | int blocks; | |
| 1990/0227 | /* output */ | |
| 1990/0315/sys/src/9/port/sturp.c:110,115 – 1990/0321/sys/src/9/port/sturp.c:111,118 | ||
| 1990/0227 | static void rcvack(Urp*, int); static void flushinput(Urp*); | |
| 1990/0312 | static void sendctl(Urp*, int); | |
| 1990/0321 | static void sendack(Urp*); static void sendrej(Urp*); | |
| 1990/0227 | static void initoutput(Urp*, int); static void initinput(Urp*, int); | |
| 1990/0312 | static void urpkproc(void *arg); | |
| 1990/0315/sys/src/9/port/sturp.c:123,130 – 1990/0321/sys/src/9/port/sturp.c:126,131 | ||
| 1990/0227 | int i; | |
| 1990/0312 | char name[128]; | |
| 1990/0227 | ||
| 1990/0315 |
| |
| 1990/0227 | /* * find a free urp structure */ | |
| 1990/0315/sys/src/9/port/sturp.c:200,212 – 1990/0321/sys/src/9/port/sturp.c:201,211 | ||
| 1990/0312 | i = 7; rcvack(up, ECHO+i); qunlock(&up->xmit); | |
| 1990/0227 | } /* | |
| 1990/0315/sys/src/9/port/sturp.c:309,318 – 1990/0321/sys/src/9/port/sturp.c:308,319 | ||
| 1990/0227 | case SEQ+0: case SEQ+1: case SEQ+2: case SEQ+3: case SEQ+4: case SEQ+5: case SEQ+6: case SEQ+7: | |
| 1990/0321 | qlock(&up->ack); | |
| 1990/0312 | i = ctl & Nmask; if(q->next->len < Streamhi) sendctl(up, up->lastecho = ECHO+i); up->iseq = i; | |
| 1990/0321 | qunlock(&up->ack); | |
| 1990/0227 | break; } } | |
| 1990/0315/sys/src/9/port/sturp.c:381,387 – 1990/0321/sys/src/9/port/sturp.c:382,389 | ||
| 1990/0227 | case 0: break; case ENQ: | |
| 1990/0315 |
| |
| 1990/0321 | DPRINT("rENQ %d %uo %uo\n", up->blocks, up->lastecho, ACK+up->iseq); up->blocks = 0; | |
| 1990/0227 | urpstat.enqsr++; | |
| 1990/0312 | sendctl(up, up->lastecho); sendctl(up, ACK+up->iseq); | |
| 1990/0315/sys/src/9/port/sturp.c:422,428 – 1990/0321/sys/src/9/port/sturp.c:424,430 | ||
| 1990/0227 | case REJ+0: case REJ+1: case REJ+2: case REJ+3: case REJ+4: case REJ+5: case REJ+6: case REJ+7: | |
| 1990/0312 |
| |
| 1990/0321 | DPRINT("rREJ\n"); | |
| 1990/0227 | rcvack(up, ctl); break; | |
| 1990/0315/sys/src/9/port/sturp.c:444,464 – 1990/0321/sys/src/9/port/sturp.c:446,460 | ||
| 1990/0312 | i = ctl & Nmask; | |
| 1990/0227 | if(up->trx != 3){ urpstat.rjtrs++; | |
| 1990/0315 |
| |
| 1990/0312 |
| |
| 1990/0321 | sendrej(up); | |
| 1990/0227 | break; } else if(q->len != up->trbuf[1] + (up->trbuf[2]<<8)){ urpstat.rjpks++; | |
| 1990/0315 |
| |
| 1990/0312 |
| |
| 1990/0321 | sendrej(up); | |
| 1990/0227 | break; | |
| 1990/0312 | } else if(i != ((up->iseq+1)&Nmask)) { | |
| 1990/0227 | urpstat.rjseq++; | |
| 1990/0315 |
| |
| 1990/0312 |
| |
| 1990/0321 | sendrej(up); | |
| 1990/0227 | break; } | |
| 1990/0315/sys/src/9/port/sturp.c:480,491 – 1990/0321/sys/src/9/port/sturp.c:476,486 | ||
| 1990/0227 | /* * acknowledge receipt */ | |
| 1990/0312 |
| |
| 1990/0227 |
| |
| 1990/0321 | qlock(&up->ack); | |
| 1990/0312 | up->iseq = i; | |
| 1990/0321 | if(q->next->len < Streamhi) sendctl(up, up->lastecho = ECHO|i); qunlock(&up->ack); | |
| 1990/0227 | break; } } | |
| 1990/0315/sys/src/9/port/sturp.c:510,516 – 1990/0321/sys/src/9/port/sturp.c:505,510 | ||
| 1990/0227 | outwin = strtoul(fields[0], 0, 0); } | |
| 1990/0312 | /* initinput(up, inwin); */ | |
| 1990/0227 | initoutput(up, outwin); freeb(bp); return; | |
| 1990/0315/sys/src/9/port/sturp.c:596,602 – 1990/0321/sys/src/9/port/sturp.c:590,596 | ||
| 1990/0312 | * if a retransmit time has elapsed since a transmit, send an ENQ */ if(up->unechoed != up->next && NOW > up->timer){ | |
| 1990/0321 | DPRINT("sENQ\n"); | |
| 1990/0312 | up->timer = NOW + MSrexmit; up->state &= ~REJECTING; sendctl(up, ENQ); | |
| 1990/0315/sys/src/9/port/sturp.c:638,643 – 1990/0321/sys/src/9/port/sturp.c:632,684 | ||
| 1990/0227 | } | |
| 1990/0312 | /* | |
| 1990/0321 | * send a reject */ static void sendrej(Urp *up) { flushinput(up); qlock(&up->ack); if((up->lastecho&~Nmask) == ECHO){ DPRINT("REJ %d\n", up->iseq); sendctl(up, up->lastecho = REJ|up->iseq); } qunlock(&up->ack); } /* * send an acknowledge */ static void sendack(Urp *up) { Block *bp; /* * check the precondition for acking */ if(up->rq->next->len>=Streamhi || (up->lastecho&Nmask)==up->iseq) return; if(!canqlock(&up->ack)) return; /* * check again now that we've locked */ if(up->rq->next->len>=Streamhi || (up->lastecho&Nmask)==up->iseq){ qunlock(&up->ack); return; } /* * send the ack */ sendctl(up, up->lastecho = ECHO|up->iseq); qunlock(&up->ack); } /* | |
| 1990/0312 | * send a block. */ static void | |
| 1990/0315/sys/src/9/port/sturp.c:803,808 – 1990/0321/sys/src/9/port/sturp.c:844,850 | ||
| 1990/0227 | /* * restart all sequence parameters */ | |
| 1990/0321 | up->blocks = 0; | |
| 1990/0227 | up->trx = 0; up->iseq = 0; up->lastecho = ECHO+0; | |
| 1990/0315/sys/src/9/port/sturp.c:826,832 – 1990/0321/sys/src/9/port/sturp.c:868,873 | ||
| 1990/0312 | Urp *up; up = (Urp *)arg; | |
| 1990/0315 |
| |
| 1990/0312 | for(;;){ if(up->state & (HUNGUP|CLOSING)){ | |
| 1990/0315/sys/src/9/port/sturp.c:835,846 – 1990/0321/sys/src/9/port/sturp.c:876,885 | ||
| 1990/0312 | if(up->state & HUNGUP) break; } | |
| 1990/0321 | sendack(up); | |
| 1990/0312 | output(up); tsleep(&up->rq->r, todo, up, MSrexmit/2); } | |
| 1990/0227 | } | |