From ddd16bcc321e44b9ca2f24a66d6be42fa75860dc Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Tue, 7 Nov 2017 11:54:39 +0100 Subject: 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(+) (limited to 'dhcpcd') diff --git a/dhcpcd/dhcp.c b/dhcpcd/dhcp.c index 1641f44c..5a061726 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); -- cgit v1.2.3