From: Vasiliy Tolstov <v.tolstov(a)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(a)selfip.ru>
Signed-off-by: Laine Stump <laine(a)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