7a3408
From 4db05578f2b40f0374477bccf85a492a7e8ee8fc Mon Sep 17 00:00:00 2001
7a3408
Message-Id: <4db05578f2b40f0374477bccf85a492a7e8ee8fc@dist-git>
7a3408
From: Martin Kletzander <mkletzan@redhat.com>
7a3408
Date: Thu, 6 Aug 2015 13:10:23 +0200
7a3408
Subject: [PATCH] conf: Add getter for network routes
7a3408
7a3408
https://bugzilla.redhat.com/show_bug.cgi?id=1094205
7a3408
7a3408
Add virNetworkDefGetRouteByIndex() similarly to
7a3408
virNetworkDefGetIpByIndex(), but for routes.
7a3408
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
(cherry picked from commit 0f10eb6a289502b295b56bc0925cf05cfa32193d)
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
7a3408
 src/conf/network_conf.c  | 26 ++++++++++++++++++++++++++
7a3408
 src/conf/network_conf.h  |  3 +++
7a3408
 src/libvirt_private.syms |  1 +
7a3408
 3 files changed, 30 insertions(+)
7a3408
7a3408
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
7a3408
index 31d4463..72006e9 100644
7a3408
--- a/src/conf/network_conf.c
7a3408
+++ b/src/conf/network_conf.c
7a3408
@@ -803,6 +803,32 @@ virNetworkDefGetIpByIndex(const virNetworkDef *def,
7a3408
     return NULL;
7a3408
 }
7a3408
 
7a3408
+/* return routes[index], or NULL if there aren't enough routes */
7a3408
+virNetworkRouteDefPtr
7a3408
+virNetworkDefGetRouteByIndex(const virNetworkDef *def,
7a3408
+                             int family, size_t n)
7a3408
+{
7a3408
+    size_t i;
7a3408
+
7a3408
+    if (!def->routes || n >= def->nroutes)
7a3408
+        return NULL;
7a3408
+
7a3408
+    if (family == AF_UNSPEC)
7a3408
+        return def->routes[n];
7a3408
+
7a3408
+    /* find the nth route of type "family" */
7a3408
+    for (i = 0; i < def->nroutes; i++) {
7a3408
+        virSocketAddrPtr addr = virNetworkRouteDefGetAddress(def->routes[i]);
7a3408
+        if (VIR_SOCKET_ADDR_IS_FAMILY(addr, family)
7a3408
+            && (n-- <= 0)) {
7a3408
+            return def->routes[i];
7a3408
+        }
7a3408
+    }
7a3408
+
7a3408
+    /* failed to find enough of the right family */
7a3408
+    return NULL;
7a3408
+}
7a3408
+
7a3408
 /* return number of 1 bits in netmask for the network's ipAddress,
7a3408
  * or -1 on error
7a3408
  */
7a3408
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
7a3408
index 9411a02..1cd5100 100644
7a3408
--- a/src/conf/network_conf.h
7a3408
+++ b/src/conf/network_conf.h
7a3408
@@ -360,6 +360,9 @@ virPortGroupDefPtr virPortGroupFindByName(virNetworkDefPtr net,
7a3408
 virNetworkIpDefPtr
7a3408
 virNetworkDefGetIpByIndex(const virNetworkDef *def,
7a3408
                           int family, size_t n);
7a3408
+virNetworkRouteDefPtr
7a3408
+virNetworkDefGetRouteByIndex(const virNetworkDef *def,
7a3408
+                             int family, size_t n);
7a3408
 int virNetworkIpDefPrefix(const virNetworkIpDef *def);
7a3408
 int virNetworkIpDefNetmask(const virNetworkIpDef *def,
7a3408
                            virSocketAddrPtr netmask);
7a3408
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
7a3408
index a6b523a..46e535e 100644
7a3408
--- a/src/libvirt_private.syms
7a3408
+++ b/src/libvirt_private.syms
7a3408
@@ -597,6 +597,7 @@ virNetworkDefFormat;
7a3408
 virNetworkDefFormatBuf;
7a3408
 virNetworkDefFree;
7a3408
 virNetworkDefGetIpByIndex;
7a3408
+virNetworkDefGetRouteByIndex;
7a3408
 virNetworkDefParseFile;
7a3408
 virNetworkDefParseNode;
7a3408
 virNetworkDefParseString;
7a3408
-- 
7a3408
2.5.0
7a3408