18280799 ntpd may not reach NTP servers during boot if it has multiple IP address
authorBrian Utterback <brian.utterback@oracle.com>
Tue, 15 Jul 2014 07:20:42 -0700
changeset 2002 5d0b96773c16
parent 2001 94f18110af7b
child 2003 81f9a60cccb1
18280799 ntpd may not reach NTP servers during boot if it has multiple IP address
components/ntp/patches/70-refresh.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/ntp/patches/70-refresh.patch	Tue Jul 15 07:20:42 2014 -0700
@@ -0,0 +1,122 @@
+Patch to restore the period refreshing of the interface list 
+and to re-resolve the peers source addresses. This is needed
+because the interfaces are not done coming online when ntpd
+starts due to delays from DAD. 
+
+This patch can be removed when NTP is upgraded to 4.2.7p396
+or later
+
+
+--- ntpd/ntp_io.c
++++ ntpd/ntp_io.c
[email protected]@ -1704,7 +1704,6 @@ update_interfaces(
+ 	isc_result_t		result;
+ 	isc_interface_t		isc_if;
+ 	int			new_interface_found;
+-	int			refresh_peers;
+ 	unsigned int		family;
+ 	endpt			enumep;
+ 	endpt *			ep;
[email protected]@ -1719,7 +1718,6 @@ update_interfaces(
+ 	 */
+ 
+ 	new_interface_found = FALSE;
+-	refresh_peers = FALSE;
+ 	iter = NULL;
+ 	result = isc_interfaceiter_create(mctx, &iter);
+ 
[email protected]@ -1755,6 +1753,8 @@ update_interfaces(
+ 
+ 		convert_isc_if(&isc_if, &enumep, port);
+ 
++		DPRINT_INTERFACE(4, (&enumep, "examining ", "\n"));
++
+ 		/* 
+ 		 * Check if and how we are going to use the interface.
+ 		 */
[email protected]@ -1762,19 +1762,23 @@ update_interfaces(
+ 					 enumep.flags)) {
+ 
+ 		case ACTION_IGNORE:
++			DPRINTF(4, ("ignoring interface %s (%s) - by nic rules\n",
++			    enumep.name, stoa(&enumep.sin)));
+ 			continue;
+ 
+ 		case ACTION_LISTEN:
++			DPRINTF(4, ("listen interface %s (%s) - by nic rules\n",
++			    enumep.name, stoa(&enumep.sin)));
+ 			enumep.ignore_packets = ISC_FALSE;
+ 			break;
+ 
+ 		case ACTION_DROP:
++			DPRINTF(4, ("drop on interface %s (%s) - by nic rules\n",
++			    enumep.name, stoa(&enumep.sin)));
+ 			enumep.ignore_packets = ISC_TRUE;
+ 			break;
+ 		}
+ 
+-		DPRINT_INTERFACE(4, (&enumep, "examining ", "\n"));
+-
+ 		 /* interfaces must be UP to be usable */
+ 		if (!(enumep.flags & INT_UP)) {
+ 			DPRINTF(4, ("skipping interface %s (%s) - DOWN\n",
[email protected]@ -1817,15 +1821,7 @@ update_interfaces(
+ 				 */
+ 				strlcpy(ep->name, enumep.name,
+ 					sizeof(ep->name));
+-				if (ep->ignore_packets !=
+-				    enumep.ignore_packets) {
+-					ep->ignore_packets = 
+-					    enumep.ignore_packets;
+-					refresh_peers = TRUE;
+-					DPRINTF(4, ("refreshing peers due to %s ignore_packets change to %d\n",
+-					    stoa(&ep->sin),
+-					    ep->ignore_packets));
+-				}
++				ep->ignore_packets = enumep.ignore_packets;
+ 			} else {
+ 				/* name collision - rename interface */
+ 				strlcpy(ep->name, "*multiple*",
[email protected]@ -1890,9 +1886,6 @@ update_interfaces(
+ 					(*receiver)(data, &ifi);
+ 
+ 				new_interface_found = TRUE;
+-				refresh_peers = TRUE;
+-				DPRINTF(4, ("refreshing peers due to new addr %s\n",
+-					stoa(&ep->sin)));
+ 				DPRINT_INTERFACE(3,
+ 					(ep, "updating ",
+ 					 " new - created\n"));
[email protected]@ -1932,9 +1925,6 @@ update_interfaces(
+ 		DPRINT_INTERFACE(3, (ep, "updating ",
+ 				     "GONE - deleting\n"));
+ 		remove_interface(ep);
+-		refresh_peers = TRUE;
+-		DPRINTF(4, ("refreshing peers due to deleted addr %s\n",
+-			    stoa(&ep->sin)));
+ 
+ 		ifi.action = IFS_DELETED;
+ 		ifi.ep = ep;
[email protected]@ -1956,17 +1946,16 @@ update_interfaces(
+ 	}
+ 
+ 	/*
+-	 * phase 3 - re-configure as the world has changed if necessary
++	 * phase 3 - re-configure as the world has probably changed
++	 *
++	 * never ever make this conditional again - it is needed to track
++	 * routing updates. see bug #2506
+ 	 */
++	refresh_all_peerinterfaces();
+ 
+ 	if (broadcast_client_enabled)
+ 		io_setbclient();
+ 	
+-	if (refresh_peers) {
+-		refresh_all_peerinterfaces();
+-		msyslog(LOG_INFO, "peers refreshed");
+-	}
+-
+ 	return new_interface_found;
+ }
+