char *internal = NULL;
char *nic_name = NULL;
char *hostnet_name = NULL;
+ char *devaddr = NULL;
char *vlan = NULL;
if (VIR_ALLOC(def) < 0) {
xmlStrEqual(cur->name, BAD_CAST "state")) {
nic_name = virXMLPropString(cur, "nic");
hostnet_name = virXMLPropString(cur, "hostnet");
+ devaddr = virXMLPropString(cur, "devaddr");
vlan = virXMLPropString(cur, "vlan");
}
}
virCapabilitiesGenerateMac(caps, def->mac);
}
+ if (devaddr &&
+ sscanf(devaddr, "%x:%x:%x",
+ &def->pci_addr.domain,
+ &def->pci_addr.bus,
+ &def->pci_addr.slot) < 3) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Unable to parse devaddr parameter '%s'"),
+ devaddr);
+ goto error;
+ }
+
def->nic_name = nic_name;
def->hostnet_name = hostnet_name;
nic_name = hostnet_name = NULL;
VIR_FREE(internal);
VIR_FREE(nic_name);
VIR_FREE(hostnet_name);
+ VIR_FREE(devaddr);
VIR_FREE(vlan);
return def;
virBufferEscapeString(buf, " nic='%s'", def->nic_name);
if (def->hostnet_name)
virBufferEscapeString(buf, " hostnet='%s'", def->hostnet_name);
+ if (virNetHasValidPciAddr(def))
+ virBufferVSprintf(buf, " devaddr='%.4x:%.2x:%.2x'",
+ def->pci_addr.domain,
+ def->pci_addr.bus,
+ def->pci_addr.slot);
if (def->vlan > 0)
virBufferVSprintf(buf, " vlan='%d'", def->vlan);
virBufferAddLit(buf, "/>\n");
virDomainNetDefPtr net = dev->data.net;
char *cmd, *reply, *remove_cmd;
int i;
+ unsigned domain, bus, slot;
if (!(qemuCmdFlags & QEMUD_CMD_FLAG_HOST_NET_ADD)) {
qemudReportError(conn, dom, NULL, VIR_ERR_NO_SUPPORT, "%s",
goto try_remove;
}
- VIR_FREE(reply);
VIR_FREE(cmd);
+
+ if (qemudParsePciAddReply(vm, reply, &domain, &bus, &slot) < 0) {
+ qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ _("parsing pci_add reply failed: %s"), reply);
+ VIR_FREE(reply);
+ goto try_remove;
+ }
+
+ VIR_FREE(reply);
VIR_FREE(remove_cmd);
+ net->pci_addr.domain = domain;
+ net->pci_addr.bus = bus;
+ net->pci_addr.slot = slot;
+
vm->def->nets[vm->def->nnets++] = net;
return 0;