]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: add a virFirewall object to virNetworkObj
authorLaine Stump <laine@redhat.com>
Sat, 20 Apr 2024 02:19:42 +0000 (22:19 -0400)
committerLaine Stump <laine@redhat.com>
Thu, 23 May 2024 03:20:07 +0000 (23:20 -0400)
This virFirewall object will store the list of actions required to
remove the firewall that was added for the currently active instance
of the network, so it has been named "fwRemoval" (and when parsed into
XML, the <firewall> element will have the name "fwRemoval").

There are no uses of the fwRemoval object in the virNetworkObj yet,
but everything is in place to add it to the XML when formatted, parse
it from the XML when reading network status, and free the virFirewall
object when the virNetworkObj is freed.

Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/conf/virnetworkobj.c
src/conf/virnetworkobj.h
src/libvirt_private.syms

index d5aa121e201d194635f07290ad130112af51ddee..f5db4c5804e9a39c281da0d04d41a91e527b764a 100644 (file)
@@ -55,6 +55,11 @@ struct _virNetworkObj {
 
     unsigned int taint;
 
+    /* fwRemoval contains all commands needed to remove the firewall
+     * that was added for this network.
+     */
+    virFirewall *fwRemoval;
+
     /* Immutable pointer, self locking APIs */
     virMacMap *macmap;
 
@@ -239,6 +244,24 @@ virNetworkObjSetFloorSum(virNetworkObj *obj,
 }
 
 
+virFirewall *
+virNetworkObjGetFwRemoval(virNetworkObj *obj)
+{
+    return obj->fwRemoval;
+}
+
+
+void
+virNetworkObjSetFwRemoval(virNetworkObj *obj,
+                          virFirewall *fwRemoval)
+{
+    obj->fwRemoval = fwRemoval;
+    /* give it a name so it's identifiable in the XML */
+    if (fwRemoval)
+        virFirewallSetName(fwRemoval, "fwRemoval");
+}
+
+
 void
 virNetworkObjSetMacMap(virNetworkObj *obj,
                        virMacMap **macmap)
@@ -444,6 +467,7 @@ virNetworkObjDispose(void *opaque)
     virNetworkDefFree(obj->newDef);
     virBitmapFree(obj->classIdMap);
     virObjectUnref(obj->macmap);
+    virFirewallFree(obj->fwRemoval);
 }
 
 
@@ -792,6 +816,9 @@ virNetworkObjFormat(virNetworkObj *obj,
     if (virNetworkDefFormatBuf(&buf, obj->def, xmlopt, flags) < 0)
         return NULL;
 
+    if (obj->fwRemoval && virFirewallFormat(&buf, obj->fwRemoval) < 0)
+        return NULL;
+
     virBufferAdjustIndent(&buf, -2);
     virBufferAddLit(&buf, "</networkstatus>");
 
@@ -826,6 +853,7 @@ virNetworkLoadState(virNetworkObjList *nets,
     g_autofree char *configFile = NULL;
     g_autoptr(virNetworkDef) def = NULL;
     virNetworkObj *obj = NULL;
+    g_autoptr(virFirewall) fwRemoval = NULL;
     g_autoptr(xmlDoc) xml = NULL;
     xmlNodePtr node = NULL;
     g_autoptr(xmlXPathContext) ctxt = NULL;
@@ -868,6 +896,7 @@ virNetworkLoadState(virNetworkObjList *nets,
         g_autofree char *classIdStr = NULL;
         g_autofree char *floor_sum = NULL;
         g_autofree xmlNodePtr *nodes = NULL;
+        xmlNodePtr fwNode;
 
         ctxt->node = node;
         if ((classIdStr = virXPathString("string(./class_id[1]/@bitmap)",
@@ -902,6 +931,15 @@ virNetworkLoadState(virNetworkObjList *nets,
                 taint |= (1 << flag);
             }
         }
+        if ((fwNode = virXPathNode("./firewall", ctxt))) {
+            g_autoptr(virFirewall) fwTmp = NULL;
+
+            if (virFirewallParseXML(&fwTmp, fwNode, ctxt) < 0)
+                return NULL;
+
+            if (STREQ_NULLABLE(virFirewallGetName(fwTmp), "fwRemoval"))
+                fwRemoval = g_steal_pointer(&fwTmp);
+        }
     }
 
     /* create the object */
@@ -910,6 +948,8 @@ virNetworkLoadState(virNetworkObjList *nets,
 
     def = NULL;
 
+    virNetworkObjSetFwRemoval(obj, g_steal_pointer(&fwRemoval));
+
     /* assign status data stored in the network object */
     if (classIdMap) {
         virBitmapFree(obj->classIdMap);
index d3847d342207e1502a5be8d180c8dc98fd1a2bff..6ebc6c49f56882fe6d42877642ee8239e0e13e5f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "network_conf.h"
 #include "virnetworkportdef.h"
+#include "virfirewall.h"
 
 typedef struct _virNetworkObj virNetworkObj;
 
@@ -76,6 +77,13 @@ void
 virNetworkObjSetFloorSum(virNetworkObj *obj,
                          unsigned long long floor_sum);
 
+virFirewall *
+virNetworkObjGetFwRemoval(virNetworkObj *obj);
+
+void
+virNetworkObjSetFwRemoval(virNetworkObj *obj,
+                          virFirewall *fwRemoval);
+
 void
 virNetworkObjSetMacMap(virNetworkObj *obj,
                        virMacMap **macmap);
index eb328ca04f1d4e6022a4f416ccf10bf61278b9ac..f0f7aa86541f0c982e113db2a3605926c37f4dfb 100644 (file)
@@ -1300,6 +1300,7 @@ virNetworkObjGetClassIdMap;
 virNetworkObjGetDef;
 virNetworkObjGetDnsmasqPid;
 virNetworkObjGetFloorSum;
+virNetworkObjGetFwRemoval;
 virNetworkObjGetMacMap;
 virNetworkObjGetMetadata;
 virNetworkObjGetNewDef;
@@ -1331,6 +1332,7 @@ virNetworkObjSetDef;
 virNetworkObjSetDefTransient;
 virNetworkObjSetDnsmasqPid;
 virNetworkObjSetFloorSum;
+virNetworkObjSetFwRemoval;
 virNetworkObjSetMacMap;
 virNetworkObjSetMetadata;
 virNetworkObjTaint;