[Libvir] 3/4 Remote driver

Richard W.M. Jones rjones at redhat.com
Thu Feb 21 20:58:40 UTC 2008


This implements the changes in the client & server ends of the remote
driver.

Rich.

-- 
Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod
Street, Windsor, Berkshire, SL4 1TE, United Kingdom.  Registered in
England and Wales under Company Registration No. 03798903
-------------- next part --------------
Index: src/remote_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/remote_internal.c,v
retrieving revision 1.60
diff -u -r1.60 remote_internal.c
--- src/remote_internal.c	20 Feb 2008 15:23:36 -0000	1.60
+++ src/remote_internal.c	21 Feb 2008 20:44:08 -0000
@@ -2681,9 +2681,104 @@
     return 0;
 }
 
+static int
+remoteNetworkNumOfDHCPHostMappings (virNetworkPtr network)
+{
+    remote_network_num_of_dhcp_host_mappings_args args;
+    remote_network_num_of_dhcp_host_mappings_ret ret;
+    GET_NETWORK_PRIVATE (network->conn, -1);
+
+    make_nonnull_network (&args.net, network);
+
+    if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_NUM_OF_DHCP_HOST_MAPPINGS,
+              (xdrproc_t) xdr_remote_network_num_of_dhcp_host_mappings_args, (char *) &args,
+              (xdrproc_t) xdr_remote_network_num_of_dhcp_host_mappings_ret, (char *) &ret) == -1)
+        return -1;
+
+    return ret.num;
+}
+
+
+static int
+remoteNetworkListDHCPHostMappings (virNetworkPtr network,
+                                   virNetworkDHCPHostMappingPtr *const mappings,
+                                   int maxmappings)
+{
+    remote_network_list_dhcp_host_mappings_args args;
+    remote_network_list_dhcp_host_mappings_ret ret;
+    int i;
+    GET_NETWORK_PRIVATE (network->conn, -1);
+
+    make_nonnull_network (&args.net, network);
+    args.maxmappings = maxmappings;
 
+    if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_LIST_DHCP_HOST_MAPPINGS,
+              (xdrproc_t) xdr_remote_network_list_dhcp_host_mappings_args, (char *) &args,
+              (xdrproc_t) xdr_remote_network_list_dhcp_host_mappings_ret, (char *) &ret) == -1)
+        return -1;
+
+    if (ret.mappings.mappings_len > maxmappings) {
+        error (network->conn, VIR_ERR_INTERNAL_ERROR,
+               _("remote end returned more mappings than we asked for"));
+        return -1;
+    }
+
+    /* We allocate them, caller frees. */
+    for (i = 0; i < ret.mappings.mappings_len; ++i) {
+        mappings[i] = malloc (sizeof (virNetworkDHCPHostMapping));
+        mappings[i]->hwaddr = ret.mappings.mappings_val[i].hwaddr;
+        mappings[i]->ipaddr = ret.mappings.mappings_val[i].ipaddr;
+        mappings[i]->hostname =
+            ret.mappings.mappings_val[i].hostname == NULL ?
+            NULL : *(ret.mappings.mappings_val[i].hostname);
+    }
+
+    return ret.mappings.mappings_len;
+}
 
 
+static int
+remoteNetworkAddDHCPHostMapping (virNetworkPtr network,
+                                 const char *hwaddr,
+                                 const char *ipaddr,
+                                 const char *hostname,
+                                 unsigned int flags)
+{
+    remote_network_add_dhcp_host_mapping_args args;
+    GET_NETWORK_PRIVATE (network->conn, -1);
+
+    make_nonnull_network (&args.net, network);
+    args.hwaddr = (char *) hwaddr;
+    args.ipaddr = (char *) ipaddr;
+    args.hostname = hostname == NULL ? NULL : (char **) &hostname;
+    args.flags = flags;
+
+    if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_ADD_DHCP_HOST_MAPPING,
+              (xdrproc_t) xdr_remote_network_add_dhcp_host_mapping_args, (char *) &args,
+              (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        return -1;
+
+    return 0;
+}
+
+static int
+remoteNetworkDeleteDHCPHostMapping (virNetworkPtr network,
+                                    const char *hwaddr)
+{
+    remote_network_add_dhcp_host_mapping_args args;
+    GET_NETWORK_PRIVATE (network->conn, -1);
+
+    make_nonnull_network (&args.net, network);
+    args.hwaddr = (char *) hwaddr;
+
+    if (call (network->conn, priv, 0, REMOTE_PROC_NETWORK_DELETE_DHCP_HOST_MAPPING,
+              (xdrproc_t) xdr_remote_network_delete_dhcp_host_mapping_args, (char *) &args,
+              (xdrproc_t) xdr_void, (char *) NULL) == -1)
+        return -1;
+
+    return 0;
+}
+
 /*----------------------------------------------------------------------*/
 
 static int
@@ -4671,6 +4766,10 @@
     .networkGetBridgeName = remoteNetworkGetBridgeName,
     .networkGetAutostart = remoteNetworkGetAutostart,
     .networkSetAutostart = remoteNetworkSetAutostart,
+    .networkNumOfDHCPHostMappings = remoteNetworkNumOfDHCPHostMappings,
+    .networkListDHCPHostMappings = remoteNetworkListDHCPHostMappings,
+    .networkAddDHCPHostMapping = remoteNetworkAddDHCPHostMapping,
+    .networkDeleteDHCPHostMapping = remoteNetworkDeleteDHCPHostMapping,
 };
 
 static virStorageDriver storage_driver = {
Index: qemud/remote.c
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote.c,v
retrieving revision 1.23
diff -u -r1.23 remote.c
--- qemud/remote.c	20 Feb 2008 16:54:36 -0000	1.23
+++ qemud/remote.c	21 Feb 2008 20:44:11 -0000
@@ -2058,6 +2058,143 @@
 
 
 static int
+remoteDispatchNetworkNumOfDhcpHostMappings (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                            struct qemud_client *client,
+                                            remote_message_header *req,
+                                            remote_network_num_of_dhcp_host_mappings_args *args,
+                                            remote_network_num_of_dhcp_host_mappings_ret *ret)
+{
+    virNetworkPtr net;
+    CHECK_CONN(client);
+
+    net = get_nonnull_network (client->conn, args->net);
+    if (net == NULL) {
+        remoteDispatchError (client, req, "network not found");
+        return -2;
+    }
+
+    ret->num = virNetworkNumOfDHCPHostMappings (net);
+    if (ret->num == -1) {
+        virNetworkFree (net);
+        return -1;
+    }
+
+    virNetworkFree (net);
+    return 0;
+}
+
+
+static int
+remoteDispatchNetworkListDhcpHostMappings (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                           struct qemud_client *client,
+                                           remote_message_header *req,
+                                           remote_network_list_dhcp_host_mappings_args *args,
+                                           remote_network_list_dhcp_host_mappings_ret *ret)
+{
+    virNetworkPtr net;
+    virNetworkDHCPHostMappingPtr *mappings;
+    int nr_mappings, i;
+    CHECK_CONN(client);
+
+    net = get_nonnull_network (client->conn, args->net);
+    if (net == NULL) {
+        remoteDispatchError (client, req, "network not found");
+        return -2;
+    }
+
+    if (args->maxmappings > REMOTE_NETWORK_DHCP_HOST_MAPPINGS_LIST_MAX) {
+        remoteDispatchError (client, req,
+                             "maxmappings > REMOTE_NETWORK_DHCP_HOST_MAPPINGS_LIST_MAX");
+        return -2;
+    }
+
+    mappings = malloc (args->maxmappings * sizeof (virNetworkDHCPHostMappingPtr));
+
+    nr_mappings = virNetworkListDHCPHostMappings (net,
+                                                  mappings, args->maxmappings);
+    if (nr_mappings == -1) {
+        virNetworkFree(net);
+        free (mappings);
+        return -1;
+    }
+
+    ret->mappings.mappings_len = nr_mappings;
+    ret->mappings.mappings_val =
+        calloc (nr_mappings, sizeof (*(ret->mappings.mappings_val)));
+    for (i = 0; i < nr_mappings; ++i) {
+        ret->mappings.mappings_val[i].hwaddr = mappings[i]->hwaddr;
+        ret->mappings.mappings_val[i].ipaddr = mappings[i]->ipaddr;
+        ret->mappings.mappings_val[i].hostname =
+            mappings[i]->hostname == NULL ? NULL : &mappings[i]->hostname;
+    }
+
+    free (mappings); /* NB: Just free the array, caller frees the rest. */
+
+    virNetworkFree(net);
+    return 0;
+}
+
+
+static int
+remoteDispatchNetworkAddDhcpHostMapping (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                         struct qemud_client *client,
+                                         remote_message_header *req,
+                                         remote_network_add_dhcp_host_mapping_args *args,
+                                         void *ret ATTRIBUTE_UNUSED)
+{
+    virNetworkPtr net;
+    char *hwaddr, *ipaddr, *hostname;
+    CHECK_CONN(client);
+
+    net = get_nonnull_network (client->conn, args->net);
+    if (net == NULL) {
+        remoteDispatchError (client, req, "network not found");
+        return -2;
+    }
+
+    hwaddr = args->hwaddr;
+    ipaddr = args->ipaddr;
+    hostname = *args->hostname == NULL ? NULL : *args->hostname;
+
+    if (virNetworkAddDHCPHostMapping (net, hwaddr, ipaddr, hostname, args->flags) == -1) {
+        virNetworkFree (net);
+        return -1;
+    }
+
+    virNetworkFree (net);
+    return 0;
+}
+
+static int
+remoteDispatchNetworkDeleteDhcpHostMapping (struct qemud_server *server ATTRIBUTE_UNUSED,
+                                            struct qemud_client *client,
+                                            remote_message_header *req,
+                                            remote_network_delete_dhcp_host_mapping_args *args,
+                                            void *ret ATTRIBUTE_UNUSED)
+{
+    virNetworkPtr net;
+    char *hwaddr;
+    CHECK_CONN(client);
+
+    net = get_nonnull_network (client->conn, args->net);
+    if (net == NULL) {
+        remoteDispatchError (client, req, "network not found");
+        return -2;
+    }
+
+    hwaddr = args->hwaddr;
+
+    if (virNetworkDeleteDHCPHostMapping (net, hwaddr) == -1) {
+        virNetworkFree (net);
+        return -1;
+    }
+
+    virNetworkFree (net);
+    return 0;
+}
+
+
+static int
 remoteDispatchAuthList (struct qemud_server *server ATTRIBUTE_UNUSED,
                         struct qemud_client *client,
                         remote_message_header *req ATTRIBUTE_UNUSED,
Index: qemud/remote_protocol.x
===================================================================
RCS file: /data/cvs/libvirt/qemud/remote_protocol.x,v
retrieving revision 1.10
diff -u -r1.10 remote_protocol.x
--- qemud/remote_protocol.x	20 Feb 2008 15:22:35 -0000	1.10
+++ qemud/remote_protocol.x	21 Feb 2008 20:44:11 -0000
@@ -78,6 +78,9 @@
 /* Upper limit on lists of network names. */
 const REMOTE_NETWORK_NAME_LIST_MAX = 256;
 
+/* Upper limit on lists of DHCP host mappings. */
+const REMOTE_NETWORK_DHCP_HOST_MAPPINGS_LIST_MAX = 256;
+
 /* Upper limit on lists of storage pool names. */
 const REMOTE_STORAGE_POOL_NAME_LIST_MAX = 256;
 
@@ -109,6 +112,13 @@
     remote_uuid uuid;
 };
 
+/* A DHCP host mapping which may not be NULL. */
+struct remote_nonnull_dhcp_host_mapping {
+    remote_nonnull_string hwaddr;
+    remote_nonnull_string ipaddr;
+    remote_string hostname;
+};
+
 /* A storage pool which may not be NULL. */
 struct remote_nonnull_storage_pool {
     remote_nonnull_string name;
@@ -647,6 +657,35 @@
     int autostart;
 };
 
+struct remote_network_num_of_dhcp_host_mappings_args {
+    remote_nonnull_network net;
+};
+
+struct remote_network_num_of_dhcp_host_mappings_ret {
+    int num;
+};
+
+struct remote_network_list_dhcp_host_mappings_args {
+    remote_nonnull_network net;
+    int maxmappings;
+};
+
+struct remote_network_list_dhcp_host_mappings_ret {
+    remote_nonnull_dhcp_host_mapping mappings<REMOTE_NETWORK_DHCP_HOST_MAPPINGS_LIST_MAX>;
+};
+
+struct remote_network_add_dhcp_host_mapping_args {
+    remote_nonnull_network net;
+    remote_nonnull_string hwaddr;
+    remote_nonnull_string ipaddr;
+    remote_string hostname;
+    int flags;
+};
+
+struct remote_network_delete_dhcp_host_mapping_args {
+    remote_nonnull_network net;
+    remote_nonnull_string hwaddr;
+};
 
 struct remote_auth_list_ret {
     remote_auth_type types<REMOTE_AUTH_TYPE_LIST_MAX>;
@@ -1017,7 +1056,12 @@
     REMOTE_PROC_STORAGE_VOL_LOOKUP_BY_PATH = 97,
     REMOTE_PROC_STORAGE_VOL_GET_INFO = 98,
     REMOTE_PROC_STORAGE_VOL_DUMP_XML = 99,
-    REMOTE_PROC_STORAGE_VOL_GET_PATH = 100
+    REMOTE_PROC_STORAGE_VOL_GET_PATH = 100,
+
+    REMOTE_PROC_NETWORK_ADD_DHCP_HOST_MAPPING = 101,
+    REMOTE_PROC_NETWORK_DELETE_DHCP_HOST_MAPPING = 102,
+    REMOTE_PROC_NETWORK_LIST_DHCP_HOST_MAPPINGS = 103,
+    REMOTE_PROC_NETWORK_NUM_OF_DHCP_HOST_MAPPINGS = 104
 };
 
 /* Custom RPC structure. */


More information about the libvir-list mailing list