7734ea0612
When this happens, we know for sure that the packet data was not received by the peer. Therefore, back out any advancing of the transmit sequence number so that we send the same data the next time we transmit a packet, avoiding a guaranteed missed packet and its resulting TCP transmit slowdown. In most systems ip_output() probably never returns an error, and so this problem is never seen. However, it is more likely to occur with device drivers having short output queues (causing ENOBUFS to be returned when they are full), not to mention low memory situations. Moreover, because of this problem writers of slow devices were required to make an unfortunate choice between (a) having a relatively short output queue (with low latency but low TCP bandwidth because of this problem) or (b) a long output queue (with high latency and high TCP bandwidth). In my particular application (ISDN) it took an output queue equal to ~5 seconds of transmission to avoid ENOBUFS. A more reasonable output queue of 0.5 seconds resulted in only about 50% TCP throughput. With this patch full throughput was restored in the latter case. Reviewed by: freebsd-net |
||
---|---|---|
.. | ||
libalias | ||
accf_data.c | ||
accf_http.c | ||
fil.c | ||
icmp6.h | ||
icmp_var.h | ||
if_atm.c | ||
if_atm.h | ||
if_ether.c | ||
if_ether.h | ||
if_fddi.h | ||
igmp_var.h | ||
igmp.c | ||
igmp.h | ||
in_cksum.c | ||
in_gif.c | ||
in_gif.h | ||
in_hostcache.c | ||
in_hostcache.h | ||
in_pcb.c | ||
in_pcb.h | ||
in_proto.c | ||
in_rmx.c | ||
in_systm.h | ||
in_var.h | ||
in.c | ||
in.h | ||
ip6.h | ||
ip_auth.c | ||
ip_auth.h | ||
ip_compat.h | ||
ip_divert.c | ||
ip_dummynet.c | ||
ip_dummynet.h | ||
ip_ecn.c | ||
ip_ecn.h | ||
ip_encap.c | ||
ip_encap.h | ||
ip_fil.c | ||
ip_fil.h | ||
ip_flow.c | ||
ip_flow.h | ||
ip_frag.c | ||
ip_frag.h | ||
ip_ftp_pxy.c | ||
ip_fw.c | ||
ip_fw.h | ||
ip_icmp.c | ||
ip_icmp.h | ||
ip_input.c | ||
ip_log.c | ||
ip_mroute.c | ||
ip_mroute.h | ||
ip_nat.c | ||
ip_nat.h | ||
ip_output.c | ||
ip_proxy.c | ||
ip_proxy.h | ||
ip_raudio_pxy.c | ||
ip_rcmd_pxy.c | ||
ip_state.c | ||
ip_state.h | ||
ip_var.h | ||
ip.h | ||
ipl.h | ||
ipprotosw.h | ||
mlfk_ipl.c | ||
raw_ip.c | ||
tcp_debug.c | ||
tcp_debug.h | ||
tcp_fsm.h | ||
tcp_input.c | ||
tcp_output.c | ||
tcp_reass.c | ||
tcp_seq.h | ||
tcp_subr.c | ||
tcp_timer.c | ||
tcp_timer.h | ||
tcp_timewait.c | ||
tcp_usrreq.c | ||
tcp_var.h | ||
tcp.h | ||
tcpip.h | ||
udp_usrreq.c | ||
udp_var.h | ||
udp.h |