From 8356c43e42dc6d86905f63176caded55bffb4515 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Wed, 14 Feb 2007 16:20:38 +0000 Subject: [PATCH] Tue Feb 14 16:17:51 IST 2007 Mark McLoughlin * 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 | 19 +++++++++++++++++++ include/libvirt/libvirt.h.in | 1 + qemud/dispatch.c | 20 ++++++++++++++++++++ qemud/driver.c | 14 ++++++++++++++ qemud/driver.h | 4 ++++ qemud/protocol.h | 9 +++++++++ src/driver.h | 3 +++ src/libvirt.c | 35 +++++++++++++++++++++++++++++++++++ src/libvirt_sym.version | 1 + src/qemu_internal.c | 18 +++++++++++++++++- 10 files changed, 123 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index cbe4d44336..cb9228bac4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +Tue Feb 14 16:17:51 IST 2007 Mark McLoughlin + + * 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 * src/xend_internal.c, src/xm_internal.c: pass the diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 72d5730ae3..fd46c55209 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -526,6 +526,7 @@ int virNetworkGetUUIDString (virNetworkPtr network, char *buf); char * virNetworkGetXMLDesc (virNetworkPtr network, int flags); +char * virNetworkGetBridgeName (virNetworkPtr network); #ifdef __cplusplus } diff --git a/qemud/dispatch.c b/qemud/dispatch.c index 195b3d85c2..016a5c3627 100644 --- a/qemud/dispatch.c +++ b/qemud/dispatch.c @@ -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, }; /* diff --git a/qemud/driver.c b/qemud/driver.c index 8e246e0d60..9d30dd1fbf 100644 --- a/qemud/driver.c +++ b/qemud/driver.c @@ -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 diff --git a/qemud/driver.h b/qemud/driver.h index 3f56bb45c1..7197878843 100644 --- a/qemud/driver.h +++ b/qemud/driver.h @@ -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 diff --git a/qemud/protocol.h b/qemud/protocol.h index 176428c91f..7e6cc33f0d 100644 --- a/qemud/protocol.h +++ b/qemud/protocol.h @@ -26,6 +26,7 @@ #define QEMUD_PROTOCOL_H__ #include +#include /* 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 */ diff --git a/src/driver.h b/src/driver.h index 3609041106..c467ad0333 100644 --- a/src/driver.h +++ b/src/driver.h @@ -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; }; diff --git a/src/libvirt.c b/src/libvirt.c index c4a82289a3..50f1c5d8d4 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -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); +} diff --git a/src/libvirt_sym.version b/src/libvirt_sym.version index d19ee7552b..f312bf6a2f 100644 --- a/src/libvirt_sym.version +++ b/src/libvirt_sym.version @@ -75,6 +75,7 @@ virNetworkGetUUID; virNetworkGetUUIDString; virNetworkGetXMLDesc; + virNetworkGetBridgeName; local: *; }; diff --git a/src/qemu_internal.c b/src/qemu_internal.c index ca82af48c6..f940bcd31c 100644 --- a/src/qemu_internal.c +++ b/src/qemu_internal.c @@ -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