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,105 +342,87 @@ 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++) { virNetworkObjLock(obj);
virNetworkObjPtr obj = driver->networks->objs[i]; if (!virNetworkObjIsActive(obj)) {
virNetworkObjUnlock(obj);
return 0;
}
virNetworkObjLock(obj); switch (obj->def->forward.type) {
if (!virNetworkObjIsActive(obj)) { case VIR_NETWORK_FORWARD_NONE:
virNetworkObjUnlock(obj); case VIR_NETWORK_FORWARD_NAT:
continue; case VIR_NETWORK_FORWARD_ROUTE:
} /* If bridge doesn't exist, then mark it inactive */
if (!(obj->def->bridge && virNetDevExists(obj->def->bridge) == 1))
obj->active = 0;
break;
switch (obj->def->forward.type) { case VIR_NETWORK_FORWARD_BRIDGE:
case VIR_NETWORK_FORWARD_NONE: if (!(obj->def->bridge && virNetDevExists(obj->def->bridge) == 1)) {
case VIR_NETWORK_FORWARD_NAT:
case VIR_NETWORK_FORWARD_ROUTE:
/* If bridge doesn't exist, then mark it inactive */
if (!(obj->def->bridge && virNetDevExists(obj->def->bridge) == 1))
obj->active = 0; obj->active = 0;
break; break;
case VIR_NETWORK_FORWARD_BRIDGE:
if (obj->def->bridge) {
if (virNetDevExists(obj->def->bridge) != 1)
obj->active = 0;
break;
}
/* intentionally drop through to common case for all
* macvtap networks (forward='bridge' with no bridge
* device defined is macvtap using its 'bridge' mode)
*/
case VIR_NETWORK_FORWARD_PRIVATE:
case VIR_NETWORK_FORWARD_VEPA:
case VIR_NETWORK_FORWARD_PASSTHROUGH:
/* so far no extra checks */
break;
case VIR_NETWORK_FORWARD_HOSTDEV:
/* so far no extra checks */
break;
} }
/* intentionally drop through to common case for all
* macvtap networks (forward='bridge' with no bridge
* device defined is macvtap using its 'bridge' mode)
*/
case VIR_NETWORK_FORWARD_PRIVATE:
case VIR_NETWORK_FORWARD_VEPA:
case VIR_NETWORK_FORWARD_PASSTHROUGH:
/* so far no extra checks */
break;
/* Try and read dnsmasq/radvd pids of active networks */ case VIR_NETWORK_FORWARD_HOSTDEV:
if (obj->active && obj->def->ips && (obj->def->nips > 0)) { /* so far no extra checks */
char *radvdpidbase; break;
ignore_value(virPidFileReadIfAlive(driver->pidDir,
obj->def->name,
&obj->dnsmasqPid,
dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
if (!radvdpidbase)
break;
ignore_value(virPidFileReadIfAlive(driver->pidDir,
radvdpidbase,
&obj->radvdPid, RADVD));
VIR_FREE(radvdpidbase);
}
virNetworkObjUnlock(obj);
} }
/* remove inactive transient networks */ /* Try and read dnsmasq/radvd pids of active networks */
i = 0; if (obj->active && obj->def->ips && (obj->def->nips > 0)) {
while (i < driver->networks->count) { char *radvdpidbase;
virNetworkObjPtr obj = driver->networks->objs[i];
virNetworkObjLock(obj);
if (!obj->persistent && !obj->active) { ignore_value(virPidFileReadIfAlive(driver->pidDir,
networkRemoveInactive(obj); obj->def->name,
continue; &obj->dnsmasqPid,
} dnsmasqCapsGetBinaryPath(driver->dnsmasqCaps)));
radvdpidbase = networkRadvdPidfileBasename(obj->def->name);
if (!radvdpidbase)
goto cleanup;
virNetworkObjUnlock(obj); ignore_value(virPidFileReadIfAlive(driver->pidDir,
i++; radvdpidbase,
&obj->radvdPid, RADVD));
VIR_FREE(radvdpidbase);
} }
ret = 0;
cleanup:
virNetworkObjUnlock(obj);
return ret;
} }
static int
static void networkAutostartConfig(virNetworkObjPtr net,
networkAutostartConfigs(void) void *opaque ATTRIBUTE_UNUSED)
{ {
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 */
static int
networkRefreshDaemonsHelper(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 will have a dnsmasq or radvd daemon associated
* with them. Here we send a SIGHUP to an existing
* dnsmasq and/or radvd, or restart them if they've
* disappeared.
*/
networkRefreshDhcpDaemon(net);
networkRefreshRadvd(net);
}
virNetworkObjUnlock(net);
return 0;
}
/* SIGHUP/restart any dnsmasq or radvd daemons. /* SIGHUP/restart any dnsmasq or radvd daemons.
* This should be called when libvirtd is restarted. * This should be called when libvirtd is restarted.
*/ */
static void static void
networkRefreshDaemons(void) networkRefreshDaemons(void)
{ {
size_t i;
VIR_INFO("Refreshing network daemons"); VIR_INFO("Refreshing network daemons");
virNetworkObjListForEach(driver->networks,
networkRefreshDaemonsHelper,
NULL);
}
for (i = 0; i < driver->networks->count; i++) { static int
virNetworkObjPtr network = driver->networks->objs[i]; networkReloadFirewallRulesHelper(virNetworkObjPtr net,
void *opaque ATTRIBUTE_UNUSED)
{
virNetworkObjLock(network); virNetworkObjLock(net);
if (virNetworkObjIsActive(network) && if (virNetworkObjIsActive(net) &&
((network->def->forward.type == VIR_NETWORK_FORWARD_NONE) || ((net->def->forward.type == VIR_NETWORK_FORWARD_NONE) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_NAT) || (net->def->forward.type == VIR_NETWORK_FORWARD_NAT) ||
(network->def->forward.type == VIR_NETWORK_FORWARD_ROUTE))) { (net->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
* libvirt will have a dnsmasq or radvd daemon associated * need to have iptables rules reloaded.
* with them. Here we send a SIGHUP to an existing */
* dnsmasq and/or radvd, or restart them if they've networkRemoveFirewallRules(net->def);
* disappeared. if (networkAddFirewallRules(net->def) < 0) {
*/ /* failed to add but already logged */
networkRefreshDhcpDaemon(network);
networkRefreshRadvd(network);
} }
virNetworkObjUnlock(network);
} }
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