]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Tue Feb 14 16:17:51 IST 2007 Mark McLoughlin <markmc@redhat.com>
authorMark McLoughlin <markmc@redhat.com>
Wed, 14 Feb 2007 16:20:38 +0000 (16:20 +0000)
committerMark McLoughlin <markmc@redhat.com>
Wed, 14 Feb 2007 16:20:38 +0000 (16:20 +0000)
        * include/libvirt/libvirt.h.in, src/libvirt.c: add
        virNetworkGetBridgeName() to allow finding out what
        bridge to connect to in order to join a network.

        * src/driver.h: add networkGetBridgeName() to vtable.

        * qemud/protocol.h: add the request and reply to
        the qemud protocol.

        * qemud/dispatch.c, qemud/driver.[ch]: handle them
        here.

        * src/qemu_internal.c: implement GetBridgeName()
        in the qemu driver.

        * src/libvirt_sym.version: add new symbol.

ChangeLog
include/libvirt/libvirt.h.in
qemud/dispatch.c
qemud/driver.c
qemud/driver.h
qemud/protocol.h
src/driver.h
src/libvirt.c
src/libvirt_sym.version
src/qemu_internal.c

index cbe4d44336312f6ed16fd7de607356d657a83e6c..cb9228bac4911fbf278c62a9eb5464f8454cf93f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+Tue Feb 14 16:17:51 IST 2007 Mark McLoughlin <markmc@redhat.com>
+
+       * include/libvirt/libvirt.h.in, src/libvirt.c: add
+       virNetworkGetBridgeName() to allow finding out what
+       bridge to connect to in order to join a network.
+       
+       * src/driver.h: add networkGetBridgeName() to vtable.
+       
+       * qemud/protocol.h: add the request and reply to
+       the qemud protocol.
+       
+       * qemud/dispatch.c, qemud/driver.[ch]: handle them
+       here.
+       
+       * src/qemu_internal.c: implement GetBridgeName()
+       in the qemu driver.
+       
+       * src/libvirt_sym.version: add new symbol.
+       
 Tue Feb 14 16:14:32 IST 2007 Mark McLoughlin <markmc@redhat.com>
 
        * src/xend_internal.c, src/xm_internal.c: pass the
index 72d5730ae397d58ba0a1eccd6c58fe5f9a3bd4fb..fd46c552091e15b93d009caf37b4791b3f63aa1d 100644 (file)
@@ -526,6 +526,7 @@ int                 virNetworkGetUUIDString (virNetworkPtr network,
                                                 char *buf);
 char *                 virNetworkGetXMLDesc    (virNetworkPtr network,
                                                 int flags);
+char *                 virNetworkGetBridgeName (virNetworkPtr network);
 
 #ifdef __cplusplus
 }
index 195b3d85c2820e00090ab6134368d895dfea60b1..016a5c3627464c3cacf8f0e088a5e4faf7b7ab7b 100644 (file)
@@ -699,6 +699,24 @@ static int qemudDispatchNetworkDumpXML(struct qemud_server *server, struct qemud
     return 0;
 }
 
+static int qemudDispatchNetworkGetBridgeName(struct qemud_server *server, struct qemud_client *client,
+                                             struct qemud_packet *in, struct qemud_packet *out) {
+    if (in->header.dataSize != sizeof(in->data.networkGetBridgeNameRequest))
+        return -1;
+
+    int ret = qemudNetworkGetBridgeName(server,
+                                        in->data.networkDumpXMLRequest.uuid,
+                                        out->data.networkGetBridgeNameReply.ifname, QEMUD_MAX_IFNAME_LEN);
+    if (ret < 0) {
+        if (qemudDispatchFailure(server, client, out) < 0)
+            return -1;
+    } else {
+        out->header.type = QEMUD_PKT_NETWORK_GET_BRIDGE_NAME;
+        out->header.dataSize = sizeof(out->data.networkGetBridgeNameReply);
+    }
+    return 0;
+}
+
 
 typedef int (*clientFunc)(struct qemud_server *server, struct qemud_client *client,
                           struct qemud_packet *in, struct qemud_packet *out);
@@ -740,6 +758,7 @@ clientFunc funcsTransmitRW[QEMUD_PKT_MAX] = {
     qemudDispatchNetworkStart,
     qemudDispatchNetworkDestroy,
     qemudDispatchNetworkDumpXML,
+    qemudDispatchNetworkGetBridgeName,
 };
 
 clientFunc funcsTransmitRO[QEMUD_PKT_MAX] = {
@@ -776,6 +795,7 @@ clientFunc funcsTransmitRO[QEMUD_PKT_MAX] = {
     NULL,
     NULL,
     qemudDispatchNetworkDumpXML,
+    qemudDispatchNetworkGetBridgeName,
 };
 
 /*
index 8e246e0d604343691b3a5ffa9ce290fb959346f4..9d30dd1fbf4d1aff1715eb8c84b2b3b07f04772f 100644 (file)
@@ -743,6 +743,20 @@ int qemudNetworkDumpXML(struct qemud_server *server, const unsigned char *uuid,
     return 0;
 }
 
+int qemudNetworkGetBridgeName(struct qemud_server *server, const unsigned char *uuid, char *ifname, int ifnamelen) {
+    struct qemud_network *network = qemudFindNetworkByUUID(server, uuid);
+
+    if (!network) {
+        qemudReportError(server, VIR_ERR_INVALID_NETWORK, "no network with matching id");
+        return -1;
+    }
+
+    strncpy(ifname, network->bridge, ifnamelen);
+    ifname[ifnamelen-1] = '\0';
+
+    return 0;
+}
+
 /*
  * Local variables:
  *  indent-tabs-mode: nil
index 3f56bb45c11967bf809149e4dacfe47beb96a53f..71978788435381c2b7330460bc95b5845b7146d2 100644 (file)
@@ -113,6 +113,10 @@ int qemudNetworkDumpXML(struct qemud_server *server,
                         const unsigned char *uuid,
                         char *xml,
                         int xmllen);
+int qemudNetworkGetBridgeName(struct qemud_server *server,
+                              const unsigned char *uuid,
+                              char *ifname,
+                              int ifnamelen);
 
 #endif
 
index 176428c91ffe599d37f51a07a38b545374e0e215..7e6cc33f0de50e343717799d4260f6782ef301e9 100644 (file)
@@ -26,6 +26,7 @@
 #define QEMUD_PROTOCOL_H__
 
 #include <stdint.h>
+#include <net/if.h> /* for IF_NAMESIZE */
 
 /* List of different packet types which can be sent */
 enum {
@@ -62,6 +63,7 @@ enum {
     QEMUD_PKT_NETWORK_START,
     QEMUD_PKT_NETWORK_DESTROY,
     QEMUD_PKT_NETWORK_DUMP_XML,
+    QEMUD_PKT_NETWORK_GET_BRIDGE_NAME,
 
     QEMUD_PKT_MAX,
 } qemud_packet_type;
@@ -73,6 +75,7 @@ enum {
 #define QEMUD_UUID_RAW_LEN 16
 #define QEMUD_MAX_NAME_LEN 50
 #define QEMUD_MAX_XML_LEN 4096
+#define QEMUD_MAX_IFNAME_LEN IF_NAMESIZE
 #define QEMUD_MAX_NUM_DOMAINS 100
 #define QEMUD_MAX_NUM_NETWORKS 100
 #define QEMUD_MAX_ERROR_LEN 1024
@@ -270,6 +273,12 @@ union qemud_packet_data {
     struct {
         char xml[QEMUD_MAX_XML_LEN];
     } networkDumpXMLReply;
+    struct {
+        unsigned char uuid[QEMUD_UUID_RAW_LEN];
+    } networkGetBridgeNameRequest;
+    struct {
+        char ifname[QEMUD_MAX_IFNAME_LEN];
+    } networkGetBridgeNameReply;
 };
 
 /* Each packet has header & data */
index 360904110643b3024f5bd4bb84aa0da7f5e58eb9..c467ad0333885585e45440eb90f2234d1c4b5999 100644 (file)
@@ -220,6 +220,8 @@ typedef int
 typedef char *
        (*virDrvNetworkDumpXML)         (virNetworkPtr network,
                                         int flags);
+typedef char *
+       (*virDrvNetworkGetBridgeName)   (virNetworkPtr network);
 
 typedef struct _virNetworkDriver virNetworkDriver;
 typedef virNetworkDriver *virNetworkDriverPtr;
@@ -245,6 +247,7 @@ struct _virNetworkDriver {
        virDrvNetworkCreate             networkCreate;
        virDrvNetworkDestroy            networkDestroy;
        virDrvNetworkDumpXML            networkDumpXML;
+       virDrvNetworkGetBridgeName      networkGetBridgeName;
 };
 
 
index c4a82289a33fe9edac44b37153b5a1e3dead7a36..50f1c5d8d4e43fac32848e7222f170ddc9763a2a 100644 (file)
@@ -2731,3 +2731,38 @@ virNetworkGetXMLDesc(virNetworkPtr network, int flags)
     }
     return(ret);
 }
+
+/**
+ * virNetworkGetBridgeName:
+ * @network: a network object
+ *
+ * Return a bridge interface name to which a domain may connect
+ * a network interface in order to join the network.
+ *
+ * Returns a 0 terminated interface name, or NULL in case of error.
+ *         the caller must free() the returned value.
+ */
+char *
+virNetworkGetBridgeName(virNetworkPtr network)
+{
+    int i;
+    char *ret = NULL;
+    if (!VIR_IS_NETWORK(network)) {
+        virLibNetworkError(network, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+        return (NULL);
+    }
+
+    for (i = 0;i < network->conn->nb_network_drivers;i++) {
+       if ((network->conn->networkDrivers[i] != NULL) &&
+           (network->conn->networkDrivers[i]->networkGetBridgeName != NULL)) {
+            ret = network->conn->networkDrivers[i]->networkGetBridgeName(network);
+           if (ret)
+               break;
+       }
+    }
+    if (!ret) {
+        virLibConnError(network->conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
+        return (NULL);
+    }
+    return(ret);
+}
index d19ee7552bbc2ae51babb4c75227424bd65b912b..f312bf6a2ff6691dcf2c63bd41e3d2541e788e4c 100644 (file)
@@ -75,6 +75,7 @@
        virNetworkGetUUID;
        virNetworkGetUUIDString;
        virNetworkGetXMLDesc;
+       virNetworkGetBridgeName;
 
     local: *;
 };
index ca82af48c685934c888481785c64f6b7e4fc30d7..f940bcd31c0ed9a025d2ea30c250140f9cde4cfb 100644 (file)
@@ -1077,6 +1077,22 @@ static char * qemuNetworkDumpXML(virNetworkPtr network, int flags ATTRIBUTE_UNUS
     return strdup(reply.data.networkDumpXMLReply.xml);
 }
 
+static char * qemuNetworkGetBridgeName(virNetworkPtr network) {
+    struct qemud_packet req, reply;
+
+    req.header.type = QEMUD_PKT_NETWORK_GET_BRIDGE_NAME;
+    req.header.dataSize = sizeof(req.data.networkGetBridgeNameRequest);
+    memmove(req.data.networkGetBridgeNameRequest.uuid, network->uuid, QEMUD_UUID_RAW_LEN);
+
+    if (qemuProcessRequest(network->conn, NULL, &req, &reply) < 0) {
+        return NULL;
+    }
+
+    reply.data.networkGetBridgeNameReply.ifname[QEMUD_MAX_IFNAME_LEN-1] = '\0';
+
+    return strdup(reply.data.networkGetBridgeNameReply.ifname);
+}
+
 static virDriver qemuDriver = {
     VIR_DRV_QEMU,
     "QEMU",
@@ -1134,6 +1150,7 @@ static virNetworkDriver qemuNetworkDriver = {
     qemuNetworkCreate, /* networkCreate */
     qemuNetworkDestroy, /* networkDestroy */
     qemuNetworkDumpXML, /* networkDumpXML */
+    qemuNetworkGetBridgeName, /* networkGetBridgeName */
 };
 
 void qemuRegister(void) {
@@ -1141,7 +1158,6 @@ void qemuRegister(void) {
     virRegisterDriver(&qemuNetworkDriver);
 }
 
-
 /*
  * Local variables:
  *  indent-tabs-mode: nil