#include "netdev_bandwidth_conf.h"
#include "netdev_vlan_conf.h"
#include "device_conf.h"
+#include "network_conf.h"
#include "virtpm.h"
#include "virstring.h"
char *mode = NULL;
char *addrtype = NULL;
char *trustGuestRxFilters = NULL;
+ char *macTableManager = NULL;
if (VIR_ALLOC(actual) < 0)
return -1;
goto error;
}
actual->data.bridge.brname = brname;
+ macTableManager = virXPathString("string(./source/@macTableManager)", ctxt);
+ if (macTableManager &&
+ (actual->data.bridge.macTableManager
+ = virNetworkBridgeMACTableManagerTypeFromString(macTableManager)) <= 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid macTableManager setting '%s' "
+ "in domain interface's <actual> element"),
+ macTableManager);
+ goto error;
+ }
}
bandwidth_node = virXPathNode("./bandwidth", ctxt);
VIR_FREE(mode);
VIR_FREE(addrtype);
VIR_FREE(trustGuestRxFilters);
+ VIR_FREE(macTableManager);
virDomainActualNetDefFree(actual);
ctxt->node = save_ctxt;
}
if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ int macTableManager = virDomainNetGetActualBridgeMACTableManager(def);
+
/* actualType == NETWORK includes the name of the bridge
* that is used by the network, whether we are
* "inSubElement" or not.
*/
virBufferEscapeString(buf, " bridge='%s'",
virDomainNetGetActualBridgeName(def));
+ if (macTableManager) {
+ virBufferAsprintf(buf, " macTableManager='%s'",
+ virNetworkBridgeMACTableManagerTypeToString(macTableManager));
+ }
} else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
const char *mode;
return NULL;
}
+int
+virDomainNetGetActualBridgeMACTableManager(virDomainNetDefPtr iface)
+{
+ if (iface->type == VIR_DOMAIN_NET_TYPE_NETWORK &&
+ iface->data.network.actual &&
+ (iface->data.network.actual->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
+ iface->data.network.actual->type == VIR_DOMAIN_NET_TYPE_NETWORK))
+ return iface->data.network.actual->data.bridge.macTableManager;
+ return 0;
+}
+
const char *
virDomainNetGetActualDirectDev(virDomainNetDefPtr iface)
{
union {
struct {
char *brname;
+ int macTableManager; /* enum virNetworkBridgeMACTableManagerType */
} bridge;
struct {
char *linkdev;
int virDomainNetGetActualType(virDomainNetDefPtr iface);
const char *virDomainNetGetActualBridgeName(virDomainNetDefPtr iface);
+int virDomainNetGetActualBridgeMACTableManager(virDomainNetDefPtr iface);
const char *virDomainNetGetActualDirectDev(virDomainNetDefPtr iface);
int virDomainNetGetActualDirectMode(virDomainNetDefPtr iface);
virDomainHostdevDefPtr virDomainNetGetActualHostdev(virDomainNetDefPtr iface);
*/
iface->data.network.actual->type = VIR_DOMAIN_NET_TYPE_NETWORK;
- /* we also store the bridge device
+ /* we also store the bridge device and macTableManager settings
* in iface->data.network.actual->data.bridge for later use
* after the domain's tap device is created (to attach to the
* bridge and set flood/learning mode on the tap device)
if (VIR_STRDUP(iface->data.network.actual->data.bridge.brname,
netdef->bridge) < 0)
goto error;
+ iface->data.network.actual->data.bridge.macTableManager
+ = netdef->macTableManager;
if (networkPlugBandwidth(network, iface) < 0)
goto error;
if (VIR_STRDUP(iface->data.network.actual->data.bridge.brname,
netdef->bridge) < 0)
goto error;
+ iface->data.network.actual->data.bridge.macTableManager
+ = netdef->macTableManager;
/* merge virtualports from interface, network, and portgroup to
* arrive at actual virtualport to use