[rtems-libbsd commit] dhcpcd: Don't ignore interface on transient errors.

Sebastian Huber sebh at rtems.org
Fri Nov 10 13:22:23 UTC 2017


Module:    rtems-libbsd
Branch:    master
Commit:    ddd16bcc321e44b9ca2f24a66d6be42fa75860dc
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=ddd16bcc321e44b9ca2f24a66d6be42fa75860dc

Author:    Christian Mauderer <Christian.Mauderer at embedded-brains.de>
Date:      Tue Nov  7 11:54:39 2017 +0100

dhcpcd: Don't ignore interface on transient errors.

In case of WPA on a WiFi interface, the interface isn't yet ready when
the dhcpcd starts. Sending a packet during that time returns with a
ENOBUFS. That caused the interface to be ignored.

On the upstream repository of dhcpcd, that transient error (and some
others) are already ignored.

---

 dhcpcd/dhcp.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/dhcpcd/dhcp.c b/dhcpcd/dhcp.c
index 1641f44..5a06172 100644
--- a/dhcpcd/dhcp.c
+++ b/dhcpcd/dhcp.c
@@ -1487,6 +1487,9 @@ send_message(struct interface *iface, int type,
 	struct in_addr from, to;
 	in_addr_t a = 0;
 	struct timeval tv;
+#ifdef __rtems__
+	int errno_save;
+#endif /* __rtems__ */
 
 	if (!callback)
 		syslog(LOG_DEBUG, "%s: sending %s with xid 0x%x",
@@ -1544,6 +1547,9 @@ send_message(struct interface *iface, int type,
 		if (len == -1)
 			return;
 		r = ipv4_sendrawpacket(iface, ETHERTYPE_IP, udp, len);
+#ifdef __rtems__
+		errno_save = errno;
+#endif /* __rtems__ */
 		free(udp);
 		/* If we failed to send a raw packet this normally means
 		 * we don't have the ability to work beneath the IP layer
@@ -1553,11 +1559,20 @@ send_message(struct interface *iface, int type,
 		if (r == -1) {
 			syslog(LOG_ERR, "%s: ipv4_sendrawpacket: %m",
 			    iface->name);
+#ifdef __rtems__
+			if (errno_save != ENETDOWN &&
+			    errno_save != ENETRESET &&
+			    errno_save != ENETUNREACH &&
+			    errno_save != ENOBUFS) {
+#endif /* __rtems__ */
 			if (!(options & DHCPCD_TEST))
 				dhcp_drop(iface, "FAIL");
 			dhcp_close(iface);
 			eloop_timeout_delete(NULL, iface);
 			callback = NULL;
+#ifdef __rtems__
+			}
+#endif /* __rtems__ */
 		}
 	}
 	free(dhcp);



More information about the vc mailing list