dhcp: allow some same-state transitions (rh #801744)
authorDan Williams <dcbw@redhat.com>
Wed, 16 May 2012 03:45:27 +0000 (22:45 -0500)
committerDan Williams <dcbw@redhat.com>
Wed, 16 May 2012 03:54:42 +0000 (22:54 -0500)
The DHCP code usually ignores dhclient state transitions to the
same state it's currently in.  This turns out to be wrong, since
dhclient will use the same reason code (which NM uses for the
state value) for operations like RENEW and REBIND.  i.e. you'll
see states like this:

BOUND
RENEW (first renew)
RENEW (second renew)
RENEW (third renew)
etc

Therefore to ensure we trigger dispatcher scripts and internal
housekeeping code for renewals we need to make sure we process
these events even though they use the same state as the previous
event.

src/dhcp-manager/nm-dhcp-client.c

index 16c6dd7..f6fec0a 100644 (file)
@@ -570,8 +570,20 @@ nm_dhcp_client_new_options (NMDHCPClient *self,
        g_hash_table_remove_all (priv->options);
        g_hash_table_foreach (options, copy_option, priv->options);
 
-       if (old_state == new_state)
-               return;
+       if (old_state == new_state) {
+               /* dhclient will stay in the same state (or, really, provide the same
+                * reason) for operations like RENEW and REBIND.  We need to ensure
+                * that triggers various DHCP lease change code, so we need to pass
+                * along same-state transitions for these states.
+                */
+               if (   new_state != DHC_BOUND4
+                   && new_state != DHC_RENEW4
+                   && new_state != DHC_REBIND4
+                   && new_state != DHC_BOUND6
+                   && new_state != DHC_RENEW6
+                   && new_state != DHC_REBIND6)
+                       return;
+       }
 
        /* Handle changed device state */
        if (state_is_bound (new_state)) {