[libvirt] [PATCH 24/28] conf: allow setting peer address in <ip> element of <interface>

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


From: Vasiliy Tolstov <v.tolstov at selfip.ru>

The peer attribute is used to set the property of the same name in the
interface IP info:

  <interface type='ethernet'>
    ...
    <ip family='ipv4' address='192.168.122.5'
        prefix='32' peer='192.168.122.6'/>
    ...
  </interface>

Note that this element is used to set the IP information on the
*guest* side interface, not the host side interface - that will be
supported in an upcoming patch.

(This is an updated *re*-commit of commit 690969af, which was
subsequently reverted in commit 1d14b13f).

Signed-off-by: Vasiliy Tolstov <v.tolstov at selfip.ru>
Signed-off-by: Laine Stump <laine at laine.org>
---
 docs/formatdomain.html.in     | 40 +++++++++++++++++++++++++---------------
 docs/schemas/domaincommon.rng |  5 +++++
 src/conf/domain_conf.c        | 16 +++++++++++++++-
 src/conf/domain_conf.h        |  1 +
 src/util/virnetdevip.h        |  5 +++--
 5 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index f660aa6..2466df7 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4967,6 +4967,7 @@ qemu-kvm -net nic,model=? /dev/null
       <source network='default'/>
       <target dev='vnet0'/>
       <b><ip address='192.168.122.5' prefix='24'/></b>
+      <b><ip address='192.168.122.5' prefix='24' peer='10.0.0.10'/></b>
       <b><route family='ipv4' address='192.168.122.0' prefix='24' gateway='192.168.122.1'/></b>
       <b><route family='ipv4' address='192.168.122.8' gateway='192.168.122.1'/></b>
     </interface>
@@ -4985,21 +4986,30 @@ qemu-kvm -net nic,model=? /dev/null
 </pre>
 
     <p>
-    <span class="since">Since 1.2.12</span> the network devices and host devices
-    with network capabilities can be provided zero or more IP addresses to set
-    on the target device. Note that some hypervisors or network device types
-    will simply ignore them or only use the first one. The <code>family</code>
-    attribute can be set to either <code>ipv4</code> or <code>ipv6</code>, the
-    <code>address</code> attribute holds the IP address. The <code>prefix</code>
-    is not mandatory since some hypervisors do not handle it.
-    </p>
-
-    <p>
-    <span class="since">Since 1.2.12</span> route elements can also be added
-    to define the network routes to use for the network device. The attributes
-    of this element are described in the documentation for the <code>route</code>
-    element in <a href="formatnetwork.html#elementsStaticroute">network definitions</a>.
-    This is only used by the LXC driver.
+      <span class="since">Since 1.2.12</span> network devices and
+      hostdev devices with network capabilities can optionally be provided
+      one or more IP addresses to set on the network device in the
+      guest. Note that some hypervisors or network device types will
+      simply ignore them or only use the first one.
+      The <code>family</code> attribute can be set to
+      either <code>ipv4</code> or <code>ipv6</code>, and the
+      <code>address</code> attribute contains the IP address. The
+      optional <code>prefix</code> is the number of 1 bits in the
+      netmask, and will be automatically set if not specified - for
+      IPv4 the default prefix is determined according to the network
+      "class" (A, B, or C - see RFC870), and for IPv6 the default
+      prefix is 64. The optional <code>peer</code> attribute holds the
+      IP address of the other end of a point-to-point network
+      device <span class="since">(since 2.0.0)</span>.
+    </p>
+
+    <p>
+    <span class="since">Since 1.2.12</span> route elements can also be
+    added to define IP routes to add in the guest.  The attributes of
+    this element are described in the documentation for
+    the <code>route</code> element
+    in <a href="formatnetwork.html#elementsStaticroute">network
+    definitions</a>.  This is used by the LXC driver.
     </p>
 
     <h5><a name="elementVhostuser">vhost-user interface</a></h5>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 563cb3c..2d12da9 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2629,6 +2629,11 @@
             <ref name="ipPrefix"/>
           </attribute>
         </optional>
+        <optional>
+          <attribute name="peer">
+            <ref name="ipAddr"/>
+          </attribute>
+        </optional>
         <empty/>
       </element>
     </zeroOrMore>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index df52ac9..ad2d983 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6108,7 +6108,7 @@ virDomainNetIPParseXML(xmlNodePtr node)
     unsigned int prefixValue = 0;
     char *familyStr = NULL;
     int family = AF_UNSPEC;
-    char *address = NULL;
+    char *address = NULL, *peer = NULL;
 
     if (!(address = virXMLPropString(node, "address"))) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
@@ -6146,6 +6146,13 @@ virDomainNetIPParseXML(xmlNodePtr node)
     }
     ip->prefix = prefixValue;
 
+    if ((peer = virXMLPropString(node, "peer")) != NULL &&
+        virSocketAddrParse(&ip->peer, peer, family) < 0) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("Invalid peer '%s' in <ip>"), peer);
+        goto cleanup;
+    }
+
     ret = ip;
     ip = NULL;
 
@@ -6153,6 +6160,7 @@ virDomainNetIPParseXML(xmlNodePtr node)
     VIR_FREE(prefixStr);
     VIR_FREE(familyStr);
     VIR_FREE(address);
+    VIR_FREE(peer);
     VIR_FREE(ip);
     return ret;
 }
@@ -20254,6 +20262,12 @@ virDomainNetIPInfoFormat(virBufferPtr buf,
             virBufferAsprintf(buf, " family='%s'", familyStr);
         if (def->ips[i]->prefix)
             virBufferAsprintf(buf, " prefix='%u'", def->ips[i]->prefix);
+        if (VIR_SOCKET_ADDR_VALID(&def->ips[i]->peer)) {
+            if (!(ipStr = virSocketAddrFormat(&def->ips[i]->peer)))
+                return -1;
+            virBufferAsprintf(buf, " peer='%s'", ipStr);
+            VIR_FREE(ipStr);
+        }
         virBufferAddLit(buf, "/>\n");
     }
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 0df5579..7ff966f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -383,6 +383,7 @@ typedef enum {
     VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST
 } virDomainHostdevCapsType;
 
+
 typedef struct _virDomainHostdevCaps virDomainHostdevCaps;
 typedef virDomainHostdevCaps *virDomainHostdevCapsPtr;
 struct _virDomainHostdevCaps {
diff --git a/src/util/virnetdevip.h b/src/util/virnetdevip.h
index 66c5c00..3b9b3e0 100644
--- a/src/util/virnetdevip.h
+++ b/src/util/virnetdevip.h
@@ -26,8 +26,9 @@
 # include "virsocketaddr.h"
 
 typedef struct {
-    virSocketAddr address;       /* ipv4 or ipv6 address */
-    unsigned int prefix; /* number of 1 bits in the net mask */
+    virSocketAddr address; /* ipv4 or ipv6 address */
+    virSocketAddr peer;    /* ipv4 or ipv6 address of peer */
+    unsigned int prefix;   /* number of 1 bits in the netmask */
 } virNetDevIPAddr, *virNetDevIPAddrPtr;
 
 typedef struct {
-- 
2.5.5




More information about the libvir-list mailing list