---
src/network/bridge_driver.c | 90
src/network/bridge_driver_platform.h | 3 ++
2 files changed, 93 insertions(+)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 80c5acb..4c0c352 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -70,6 +70,7 @@
#include "virfile.h"
#include "virstring.h"
#include "viraccessapicheck.h"
+#include "network_event.h"
#define VIR_FROM_THIS VIR_FROM_NETWORK
@@ -438,6 +439,8 @@ networkStateInitialize(bool privileged,
networkReloadFirewallRules(driverState);
networkRefreshDaemons(driverState);
+driverState->networkEventState = virObjectEventStateNew();
+
networkDriverUnlock(driverState);
#ifdef HAVE_FIREWALLD
@@ -532,6 +535,8 @@ networkStateCleanup(void) {
networkDriverLock(driverState);
+virObjectEventStateFree(driverState->networkEventState);
+
/* free inactive networks */
virNetworkObjListFree(&driverState->networks);
@@ -2290,6 +2295,55 @@ cleanup:
return ret;
}
+static int
+networkConnectNetworkEventRegisterAny(virConnectPtr conn,
+ virNetworkPtr net,
+ int eventID,
+ virConnectNetworkEventGenericCallback
callback,
+ void *opaque,
+ virFreeCallback freecb)
+{
+virNetworkDriverStatePtr driver = conn->networkPrivateData;
+int ret = -1;
+
+networkDriverLock(driver);
+
+if (virConnectNetworkEventRegisterAnyEnsureACL(conn) < 0)
+goto cleanup;
+
+if (virNetworkEventStateRegisterID(conn, driver->networkEventState,
+ net, eventID,
+ VIR_OBJECT_EVENT_CALLBACK(callback),
+ opaque, freecb, &ret) < 0)
+ret = -1;
+
+networkDriverUnlock(driver);
+
+cleanup:
+return ret;
+}
+
+static int
+networkConnectNetworkEventDeregisterAny(virConnectPtr conn,
+int callbackID)
+{
+virNetworkDriverStatePtr driver = conn->networkPrivateData;
+int ret = -1;
+
+if (virConnectNetworkEventDeregisterAnyEnsureACL(conn) < 0)
+goto cleanup;
+
+
+networkDriverLock(driver);
+ret = virObjectEventStateDeregisterID(conn,
+ driver->networkEventState,
+ callbackID);
+networkDriverUnlock(driver);
+
+cleanup:
+return ret;
+}
+
static int networkIsActive(virNetworkPtr net)
{
virNetworkObjPtr obj;
@@ -2483,6 +2537,7 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn,
const char *xml) {
virNetworkDefPtr def;
virNetworkObjPtr network = NULL;
virNetworkPtr ret = NULL;
+virObjectEventPtr event = NULL;
networkDriverLock(driver);
@@ -2509,11 +2564,17 @@ static virNetworkPtr networkCreateXML(virConnectPtr
conn, const char *xml) {
goto cleanup;
}
+event = virNetworkEventLifecycleNew(network->def->name,
+network->def->uuid,
+VIR_NETWORK_EVENT_STARTED);
+
VIR_INFO("Creating network '%s'", network->def->name);
ret = virGetNetwork(conn, network->def->name, network->def->uuid);
cleanup:
virNetworkDefFree(def);
+if (event)
+virObjectEventStateQueue(driver->networkEventState, event);
if (network)
virNetworkObjUnlock(network);
networkDriverUnlock(driver);
@@ -2526,6 +2587,7 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn,
const char *xml) {
bool freeDef = true;
virNetworkObjPtr network = NULL;
virNetworkPtr ret = NULL;
+virObjectEventPtr event = NULL;
networkDriverLock(driver);
@@ -2565,10 +2627,15 @@ static virNetworkPtr networkDefineXML(virConnectPtr
conn, const char *xml) {
goto cleanup;
}
+event = virNetworkEventLifecycleNew(def->name, def->uuid,
+VIR_NETWORK_EVENT_DEFINED);
+
VIR_INFO("Defining network '%s'", def->name);
ret = virGetNetwork(conn, def->name, def->uuid);
cleanup:
+if (event)
+virObjectEventStateQueue(driver->networkEventState, event);
if (freeDef)
virNetworkDefFree(def);
if (network)
@@ -2583,6 +2650,7 @@ networkUndefine(virNetworkPtr net) {
virNetworkObjPtr network;
int ret = -1;
bool active = false;
+virObjectEventPtr event = NULL;
networkDriverLock(driver);
@@ -2610,6 +2678,10 @@ networkUndefine(virNetworkPtr net) {
virNetworkDefFree(network->newDef);
network->newDef = NULL;
+event = virNetworkEventLifecycleNew(network->def->name,
+network->def->uuid,
+VIR_NETWORK_EVENT_UNDEFINED);
+
VIR_INFO("Un