diff --git a/ChangeLog b/ChangeLog index d19a623df9..fad8b8bb39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Mar 8 15:10:12 CET 2007 Daniel Veillard + + * src/internal.h src/xend_internal.c src/xm_internal.c src/xml.c: + add a check for minimal size of Xen Dom0, track places where we + had arbitrary minimal memory requirement and use a predefined + macro to clean this up. + Thu Mar 8 08:45:46 EST 2007 Daniel P., Berrange * src/virsh.c: Added an explicit --readonly option to virsh diff --git a/src/internal.h b/src/internal.h index 27c57f1c50..0d8974b799 100644 --- a/src/internal.h +++ b/src/internal.h @@ -84,7 +84,21 @@ extern "C" { #define VIR_IS_DOMAIN(obj) ((obj) && (obj)->magic==VIR_DOMAIN_MAGIC) #define VIR_IS_CONNECTED_DOMAIN(obj) (VIR_IS_DOMAIN(obj) && VIR_IS_CONNECT((obj)->conn)) +/** + * VIR_NETWORK_MAGIC: + * + * magic value used to protect the API when pointers to network structures + * are passed down by the uers. + */ +#define VIR_NETWORK_MAGIC 0xDEAD1234 +#define VIR_IS_NETWORK(obj) ((obj) && (obj)->magic==VIR_NETWORK_MAGIC) +#define VIR_IS_CONNECTED_NETWORK(obj) (VIR_IS_NETWORK(obj) && VIR_IS_CONNECT((obj)->conn)) + +/* + * arbitrary limitations + */ #define MAX_DRIVERS 10 +#define MIN_XEN_GUEST_SIZE 64 /* 64 megabytes */ /* * Flags for Xen connections @@ -104,6 +118,10 @@ struct _virConnect { virDriverPtr drivers[MAX_DRIVERS]; int nb_drivers; + /* the list of available network drivers */ + virNetworkDriverPtr networkDrivers[MAX_DRIVERS]; + int nb_network_drivers; + /* extra data needed by drivers */ int handle; /* internal handle used for hypercall */ struct xs_handle *xshandle;/* handle to talk to the xenstore */ @@ -125,8 +143,9 @@ struct _virConnect { void *userData; /* the user data */ /* misc */ - xmlMutexPtr hashes_mux;/* a mutex to protect the domain hash table */ + xmlMutexPtr hashes_mux;/* a mutex to protect the domain and networks hash tables */ virHashTablePtr domains;/* hash table for known domains */ + virHashTablePtr networks;/* hash table for known domains */ int flags; /* a set of connection flags */ }; @@ -158,6 +177,19 @@ struct _virDomain { char *xml; /* the XML description for defined domains */ }; +/** +* _virNetwork: +* +* Internal structure associated to a domain +*/ +struct _virNetwork { + unsigned int magic; /* specific value to check */ + int uses; /* reference count */ + virConnectPtr conn; /* pointer back to the connection */ + char *name; /* the network external name */ + unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */ +}; + /* * Internal routines */ @@ -172,6 +204,7 @@ char *virDomainGetVMInfo(virDomainPtr domain, ************************************************************************/ void __virRaiseError(virConnectPtr conn, virDomainPtr dom, + virNetworkPtr net, int domain, int code, virErrorLevel level, @@ -196,6 +229,11 @@ int virFreeDomain (virConnectPtr conn, virDomainPtr domain); virDomainPtr virGetDomainByID(virConnectPtr conn, int id); +virNetworkPtr virGetNetwork (virConnectPtr conn, + const char *name, + const unsigned char *uuid); +int virFreeNetwork (virConnectPtr conn, + virNetworkPtr domain); #ifdef __cplusplus } diff --git a/src/xend_internal.c b/src/xend_internal.c index eda94bd6d2..7c05bfa644 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1383,7 +1383,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi if (cur_mem > max_mem) max_mem = cur_mem; virBufferVSprintf(&buf, " %d\n", max_mem); - if ((cur_mem > 63) && (cur_mem != max_mem)) + if ((cur_mem >= MIN_XEN_GUEST_SIZE) && (cur_mem != max_mem)) virBufferVSprintf(&buf, " %d\n", cur_mem); virBufferVSprintf(&buf, " %d\n", diff --git a/src/xm_internal.c b/src/xm_internal.c index c23574ca7a..4c1a97a0a5 100644 --- a/src/xm_internal.c +++ b/src/xm_internal.c @@ -540,7 +540,7 @@ int xenXMDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { memset(info, 0, sizeof(virDomainInfo)); if (xenXMConfigGetInt(entry->conf, "memory", &mem) < 0 || mem < 0) - info->memory = 64 * 1024; + info->memory = MIN_XEN_GUEST_SIZE * 1024 * 2; else info->memory = (unsigned long)mem * 1024; if (xenXMConfigGetInt(entry->conf, "maxmem", &mem) < 0 || @@ -649,12 +649,13 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { } if (xenXMConfigGetInt(conf, "memory", &val) < 0) - val = 64; - virBufferVSprintf(buf, " %ld\n", val * 1024); + val = MIN_XEN_GUEST_SIZE * 2; + virBufferVSprintf(buf, " %ld\n", + val * 1024); if (xenXMConfigGetInt(conf, "maxmem", &val) < 0) if (xenXMConfigGetInt(conf, "memory", &val) < 0) - val = 64; + val = MIN_XEN_GUEST_SIZE * 2; virBufferVSprintf(buf, " %ld\n", val * 1024); @@ -663,7 +664,6 @@ char *xenXMDomainFormatXML(virConnectPtr conn, virConfPtr conf) { virBufferVSprintf(buf, " %ld\n", val); - if (xenXMConfigGetString(conf, "on_poweroff", &str) < 0) str = "destroy"; virBufferVSprintf(buf, " %s\n", str); @@ -1122,7 +1122,7 @@ unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain) { val < 0) if (xenXMConfigGetInt(entry->conf, "memory", &val) < 0 || val < 0) - val = 64; + val = MIN_XEN_GUEST_SIZE * 2; return (val * 1024); } diff --git a/src/xml.c b/src/xml.c index 4ec9fb746c..6f14d9d964 100644 --- a/src/xml.c +++ b/src/xml.c @@ -1026,7 +1026,7 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int obj = xmlXPathEval(BAD_CAST "number(/domain/memory[1])", ctxt); if ((obj == NULL) || (obj->type != XPATH_NUMBER) || - (isnan(obj->floatval)) || (obj->floatval < 64000)) { + (isnan(obj->floatval)) || (obj->floatval < MIN_XEN_GUEST_SIZE * 1024)) { max_mem = 128; } else { max_mem = (obj->floatval / 1024); @@ -1034,7 +1034,7 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xmlXPathFreeObject(obj); obj = xmlXPathEval(BAD_CAST "number(/domain/currentMemory[1])", ctxt); if ((obj == NULL) || (obj->type != XPATH_NUMBER) || - (isnan(obj->floatval)) || (obj->floatval < 64000)) { + (isnan(obj->floatval)) || (obj->floatval < MIN_XEN_GUEST_SIZE * 1024)) { mem = max_mem; } else { mem = (obj->floatval / 1024);