[libvirt] [PATCH 01/28] util: move virNetDevLinkDump to virnetlink.c

Laine Stump laine at laine.org
Wed Jun 22 17:37:00 UTC 2016


virNetDevLinkDump should have been in virnetlink.c, but that file
didn't exist yet when the function was created. It didn't really
matter until now - I found that having virnetlink.h included by
virnetdev.h caused build problems when trying to #include virnetdev.h
in a .c file in src/conf (due to missing directory in -I). Rather than
fix that to further institutionalize the incorrect placement of this
one function, this patch moves the function.
---
 src/libvirt_private.syms         |   2 +-
 src/util/virnetdev.c             | 134 +-------------------------------------
 src/util/virnetdev.h             |   6 --
 src/util/virnetdevvportprofile.c |   4 +-
 src/util/virnetlink.c            | 135 +++++++++++++++++++++++++++++++++++++++
 src/util/virnetlink.h            |   5 ++
 6 files changed, 145 insertions(+), 141 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 501c23e..00fa673 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1872,7 +1872,6 @@ virNetDevGetVirtualFunctionInfo;
 virNetDevGetVirtualFunctions;
 virNetDevGetVLanID;
 virNetDevIsVirtualFunction;
-virNetDevLinkDump;
 virNetDevReplaceMacAddress;
 virNetDevReplaceNetConfig;
 virNetDevRestoreMacAddress;
@@ -1986,6 +1985,7 @@ virNetDevVPortProfileOpTypeToString;
 # util/virnetlink.h
 virNetlinkCommand;
 virNetlinkDelLink;
+virNetlinkDumpLink;
 virNetlinkEventAddClient;
 virNetlinkEventRemoveClient;
 virNetlinkEventServiceIsRunning;
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index 5a4ccc6..4cd51cb 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -23,6 +23,7 @@
 #include <config.h>
 
 #include "virnetdev.h"
+#include "virnetlink.h"
 #include "virmacaddr.h"
 #include "virfile.h"
 #include "virerror.h"
@@ -2086,124 +2087,6 @@ static struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
                             .maxlen = sizeof(struct ifla_vf_vlan) },
 };
 
-/**
- * virNetDevLinkDump:
- *
- * @ifname:  The name of the interface; only use if ifindex <= 0
- * @ifindex: The interface index; may be <= 0 if ifname is given
- * @data:    Gets a pointer to the raw data from netlink.
-             MUST BE FREED BY CALLER!
- * @nlattr:  Pointer to a pointer of netlink attributes that will contain
- *           the results
- * @src_pid: pid used for nl_pid of the local end of the netlink message
- *           (0 == "use getpid()")
- * @dst_pid: pid of destination nl_pid if the kernel
- *           is not the target of the netlink message but it is to be
- *           sent to another process (0 if sending to the kernel)
- *
- * Get information from netlink about an interface given its name or index.
- *
- * Returns 0 on success, -1 on fatal error.
- */
-int
-virNetDevLinkDump(const char *ifname, int ifindex,
-                  void **nlData, struct nlattr **tb,
-                  uint32_t src_pid, uint32_t dst_pid)
-{
-    int rc = -1;
-    struct nlmsghdr *resp = NULL;
-    struct nlmsgerr *err;
-    struct ifinfomsg ifinfo = {
-        .ifi_family = AF_UNSPEC,
-        .ifi_index  = ifindex
-    };
-    unsigned int recvbuflen;
-    struct nl_msg *nl_msg;
-
-    if (ifname && ifindex <= 0 && virNetDevGetIndex(ifname, &ifindex) < 0)
-        return -1;
-
-    ifinfo.ifi_index = ifindex;
-
-    nl_msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_REQUEST);
-    if (!nl_msg) {
-        virReportOOMError();
-        return -1;
-    }
-
-    if (nlmsg_append(nl_msg,  &ifinfo, sizeof(ifinfo), NLMSG_ALIGNTO) < 0)
-        goto buffer_too_small;
-
-    if (ifname) {
-        if (nla_put(nl_msg, IFLA_IFNAME, strlen(ifname)+1, ifname) < 0)
-            goto buffer_too_small;
-    }
-
-# ifdef RTEXT_FILTER_VF
-    /* if this filter exists in the kernel's netlink implementation,
-     * we need to set it, otherwise the response message will not
-     * contain the IFLA_VFINFO_LIST that we're looking for.
-     */
-    {
-        uint32_t ifla_ext_mask = RTEXT_FILTER_VF;
-
-        if (nla_put(nl_msg, IFLA_EXT_MASK,
-                    sizeof(ifla_ext_mask), &ifla_ext_mask) < 0) {
-            goto buffer_too_small;
-        }
-    }
-# endif
-
-    if (virNetlinkCommand(nl_msg, &resp, &recvbuflen,
-                          src_pid, dst_pid, NETLINK_ROUTE, 0) < 0)
-        goto cleanup;
-
-    if (recvbuflen < NLMSG_LENGTH(0) || resp == NULL)
-        goto malformed_resp;
-
-    switch (resp->nlmsg_type) {
-    case NLMSG_ERROR:
-        err = (struct nlmsgerr *)NLMSG_DATA(resp);
-        if (resp->nlmsg_len < NLMSG_LENGTH(sizeof(*err)))
-            goto malformed_resp;
-
-        if (err->error) {
-            virReportSystemError(-err->error,
-                                 _("error dumping %s (%d) interface"),
-                                 ifname, ifindex);
-            goto cleanup;
-        }
-        break;
-
-    case GENL_ID_CTRL:
-    case NLMSG_DONE:
-        rc = nlmsg_parse(resp, sizeof(struct ifinfomsg),
-                         tb, IFLA_MAX, NULL);
-        if (rc < 0)
-            goto malformed_resp;
-        break;
-
-    default:
-        goto malformed_resp;
-    }
-    rc = 0;
- cleanup:
-    nlmsg_free(nl_msg);
-    if (rc < 0)
-       VIR_FREE(resp);
-    *nlData = resp;
-    return rc;
-
- malformed_resp:
-    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                   _("malformed netlink response message"));
-    goto cleanup;
-
- buffer_too_small:
-    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                   _("allocated netlink buffer is too small"));
-    goto cleanup;
-}
 
 static int
 virNetDevSetVfConfig(const char *ifname, int ifindex, int vf,
@@ -2398,7 +2281,7 @@ virNetDevGetVfConfig(const char *ifname, int vf, virMacAddrPtr mac,
     struct nlattr *tb[IFLA_MAX + 1] = {NULL, };
     int ifindex = -1;
 
-    rc = virNetDevLinkDump(ifname, ifindex, &nlData, tb, 0, 0);
+    rc = virNetlinkDumpLink(ifname, ifindex, &nlData, tb, 0, 0);
     if (rc < 0)
         goto cleanup;
 
@@ -2640,19 +2523,6 @@ virNetDevRestoreNetConfig(const char *linkdev, int vf, const char *stateDir)
 #else /* defined(__linux__) && defined(HAVE_LIBNL) */
 
 int
-virNetDevLinkDump(const char *ifname ATTRIBUTE_UNUSED,
-                  int ifindex ATTRIBUTE_UNUSED,
-                  void **nlData ATTRIBUTE_UNUSED,
-                  struct nlattr **tb ATTRIBUTE_UNUSED,
-                  uint32_t src_pid ATTRIBUTE_UNUSED,
-                  uint32_t dst_pid ATTRIBUTE_UNUSED)
-{
-    virReportSystemError(ENOSYS, "%s",
-                         _("Unable to dump link info on this platform"));
-    return -1;
-}
-
-int
 virNetDevReplaceNetConfig(const char *linkdev ATTRIBUTE_UNUSED,
                           int vf ATTRIBUTE_UNUSED,
                           const virMacAddr *macaddress ATTRIBUTE_UNUSED,
diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h
index cbe7938..522536f 100644
--- a/src/util/virnetdev.h
+++ b/src/util/virnetdev.h
@@ -27,7 +27,6 @@
 
 # include "virbitmap.h"
 # include "virsocketaddr.h"
-# include "virnetlink.h"
 # include "virmacaddr.h"
 # include "virpci.h"
 # include "virnetdevvlan.h"
@@ -170,11 +169,6 @@ int virNetDevGetVirtualFunctions(const char *pfname,
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
     ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_RETURN_CHECK;
 
-int virNetDevLinkDump(const char *ifname, int ifindex,
-                      void **nlData, struct nlattr **tb,
-                      uint32_t src_pid, uint32_t dst_pid)
-    ATTRIBUTE_RETURN_CHECK;
-
 int virNetDevReplaceNetConfig(const char *linkdev, int vf,
                               const virMacAddr *macaddress,
                               virNetDevVlanPtr vlan,
diff --git a/src/util/virnetdevvportprofile.c b/src/util/virnetdevvportprofile.c
index 8100656..db495a7 100644
--- a/src/util/virnetdevvportprofile.c
+++ b/src/util/virnetdevvportprofile.c
@@ -880,7 +880,7 @@ virNetDevVPortProfileGetNthParent(const char *ifname, int ifindex, unsigned int
 
     while (!end && i <= nthParent) {
         VIR_FREE(nlData);
-        rc = virNetDevLinkDump(ifname, ifindex, &nlData, tb, 0, 0);
+        rc = virNetlinkDumpLink(ifname, ifindex, &nlData, tb, 0, 0);
         if (rc < 0)
             break;
 
@@ -964,7 +964,7 @@ virNetDevVPortProfileOpCommon(const char *ifname, int ifindex,
 
     while (--repeats >= 0) {
         VIR_FREE(nlData);
-        rc = virNetDevLinkDump(NULL, ifindex, &nlData, tb, src_pid, dst_pid);
+        rc = virNetlinkDumpLink(NULL, ifindex, &nlData, tb, src_pid, dst_pid);
         if (rc < 0)
             goto cleanup;
 
diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c
index 513f36e..a5d10fa 100644
--- a/src/util/virnetlink.c
+++ b/src/util/virnetlink.c
@@ -36,6 +36,7 @@
 #include <sys/socket.h>
 
 #include "virnetlink.h"
+#include "virnetdev.h"
 #include "virlog.h"
 #include "viralloc.h"
 #include "virthread.h"
@@ -316,6 +317,126 @@ int virNetlinkCommand(struct nl_msg *nl_msg,
 
 
 /**
+ * virNetlinkDumpLink:
+ *
+ * @ifname:  The name of the interface; only use if ifindex <= 0
+ * @ifindex: The interface index; may be <= 0 if ifname is given
+ * @data:    Gets a pointer to the raw data from netlink.
+             MUST BE FREED BY CALLER!
+ * @nlattr:  Pointer to a pointer of netlink attributes that will contain
+ *           the results
+ * @src_pid: pid used for nl_pid of the local end of the netlink message
+ *           (0 == "use getpid()")
+ * @dst_pid: pid of destination nl_pid if the kernel
+ *           is not the target of the netlink message but it is to be
+ *           sent to another process (0 if sending to the kernel)
+ *
+ * Get information from netlink about an interface given its name or index.
+ *
+ * Returns 0 on success, -1 on fatal error.
+ */
+int
+virNetlinkDumpLink(const char *ifname, int ifindex,
+                   void **nlData, struct nlattr **tb,
+                   uint32_t src_pid, uint32_t dst_pid)
+{
+    int rc = -1;
+    struct nlmsghdr *resp = NULL;
+    struct nlmsgerr *err;
+    struct ifinfomsg ifinfo = {
+        .ifi_family = AF_UNSPEC,
+        .ifi_index  = ifindex
+    };
+    unsigned int recvbuflen;
+    struct nl_msg *nl_msg;
+
+    if (ifname && ifindex <= 0 && virNetDevGetIndex(ifname, &ifindex) < 0)
+        return -1;
+
+    ifinfo.ifi_index = ifindex;
+
+    nl_msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_REQUEST);
+    if (!nl_msg) {
+        virReportOOMError();
+        return -1;
+    }
+
+    if (nlmsg_append(nl_msg,  &ifinfo, sizeof(ifinfo), NLMSG_ALIGNTO) < 0)
+        goto buffer_too_small;
+
+    if (ifname) {
+        if (nla_put(nl_msg, IFLA_IFNAME, strlen(ifname)+1, ifname) < 0)
+            goto buffer_too_small;
+    }
+
+# ifdef RTEXT_FILTER_VF
+    /* if this filter exists in the kernel's netlink implementation,
+     * we need to set it, otherwise the response message will not
+     * contain the IFLA_VFINFO_LIST that we're looking for.
+     */
+    {
+        uint32_t ifla_ext_mask = RTEXT_FILTER_VF;
+
+        if (nla_put(nl_msg, IFLA_EXT_MASK,
+                    sizeof(ifla_ext_mask), &ifla_ext_mask) < 0) {
+            goto buffer_too_small;
+        }
+    }
+# endif
+
+    if (virNetlinkCommand(nl_msg, &resp, &recvbuflen,
+                          src_pid, dst_pid, NETLINK_ROUTE, 0) < 0)
+        goto cleanup;
+
+    if (recvbuflen < NLMSG_LENGTH(0) || resp == NULL)
+        goto malformed_resp;
+
+    switch (resp->nlmsg_type) {
+    case NLMSG_ERROR:
+        err = (struct nlmsgerr *)NLMSG_DATA(resp);
+        if (resp->nlmsg_len < NLMSG_LENGTH(sizeof(*err)))
+            goto malformed_resp;
+
+        if (err->error) {
+            virReportSystemError(-err->error,
+                                 _("error dumping %s (%d) interface"),
+                                 ifname, ifindex);
+            goto cleanup;
+        }
+        break;
+
+    case GENL_ID_CTRL:
+    case NLMSG_DONE:
+        rc = nlmsg_parse(resp, sizeof(struct ifinfomsg),
+                         tb, IFLA_MAX, NULL);
+        if (rc < 0)
+            goto malformed_resp;
+        break;
+
+    default:
+        goto malformed_resp;
+    }
+    rc = 0;
+ cleanup:
+    nlmsg_free(nl_msg);
+    if (rc < 0)
+       VIR_FREE(resp);
+    *nlData = resp;
+    return rc;
+
+ malformed_resp:
+    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                   _("malformed netlink response message"));
+    goto cleanup;
+
+ buffer_too_small:
+    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                   _("allocated netlink buffer is too small"));
+    goto cleanup;
+}
+
+
+/**
  * virNetlinkDelLink:
  *
  * @ifname: Name of the link
@@ -923,6 +1044,20 @@ int virNetlinkCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED,
 
 
 int
+virNetlinkDumpLink(const char *ifname ATTRIBUTE_UNUSED,
+                   int ifindex ATTRIBUTE_UNUSED,
+                   void **nlData ATTRIBUTE_UNUSED,
+                   struct nlattr **tb ATTRIBUTE_UNUSED,
+                   uint32_t src_pid ATTRIBUTE_UNUSED,
+                   uint32_t dst_pid ATTRIBUTE_UNUSED)
+{
+    virReportSystemError(ENOSYS, "%s",
+                         _("Unable to dump link info on this platform"));
+    return -1;
+}
+
+
+int
 virNetlinkDelLink(const char *ifname ATTRIBUTE_UNUSED,
                   virNetlinkDelLinkFallback fallback ATTRIBUTE_UNUSED)
 {
diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h
index 0664a7a..11e817c 100644
--- a/src/util/virnetlink.h
+++ b/src/util/virnetlink.h
@@ -58,6 +58,11 @@ int virNetlinkDelLink(const char *ifname, virNetlinkDelLinkFallback fallback);
 
 int virNetlinkGetErrorCode(struct nlmsghdr *resp, unsigned int recvbuflen);
 
+int virNetlinkDumpLink(const char *ifname, int ifindex,
+                       void **nlData, struct nlattr **tb,
+                       uint32_t src_pid, uint32_t dst_pid)
+    ATTRIBUTE_RETURN_CHECK;
+
 typedef void (*virNetlinkEventHandleCallback)(struct nlmsghdr *,
                                               unsigned int length,
                                               struct sockaddr_nl *peer,
-- 
2.5.5




More information about the libvir-list mailing list