Fixed bug #32820 (Outgoing TCP connections created before route is present never times out) by starting retransmission timer before checking route.

This commit is contained in:
goldsimon 2011-03-27 13:00:54 +00:00
parent 4495516497
commit 3bad9f013e
2 changed files with 12 additions and 6 deletions

View File

@ -13,7 +13,7 @@ HISTORY
++ New features: ++ New features:
2011-03-22: Simon Goldschmidt 2011-03-27: Simon Goldschmidt
* tcp_impl.h, tcp_in.c, tcp_out.c: Removed 'dataptr' from 'struct tcp_seg' and * tcp_impl.h, tcp_in.c, tcp_out.c: Removed 'dataptr' from 'struct tcp_seg' and
calculate it in tcp_zero_window_probe (the only place where it was used). calculate it in tcp_zero_window_probe (the only place where it was used).
@ -237,6 +237,11 @@ HISTORY
++ Bugfixes: ++ Bugfixes:
2011-03-27: Simon Goldschmidt
* tcp_out.c: Fixed bug #32820 (Outgoing TCP connections created before route
is present never times out) by starting retransmission timer before checking
route.
2011-03-22: Simon Goldschmidt 2011-03-22: Simon Goldschmidt
* ppp.c: Fixed bug #32648 (PPP code crashes when terminating a link) by only * ppp.c: Fixed bug #32648 (PPP code crashes when terminating a link) by only
calling sio_read_abort() if the file descriptor is valid. calling sio_read_abort() if the file descriptor is valid.

View File

@ -1078,6 +1078,12 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
} }
#endif #endif
/* Set retransmission timer running if it is not currently enabled
This must be set before checking the route. */
if (pcb->rtime == -1) {
pcb->rtime = 0;
}
/* If we don't have a local IP address, we get one by /* If we don't have a local IP address, we get one by
calling ip_route(). */ calling ip_route(). */
if (ip_addr_isany(&(pcb->local_ip))) { if (ip_addr_isany(&(pcb->local_ip))) {
@ -1088,11 +1094,6 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
ip_addr_copy(pcb->local_ip, netif->ip_addr); ip_addr_copy(pcb->local_ip, netif->ip_addr);
} }
/* Set retransmission timer running if it is not currently enabled */
if(pcb->rtime == -1) {
pcb->rtime = 0;
}
if (pcb->rttest == 0) { if (pcb->rttest == 0) {
pcb->rttest = tcp_ticks; pcb->rttest = tcp_ticks;
pcb->rtseq = ntohl(seg->tcphdr->seqno); pcb->rtseq = ntohl(seg->tcphdr->seqno);