VIR_FREE(def->ifname_guest_actual);
virNetDevIPInfoClear(&def->guestIP);
- virNetDevIPInfoClear(&def->hostIP);
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def->filter);
}
-static int
-virDomainNetDefValidate(const virDomainNetDef *net)
-{
- if ((net->hostIP.nroutes || net->hostIP.nips) &&
- net->type != VIR_DOMAIN_NET_TYPE_ETHERNET) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("Invalid attempt to set network interface "
- "host-side IP route and/or address info on "
- "interface of type '%s'. This is only supported "
- "on interfaces of type 'ethernet'"),
- virDomainNetTypeToString(net->type));
- return -1;
- }
- return 0;
-}
-
-
static int
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
const virDomainDef *def)
case VIR_DOMAIN_DEVICE_REDIRDEV:
return virDomainRedirdevDefValidate(def, dev->data.redirdev);
- case VIR_DOMAIN_DEVICE_NET:
- return virDomainNetDefValidate(dev->data.net);
-
case VIR_DOMAIN_DEVICE_LEASE:
case VIR_DOMAIN_DEVICE_FS:
+ case VIR_DOMAIN_DEVICE_NET:
case VIR_DOMAIN_DEVICE_INPUT:
case VIR_DOMAIN_DEVICE_SOUND:
case VIR_DOMAIN_DEVICE_VIDEO:
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
- if (xmlStrEqual(cur->name, BAD_CAST "source")) {
- xmlNodePtr tmpnode = ctxt->node;
-
- ctxt->node = cur;
- if (virDomainNetIPInfoParseXML(_("interface host IP"),
- ctxt, &def->hostIP) < 0)
- goto error;
- ctxt->node = tmpnode;
- }
if (!macaddr && xmlStrEqual(cur->name, BAD_CAST "mac")) {
macaddr = virXMLPropString(cur, "address");
} else if (!network &&
{
unsigned int actualType = virDomainNetGetActualType(def);
bool publicActual = false;
- int sourceLines = 0;
const char *typeStr;
virDomainHostdevDefPtr hostdef = NULL;
char macstr[VIR_MAC_STRING_BUFLEN];
def->data.network.name);
virBufferEscapeString(buf, " portgroup='%s'",
def->data.network.portgroup);
- sourceLines++;
+ virBufferAddLit(buf, "/>\n");
+
+ /* ONLY for internal status storage - format the ActualNetDef
+ * as a subelement of <interface> so that no persistent config
+ * data is overwritten.
+ */
+ if ((flags & VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET) &&
+ (virDomainActualNetDefFormat(buf, def, flags) < 0))
+ return -1;
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
virBufferAsprintf(buf, " mode='%s'",
def->data.vhostuser->data.nix.listen ?
"server" : "client");
- sourceLines++;
+ virBufferAddLit(buf, "/>\n");
}
break;
case VIR_DOMAIN_NET_TYPE_BRIDGE:
- if (def->data.bridge.brname) {
- virBufferEscapeString(buf, "<source bridge='%s'",
- def->data.bridge.brname);
- sourceLines++;
- }
+ virBufferEscapeString(buf, "<source bridge='%s'/>\n",
+ def->data.bridge.brname);
break;
case VIR_DOMAIN_NET_TYPE_SERVER:
virBufferAsprintf(buf, "<source port='%d'",
def->data.socket.port);
}
- sourceLines++;
- if (def->type != VIR_DOMAIN_NET_TYPE_UDP)
+ if (def->type != VIR_DOMAIN_NET_TYPE_UDP) {
+ virBufferAddLit(buf, "/>\n");
break;
+ }
virBufferAddLit(buf, ">\n");
- sourceLines++;
virBufferAdjustIndent(buf, 2);
virBufferAsprintf(buf, "<local address='%s' port='%d'/>\n",
def->data.socket.localaddr,
def->data.socket.localport);
virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</source>\n");
break;
case VIR_DOMAIN_NET_TYPE_INTERNAL:
- if (def->data.internal.name) {
- virBufferEscapeString(buf, "<source name='%s'",
- def->data.internal.name);
- sourceLines++;
- }
+ virBufferEscapeString(buf, "<source name='%s'/>\n",
+ def->data.internal.name);
break;
case VIR_DOMAIN_NET_TYPE_DIRECT:
def->data.direct.linkdev);
virBufferAsprintf(buf, " mode='%s'",
virNetDevMacVLanModeTypeToString(def->data.direct.mode));
- sourceLines++;
+ virBufferAddLit(buf, "/>\n");
break;
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
break;
}
- /* if sourceLines == 0 - no <source> info at all so far
- * sourceLines == 1 - first line written, no terminating ">"
- * sourceLines > 1 - multiple lines, including subelements
- */
- if (def->hostIP.nips || def->hostIP.nroutes) {
- if (sourceLines == 0) {
- virBufferAddLit(buf, "<source>\n");
- sourceLines += 2;
- } else if (sourceLines == 1) {
- virBufferAddLit(buf, ">\n");
- sourceLines++;
- }
- virBufferAdjustIndent(buf, 2);
- if (virDomainNetIPInfoFormat(buf, &def->hostIP) < 0)
- return -1;
- virBufferAdjustIndent(buf, -2);
- }
- if (sourceLines == 1)
- virBufferAddLit(buf, "/>\n");
- else if (sourceLines > 1)
- virBufferAddLit(buf, "</source>\n");
-
if (virNetDevVlanFormat(&def->vlan, buf) < 0)
return -1;
if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0)
return -1;
if (virNetDevBandwidthFormat(def->bandwidth, buf) < 0)
return -1;
-
- /* ONLY for internal status storage - format the ActualNetDef
- * as a subelement of <interface> so that no persistent config
- * data is overwritten.
- */
- if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
- (flags & VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET) &&
- (virDomainActualNetDefFormat(buf, def, flags) < 0))
- return -1;
-
}
if (virDomainNetIPInfoFormat(buf, &def->guestIP) < 0)
virBufferEscapeString(buf, "<script path='%s'/>\n",
def->script);
virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name);
-
if (def->ifname &&
!((flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) &&
(STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX) ||
/* Skip auto-generated target names for inactive config. */
virBufferEscapeString(buf, "<target dev='%s'/>\n", def->ifname);
}
-
if (def->ifname_guest || def->ifname_guest_actual) {
virBufferAddLit(buf, "<guest");
/* Skip auto-generated target names for inactive config. */