u32 available_space, wnd;
i32 observed_wnd;
- ASSERT (tc->rcv_opts.mss < transport_rx_fifo_size (&tc->connection));
-
/*
* Figure out how much space we have available
*/
tc->snd_opts_len = tcp_make_options (tc, &tc->snd_opts, tc->state);
tcp_hdr_opts_len = tc->snd_opts_len + sizeof (tcp_header_t);
- advertise_wnd = tcp_window_to_advertise (tc, TCP_STATE_ESTABLISHED);
+ advertise_wnd = tc->rcv_wnd >> tc->rcv_wscale;
flags = TCP_FLAG_RST;
th = vlib_buffer_push_tcp (b, tc->c_lcl_port, tc->c_rmt_port, tc->snd_nxt,
tc->rcv_nxt, tcp_hdr_opts_len, flags,
/* Problem already solved or worse */
if (tc->state == TCP_STATE_CLOSED || tc->snd_wnd > tc->snd_mss
|| (tc->flags & TCP_CONN_FINSNT))
- return;
+ goto update_scheduler;
available_bytes = transport_max_tx_dequeue (&tc->connection);
offset = tc->snd_nxt - tc->snd_una;
}
if (available_bytes <= offset)
- return;
+ goto update_scheduler;
/* Increment RTO backoff */
tc->rto_boff += 1;
tcp_persist_timer_set (tc);
return;
}
+
b = vlib_get_buffer (vm, bi);
data = tcp_init_buffer (vm, b);
/* Just sent new data, enable retransmit */
tcp_retransmit_timer_update (tc);
+
+ return;
+
+update_scheduler:
+
+ if (tcp_is_descheduled (tc))
+ transport_connection_reschedule (&tc->connection);
}
/**