diff --git a/ChangeLog b/ChangeLog index 808d3f538df55dcb204bffcd38e681440c9fdc6b..6c2559a9a3e2ece571b6968b6e8895d479309443 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Tue Apr 29 08:13:28 EST 2008 Daniel P. Berrange + + * src/qemu_conf.c, src/qemu_conf.h, src/xend_internal.c, + src/xm_internal.c, src/xml.c: Added support for network + interface model type setting + * tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, + tests/sexpr2xmltest.c, tests/xmconfigtest.c, + tests/xml2sexprtest.c: Added test cases for NIC model type + * tests/qemuxml2argvdata/qemuxml2argv-net-virtio.{xml,args}, + tests/sexpr2xmldata/sexpr2xml-net-e1000.{sexpr,xml}, + tests/xml2sexprdata/xml2sexpr-net-e1000.{sexpr,xml}, + tests/xmconfigdata/test-paravirt-net-e1000.{cfg,xml}: Added + new data files for test cases + Tue Apr 29 21:43:28 CEST 2008 Jim Meyering Fix build errors. diff --git a/src/qemu_conf.c b/src/qemu_conf.c index a0c4a8ff7b4c30461866735034a3493f0fb279e0..1efd9e956d6d309170e6628c420ee302f5b2794e 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -714,6 +714,7 @@ static int qemudParseInterfaceXML(virConnectPtr conn, xmlChar *script = NULL; xmlChar *address = NULL; xmlChar *port = NULL; + xmlChar *model = NULL; net->type = QEMUD_NET_USER; @@ -775,6 +776,8 @@ static int qemudParseInterfaceXML(virConnectPtr conn, (net->type == QEMUD_NET_ETHERNET) && xmlStrEqual(cur->name, BAD_CAST "script")) { script = xmlGetProp(cur, BAD_CAST "path"); + } else if (xmlStrEqual (cur->name, BAD_CAST "model")) { + model = xmlGetProp (cur, BAD_CAST "type"); } } cur = cur->next; @@ -934,6 +937,39 @@ static int qemudParseInterfaceXML(virConnectPtr conn, xmlFree(address); } + /* NIC model (see -net nic,model=?). We only check that it looks + * reasonable, not that it is a supported NIC type. FWIW kvm + * supports these types as of April 2008: + * i82551 i82557b i82559er ne2k_pci pcnet rtl8139 e1000 virtio + */ + if (model != NULL) { + int i, len, char_ok; + + len = xmlStrlen (model); + if (len >= QEMUD_MODEL_MAX_LEN) { + qemudReportError (conn, NULL, NULL, VIR_ERR_INVALID_ARG, + _("Model name '%s' is too long"), model); + goto error; + } + for (i = 0; i < len; ++i) { + char_ok = + (model[i] >= '0' && model[i] <= '9') || + (model[i] >= 'a' && model[i] <= 'z') || + (model[i] >= 'A' && model[i] <= 'Z') || model[i] == '_'; + if (!char_ok) { + qemudReportError (conn, NULL, NULL, VIR_ERR_INVALID_ARG, + _("Model name contains invalid characters")); + goto error; + } + } + strncpy (net->model, (const char*) model, len); + net->model[len] = '\0'; + + xmlFree (model); + model = NULL; + } else + net->model[0] = '\0'; + return 0; error: @@ -943,6 +979,7 @@ static int qemudParseInterfaceXML(virConnectPtr conn, xmlFree(ifname); xmlFree(script); xmlFree(bridge); + xmlFree(model); return -1; } @@ -2271,11 +2308,13 @@ int qemudBuildCommandLine(virConnectPtr conn, while (net) { char nic[100]; - if (snprintf(nic, sizeof(nic), "nic,macaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d", + if (snprintf(nic, sizeof(nic), + "nic,macaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d%s%s", net->mac[0], net->mac[1], net->mac[2], net->mac[3], net->mac[4], net->mac[5], - vlan) >= sizeof(nic)) + vlan, + (net->model[0] ? ",model=" : ""), net->model) >= sizeof(nic)) goto error; if (!((*argv)[++n] = strdup("-net"))) @@ -3395,7 +3434,6 @@ static int qemudGenerateXMLChar(virBufferPtr buf, virBufferVSprintf(buf, " \n", dev->srcData.udp.connectService); } - break; case QEMUD_CHR_SRC_TYPE_TCP: @@ -3609,6 +3647,11 @@ char *qemudGenerateXML(virConnectPtr conn, net->dst.socket.port); } + if (net->model && net->model[0] != '\0') { + virBufferVSprintf(&buf, " \n", + net->model); + } + virBufferAddLit(&buf, " \n"); net = net->next; diff --git a/src/qemu_conf.h b/src/qemu_conf.h index 8a367e3eca429fbb9c4271aab96cb0fb82e6ffda..bd8d8b28af75c88248ca95f20f50c8ff1986db55 100644 --- a/src/qemu_conf.h +++ b/src/qemu_conf.h @@ -68,6 +68,7 @@ struct qemud_vm_disk_def { }; #define QEMUD_MAC_ADDRESS_LEN 6 +#define QEMUD_MODEL_MAX_LEN 10 #define QEMUD_OS_TYPE_MAX_LEN 10 #define QEMUD_OS_ARCH_MAX_LEN 10 #define QEMUD_OS_MACHINE_MAX_LEN 10 @@ -97,6 +98,7 @@ enum qemud_vm_net_forward_type { struct qemud_vm_net_def { int type; unsigned char mac[QEMUD_MAC_ADDRESS_LEN]; + char model[QEMUD_MODEL_MAX_LEN]; union { struct { char ifname[BR_IFNAME_MAXLEN]; diff --git a/src/xend_internal.c b/src/xend_internal.c index b079fe663647a1f77d52decf18b1581f2af68cef..29a16dd55acb99e9d9b0e93c4ae095eff138b4c1 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1893,9 +1893,10 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, free(drvName); free(drvType); } else if (sexpr_lookup(node, "device/vif")) { - const char *tmp2; + const char *tmp2, *model; tmp2 = sexpr_node(node, "device/vif/script"); tmp = sexpr_node(node, "device/vif/bridge"); + model = sexpr_node(node, "device/vif/model"); if ((tmp2 && strstr(tmp2, "bridge")) || tmp) { virBufferAddLit(&buf, " \n"); if (tmp != NULL) @@ -1924,6 +1925,10 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, virBufferVSprintf(&buf, "