This fixes https://bugzilla.redhat.com/show_bug.cgi?id=961184

Apparently one or the other of IFF_UP and IFF_RUNNING are not always
set by the time /sbin/ifup returns control to netcf, so the subsequent
check to verify that the interface is up may fail. This patch adds a
loop to re-check the status of the interface every 250msec for up to
2.5 seconds (or until both flags are set). If timeout is reached, it
still fails the operation.
---
 bootstrap.conf   |  3 ++-
 src/drv_debian.c | 13 ++++++++++---
 src/drv_redhat.c | 11 +++++++++--
 src/drv_suse.c   | 13 ++++++++++---
 4 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index fd1c8f7..4736009 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -1,6 +1,6 @@
 # Bootstrap configuration.
 
-# Copyright (C) 2010-2012 Red Hat, Inc.
+# Copyright (C) 2010-2013 Red Hat, Inc.
 
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -43,6 +43,7 @@ sys_ioctl
 sys_socket
 sys_wait
 unistd
+usleep
 vasprintf
 waitpid
 warnings
diff --git a/src/drv_debian.c b/src/drv_debian.c
index ceeed94..d762a5d 100644
--- a/src/drv_debian.c
+++ b/src/drv_debian.c
@@ -1,7 +1,7 @@
 /*
- * drv_initscripts.c: the initscripts backend for netcf
+ * drv_debian.c: the debian backend for netcf
  *
- * Copyright (C) 2009-2012 Red Hat Inc.
+ * Copyright (C) 2009-2013 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1056,10 +1056,17 @@ int drv_if_up(struct netcf_if *nif) {
     static const char *const ifup = IFUP;
     struct netcf *ncf = nif->ncf;
     int result = -1;
+    int is_active, retries;
 
     run1(ncf, ifup, nif->name);
     ERR_BAIL(ncf);
-    ERR_THROW(!if_is_active(ncf, nif->name), ncf, EOTHER,
+
+    for (retries = 0; retries < 10; retries++) {
+        if ((is_active = if_is_active(ncf, nif->name)))
+            break;
+        usleep(250000);
+    }
+    ERR_THROW(!is_active, ncf, EOTHER,
               "interface %s failed to become active - "
               "possible disconnected cable.", nif->name);
     result = 0;
diff --git a/src/drv_redhat.c b/src/drv_redhat.c
index 4040f5e..b5b8694 100644
--- a/src/drv_redhat.c
+++ b/src/drv_redhat.c
@@ -1,7 +1,7 @@
 /*
  * drv_redhat.c: the Red Hat distro family backend for netcf
  *
- * Copyright (C) 2009-2012 Red Hat Inc.
+ * Copyright (C) 2009-2013 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1021,6 +1021,7 @@ int drv_if_up(struct netcf_if *nif) {
     char **slaves = NULL;
     int nslaves = 0;
     int result = -1;
+    int is_active, retries;
 
     if (is_bridge(ncf, nif->name)) {
         /* Bring up bridge slaves before the bridge */
@@ -1034,7 +1035,13 @@ int drv_if_up(struct netcf_if *nif) {
     }
     run1(ncf, ifup, nif->name);
     ERR_BAIL(ncf);
-    ERR_THROW(!if_is_active(ncf, nif->name), ncf, EOTHER,
+
+    for (retries = 0; retries < 10; retries++) {
+        if ((is_active = if_is_active(ncf, nif->name)))
+            break;
+        usleep(250000);
+    }
+    ERR_THROW(!is_active, ncf, EOTHER,
               "interface %s failed to become active - "
               "possible disconnected cable.", nif->name);
     result = 0;
diff --git a/src/drv_suse.c b/src/drv_suse.c
index 0d4a0af..e59d7d3 100644
--- a/src/drv_suse.c
+++ b/src/drv_suse.c
@@ -1,8 +1,8 @@
 /*
- * drv_suse.c: the suse backend for suse
+ * drv_suse.c: the suse backend for netcf
  *
  * Copyright (C) 2010 Novell Inc.
- * Copyright (C) 2009-2012 Red Hat Inc.
+ * Copyright (C) 2009-2013 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1164,6 +1164,7 @@ int drv_if_up(struct netcf_if *nif) {
     char **slaves = NULL;
     int nslaves = 0;
     int result = -1;
+    int is_active, retries;
 
     if (is_bridge(ncf, nif->name)) {
         /* Bring up bridge slaves before the bridge */
@@ -1177,7 +1178,13 @@ int drv_if_up(struct netcf_if *nif) {
     }
     run1(ncf, ifup, nif->name);
     ERR_BAIL(ncf);
-    ERR_THROW(!if_is_active(ncf, nif->name), ncf, EOTHER,
+
+    for (retries = 0; retries < 10; retries++) {
+        if ((is_active = if_is_active(ncf, nif->name)))
+            break;
+        usleep(250000);
+    }
+    ERR_THROW(!is_active, ncf, EOTHER,
               "interface %s failed to become active - "
               "possible disconnected cable.", nif->name);
     result = 0;
-- 
1.7.11.7

_______________________________________________
netcf-devel mailing list
netcf-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/netcf-devel

Reply via email to