+Fri Oct 10 15:39:00 BST 2008 Daniel P. Berrange <berrange@redhat.com>
+
+ * src/network_conf.c, src/network_conf.h, src/network_driver.c,
+ src/test.c: Switch to using array instead of linked list for
+ network objects
+
Fri Oct 10 15:19:00 BST 2008 Daniel P. Berrange <berrange@redhat.com>
* src/domain_conf.c, src/domain_conf.h: Switch to using
__virReportErrorHelper(conn, VIR_FROM_NETWORK, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
-virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjPtr nets,
+virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
const unsigned char *uuid)
{
- virNetworkObjPtr net = nets;
- while (net) {
- if (!memcmp(net->def->uuid, uuid, VIR_UUID_BUFLEN))
- return net;
- net = net->next;
- }
+ unsigned int i;
+
+ for (i = 0 ; i < nets->count ; i++)
+ if (!memcmp(nets->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
+ return nets->objs[i];
return NULL;
}
-virNetworkObjPtr virNetworkFindByName(const virNetworkObjPtr nets,
+virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets,
const char *name)
{
- virNetworkObjPtr net = nets;
- while (net) {
- if (STREQ(net->def->name, name))
- return net;
- net = net->next;
- }
+ unsigned int i;
+
+ for (i = 0 ; i < nets->count ; i++)
+ if (STREQ(nets->objs[i]->def->name, name))
+ return nets->objs[i];
return NULL;
}
VIR_FREE(net);
}
+void virNetworkObjListFree(virNetworkObjListPtr nets)
+{
+ unsigned int i;
+
+ for (i = 0 ; i < nets->count ; i++)
+ virNetworkObjFree(nets->objs[i]);
+
+ VIR_FREE(nets->objs);
+ nets->count = 0;
+}
+
virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const virNetworkDefPtr def)
{
virNetworkObjPtr network;
- if ((network = virNetworkFindByName(*nets, def->name))) {
+ if ((network = virNetworkFindByName(nets, def->name))) {
if (!virNetworkIsActive(network)) {
virNetworkDefFree(network->def);
network->def = def;
}
network->def = def;
- network->next = *nets;
- *nets = network;
+ if (VIR_REALLOC_N(nets->objs, nets->count + 1) < 0) {
+ virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ VIR_FREE(network);
+ return NULL;
+ }
+
+ nets->objs[nets->count] = network;
+ nets->count++;
return network;
}
-void virNetworkRemoveInactive(virNetworkObjPtr *nets,
+void virNetworkRemoveInactive(virNetworkObjListPtr nets,
const virNetworkObjPtr net)
{
- virNetworkObjPtr prev = NULL;
- virNetworkObjPtr curr = *nets;
+ unsigned int i;
- while (curr &&
- curr != net) {
- prev = curr;
- curr = curr->next;
- }
+ for (i = 0 ; i < nets->count ; i++) {
+ if (nets->objs[i] == net) {
+ virNetworkObjFree(nets->objs[i]);
- if (curr) {
- if (prev)
- prev->next = curr->next;
- else
- *nets = curr->next;
- }
+ if (i < (nets->count - 1))
+ memmove(nets->objs + i, nets->objs + i + 1,
+ sizeof(*(nets->objs)) * (nets->count - (i + 1)));
- virNetworkObjFree(net);
+ if (VIR_REALLOC_N(nets->objs, nets->count - 1) < 0) {
+ ; /* Failure to reduce memory allocation isn't fatal */
+ }
+ nets->count--;
+
+ break;
+ }
+ }
}
}
virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const char *configDir,
const char *autostartDir,
const char *file)
}
int virNetworkLoadAllConfigs(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const char *configDir,
const char *autostartDir)
{
virNetworkDefPtr def; /* The current definition */
virNetworkDefPtr newDef; /* New definition to activate at shutdown */
+};
- virNetworkObjPtr next;
+typedef struct _virNetworkObjList virNetworkObjList;
+typedef virNetworkObjList *virNetworkObjListPtr;
+struct _virNetworkObjList {
+ unsigned int count;
+ virNetworkObjPtr *objs;
};
static inline int
}
-virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjPtr nets,
+virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
const unsigned char *uuid);
-virNetworkObjPtr virNetworkFindByName(const virNetworkObjPtr nets,
+virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets,
const char *name);
void virNetworkDefFree(virNetworkDefPtr def);
void virNetworkObjFree(virNetworkObjPtr net);
+void virNetworkObjListFree(virNetworkObjListPtr vms);
virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const virNetworkDefPtr def);
-void virNetworkRemoveInactive(virNetworkObjPtr *nets,
+void virNetworkRemoveInactive(virNetworkObjListPtr nets,
const virNetworkObjPtr net);
virNetworkDefPtr virNetworkDefParseString(virConnectPtr conn,
virNetworkObjPtr net);
virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const char *configDir,
const char *autostartDir,
const char *file);
int virNetworkLoadAllConfigs(virConnectPtr conn,
- virNetworkObjPtr *nets,
+ virNetworkObjListPtr nets,
const char *configDir,
const char *autostartDir);
/* Main driver state */
struct network_driver {
- virNetworkObjPtr networks;
+ virNetworkObjList networks;
iptablesContext *iptables;
brControl *brctl;
static struct network_driver *driverState = NULL;
-static
-void networkAutostartConfigs(struct network_driver *driver) {
- virNetworkObjPtr network;
-
- network = driver->networks;
- while (network != NULL) {
- virNetworkObjPtr next = network->next;
+static void
+networkAutostartConfigs(struct network_driver *driver) {
+ unsigned int i;
- if (network->autostart &&
- !virNetworkIsActive(network) &&
- networkStartNetworkDaemon(NULL, driver, network) < 0) {
+ for (i = 0 ; i < driver->networks.count ; i++) {
+ if (driver->networks.objs[i]->autostart &&
+ !virNetworkIsActive(driver->networks.objs[i]) &&
+ networkStartNetworkDaemon(NULL, driver, driver->networks.objs[i]) < 0) {
virErrorPtr err = virGetLastError();
networkLog(NETWORK_ERR, _("Failed to autostart network '%s': %s\n"),
- network->def->name, err->message);
+ driver->networks.objs[i]->def->name, err->message);
}
-
- network = next;
}
}
*/
static int
networkReload(void) {
+ if (!driverState)
+ return 0;
+
virNetworkLoadAllConfigs(NULL,
&driverState->networks,
driverState->networkConfigDir,
*/
static int
networkActive(void) {
- virNetworkObjPtr net = driverState->networks;
+ unsigned int i;
- while (net) {
- if (virNetworkIsActive(net))
+ if (!driverState)
+ return 0;
+
+ for (i = 0 ; i < driverState->networks.count ; i++)
+ if (virNetworkIsActive(driverState->networks.objs[i]))
return 1;
- net = net->next;
- }
/* Otherwise we're happy to deal with a shutdown */
return 0;
*/
static int
networkShutdown(void) {
- virNetworkObjPtr network;
+ unsigned int i;
if (!driverState)
return -1;
/* shutdown active networks */
- network = driverState->networks;
- while (network) {
- virNetworkObjPtr next = network->next;
- if (virNetworkIsActive(network))
- networkShutdownNetworkDaemon(NULL, driverState, network);
- network = next;
- }
+ for (i = 0 ; i < driverState->networks.count ; i++)
+ if (virNetworkIsActive(driverState->networks.objs[i]))
+ networkShutdownNetworkDaemon(NULL, driverState,
+ driverState->networks.objs[i]);
/* free inactive networks */
- network = driverState->networks;
- while (network) {
- virNetworkObjPtr next = network->next;
- virNetworkObjFree(network);
- network = next;
- }
- driverState->networks = NULL;
+ virNetworkObjListFree(&driverState->networks);
VIR_FREE(driverState->logDir);
VIR_FREE(driverState->networkConfigDir);
static virNetworkPtr networkLookupByUUID(virConnectPtr conn ATTRIBUTE_UNUSED,
const unsigned char *uuid) {
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, uuid);
virNetworkPtr net;
if (!network) {
static virNetworkPtr networkLookupByName(virConnectPtr conn ATTRIBUTE_UNUSED,
const char *name) {
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByName(driver->networks, name);
+ virNetworkObjPtr network = virNetworkFindByName(&driver->networks, name);
virNetworkPtr net;
if (!network) {
}
static int networkNumNetworks(virConnectPtr conn) {
- int nactive = 0;
+ int nactive = 0, i;
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr net = driver->networks;
- while (net) {
- if (virNetworkIsActive(net))
+
+ for (i = 0 ; i < driver->networks.count ; i++)
+ if (virNetworkIsActive(driver->networks.objs[i]))
nactive++;
- net = net->next;
- }
+
return nactive;
}
static int networkListNetworks(virConnectPtr conn, char **const names, int nnames) {
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr network = driver->networks;
int got = 0, i;
- while (network && got < nnames) {
- if (virNetworkIsActive(network)) {
- if (!(names[got] = strdup(network->def->name))) {
+
+ for (i = 0 ; i < driver->networks.count && got < nnames ; i++) {
+ if (virNetworkIsActive(driver->networks.objs[i])) {
+ if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) {
networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
- "%s", _("failed to allocate space for VM name string"));
+ "%s", _("failed to allocate space for VM name string"));
goto cleanup;
}
got++;
}
- network = network->next;
}
return got;
}
static int networkNumDefinedNetworks(virConnectPtr conn) {
- int ninactive = 0;
+ int ninactive = 0, i;
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr net = driver->networks;
- while (net) {
- if (!virNetworkIsActive(net))
+
+ for (i = 0 ; i < driver->networks.count ; i++)
+ if (!virNetworkIsActive(driver->networks.objs[i]))
ninactive++;
- net = net->next;
- }
+
return ninactive;
}
static int networkListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) {
struct network_driver *driver = (struct network_driver *)conn->networkPrivateData;
- virNetworkObjPtr network = driver->networks;
int got = 0, i;
- while (network && got < nnames) {
- if (!virNetworkIsActive(network)) {
- if (!(names[got] = strdup(network->def->name))) {
+
+ for (i = 0 ; i < driver->networks.count && got < nnames ; i++) {
+ if (!virNetworkIsActive(driver->networks.objs[i])) {
+ if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) {
networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
- "%s", _("failed to allocate space for VM name string"));
+ "%s", _("failed to allocate space for VM name string"));
goto cleanup;
}
got++;
}
- network = network->next;
}
return got;
static int networkUndefine(virNetworkPtr net) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_DOMAIN,
static int networkStart(virNetworkPtr net) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
static int networkDestroy(virNetworkPtr net) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
int ret;
if (!network) {
static char *networkDumpXML(virNetworkPtr net, int flags ATTRIBUTE_UNUSED) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
static char *networkGetBridgeName(virNetworkPtr net) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
char *bridge;
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
static int networkGetAutostart(virNetworkPtr net,
int *autostart) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
static int networkSetAutostart(virNetworkPtr net,
int autostart) {
struct network_driver *driver = (struct network_driver *)net->conn->networkPrivateData;
- virNetworkObjPtr network = virNetworkFindByUUID(driver->networks, net->uuid);
+ virNetworkObjPtr network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
virCapsPtr caps;
virNodeInfo nodeInfo;
virDomainObjList domains;
- virNetworkObjPtr networks;
+ virNetworkObjList networks;
int numCells;
testCell cells[MAX_CELLS];
};
\
privconn = (testConnPtr)net->conn->privateData; \
do { \
- if ((privnet = virNetworkFindByName(privconn->networks, \
+ if ((privnet = virNetworkFindByName(&privconn->networks, \
(net)->name)) == NULL) { \
testError((net)->conn, NULL, (net), VIR_ERR_INVALID_ARG, \
__FUNCTION__); \
error:
virDomainObjListFree(&privconn->domains);
- virNetworkObjFree(privconn->networks);
+ virNetworkObjListFree(&privconn->networks);
virCapabilitiesFree(privconn->caps);
VIR_FREE(privconn);
return VIR_DRV_OPEN_ERROR;
if (fd != -1)
close(fd);
virDomainObjListFree(&privconn->domains);
- net = privconn->networks;
- while (net) {
- virNetworkObjPtr tmp = net->next;
- virNetworkObjFree(net);
- net = tmp;
- }
+ virNetworkObjListFree(&privconn->networks);
VIR_FREE(privconn);
conn->privateData = NULL;
return VIR_DRV_OPEN_ERROR;
static int testClose(virConnectPtr conn)
{
- virNetworkObjPtr net;
GET_CONNECTION(conn);
+
virCapabilitiesFree(privconn->caps);
virDomainObjListFree(&privconn->domains);
- net = privconn->networks;
- while (net) {
- virNetworkObjPtr tmp = net->next;
- virNetworkObjFree(net);
- net = tmp;
- }
+ virNetworkObjListFree(&privconn->networks);
+
VIR_FREE (privconn);
conn->privateData = conn;
return 0;
virNetworkObjPtr net = NULL;
GET_CONNECTION(conn);
- if ((net = virNetworkFindByUUID(privconn->networks, uuid)) == NULL) {
+ if ((net = virNetworkFindByUUID(&privconn->networks, uuid)) == NULL) {
testError (conn, NULL, NULL, VIR_ERR_NO_NETWORK, NULL);
return NULL;
}
virNetworkObjPtr net = NULL;
GET_CONNECTION(conn);
- if ((net = virNetworkFindByName(privconn->networks, name)) == NULL) {
+ if ((net = virNetworkFindByName(&privconn->networks, name)) == NULL) {
testError (conn, NULL, NULL, VIR_ERR_NO_NETWORK, NULL);
return NULL;
}
static int testNumNetworks(virConnectPtr conn) {
- int numActive = 0;
- virNetworkObjPtr net;
+ int numActive = 0, i;
GET_CONNECTION(conn);
- net = privconn->networks;
- while (net) {
- if (virNetworkIsActive(net))
+ for (i = 0 ; i < privconn->networks.count ; i++)
+ if (virNetworkIsActive(privconn->networks.objs[i]))
numActive++;
- net = net->next;
- }
+
return numActive;
}
static int testListNetworks(virConnectPtr conn, char **const names, int nnames) {
- int n = 0;
- virNetworkObjPtr net;
+ int n = 0, i;
GET_CONNECTION(conn);
- net = privconn->networks;
memset(names, 0, sizeof(*names)*nnames);
- while (net && n < nnames) {
- if (virNetworkIsActive(net) &&
- !(names[n++] = strdup(net->def->name)))
+ for (i = 0 ; i < privconn->networks.count && n < nnames ; i++)
+ if (virNetworkIsActive(privconn->networks.objs[i]) &&
+ !(names[n++] = strdup(privconn->networks.objs[i]->def->name)))
goto no_memory;
- net = net->next;
- }
+
return n;
no_memory:
}
static int testNumDefinedNetworks(virConnectPtr conn) {
- int numInactive = 0;
- virNetworkObjPtr net;
+ int numInactive = 0, i;
GET_CONNECTION(conn);
- net = privconn->networks;
- while (net) {
- if (!virNetworkIsActive(net))
+ for (i = 0 ; i < privconn->networks.count ; i++)
+ if (!virNetworkIsActive(privconn->networks.objs[i]))
numInactive++;
- net = net->next;
- }
+
return numInactive;
}
static int testListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) {
- int n = 0;
- virNetworkObjPtr net;
+ int n = 0, i;
GET_CONNECTION(conn);
- net = privconn->networks;
memset(names, 0, sizeof(*names)*nnames);
- while (net && n < nnames) {
- if (!virNetworkIsActive(net) &&
- !(names[n++] = strdup(net->def->name)))
+ for (i = 0 ; i < privconn->networks.count && n < nnames ; i++)
+ if (!virNetworkIsActive(privconn->networks.objs[i]) &&
+ !(names[n++] = strdup(privconn->networks.objs[i]->def->name)))
goto no_memory;
- net = net->next;
- }
+
return n;
no_memory: