gettimeofday(&c->conn_timeout, NULL);
c->conn_timeout.tv_sec += utcp->timeout;
+ start_retransmit_timer(c);
+
return c;
}
pkt->hdr.seq = c->snd.iss;
pkt->hdr.ack = 0;
pkt->hdr.ctl = SYN;
- print_packet(c->utcp, "rtrx", pkt, sizeof pkt->hdr);
- utcp->send(utcp, pkt, sizeof pkt->hdr);
+ pkt->hdr.aux = 0x0101;
+ pkt->data[0] = 1;
+ pkt->data[1] = 0;
+ pkt->data[2] = 0;
+ pkt->data[3] = c->flags & 0x7;
+ print_packet(c->utcp, "rtrx", pkt, sizeof pkt->hdr + 4);
+ utcp->send(utcp, pkt, sizeof pkt->hdr + 4);
break;
case SYN_RECEIVED:
retransmit(c);
}
- if(c->poll && buffer_free(&c->sndbuf) && (c->state == ESTABLISHED || c->state == CLOSE_WAIT))
- c->poll(c, buffer_free(&c->sndbuf));
+ if(c->poll) {
+ if((c->state == ESTABLISHED || c->state == CLOSE_WAIT)) {
+ uint32_t len = buffer_free(&c->sndbuf);
+ if(len)
+ c->poll(c, len);
+ } else if(c->state == CLOSED) {
+ c->poll(c, 0);
+ }
+ }
if(timerisset(&c->conn_timeout) && timercmp(&c->conn_timeout, &next, <))
next = c->conn_timeout;