[libvirt] [PATCH v2 09/21] remote: add support for nwfilter binding objects

Daniel P. Berrangé berrange at redhat.com
Tue May 15 17:43:25 UTC 2018


Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/remote/remote_daemon_dispatch.c | 15 +++++
 src/remote/remote_driver.c          | 20 +++++++
 src/remote/remote_protocol.x        | 90 ++++++++++++++++++++++++++++-
 src/remote_protocol-structs         | 43 ++++++++++++++
 src/rpc/gendispatch.pl              | 12 ++--
 5 files changed, 173 insertions(+), 7 deletions(-)

diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon_dispatch.c
index a8a5932d71..26ccc8d4b6 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -90,6 +90,7 @@ static virStoragePoolPtr get_nonnull_storage_pool(virConnectPtr conn, remote_non
 static virStorageVolPtr get_nonnull_storage_vol(virConnectPtr conn, remote_nonnull_storage_vol vol);
 static virSecretPtr get_nonnull_secret(virConnectPtr conn, remote_nonnull_secret secret);
 static virNWFilterPtr get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
+static virNWFilterBindingPtr get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding binding);
 static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot);
 static virNodeDevicePtr get_nonnull_node_device(virConnectPtr conn, remote_nonnull_node_device dev);
 static void make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
@@ -100,6 +101,7 @@ static void make_nonnull_storage_vol(remote_nonnull_storage_vol *vol_dst, virSto
 static void make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNodeDevicePtr dev_src);
 static void make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret_src);
 static void make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr nwfilter_src);
+static void make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src);
 static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src);
 
 static int
@@ -6998,6 +7000,12 @@ get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter)
     return virGetNWFilter(conn, nwfilter.name, BAD_CAST nwfilter.uuid);
 }
 
+static virNWFilterBindingPtr
+get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding binding)
+{
+    return virGetNWFilterBinding(conn, binding.portdev, binding.filtername);
+}
+
 static virDomainSnapshotPtr
 get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot)
 {
@@ -7070,6 +7078,13 @@ make_nonnull_nwfilter(remote_nonnull_nwfilter *nwfilter_dst, virNWFilterPtr nwfi
     memcpy(nwfilter_dst->uuid, nwfilter_src->uuid, VIR_UUID_BUFLEN);
 }
 
+static void
+make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src)
+{
+    ignore_value(VIR_STRDUP_QUIET(binding_dst->portdev, binding_src->portdev));
+    ignore_value(VIR_STRDUP_QUIET(binding_dst->filtername, binding_src->filtername));
+}
+
 static void
 make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src)
 {
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 95437b4365..13eafa67d1 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -141,6 +141,7 @@ static int remoteAuthPolkit(virConnectPtr conn, struct private_data *priv,
 static virDomainPtr get_nonnull_domain(virConnectPtr conn, remote_nonnull_domain domain);
 static virNetworkPtr get_nonnull_network(virConnectPtr conn, remote_nonnull_network network);
 static virNWFilterPtr get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
+static virNWFilterBindingPtr get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding binding);
 static virInterfacePtr get_nonnull_interface(virConnectPtr conn, remote_nonnull_interface iface);
 static virStoragePoolPtr get_nonnull_storage_pool(virConnectPtr conn, remote_nonnull_storage_pool pool);
 static virStorageVolPtr get_nonnull_storage_vol(virConnectPtr conn, remote_nonnull_storage_vol vol);
@@ -156,6 +157,7 @@ static void
 make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNodeDevicePtr dev_src);
 static void make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret_src);
 static void make_nonnull_nwfilter(remote_nonnull_nwfilter *nwfilter_dst, virNWFilterPtr nwfilter_src);
+static void make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src);
 static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src);
 
 /*----------------------------------------------------------------------*/
@@ -8138,6 +8140,12 @@ get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter)
     return virGetNWFilter(conn, nwfilter.name, BAD_CAST nwfilter.uuid);
 }
 
+static virNWFilterBindingPtr
+get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding binding)
+{
+    return virGetNWFilterBinding(conn, binding.portdev, binding.filtername);
+}
+
 static virDomainSnapshotPtr
 get_nonnull_domain_snapshot(virDomainPtr domain, remote_nonnull_domain_snapshot snapshot)
 {
@@ -8205,6 +8213,13 @@ make_nonnull_nwfilter(remote_nonnull_nwfilter *nwfilter_dst, virNWFilterPtr nwfi
     memcpy(nwfilter_dst->uuid, nwfilter_src->uuid, VIR_UUID_BUFLEN);
 }
 
+static void
+make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src)
+{
+    binding_dst->portdev = binding_src->portdev;
+    binding_dst->filtername = binding_src->filtername;
+}
+
 static void
 make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src)
 {
@@ -8583,6 +8598,11 @@ static virNWFilterDriver nwfilter_driver = {
     .connectNumOfNWFilters       = remoteConnectNumOfNWFilters, /* 0.8.0 */
     .connectListNWFilters        = remoteConnectListNWFilters, /* 0.8.0 */
     .connectListAllNWFilters     = remoteConnectListAllNWFilters, /* 0.10.2 */
+    .connectListAllNWFilterBindings = remoteConnectListAllNWFilterBindings, /* 4.4.0 */
+    .nwfilterBindingLookupByPortDev = remoteNWFilterBindingLookupByPortDev, /* 4.4.0 */
+    .nwfilterBindingCreateXML = remoteNWFilterBindingCreateXML, /* 4.4.0 */
+    .nwfilterBindingDelete = remoteNWFilterBindingDelete, /* 4.4.0 */
+    .nwfilterBindingGetXMLDesc = remoteNWFilterBindingGetXMLDesc, /* 4.4.0 */
 };
 
 static virConnectDriver connect_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 296a087181..347ab7fa32 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -94,6 +94,9 @@ const REMOTE_NODE_DEVICE_CAPS_LIST_MAX = 65536;
 /* Upper limit on lists of network filters. */
 const REMOTE_NWFILTER_LIST_MAX = 16384;
 
+/* Upper limit on lists of network filter bindings. */
+const REMOTE_NWFILTER_BINDING_LIST_MAX = 16384;
+
 /* Upper limit on list of scheduler parameters. */
 const REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX = 16;
 
@@ -275,6 +278,12 @@ struct remote_nonnull_nwfilter {
     remote_uuid uuid;
 };
 
+/* A network filter binding which may not be NULL. */
+struct remote_nonnull_nwfilter_binding {
+    remote_nonnull_string portdev;
+    remote_nonnull_string filtername;
+};
+
 /* An interface which may not be NULL. */
 struct remote_nonnull_interface {
     remote_nonnull_string name;
@@ -316,6 +325,7 @@ struct remote_nonnull_domain_snapshot {
 typedef remote_nonnull_domain *remote_domain;
 typedef remote_nonnull_network *remote_network;
 typedef remote_nonnull_nwfilter *remote_nwfilter;
+typedef remote_nonnull_nwfilter_binding *remote_nwfilter_binding;
 typedef remote_nonnull_storage_pool *remote_storage_pool;
 typedef remote_nonnull_storage_vol *remote_storage_vol;
 typedef remote_nonnull_node_device *remote_node_device;
@@ -3448,6 +3458,48 @@ struct remote_domain_set_lifecycle_action_args {
     unsigned int flags;
 };
 
+/* nwfilter binding */
+
+struct remote_nwfilter_binding_lookup_by_port_dev_args {
+    remote_nonnull_string name;
+};
+
+struct remote_nwfilter_binding_lookup_by_port_dev_ret {
+    remote_nonnull_nwfilter_binding nwfilter;
+};
+
+struct remote_nwfilter_binding_create_xml_args {
+    remote_nonnull_string xml;
+    unsigned int flags;
+};
+
+struct remote_nwfilter_binding_create_xml_ret {
+    remote_nonnull_nwfilter_binding nwfilter;
+};
+
+struct remote_nwfilter_binding_delete_args {
+    remote_nonnull_nwfilter_binding nwfilter;
+};
+
+struct remote_nwfilter_binding_get_xml_desc_args {
+    remote_nonnull_nwfilter_binding nwfilter;
+    unsigned int flags;
+};
+
+struct remote_nwfilter_binding_get_xml_desc_ret {
+    remote_nonnull_string xml;
+};
+
+struct remote_connect_list_all_nwfilter_bindings_args {
+    int need_results;
+    unsigned int flags;
+};
+
+struct remote_connect_list_all_nwfilter_bindings_ret { /* insert at 1 */
+    remote_nonnull_nwfilter_binding bindings<REMOTE_NWFILTER_BINDING_LIST_MAX>;
+    unsigned int ret;
+};
+
 /*----- Protocol. -----*/
 
 /* Define the program number, protocol version and procedure numbers here. */
@@ -6135,5 +6187,41 @@ enum remote_procedure {
      * @priority: high
      * @acl: storage_pool:getattr
      */
-    REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH = 391
+    REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH = 391,
+
+    /**
+     * @generate: both
+     * @priority: high
+     * @acl: nwfilter_binding:getattr
+     */
+    REMOTE_PROC_NWFILTER_BINDING_LOOKUP_BY_PORT_DEV = 392,
+
+    /**
+     * @generate: both
+     * @priority: high
+     * @acl: nwfilter_binding:read
+     */
+    REMOTE_PROC_NWFILTER_BINDING_GET_XML_DESC = 393,
+
+    /**
+     * @generate: both
+     * @priority: high
+     * @acl: nwfilter_binding:create
+     */
+    REMOTE_PROC_NWFILTER_BINDING_CREATE_XML = 394,
+
+    /**
+     * @generate: both
+     * @priority: high
+     * @acl: nwfilter_binding:delete
+     */
+    REMOTE_PROC_NWFILTER_BINDING_DELETE = 395,
+
+    /**
+     * @generate: both
+     * @priority: high
+     * @acl: connect:search_nwfilter_bindings
+     * @aclfilter: nwfilter_binding:getattr
+     */
+    REMOTE_PROC_CONNECT_LIST_ALL_NWFILTER_BINDINGS = 396
 };
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index fe163db73f..6deb79dff0 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -21,6 +21,10 @@ struct remote_nonnull_nwfilter {
         remote_nonnull_string      name;
         remote_uuid                uuid;
 };
+struct remote_nonnull_nwfilter_binding {
+        remote_nonnull_string      portdev;
+        remote_nonnull_string      filtername;
+};
 struct remote_nonnull_interface {
         remote_nonnull_string      name;
         remote_nonnull_string      mac;
@@ -2877,6 +2881,40 @@ struct remote_domain_set_lifecycle_action_args {
         u_int                      action;
         u_int                      flags;
 };
+struct remote_nwfilter_binding_lookup_by_port_dev_args {
+        remote_nonnull_string      name;
+};
+struct remote_nwfilter_binding_lookup_by_port_dev_ret {
+        remote_nonnull_nwfilter_binding nwfilter;
+};
+struct remote_nwfilter_binding_create_xml_args {
+        remote_nonnull_string      xml;
+        u_int                      flags;
+};
+struct remote_nwfilter_binding_create_xml_ret {
+        remote_nonnull_nwfilter_binding nwfilter;
+};
+struct remote_nwfilter_binding_delete_args {
+        remote_nonnull_nwfilter_binding nwfilter;
+};
+struct remote_nwfilter_binding_get_xml_desc_args {
+        remote_nonnull_nwfilter_binding nwfilter;
+        u_int                      flags;
+};
+struct remote_nwfilter_binding_get_xml_desc_ret {
+        remote_nonnull_string      xml;
+};
+struct remote_connect_list_all_nwfilter_bindings_args {
+        int                        need_results;
+        u_int                      flags;
+};
+struct remote_connect_list_all_nwfilter_bindings_ret {
+        struct {
+                u_int              bindings_len;
+                remote_nonnull_nwfilter_binding * bindings_val;
+        } bindings;
+        u_int                      ret;
+};
 enum remote_procedure {
         REMOTE_PROC_CONNECT_OPEN = 1,
         REMOTE_PROC_CONNECT_CLOSE = 2,
@@ -3269,4 +3307,9 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_MANAGED_SAVE_DEFINE_XML = 389,
         REMOTE_PROC_DOMAIN_SET_LIFECYCLE_ACTION = 390,
         REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH = 391,
+        REMOTE_PROC_NWFILTER_BINDING_LOOKUP_BY_PORT_DEV = 392,
+        REMOTE_PROC_NWFILTER_BINDING_GET_XML_DESC = 393,
+        REMOTE_PROC_NWFILTER_BINDING_CREATE_XML = 394,
+        REMOTE_PROC_NWFILTER_BINDING_DELETE = 395,
+        REMOTE_PROC_CONNECT_LIST_ALL_NWFILTER_BINDINGS = 396,
 };
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index 480ebe7b00..0c4648c0fb 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -557,7 +557,7 @@ elsif ($mode eq "server") {
                 if ($args_member =~ m/^remote_nonnull_string name;/ and $has_node_device) {
                     # ignore the name arg for node devices
                     next
-                } elsif ($args_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|secret|nwfilter) (\S+);/) {
+                } elsif ($args_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|secret|nwfilter|nwfilter_binding) (\S+);/) {
                     my $type_name = name_to_TypeName($1);
 
                     push(@vars_list, "vir${type_name}Ptr $2 = NULL");
@@ -722,7 +722,7 @@ elsif ($mode eq "server") {
                         if (!$modern_ret_as_list) {
                             push(@ret_list, "ret->$3 = tmp.$3;");
                         }
-                    } elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|node_device|interface|network|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
+                    } elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
                         $modern_ret_struct_name = $1;
                         $single_ret_list_error_msg_type = $1;
                         $single_ret_list_name = $2;
@@ -780,7 +780,7 @@ elsif ($mode eq "server") {
                     $single_ret_var = $1;
                     $single_ret_by_ref = 0;
                     $single_ret_check = " == NULL";
-                } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|domain_snapshot) (\S+);/) {
+                } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|node_device|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
                     my $type_name = name_to_TypeName($1);
 
                     if ($call->{ProcName} eq "DomainCreateWithFlags") {
@@ -1325,7 +1325,7 @@ elsif ($mode eq "client") {
                     $priv_src = "dev->conn";
                     push(@args_list, "virNodeDevicePtr dev");
                     push(@setters_list, "args.name = dev->name;");
-                } elsif ($args_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|secret|nwfilter|domain_snapshot) (\S+);/) {
+                } elsif ($args_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|interface|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
                     my $name = $1;
                     my $arg_name = $2;
                     my $type_name = name_to_TypeName($name);
@@ -1518,7 +1518,7 @@ elsif ($mode eq "client") {
                         }
 
                         push(@ret_list, "memcpy(result->$3, ret.$3, sizeof(result->$3));");
-                    } elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|node_device|interface|network|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
+                    } elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
                         my $proc_name = name_to_TypeName($1);
 
                         if ($structprefix eq "admin") {
@@ -1571,7 +1571,7 @@ elsif ($mode eq "client") {
                     push(@ret_list, "VIR_FREE(ret.$1);");
                     $single_ret_var = "char *rv = NULL";
                     $single_ret_type = "char *";
-                } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|node_device|interface|secret|nwfilter|domain_snapshot) (\S+);/) {
+                } elsif ($ret_member =~ m/^remote_nonnull_(domain|network|storage_pool|storage_vol|node_device|interface|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
                     my $name = $1;
                     my $arg_name = $2;
                     my $type_name = name_to_TypeName($name);
-- 
2.17.0




More information about the libvir-list mailing list