Change in vdsm[master]: iproute2, dhclient: Deal with v4/v6 protocols separately

osvoboda at redhat.com osvoboda at redhat.com
Tue Aug 5 17:04:36 UTC 2014


Ondřej Svoboda has uploaded a new change for review.

Change subject: iproute2, dhclient: Deal with v4/v6 protocols separately
......................................................................

iproute2, dhclient: Deal with v4/v6 protocols separately

When taking over DHCP services, stop the previously running dhclient
only if the protocol matches. Similarly, flush only the respective
adresses (also keep link-local v6 addresses for DHCPv6 functionality).

Change-Id: I5708c4db6f6d450536bd243a0475164b89f46f93
Signed-off-by: Ondřej Svoboda <osvoboda at redhat.com>
---
M lib/vdsm/ipwrapper.py
M vdsm/network/configurators/dhclient.py
2 files changed, 14 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/04/31104/1

diff --git a/lib/vdsm/ipwrapper.py b/lib/vdsm/ipwrapper.py
index 3b38be4..79ad112 100644
--- a/lib/vdsm/ipwrapper.py
+++ b/lib/vdsm/ipwrapper.py
@@ -556,8 +556,10 @@
     _execCmd(command)
 
 
-def addrFlush(dev):
-    command = [_IP_BINARY.cmd, 'addr', 'flush', 'dev', dev]
+def addrFlush(dev, family='both'):
+    family = ['-%s' % family] if family in (4, 6) else []
+    command = [_IP_BINARY.cmd] + family + ['addr', 'flush', 'dev', dev,
+               'scope', 'global']
     _execCmd(command)
 
 
diff --git a/vdsm/network/configurators/dhclient.py b/vdsm/network/configurators/dhclient.py
index 8adbc2a..8f1617a 100644
--- a/vdsm/network/configurators/dhclient.py
+++ b/vdsm/network/configurators/dhclient.py
@@ -48,7 +48,7 @@
     def _dhclient(self):
         # Ask dhclient to stop any dhclient running for the device
         if os.path.exists(os.path.join(netinfo.NET_PATH, self.iface)):
-            kill_dhclient(self.iface)
+            kill_dhclient(self.iface, self.family)
         rc, out, err = execCmd([self.DHCLIENT.cmd, '-%s' % self.family,
                                 '-1', '-pf', self.pidFile,
                                 '-lf', self.leaseFile, self.iface])
@@ -76,7 +76,7 @@
             _kill_and_rm_pid(pid, self.pidFile)
 
 
-def kill_dhclient(device_name):
+def kill_dhclient(device_name, family=4):
     for pid in pgrep('dhclient'):
         try:
             with open('/proc/%s/cmdline' % pid) as cmdline:
@@ -88,18 +88,24 @@
             continue
         tokens = iter(args)
         pid_file = '/var/run/dhclient.pid'  # Default client pid location
+        running_family = 4
         for token in tokens:
             if token == '-pf':
                 pid_file = next(tokens)
             elif token == '--no-pid':
                 pid_file = None
+            elif token == '-6':
+                running_family = 6
 
+        if running_family != family:
+            continue
         _kill_and_rm_pid(pid, pid_file)
 
     #  In order to be able to configure the device with dhclient again. It is
     #  necessary that dhclient does not find it configured with any IP address
-    #  (except 0.0.0.0 which is fine).
-    ipwrapper.addrFlush(device_name)
+    #  (except 0.0.0.0 which is fine, or IPv6 link-local address needed for
+    #   DHCPv6).
+    ipwrapper.addrFlush(device_name, family)
 
 
 def _kill_and_rm_pid(pid, pid_file):


-- 
To view, visit http://gerrit.ovirt.org/31104
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5708c4db6f6d450536bd243a0475164b89f46f93
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Ondřej Svoboda <osvoboda at redhat.com>


More information about the vdsm-patches mailing list