tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: TCP connection and "Host is down"



Manuel Bouyer <bouyer%antioche.eu.org@localhost> writes:

> I wonder if we need this patch to tcp_output.c (not tested yet)
>
> Index: netinet/tcp_output.c
> ===================================================================
> RCS file: /cvsroot/src/sys/netinet/tcp_output.c,v
> retrieving revision 1.218
> diff -u -p -u -r1.218 tcp_output.c
> --- netinet/tcp_output.c	4 Nov 2022 09:01:53 -0000	1.218
> +++ netinet/tcp_output.c	11 Sep 2023 14:20:54 -0000
> @@ -1612,8 +1612,8 @@ out:
>  			TCP_STATINC(TCP_STAT_SELFQUENCH);
>  			tcp_quench(tp->t_inpcb);
>  			error = 0;
> -		} else if ((error == EHOSTUNREACH || error == ENETDOWN) &&
> -		    TCPS_HAVERCVDSYN(tp->t_state)) {
> +		} else if ((error == EHOSTUNREACH || error == ENETDOWN ||
> +		    error == EHOSTDOWN) && TCPS_HAVERCVDSYN(tp->t_state)) {
>  			tp->t_softerror = error;
>  			error = 0;
>  		}
>

I have never understood why these sorts of errors lead to TCP closures.
I do expect these errors to lead to backoff.    EHOSTDOWN to me is about
"arp has failed after timing out", but that happens faster than TCP
gives up.

So assuming a system with your patch is ok and fixes your issue, LGTM.

> Also, while auditing the code for ENETDOWN or EHOSTUNREACH handling I wonder
> if we also need this for stcp (but I'm not using stcp ...)
>
> Index: netinet/sctp_output.c
> ===================================================================
> RCS file: /cvsroot/src/sys/netinet/sctp_output.c,v
> retrieving revision 1.33
> diff -u -p -u -r1.33 sctp_output.c
> --- netinet/sctp_output.c	4 Nov 2022 09:01:53 -0000	1.33
> +++ netinet/sctp_output.c	11 Sep 2023 14:20:54 -0000
> @@ -5643,7 +5643,8 @@ sctp_med_chunk_output(struct sctp_inpcb 
>  							}
>  							hbflag = 0;
>  						}
> -						if (error == EHOSTUNREACH) {
> +						if (error == EHOSTUNREACH ||
> +						    error == EHOSTDOWN) {
>  							/*
>  							 * Destination went
>  							 * unreachable during
> @@ -5921,7 +5922,8 @@ sctp_med_chunk_output(struct sctp_inpcb 
>  					}
>  					hbflag = 0;
>  				}
> -				if (error == EHOSTUNREACH) {
> +				if (error == EHOSTUNREACH ||
> +				    error == EHOSTDOWN) {
>  					/*
>  					 * Destination went unreachable during
>  					 * this send

looks good.   I bet that it will help 73% of the 0 people using SCTP, so
assuming it survives a full anita run, go for it.


Home | Main Index | Thread Index | Old Index