pkt->hdr.ctl |= FIN;
}
- if(!c->rtt_start.tv_sec) {
+ if(!c->rtt_start.tv_sec && is_reliable(c)) {
// Start RTT measurement
clock_gettime(UTCP_CLOCK, &c->rtt_start);
c->rtt_seq = pkt->hdr.seq + seglen;
}
// Ensure reassembled packet are not larger than 64 kiB
- if(hdr->wnd >= MAX_UNRELIABLE_SIZE || hdr->wnd + len > MAX_UNRELIABLE_SIZE) {
+ if(hdr->wnd > MAX_UNRELIABLE_SIZE || hdr->wnd + len > MAX_UNRELIABLE_SIZE) {
return;
}
}
int utcp_close(struct utcp_connection *c) {
+ if(c->rcvbuf.used) {
+ fprintf(stderr, "UTCP channel closed with stuff in receive buffer\n");
+ return reset_connection(c) ? 0 : -1;
+ }
+
if(utcp_shutdown(c, SHUT_RDWR) && errno != ENOTCONN) {
return -1;
}