Blob Blame History Raw
From 2f18434cef0ab68343ec464159de940a59f02119 Mon Sep 17 00:00:00 2001
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 29 Apr 2014 16:42:57 -0500
Subject: [PATCH] core: emit dhcp4/dhcp6-change dispatcher events if other IP
 completes first (rh #1091296)

If IPv6 completes first it would emit the "up" dispatcher event with IPv6
details and move the device to ACTIVATED state.  But if DHCPv4 was still
running, no dispatcher event would be emitted with the DHCPv4 information
until the first lease renew.  Thus dispatcher scripts would not receive
DHCPv4 information for quite some time.

Ensure that if the other IP version completes first, that when the slower
method's DHCP completes, that it emits the appropriate dhcp4-change
or dhcp6-change event so that dispatcher scripts get the information
as soon as it's available.
---
 src/devices/nm-device.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 6005072..2043ae3 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4481,14 +4481,28 @@ nm_device_activate_ip4_config_commit (gpointer user_data)
 		if (!start_sharing (self, priv->ip4_config)) {
 			nm_log_warn (LOGD_SHARING, "Activation (%s) Stage 5 of 5 (IPv4 Commit) start sharing failed.", iface);
 			nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_SHARED_START_FAILED);
 			goto out;
 		}
 	}
 
+	/* If IPv4 wasn't the first to complete, and DHCP was used, then ensure
+	 * dispatcher scripts get the DHCP lease information.
+	 */
+	if (   priv->dhcp4_client
+	    && nm_device_activate_ip4_state_in_conf (self)
+	    && (nm_device_get_state (self) > NM_DEVICE_STATE_IP_CONFIG)) {
+		/* Notify dispatcher scripts of new DHCP4 config */
+		nm_dispatcher_call (DISPATCHER_ACTION_DHCP4_CHANGE,
+		                    nm_device_get_connection (self),
+		                    self,
+		                    NULL,
+		                    NULL);
+	}
+
 	arp_announce (self);
 
 	/* Enter the IP_CHECK state if this is the first method to complete */
 	priv->ip4_state = IP_DONE;
 	if (nm_device_get_state (self) == NM_DEVICE_STATE_IP_CONFIG)
 		nm_device_state_changed (self, NM_DEVICE_STATE_IP_CHECK, NM_DEVICE_STATE_REASON_NONE);
 
@@ -4558,14 +4572,28 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
 	g_warn_if_fail (nm_platform_link_is_up (nm_device_get_ip_ifindex (self)));
 
 	/* Allow setting MTU etc */
 	if (NM_DEVICE_GET_CLASS (self)->ip6_config_pre_commit)
 		NM_DEVICE_GET_CLASS (self)->ip6_config_pre_commit (self);
 
 	if (ip6_config_merge_and_apply (self, TRUE, &reason)) {
+		/* If IPv6 wasn't the first IP to complete, and DHCP was used,
+		 * then ensure dispatcher scripts get the DHCP lease information.
+		 */
+		if (   priv->dhcp6_client
+		    && nm_device_activate_ip6_state_in_conf (self)
+		    && (nm_device_get_state (self) > NM_DEVICE_STATE_IP_CONFIG)) {
+			/* Notify dispatcher scripts of new DHCP6 config */
+			nm_dispatcher_call (DISPATCHER_ACTION_DHCP6_CHANGE,
+			                    nm_device_get_connection (self),
+			                    self,
+			                    NULL,
+			                    NULL);
+		}
+
 		/* Enter the IP_CHECK state if this is the first method to complete */
 		priv->ip6_state = IP_DONE;
 		if (nm_device_get_state (self) == NM_DEVICE_STATE_IP_CONFIG)
 			nm_device_state_changed (self, NM_DEVICE_STATE_IP_CHECK, NM_DEVICE_STATE_REASON_NONE);
 	} else {
 		nm_log_warn (LOGD_DEVICE | LOGD_IP6,
 			         "Activation (%s) Stage 5 of 5 (IPv6 Commit) failed",
-- 
1.9.0