M port/devip.c => port/devip.c +19 -17
@@ 388,7 388,7 @@ ipwrite(Chan *c, char *a, long n, ulong offset)
qunlock(&ipalloc);
}
- else if(strcmp(field[0], "announce") == 0 || strcmp(field[0], "reserve") == 0) {
+ else if(strcmp(field[0], "announce") == 0) {
if((cp->stproto == &tcpinfo && cp->tcpctl.state != CLOSED) ||
(cp->stproto == &ilinfo && cp->ilctl.state != Ilclosed))
error(Edevbusy);
@@ 404,7 404,6 @@ ipwrite(Chan *c, char *a, long n, ulong offset)
error(Einuse);
}
cp->psrc = port;
- cp->ptype = *field[0];
qunlock(&ipalloc);
}
else if(strcmp(field[0], "backlog") == 0) {
@@ 489,7 488,12 @@ udpstoput(Queue *q, Block *bp)
{
Ipconv *ipc;
Udphdr *uh;
- int dlen, ptcllen, newlen;
+ int dlen, ptcllen, newlen;
+
+ if(bp->type == M_CTL) {
+ PUTNEXT(q, bp);
+ return;
+ }
/* Prepend udp header to packet and pass on to ip layer */
ipc = (Ipconv *)(q->ptr);
@@ 545,10 549,12 @@ udpstclose(Queue *q)
ipc = (Ipconv *)(q->ptr);
- /* If the port was bound rather than reserved, clear the allocation */
qlock(ipc);
- if(--ipc->ref == 0 && ipc->ptype == 'b')
+ if(--ipc->ref == 0) {
ipc->psrc = 0;
+ ipc->pdst = 0;
+ ipc->dst = 0;
+ }
qunlock(ipc);
closeipifc(ipc->ipinterface);
@@ 583,12 589,17 @@ tcpstoput(Queue *q, Block *bp)
{
Ipconv *s;
Tcpctl *tcb;
- int len, errnum, oob = 0;
+ int len, errnum;
s = (Ipconv *)(q->ptr);
len = blen(bp);
tcb = &s->tcpctl;
+ if(bp->type == M_CTL) {
+ PUTNEXT(q, bp);
+ return;
+ }
+
if(s->psrc == 0)
error(Enoport);
@@ 607,17 618,8 @@ tcpstoput(Queue *q, Block *bp)
case ESTABLISHED:
case CLOSE_WAIT:
qlock(tcb);
- if(oob == 0) {
- appendb(&tcb->sndq, bp);
- tcb->sndcnt += len;
- }
- else {
- if(tcb->snd.up == tcb->snd.una)
- tcb->snd.up = tcb->snd.ptr;
- appendb(&tcb->sndoobq, bp);
- tcb->sndoobcnt += len;
- }
-
+ appendb(&tcb->sndq, bp);
+ tcb->sndcnt += len;
tcprcvwin(s);
tcp_output(s);
qunlock(tcb);
M port/ipdat.h => port/ipdat.h +1 -2
@@ 258,7 258,7 @@ struct Reseq
char tos;
};
-/* An ip interface used for UDP/TCP/ARP/ICMP */
+/* An ip interface used for UDP/TCP/IL */
struct Ipconv
{
QLock; /* Ref count lock */
@@ 267,7 267,6 @@ struct Ipconv
Ipaddr dst; /* Destination from connect */
Port psrc; /* Source port */
Port pdst; /* Destination port */
- char ptype; /* Port type */
Ipifc *ipinterface; /* Ip protocol interface */
Queue *readq; /* Pointer to upstream read q */
M port/stil.c => port/stil.c +0 -1
@@ 277,7 277,6 @@ ilprocess(Ipconv *s, Ilhdr *h, Block *bp)
Block *nb;
Ilcb *ic;
Ilhdr *oh;
- int sendack = 0;
ulong id, ack, oid, dlen;
id = nhgetl(h->ilid);
M port/tcpinput.c => port/tcpinput.c +3 -26
@@ 57,14 57,11 @@ tcp_input(Ipconv *ipc, Block *bp)
print("tcpin: allocb failure.");
return;
}
- DPRINT("tcpin: Duplicate packet %lux\n", bp);
}
h->Unused = 0;
hnputs(h->tcplen, length - (TCP_IPLEN+TCP_PHDRSIZE));
-
if(ptcl_csum(bp, TCP_EHSIZE+TCP_IPLEN, length - TCP_IPLEN)) {
- DPRINT("tcpin: Bad checksum.\n");
freeb(bp);
return;
}
@@ 74,21 71,12 @@ tcp_input(Ipconv *ipc, Block *bp)
/* Adjust the data length */
length -= (hdrlen+TCP_IPLEN+TCP_PHDRSIZE);
-
- DPRINT("tcpin: lport = %d, rport = %d hdrlen %d",
- seg.dest, seg.source, hdrlen);
- DPRINT(" flags = 0x%lux, seqo = %d, seqi = %d len %d\n",
- seg.flags, seg.seq, seg.ack, length);
-
- /* Trim the packet down to just the data */
bp = btrim(bp, hdrlen+TCP_PKT, length);
if(bp == 0)
return;
s = ip_conn(ipc, seg.dest, seg.source, source, IP_TCPPROTO);
if (s == 0) {
- LPRINT("tcpin: look for listen on %d\n", seg.dest);
-
if((seg.flags & SYN) == 0)
goto clear;
@@ 105,7 93,6 @@ tcp_input(Ipconv *ipc, Block *bp)
goto clear;
s->curlog++;
- LPRINT("tcpin: cloning socket\n");
new->psrc = seg.dest;
new->pdst = seg.source;
new->dst = source;
@@ 115,18 102,16 @@ tcp_input(Ipconv *ipc, Block *bp)
new->tcpctl.timer.state = TIMER_STOP;
new->tcpctl.acktimer.arg = new;
new->tcpctl.acktimer.state = TIMER_STOP;
-
new->newcon = 1;
new->ipinterface = s->ipinterface;
+
s->ipinterface->ref++;
wakeup(&s->listenr);
-
s = new;
goto process;
}
}
clear:
- LPRINT("tcpin: call cleared\n");
freeb(bp);
reset(source, dest, tos, length, &seg);
return;
@@ 219,8 204,7 @@ process:
goto done;
}
- if(seg.seq != tcb->rcv.nxt
- && (length != 0 || (seg.flags & (SYN|FIN)) )) {
+ if(seg.seq != tcb->rcv.nxt && (length != 0 || (seg.flags & (SYN|FIN)) )) {
add_reseq(tcb, tos, &seg, bp, length);
tcb->flags |= FORCE;
goto output;
@@ 301,9 285,6 @@ process:
else if (seq_gt(tcb->rcv.nxt, tcb->rcv.up))
tcb->rcv.up = tcb->rcv.nxt;
- DPRINT("tcpin: Append pkt len=%d state=%s\n",
- length, tcpstate[tcb->state]);
-
if(length != 0){
switch(tcb->state){
case SYN_RECEIVED:
@@ 366,8 347,7 @@ process:
break;
}
}
- while(tcb->reseq != 0 &&
- seq_ge(tcb->rcv.nxt, tcb->reseq->seg.seq)){
+ while(tcb->reseq != 0 && seq_ge(tcb->rcv.nxt, tcb->reseq->seg.seq)) {
get_reseq(tcb, &tos, &seg, &bp, &length);
if(trim(tcb, &seg, &bp, &length) == 0)
goto gotone;
@@ 467,9 447,6 @@ reset(Ipaddr source, Ipaddr dest, char tos, ushort length, Tcp *seg)
if((hbp = htontcp(seg, 0, &ph)) == 0)
return;
- DPRINT("Reset: seq = %lux ack = %d flags = %lux\n",
- seg->seq, seg->ack, seg->flags);
-
PUTNEXT(Ipoutput, hbp);
}