Current-Users archive

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

Re: recent dhcpcd looping on ppp0



Hi Frank

On 2014-09-28 22:58, Frank Kardel wrote:
On 09/28/14 23:17, Roy Marples wrote:
On Sunday 28 Sep 2014 22:06:47 Roy Marples wrote:
Going to guess that ppp0 doesn't have a carrier status OR IFF_RUNNING set? The attached patch should reduce the log spam, let me know how it works out.
Errm, this patch should do better!


Roy
Well, less spam, but still
    - busy wait (repeated count goes up to ~300k)
Sep 28 23:50:05 Andromeda dhcpcd[1101]: ppp0: unknown carrier
Sep 28 23:50:05 Andromeda dhcpcd[1101]: ppp0: carrier_status:
Inappropriate ioctl for device
Sep 28 23:50:14 Andromeda syslogd[1251]: last message repeated 12776 times

- a flurry of routing messages (probably same number of as syslog entries)
got message of size 152 on Sun Sep 28 23:50:10 2014
RTM_IFINFO: iface status change: len 152, if# 6, carrier: unknown,
flags: <UP,PTP,MULTICAST>
got message of size 152 on Sun Sep 28 23:50:10 2014

Yes, these messages are being triggerd by a flurry of routing messages.
This is probably a bug in NetBSD somewhere and the attached patch should pretty much silence the warnings down to one n dhcpcd until the link actually comes up.

Let me know how this one works!

Thanks

Roy
Index: dhcpcd.c
==================================================================
--- dhcpcd.c
+++ dhcpcd.c
@@ -547,19 +547,23 @@
 		 * dhcpcd has already set it.
 		 *
 		 * So we check the flags now. If IFF_UP is still not set
 		 * then we should expect an accompanying link_down message */
 		if_setflag(ifp, 0); /* will set ifp->flags */
+		ifp->options->options &= ~DHCPCD_LINK_WARNED;
 		break;
 	default:
 		ifp->flags = flags;
+		ifp->options->options &= ~DHCPCD_LINK_WARNED;
 	}
 
-	if (carrier == LINK_UNKNOWN)
-		syslog(LOG_ERR, "%s: carrier_status: %m", ifname);
-	/* IFF_RUNNING is checked, if needed, earlier and is OS dependant */
-	else if (carrier == LINK_DOWN || (ifp->flags & IFF_UP) == 0) {
+	if (carrier == LINK_UNKNOWN) {
+		if (!ifp->options->options & DHCPCD_LINK_WARNED) {
+			syslog(LOG_ERR, "%s: carrier_status: %m", ifname);
+			ifp->options->options |= DHCPCD_LINK_WARNED;
+		}
+	} else if (carrier == LINK_DOWN || (ifp->flags & IFF_UP) == 0) {
 		if (ifp->carrier != LINK_DOWN) {
 			if (ifp->carrier == LINK_UP)
 				syslog(LOG_INFO, "%s: carrier lost", ifp->name);
 			ifp->carrier = LINK_DOWN;
 			script_runreason(ifp, "NOCARRIER");
@@ -648,21 +652,26 @@
 
 	if (ifo->options & DHCPCD_LINK) {
 link_retry:
 		switch (ifp->carrier) {
 		case LINK_UP:
+			ifo->options &= ~DHCPCD_LINK_WARNED;
 			break;
 		case LINK_DOWN:
+			ifo->options &= ~DHCPCD_LINK_WARNED;
 			syslog(LOG_INFO, "%s: waiting for carrier", ifp->name);
 			return;
 		case LINK_UNKNOWN:
 			/* No media state available, so we loop until
 			 * IFF_UP and IFF_RUNNING are set. */
 			ifp->carrier = if_carrier(ifp);
 			if (ifp->carrier != LINK_UNKNOWN)
 				goto link_retry;
-			syslog(LOG_INFO, "%s: unknown carrier", ifp->name);
+			if (!(ifo->options & DHCPCD_LINK_WARNED)) {
+				syslog(LOG_INFO, "%s: unknown carrier", ifp->name);
+				ifo->options |= DHCPCD_LINK_WARNED;
+			}
 			tv.tv_sec = 0;
 			tv.tv_usec = 100;
 			eloop_timeout_add_tv(ifp->ctx->eloop, &tv,
 			    dhcpcd_startinterface, ifp);
 			return;

Index: if-options.h
==================================================================
--- if-options.h
+++ if-options.h
@@ -104,10 +104,11 @@
 #define DHCPCD_DHCP			(1ULL << 49)
 #define DHCPCD_DHCP6			(1ULL << 50)
 #define DHCPCD_NOPFXDLG			(1ULL << 51)
 #define DHCPCD_PFXDLGONLY		(1ULL << 52)
 #define DHCPCD_PFXDLGMIX		(1ULL << 53)
+#define DHCPCD_LINK_WARNED		(1ULL << 54)
 
 extern const struct option cf_options[];
 
 struct if_sla {
 	char ifname[IF_NAMESIZE];



Home | Main Index | Thread Index | Old Index