1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

bridge_driver: Adapt to new virNetworkObjList accessors

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2015-02-23 18:29:20 +01:00
parent 292acd202f
commit b61db335f9

View File

@ -342,21 +342,16 @@ networkBridgeDummyNicName(const char *brname)
return nicname; return nicname;
} }
/* Update the internal status of all allegedly active networks static int
* according to external conditions on the host (i.e. anything that networkUpdateState(virNetworkObjPtr obj,
* isn't stored directly in each network's state file). */ void *opaque ATTRIBUTE_UNUSED)
static void
networkUpdateAllState(void)
{ {
size_t i; int ret = -1;
for (i = 0; i < driver->networks->count; i++) {
virNetworkObjPtr obj = driver->networks->objs[i];
virNetworkObjLock(obj); virNetworkObjLock(obj);
if (!virNetworkObjIsActive(obj)) { if (!virNetworkObjIsActive(obj)) {
virNetworkObjUnlock(obj); virNetworkObjUnlock(obj);
continue; return 0;
} }
switch (obj->def->forward.type) { switch (obj->def->forward.type) {
@ -369,8 +364,7 @@ networkUpdateAllState(void)
break; break;
case VIR_NETWORK_FORWARD_BRIDGE: case VIR_NETWORK_FORWARD_BRIDGE:
if (obj->def->bridge) { if (!(obj->def->bridge && virNetDevExists(obj->def->bridge) == 1)) {
if (virNetDevExists(obj->def->bridge) != 1)
obj->active = 0; obj->active = 0;
break; break;
} }
@ -399,48 +393,36 @@ networkUpdateAllState(void)
dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps))); dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
radvdpidbase = networkRadvdPidfileBasename(obj->def->name); radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
if (!radvdpidbase) if (!radvdpidbase)
break; goto cleanup;
ignore_value(virPidFileReadIfAlive(driver->pidDir, ignore_value(virPidFileReadIfAlive(driver->pidDir,
radvdpidbase, radvdpidbase,
&obj->radvdPid, RADVD)); &obj->radvdPid, RADVD));
VIR_FREE(radvdpidbase); VIR_FREE(radvdpidbase);
} }
ret = 0;
cleanup:
virNetworkObjUnlock(obj); virNetworkObjUnlock(obj);
return ret;
} }
/* remove inactive transient networks */ static int
i = 0; networkAutostartConfig(virNetworkObjPtr net,
while (i < driver->networks->count) { void *opaque ATTRIBUTE_UNUSED)
virNetworkObjPtr obj = driver->networks->objs[i];
virNetworkObjLock(obj);
if (!obj->persistent && !obj->active) {
networkRemoveInactive(obj);
continue;
}
virNetworkObjUnlock(obj);
i++;
}
}
static void
networkAutostartConfigs(void)
{ {
size_t i; int ret = -1;
for (i = 0; i < driver->networks->count; i++) { virNetworkObjLock(net);
virNetworkObjLock(driver->networks->objs[i]); if (net->autostart &&
if (driver->networks->objs[i]->autostart && !virNetworkObjIsActive(net) &&
!virNetworkObjIsActive(driver->networks->objs[i])) { networkStartNetwork(net) < 0)
if (networkStartNetwork(driver->networks->objs[i]) < 0) { goto cleanup;
/* failed to start but already logged */
} ret = 0;
} cleanup:
virNetworkObjUnlock(driver->networks->objs[i]); virNetworkObjUnlock(net);
} return ret;
} }
#if HAVE_FIREWALLD #if HAVE_FIREWALLD
@ -650,7 +632,17 @@ networkStateInitialize(bool privileged,
driver->networkAutostartDir) < 0) driver->networkAutostartDir) < 0)
goto error; goto error;
networkUpdateAllState();
/* Update the internal status of all allegedly active
* networks according to external conditions on the host
* (i.e. anything that isn't stored directly in each
* network's state file). */
virNetworkObjListForEach(driver->networks,
networkUpdateState,
NULL);
virNetworkObjListPrune(driver->networks,
VIR_CONNECT_LIST_NETWORKS_INACTIVE |
VIR_CONNECT_LIST_NETWORKS_TRANSIENT);
networkReloadFirewallRules(); networkReloadFirewallRules();
networkRefreshDaemons(); networkRefreshDaemons();
@ -709,7 +701,9 @@ networkStateAutoStart(void)
return; return;
networkDriverLock(); networkDriverLock();
networkAutostartConfigs(); virNetworkObjListForEach(driver->networks,
networkAutostartConfig,
NULL);
networkDriverUnlock(); networkDriverUnlock();
} }
@ -733,7 +727,9 @@ networkStateReload(void)
driver->networkAutostartDir); driver->networkAutostartDir);
networkReloadFirewallRules(); networkReloadFirewallRules();
networkRefreshDaemons(); networkRefreshDaemons();
networkAutostartConfigs(); virNetworkObjListForEach(driver->networks,
networkAutostartConfig,
NULL);
networkDriverUnlock(); networkDriverUnlock();
return 0; return 0;
} }
@ -1745,62 +1741,70 @@ networkRestartRadvd(virNetworkObjPtr network)
} }
#endif /* #if 0 */ #endif /* #if 0 */
/* SIGHUP/restart any dnsmasq or radvd daemons. static int
* This should be called when libvirtd is restarted. networkRefreshDaemonsHelper(virNetworkObjPtr net,
*/ void *opaque ATTRIBUTE_UNUSED)
static void
networkRefreshDaemons(void)
{ {
size_t i;
VIR_INFO("Refreshing network daemons"); virNetworkObjLock(net);
if (virNetworkObjIsActive(net) &&
for (i = 0; i < driver->networks->count; i++) { ((net->def->forward.type == VIR_NETWORK_FORWARD_NONE) ||
virNetworkObjPtr network = driver->networks->objs[i]; (net->def->forward.type == VIR_NETWORK_FORWARD_NAT) ||
(net->def->forward.type == VIR_NETWORK_FORWARD_ROUTE))) {
virNetworkObjLock(network);
if (virNetworkObjIsActive(network) &&
((network->def->forward.type == VIR_NETWORK_FORWARD_NONE) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_NAT) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_ROUTE))) {
/* Only the three L3 network types that are configured by /* Only the three L3 network types that are configured by
* libvirt will have a dnsmasq or radvd daemon associated * libvirt will have a dnsmasq or radvd daemon associated
* with them. Here we send a SIGHUP to an existing * with them. Here we send a SIGHUP to an existing
* dnsmasq and/or radvd, or restart them if they've * dnsmasq and/or radvd, or restart them if they've
* disappeared. * disappeared.
*/ */
networkRefreshDhcpDaemon(network); networkRefreshDhcpDaemon(net);
networkRefreshRadvd(network); networkRefreshRadvd(net);
} }
virNetworkObjUnlock(network); virNetworkObjUnlock(net);
return 0;
} }
/* SIGHUP/restart any dnsmasq or radvd daemons.
* This should be called when libvirtd is restarted.
*/
static void
networkRefreshDaemons(void)
{
VIR_INFO("Refreshing network daemons");
virNetworkObjListForEach(driver->networks,
networkRefreshDaemonsHelper,
NULL);
}
static int
networkReloadFirewallRulesHelper(virNetworkObjPtr net,
void *opaque ATTRIBUTE_UNUSED)
{
virNetworkObjLock(net);
if (virNetworkObjIsActive(net) &&
((net->def->forward.type == VIR_NETWORK_FORWARD_NONE) ||
(net->def->forward.type == VIR_NETWORK_FORWARD_NAT) ||
(net->def->forward.type == VIR_NETWORK_FORWARD_ROUTE))) {
/* Only the three L3 network types that are configured by libvirt
* need to have iptables rules reloaded.
*/
networkRemoveFirewallRules(net->def);
if (networkAddFirewallRules(net->def) < 0) {
/* failed to add but already logged */
}
}
virNetworkObjUnlock(net);
return 0;
} }
static void static void
networkReloadFirewallRules(void) networkReloadFirewallRules(void)
{ {
size_t i;
VIR_INFO("Reloading iptables rules"); VIR_INFO("Reloading iptables rules");
virNetworkObjListForEach(driver->networks,
for (i = 0; i < driver->networks->count; i++) { networkReloadFirewallRulesHelper,
virNetworkObjPtr network = driver->networks->objs[i]; NULL);
virNetworkObjLock(network);
if (virNetworkObjIsActive(network) &&
((network->def->forward.type == VIR_NETWORK_FORWARD_NONE) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_NAT) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_ROUTE))) {
/* Only the three L3 network types that are configured by libvirt
* need to have iptables rules reloaded.
*/
networkRemoveFirewallRules(network->def);
if (networkAddFirewallRules(network->def) < 0) {
/* failed to add but already logged */
}
}
virNetworkObjUnlock(network);
}
} }
/* Enable IP Forwarding. Return 0 for success, -1 for failure. */ /* Enable IP Forwarding. Return 0 for success, -1 for failure. */
@ -2526,21 +2530,16 @@ static virNetworkPtr networkLookupByName(virConnectPtr conn,
static int networkConnectNumOfNetworks(virConnectPtr conn) static int networkConnectNumOfNetworks(virConnectPtr conn)
{ {
int nactive = 0; int nactive;
size_t i;
if (virConnectNumOfNetworksEnsureACL(conn) < 0) if (virConnectNumOfNetworksEnsureACL(conn) < 0)
return -1; return -1;
networkDriverLock(); networkDriverLock();
for (i = 0; i < driver->networks->count; i++) { nactive = virNetworkObjListNumOfNetworks(driver->networks,
virNetworkObjPtr obj = driver->networks->objs[i]; true,
virNetworkObjLock(obj); virConnectNumOfNetworksCheckACL,
if (virConnectNumOfNetworksCheckACL(conn, obj->def) && conn);
virNetworkObjIsActive(obj))
nactive++;
virNetworkObjUnlock(obj);
}
networkDriverUnlock(); networkDriverUnlock();
return nactive; return nactive;
@ -2548,53 +2547,32 @@ static int networkConnectNumOfNetworks(virConnectPtr conn)
static int networkConnectListNetworks(virConnectPtr conn, char **const names, int nnames) { static int networkConnectListNetworks(virConnectPtr conn, char **const names, int nnames) {
int got = 0; int got = 0;
size_t i;
if (virConnectListNetworksEnsureACL(conn) < 0) if (virConnectListNetworksEnsureACL(conn) < 0)
return -1; return -1;
networkDriverLock(); networkDriverLock();
for (i = 0; i < driver->networks->count && got < nnames; i++) { got = virNetworkObjListGetNames(driver->networks,
virNetworkObjPtr obj = driver->networks->objs[i]; true, names, nnames,
virNetworkObjLock(obj); virConnectListNetworksCheckACL,
if (virConnectListNetworksCheckACL(conn, obj->def) && conn);
virNetworkObjIsActive(obj)) {
if (VIR_STRDUP(names[got], obj->def->name) < 0) {
virNetworkObjUnlock(obj);
goto cleanup;
}
got++;
}
virNetworkObjUnlock(obj);
}
networkDriverUnlock(); networkDriverUnlock();
return got; return got;
cleanup:
networkDriverUnlock();
for (i = 0; i < got; i++)
VIR_FREE(names[i]);
return -1;
} }
static int networkConnectNumOfDefinedNetworks(virConnectPtr conn) static int networkConnectNumOfDefinedNetworks(virConnectPtr conn)
{ {
int ninactive = 0; int ninactive = 0;
size_t i;
if (virConnectNumOfDefinedNetworksEnsureACL(conn) < 0) if (virConnectNumOfDefinedNetworksEnsureACL(conn) < 0)
return -1; return -1;
networkDriverLock(); networkDriverLock();
for (i = 0; i < driver->networks->count; i++) { ninactive = virNetworkObjListNumOfNetworks(driver->networks,
virNetworkObjPtr obj = driver->networks->objs[i]; false,
virNetworkObjLock(obj); virConnectNumOfDefinedNetworksCheckACL,
if (virConnectNumOfDefinedNetworksCheckACL(conn, obj->def) && conn);
!virNetworkObjIsActive(obj))
ninactive++;
virNetworkObjUnlock(obj);
}
networkDriverUnlock(); networkDriverUnlock();
return ninactive; return ninactive;
@ -2602,33 +2580,17 @@ static int networkConnectNumOfDefinedNetworks(virConnectPtr conn)
static int networkConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) { static int networkConnectListDefinedNetworks(virConnectPtr conn, char **const names, int nnames) {
int got = 0; int got = 0;
size_t i;
if (virConnectListDefinedNetworksEnsureACL(conn) < 0) if (virConnectListDefinedNetworksEnsureACL(conn) < 0)
return -1; return -1;
networkDriverLock(); networkDriverLock();
for (i = 0; i < driver->networks->count && got < nnames; i++) { got = virNetworkObjListGetNames(driver->networks,
virNetworkObjPtr obj = driver->networks->objs[i]; false, names, nnames,
virNetworkObjLock(obj); virConnectListDefinedNetworksCheckACL,
if (virConnectListDefinedNetworksCheckACL(conn, obj->def) && conn);
!virNetworkObjIsActive(obj)) {
if (VIR_STRDUP(names[got], obj->def->name) < 0) {
virNetworkObjUnlock(obj);
goto cleanup;
}
got++;
}
virNetworkObjUnlock(obj);
}
networkDriverUnlock(); networkDriverUnlock();
return got; return got;
cleanup:
networkDriverUnlock();
for (i = 0; i < got; i++)
VIR_FREE(names[i]);
return -1;
} }
static int static int