debug("ACK");
if(len > sizeof hdr) {
- debug(" data=");
- for(int i = sizeof hdr; i < len; i++) {
- const char *data = pkt;
- debug("%c", data[i] >= 32 ? data[i] : '.');
+ uint32_t datalen = len - sizeof hdr;
+ uint8_t *str = malloc((datalen << 1) + 7);
+ memcpy(str, " data=", 6);
+ uint8_t *strptr = str + 6;
+ const uint8_t *data = pkt;
+ const uint8_t *dataend = data + datalen;
+
+ while(data != dataend) {
+ *strptr = (*data >> 4) > 9? (*data >> 4) + 55 : (*data >> 4) + 48;
+ ++strptr;
+ *strptr = (*data & 0xf) > 9? (*data & 0xf) + 55 : (*data & 0xf) + 48;
+ ++strptr;
+ ++data;
}
+ *strptr = 0;
+
+ debug(str);
+ free(str);
}
debug("\n");
memmove(cp, cp + 1, (utcp->nconnections - i - 1) * sizeof *cp);
utcp->nconnections--;
+ buffer_exit(&c->rcvbuf);
buffer_exit(&c->sndbuf);
free(c);
}
}
if(!buffer_init(&c->rcvbuf, DEFAULT_RCVBUFSIZE, DEFAULT_MAXRCVBUFSIZE)) {
+ buffer_exit(&c->sndbuf);
free(c);
return NULL;
}
pkt->hdr.src = c->src;
pkt->hdr.dst = c->dst;
+ pkt->hdr.wnd = c->rcv.wnd;
+ pkt->hdr.aux = 0;
switch(c->state) {
case SYN_SENT:
// Send our SYN again
pkt->hdr.seq = c->snd.iss;
pkt->hdr.ack = 0;
- pkt->hdr.wnd = c->rcv.wnd;
pkt->hdr.ctl = SYN;
print_packet(c->utcp, "rtrx", pkt, sizeof pkt->hdr);
utcp->send(utcp, pkt, sizeof pkt->hdr);
c->snd.last++;
ack(c, false);
+ if(!timerisset(&c->rtrx_timeout))
+ start_retransmit_timer(c);
return 0;
}
for(int i = 0; i < utcp->nconnections; i++) {
if(!utcp->connections[i]->reapable)
debug("Warning, freeing unclosed connection %p\n", utcp->connections[i]);
+ buffer_exit(&utcp->connections[i]->rcvbuf);
buffer_exit(&utcp->connections[i]->sndbuf);
free(utcp->connections[i]);
}