[PATCH 29/33] Rename ifaceCheck to virNetDevValidateConfig

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "Daniel P. Berrange" <berrange@xxxxxxxxxx>

Rename the ifaceCheck method to virNetDevValidateConfig and change
so that it always raises an error and returns -1 on error.

* src/util/interface.c, src/util/interface.h: Rename ifaceCheck
  to virNetDevValidateConfig
* src/nwfilter/nwfilter_gentech_driver.c,
  src/nwfilter/nwfilter_learnipaddr.c: Update for API rename
---
 src/libvirt_private.syms               |    2 +-
 src/nwfilter/nwfilter_gentech_driver.c |    6 ++-
 src/nwfilter/nwfilter_learnipaddr.c    |    6 ++-
 src/util/interface.c                   |   83 ++++++++++++++++---------------
 src/util/interface.h                   |    5 +-
 5 files changed, 55 insertions(+), 47 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 183e4f5..6b7e231 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -575,7 +575,7 @@ virHookPresent;
 
 
 # interface.h
-ifaceCheck;
+virNetDevValidateConfig;
 virNetDevGetIndex;
 virNetDevGetIPv4Address;
 ifaceGetNthParent;
diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c
index 9f44aef..9dffdc5 100644
--- a/src/nwfilter/nwfilter_gentech_driver.c
+++ b/src/nwfilter/nwfilter_gentech_driver.c
@@ -715,7 +715,8 @@ virNWFilterInstantiate(virConnectPtr conn,
         if (teardownOld && rc == 0)
             techdriver->tearOldRules(conn, ifname);
 
-        if (rc == 0 && (ifaceCheck(false, ifname, NULL, ifindex) < 0)) {
+        if (rc == 0 && (virNetDevValidateConfig(ifname, NULL, ifindex) <= 0)) {
+            virResetLastError();
             /* interface changed/disppeared */
             techdriver->allTeardown(ifname);
             rc = 1;
@@ -963,8 +964,9 @@ virNWFilterInstantiateFilterLate(virConnectPtr conn,
                                         &foundNewFilter);
     if (rc) {
         /* something went wrong... 'DOWN' the interface */
-        if ((ifaceCheck(false, ifname, NULL, ifindex) < 0) ||
+        if ((virNetDevValidateConfig(ifname, NULL, ifindex) <= 0) ||
             (virNetDevSetOnline(ifname, false) < 0)) {
+            virResetLastError();
             /* assuming interface disappeared... */
             _virNWFilterTeardownFilter(ifname);
         }
diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
index 319f317..03716ea 100644
--- a/src/nwfilter/nwfilter_learnipaddr.c
+++ b/src/nwfilter/nwfilter_learnipaddr.c
@@ -434,7 +434,8 @@ learnIPAddressThread(void *arg)
     req->status = 0;
 
     /* anything change to the VM's interface -- check at least once */
-    if (ifaceCheck(false, req->ifname, NULL, req->ifindex) < 0) {
+    if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <= 0) {
+        virResetLastError();
         req->status = ENODEV;
         goto done;
     }
@@ -504,7 +505,8 @@ learnIPAddressThread(void *arg)
             }
 
             /* check whether VM's dev is still there */
-            if (ifaceCheck(false, req->ifname, NULL, req->ifindex) < 0) {
+            if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <= 0) {
+                virResetLastError();
                 req->status = ENODEV;
                 showError = false;
                 break;
diff --git a/src/util/interface.c b/src/util/interface.c
index e86d183..16ad155 100644
--- a/src/util/interface.c
+++ b/src/util/interface.c
@@ -56,9 +56,7 @@
                              __FUNCTION__, __LINE__, __VA_ARGS__)
 
 /**
- * ifaceCheck
- *
- * @reportError: whether to report errors or keep silent
+ * virNetDevValidateConfig:
  * @ifname: Name of the interface
  * @macaddr: expected MAC address of the interface; not checked if NULL
  * @ifindex: expected index of the interface; not checked if '-1'
@@ -67,78 +65,83 @@
  * it must have the given MAC address and if an interface index is
  * passed, it must also match the interface index.
  *
- * Returns 0 on success, -errno on failure.
- *   -ENODEV : if interface with given name does not exist or its interface
- *             index is different than the one passed
- *   -EINVAL : if interface name is invalid (too long)
+ * Returns 1 if the config matches, 0 if the config does not match, or interface does not exist, -1 on error
  */
 #ifdef __linux__
-int
-ifaceCheck(bool reportError, const char *ifname,
-           const unsigned char *macaddr, int ifindex)
+int virNetDevValidateConfig(const char *ifname,
+                            const unsigned char *macaddr, int ifindex)
 {
-    struct ifreq ifr;
     int fd = -1;
-    int rc = 0;
+    int ret = -1;
+    struct ifreq ifr;
     int idx;
+    int rc;
+
+    if ((rc = virNetDevExists(ifname)) < 0)
+        return -1;
+    if (rc == 0) {
+        ret = 0;
+        goto cleanup;
+    }
 
     if (macaddr != NULL) {
         fd = socket(PF_PACKET, SOCK_DGRAM, 0);
-        if (fd < 0)
-            return -errno;
+        if (fd < 0) {
+            virReportSystemError(errno, "%s",
+                                 _("Unable to open control socket"));
+            return -1;
+        }
 
         memset(&ifr, 0, sizeof(ifr));
 
         if (virStrncpy(ifr.ifr_name,
                        ifname, strlen(ifname), sizeof(ifr.ifr_name)) == NULL) {
-            if (reportError)
-                ifaceError(VIR_ERR_INTERNAL_ERROR,
-                           _("invalid interface name %s"),
-                           ifname);
-            rc = -EINVAL;
+            virReportSystemError(ERANGE,
+                                 _("invalid interface name %s"),
+                                 ifname);
             goto cleanup;
         }
 
         if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
-            if (reportError)
-                ifaceError(VIR_ERR_INTERNAL_ERROR,
-                           _("coud not get MAC address of interface %s"),
-                           ifname);
-            rc = -errno;
+            if (errno == ENODEV) {
+                ret = 0;
+                goto cleanup;
+            }
+            virReportSystemError(errno,
+                                 _("coud not get MAC address of interface %s"),
+                                 ifname);
             goto cleanup;
         }
 
         if (memcmp(&ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN) != 0) {
-            rc = -ENODEV;
+            ret = 0;
             goto cleanup;
         }
     }
 
     if (ifindex != -1) {
         if (virNetDevGetIndex(ifname, &idx) < 0)
-            virResetLastError();
-        else if (idx != ifindex)
-            rc = -ENODEV;
+            goto cleanup;
+        else if (idx != ifindex) {
+            ret = 0;
+            goto cleanup;
+        }
     }
 
+    ret = 1;
+
  cleanup:
     VIR_FORCE_CLOSE(fd);
-
-    return rc;
+    return ret;
 }
-
-#else
-
-int
-ifaceCheck(bool reportError ATTRIBUTE_UNUSED,
-           const char *ifname ATTRIBUTE_UNUSED,
-           const unsigned char *macaddr ATTRIBUTE_UNUSED,
-           int ifindex ATTRIBUTE_UNUSED)
+#else /* ! __linux__ */
+int virNetDevValidateConfig(const char *ifname ATTRIBUTE_UNUSED,
+                            const unsigned char *macaddr ATTRIBUTE_UNUSED,
+                            int ifindex ATTRIBUTE_UNUSED)
 {
     return -ENOSYS;
 }
-
-#endif /* __linux__ */
+#endif /* ! __linux__ */
 
 
 
diff --git a/src/util/interface.h b/src/util/interface.h
index afe417d..c230264 100644
--- a/src/util/interface.h
+++ b/src/util/interface.h
@@ -30,8 +30,9 @@ struct nlattr;
 # define NET_SYSFS "/sys/class/net/"
 
 
-int ifaceCheck(bool reportError, const char *ifname,
-               const unsigned char *macaddr, int ifindex);
+int virNetDevValidateConfig(const char *ifname,
+                            const unsigned char *macaddr, int ifindex)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 int ifaceMacvtapLinkDump(bool nltarget_kernel, const char *ifname, int ifindex,
                          struct nlattr **tb, unsigned char **recvbuf,
-- 
1.7.6.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]