<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:netvirt:impl">prefix:netvirt-impl</type>
<name>netvirt-default</name>
<conntrack-enabled>false</conntrack-enabled>
+ <int-bridge-gen-mac>true</int-bridge-gen-mac>
<broker>
<type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
<name>binding-osgi-broker</name>
private List<Pair<Object, ServiceRegistration>> servicesAndRegistrations = new ArrayList<>();
private ProviderContext providerContext;
private boolean conntrackEnabled = false;
+ private boolean intBridgeGenMac = true;
public ConfigActivator(ProviderContext providerContext) {
this.providerContext = providerContext;
registerService(context, new String[] {ConfigurationService.class.getName()},
null, configurationService);
- BridgeConfigurationManagerImpl bridgeConfigurationManager = new BridgeConfigurationManagerImpl();
+ BridgeConfigurationManagerImpl bridgeConfigurationManager = new BridgeConfigurationManagerImpl(intBridgeGenMac);
registerService(context, new String[] {BridgeConfigurationManager.class.getName()},
null, bridgeConfigurationManager);
public void setConntrackEnabled(boolean conntrackEnabled) {
this.conntrackEnabled = conntrackEnabled;
}
+
+ public void setIntBridgeGenMac(boolean intBridgeGenMac) {
+ this.intBridgeGenMac = intBridgeGenMac;
+ }
}
private static final Entity ownerInstanceEntity = new Entity(
Constants.NETVIRT_OWNER_ENTITY_TYPE, Constants.NETVIRT_OWNER_ENTITY_TYPE);
private boolean conntrackEnabled = false;
+ private boolean intBridgeGenMac;
public NetvirtProvider(BundleContext bundleContext, EntityOwnershipService eos) {
LOG.info("NetvirtProvider: bundleContext: {}", bundleContext);
LOG.info("NetvirtProvider: onSessionInitiated isConntrackEnabled: {}", this.conntrackEnabled);
this.activator = new ConfigActivator(providerContext);
activator.setConntrackEnabled(this.conntrackEnabled);
+ activator.setIntBridgeGenMac(this.intBridgeGenMac);
try {
activator.start(bundleContext);
} catch (Exception e) {
public void setConntrackEnabled(boolean conntackEnabled) {
this.conntrackEnabled = conntackEnabled;
}
+
+ public boolean getIntBridgeGenMac() {
+ return intBridgeGenMac;
+ }
+
+ public void setIntBridgeGenMac(boolean intBridgeGenMac) {
+ this.intBridgeGenMac = intBridgeGenMac;
+ }
}
String getOvsdbNodeUUID(Node node);
String getOsdbNodeExternalIdsValue(OvsdbNodeAugmentation ovsdbNodeAugmentation, String key);
boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
- final Class<? extends DatapathTypeBase> dpType);
+ final Class<? extends DatapathTypeBase> dpType);
+ boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
+ final Class<? extends DatapathTypeBase> dpType, String mac);
boolean deleteBridge(Node ovsdbNode);
OvsdbBridgeAugmentation readBridge(Node node, String name);
Node readBridgeNode(Node node, String name);
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.Random;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.osgi.framework.ServiceReference;
private volatile ConfigurationService configurationService;
private volatile NetworkingProviderManager networkingProviderManager;
private volatile Southbound southbound;
+ private boolean intBridgeGenMac;
+ private Random random;
+
+ public BridgeConfigurationManagerImpl() {
+ this(true);
+ }
+
+ public BridgeConfigurationManagerImpl(boolean intBridgeGenMac) {
+ this.intBridgeGenMac = intBridgeGenMac;
+ this.random = new Random(System.currentTimeMillis());
+ }
public void setConfigurationService(ConfigurationService configurationService) {
this.configurationService = configurationService;
private boolean createIntegrationBridge(Node ovsdbNode) {
Preconditions.checkNotNull(configurationService);
- if (!addBridge(ovsdbNode, configurationService.getIntegrationBridgeName())) {
+ if (!addBridge(ovsdbNode, configurationService.getIntegrationBridgeName(),
+ intBridgeGenMac ? generateRandomMac() : null)) {
LOG.debug("Integration Bridge Creation failed");
return false;
}
return true;
}
+ private String generateRandomMac() {
+ byte[] macBytes = new byte[6];
+ random.nextBytes(macBytes);
+ macBytes[0] &= 0xfc; //the two low bits of the first byte need to be zero
+
+ StringBuilder stringBuilder = new StringBuilder();
+
+ int i = 0;
+ while(true) {
+ stringBuilder.append(String.format("%02x", macBytes[i++]));
+ if (i >= 6) {
+ break;
+ }
+ stringBuilder.append(':');
+ }
+
+ return stringBuilder.toString();
+ }
+
private boolean createExternalBridge(Node ovsdbNode) {
Preconditions.checkNotNull(configurationService);
- if (!addBridge(ovsdbNode, configurationService.getExternalBridgeName())) {
+ if (!addBridge(ovsdbNode, configurationService.getExternalBridgeName(), null)) {
LOG.debug("External Bridge Creation failed");
return false;
}
/**
* Add Bridge to a Node
*/
- private boolean addBridge(Node ovsdbNode, String bridgeName) {
+ private boolean addBridge(Node ovsdbNode, String bridgeName, String mac) {
boolean rv = true;
if ((!southbound.isBridgeOnOvsdbNode(ovsdbNode, bridgeName)) ||
(southbound.getBridgeFromConfig(ovsdbNode, bridgeName) == null)) {
if (configurationService.isUserSpaceEnabled()) {
dpType = DatapathTypeNetdev.class;
}
- rv = southbound.addBridge(ovsdbNode, bridgeName, getControllersFromOvsdbNode(ovsdbNode), dpType);
+ rv = southbound.addBridge(ovsdbNode, bridgeName, getControllersFromOvsdbNode(ovsdbNode), dpType, mac);
}
return rv;
}
public boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
final Class<? extends DatapathTypeBase> dpType) {
+ return addBridge(ovsdbNode, bridgeName, controllersStr, dpType, null);
+ }
+
+ public boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
+ final Class<? extends DatapathTypeBase> dpType, String mac) {
boolean result;
LOG.info("addBridge: node: {}, bridgeName: {}, controller(s): {}", ovsdbNode, bridgeName, controllersStr);
bridgeOtherConfigsBuilder.setBridgeOtherConfigValue("true");
List<BridgeOtherConfigs> bridgeOtherConfigsList = new ArrayList<>();
bridgeOtherConfigsList.add(bridgeOtherConfigsBuilder.build());
+ if (mac != null) {
+ BridgeOtherConfigsBuilder macOtherConfigBuilder = new BridgeOtherConfigsBuilder();
+ macOtherConfigBuilder.setBridgeOtherConfigKey("hwaddr");
+ macOtherConfigBuilder.setBridgeOtherConfigValue(mac);
+ bridgeOtherConfigsList.add(macOtherConfigBuilder.build());
+ }
ovsdbBridgeAugmentationBuilder.setBridgeOtherConfigs(bridgeOtherConfigsList);
setManagedByForBridge(ovsdbBridgeAugmentationBuilder, ovsdbNode.getKey());
if (dpType != null) {
public java.lang.AutoCloseable createInstance() {
NetvirtProvider provider = new NetvirtProvider(bundleContext, getClusteringEntityOwnershipServiceDependency());
provider.setConntrackEnabled(getConntrackEnabled());
+ provider.setIntBridgeGenMac(getIntBridgeGenMac());
BindingAwareBroker localBroker = getBrokerDependency();
localBroker.registerProvider(provider);
return provider;
leaf conntrack-enabled {
type boolean;
}
+
+ leaf int-bridge-gen-mac {
+ type boolean;
+ }
}
}
}
\ No newline at end of file