457 |
if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs")); |
if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs")); |
458 |
while(pcb != NULL) { |
while(pcb != NULL) { |
459 |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb")); |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb")); |
460 |
ASSERT("tcp_timer_coarse: active pcb->state != CLOSED", pcb->state != CLOSED); |
ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED); |
461 |
ASSERT("tcp_timer_coarse: active pcb->state != LISTEN", pcb->state != LISTEN); |
ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN); |
462 |
ASSERT("tcp_timer_coarse: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); |
463 |
|
|
464 |
pcb_remove = 0; |
pcb_remove = 0; |
465 |
|
|
475 |
if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) { |
if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) { |
476 |
|
|
477 |
/* Time for a retransmission. */ |
/* Time for a retransmission. */ |
478 |
DEBUGF(TCP_RTO_DEBUG, ("tcp_timer_coarse: rtime %ld pcb->rto %d\n", |
DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %ld pcb->rto %d\n", |
479 |
tcp_ticks - pcb->rtime, pcb->rto)); |
tcp_ticks - pcb->rtime, pcb->rto)); |
480 |
|
|
481 |
/* Double retransmission time-out unless we are trying to |
/* Double retransmission time-out unless we are trying to |
494 |
} |
} |
495 |
pcb->cwnd = pcb->mss; |
pcb->cwnd = pcb->mss; |
496 |
|
|
497 |
DEBUGF(TCP_CWND_DEBUG, ("tcp_rexmit_seg: cwnd %u ssthresh %u\n", |
DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %u ssthresh %u\n", |
498 |
pcb->cwnd, pcb->ssthresh)); |
pcb->cwnd, pcb->ssthresh)); |
499 |
} |
} |
500 |
} |
} |
517 |
pcb->rto * TCP_OOSEQ_TIMEOUT) { |
pcb->rto * TCP_OOSEQ_TIMEOUT) { |
518 |
tcp_segs_free(pcb->ooseq); |
tcp_segs_free(pcb->ooseq); |
519 |
pcb->ooseq = NULL; |
pcb->ooseq = NULL; |
520 |
DEBUGF(TCP_CWND_DEBUG, ("tcp: dropping OOSEQ queued data\n")); |
DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); |
521 |
} |
} |
522 |
#endif /* TCP_QUEUE_OOSEQ */ |
#endif /* TCP_QUEUE_OOSEQ */ |
523 |
|
|
526 |
if((u32_t)(tcp_ticks - pcb->tmr) > |
if((u32_t)(tcp_ticks - pcb->tmr) > |
527 |
TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { |
TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { |
528 |
++pcb_remove; |
++pcb_remove; |
529 |
DEBUGF(TCP_DEBUG, ("tcp_slottmr: removing pcb stuck in SYN-RCVD\n")); |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n")); |
530 |
} |
} |
531 |
} |
} |
532 |
|
|
536 |
tcp_pcb_purge(pcb); |
tcp_pcb_purge(pcb); |
537 |
/* Remove PCB from tcp_active_pcbs list. */ |
/* Remove PCB from tcp_active_pcbs list. */ |
538 |
if(prev != NULL) { |
if(prev != NULL) { |
539 |
ASSERT("tcp_timer_coarse: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); |
ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); |
540 |
prev->next = pcb->next; |
prev->next = pcb->next; |
541 |
} else { |
} else { |
542 |
/* This PCB was the first. */ |
/* This PCB was the first. */ |
543 |
ASSERT("tcp_timer_coarse: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); |
ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); |
544 |
tcp_active_pcbs = pcb->next; |
tcp_active_pcbs = pcb->next; |
545 |
} |
} |
546 |
|
|
555 |
++pcb->polltmr; |
++pcb->polltmr; |
556 |
if(pcb->polltmr >= pcb->pollinterval) { |
if(pcb->polltmr >= pcb->pollinterval) { |
557 |
pcb->polltmr = 0; |
pcb->polltmr = 0; |
558 |
DEBUGF(TCP_DEBUG, ("tcp_slottmr: polling application\n")); |
DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n")); |
559 |
TCP_EVENT_POLL(pcb, err); |
TCP_EVENT_POLL(pcb, err); |
560 |
if(err == ERR_OK) { |
if(err == ERR_OK) { |
561 |
tcp_output(pcb); |
tcp_output(pcb); |
572 |
prev = NULL; |
prev = NULL; |
573 |
pcb = tcp_tw_pcbs; |
pcb = tcp_tw_pcbs; |
574 |
while(pcb != NULL) { |
while(pcb != NULL) { |
575 |
ASSERT("tcp_timer_coarse: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); |
576 |
pcb_remove = 0; |
pcb_remove = 0; |
577 |
|
|
578 |
/* Check if this PCB has stayed long enough in TIME-WAIT */ |
/* Check if this PCB has stayed long enough in TIME-WAIT */ |
587 |
tcp_pcb_purge(pcb); |
tcp_pcb_purge(pcb); |
588 |
/* Remove PCB from tcp_tw_pcbs list. */ |
/* Remove PCB from tcp_tw_pcbs list. */ |
589 |
if(prev != NULL) { |
if(prev != NULL) { |
590 |
ASSERT("tcp_timer_coarse: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); |
ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); |
591 |
prev->next = pcb->next; |
prev->next = pcb->next; |
592 |
} else { |
} else { |
593 |
/* This PCB was the first. */ |
/* This PCB was the first. */ |
594 |
ASSERT("tcp_timer_coarse: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); |
ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); |
595 |
tcp_tw_pcbs = pcb->next; |
tcp_tw_pcbs = pcb->next; |
596 |
} |
} |
597 |
pcb2 = pcb->next; |
pcb2 = pcb->next; |