Blob Blame History Raw
commit b84b48c61368544d14324d6173d3918d24df9837
Author: Christine Caulfield <ccaulfie@redhat.com>
Date:   Wed Jan 29 15:52:26 2020 +0000

    [udp] Better fix for -ENETUNREACH
    
    This fix for the ENETUNREACH problem works better than the last one
    in that it also works with Linux kernels > 5.0.0 (which return
    -ENETUNREACH) if an interfaces is brought down, and also on FreeBSD
    which returns ENETDOWN.


--- a/libknet/transport_udp.c	2020-08-12 10:57:52.480344141 +0100
+++ b/libknet/transport_udp.c	2020-08-12 10:47:43.168435711 +0100
@@ -395,14 +395,20 @@
 			read_errs_from_sock(knet_h, sockfd);
 			return 0;
 		}
-		if (recv_errno == EINVAL || recv_errno == EPERM) {
+		if ((recv_errno == EINVAL) || (recv_errno == EPERM) ||
+		    (recv_errno == ENETUNREACH) || (recv_errno == ENETDOWN)) {
+#ifdef DEBUG
+			if ((recv_errno == ENETUNREACH) || (recv_errno == ENETDOWN)) {
+				log_debug(knet_h, KNET_SUB_TRANSP_UDP, "Sock: %d is unreachable.", sockfd);
+			}
+#endif
 			return -1;
 		}
 		if ((recv_errno == ENOBUFS) || (recv_errno == EAGAIN)) {
 #ifdef DEBUG
 			log_debug(knet_h, KNET_SUB_TRANSP_UDP, "Sock: %d is overloaded. Slowing TX down", sockfd);
 #endif
-			usleep(KNET_THREADS_TIMERES / 16);
+			usleep(KNET_THREADS_TIMERES / 16);
 		} else {
 			read_errs_from_sock(knet_h, sockfd);
 		}