From 5cbfc3bd5340e48b3a4c4915e5f9c127a8309d55 Mon Sep 17 00:00:00 2001 From: Tali Date: Sun, 17 Jul 2016 10:50:40 +0300 Subject: [PATCH 1/1] Add support for physical network on flat/vlan provider networks Change-Id: Ia7383eeb108ae295836f1ae9da091f4a88279beb Signed-off-by: Tali --- .../interfaces/IInterfaceManager.java | 4 ++++ .../src/main/yang/odl-interface.yang | 13 +++++++++++++ .../InterfacemgrProvider.java | 19 +++++++++++++++---- .../utilities/FlowBasedServicesUtils.java | 15 ++++++++++++--- .../genius/mdsalutil/MetaDataUtil.java | 17 ++++++++++++----- 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/interfacemanager/interfacemanager-api/src/main/java/org/opendaylight/genius/interfacemanager/interfaces/IInterfaceManager.java b/interfacemanager/interfacemanager-api/src/main/java/org/opendaylight/genius/interfacemanager/interfaces/IInterfaceManager.java index 9af66e869..441862168 100644 --- a/interfacemanager/interfacemanager-api/src/main/java/org/opendaylight/genius/interfacemanager/interfaces/IInterfaceManager.java +++ b/interfacemanager/interfacemanager-api/src/main/java/org/opendaylight/genius/interfacemanager/interfaces/IInterfaceManager.java @@ -46,6 +46,10 @@ public interface IInterfaceManager { public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId, String description, IfL2vlan.L2vlanMode l2vlanMode) throws InterfaceAlreadyExistsException; + + public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId, + String description, IfL2vlan.L2vlanMode l2vlanMode, boolean isExternal) throws InterfaceAlreadyExistsException; + public void bindService(String interfaceName, BoundServices serviceInfo); public void unbindService(String interfaceName, BoundServices serviceInfo); List getVlanInterfaces(); diff --git a/interfacemanager/interfacemanager-api/src/main/yang/odl-interface.yang b/interfacemanager/interfacemanager-api/src/main/yang/odl-interface.yang index e741e27f0..d2d6cf31b 100644 --- a/interfacemanager/interfacemanager-api/src/main/yang/odl-interface.yang +++ b/interfacemanager/interfacemanager-api/src/main/yang/odl-interface.yang @@ -295,4 +295,17 @@ module odl-interface { } } } + + /* Port to external network */ + augment "/if:interfaces/if:interface" { + ext:augment-identifier "if-external"; + when "if:type = 'ianaift:l2vlan'"; + + leaf external { + type boolean; + default "true"; + description + "represents whether port belongs to external network."; + } + } } diff --git a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java index d88823372..5b4473cdb 100644 --- a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java +++ b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java @@ -57,6 +57,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternalBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs; @@ -363,6 +365,11 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable @Override public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId, String description, IfL2vlan.L2vlanMode l2vlanMode) throws InterfaceAlreadyExistsException { + createVLANInterface(interfaceName, portName, dpId, vlanId, description, l2vlanMode, false); + } + @Override + public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId, + String description, IfL2vlan.L2vlanMode l2vlanMode, boolean isExternal) throws InterfaceAlreadyExistsException { LOG.info("Create VLAN interface : {}", interfaceName); InstanceIdentifier interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(interfaceName)); @@ -372,15 +379,19 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable throw new InterfaceAlreadyExistsException(interfaceOptional.getName()); } IfL2vlanBuilder l2vlanBuilder = new IfL2vlanBuilder().setL2vlanMode(l2vlanMode); - if (vlanId > 0) { + if (vlanId != null && vlanId > 0) { l2vlanBuilder.setVlanId(new VlanId(vlanId)); } ParentRefs parentRefs = new ParentRefsBuilder().setParentInterface(portName).build(); - Interface inf = new InterfaceBuilder().setEnabled(true).setName(interfaceName).setType(L2vlan.class). + InterfaceBuilder interfaceBuilder = new InterfaceBuilder().setEnabled(true).setName(interfaceName).setType(L2vlan.class). addAugmentation(IfL2vlan.class, l2vlanBuilder.build()).addAugmentation(ParentRefs.class, parentRefs). - setDescription(description).build(); + setDescription(description); + if (isExternal) { + interfaceBuilder.addAugmentation(IfExternal.class, new IfExternalBuilder().setExternal(true).build()); + } WriteTransaction t = dataBroker.newWriteOnlyTransaction(); - t.put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier, inf, true); + t.put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier, interfaceBuilder.build(), true); + t.submit(); } @Override diff --git a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java index 41ed7e948..75cb03567 100644 --- a/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java +++ b/interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java @@ -49,6 +49,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -161,10 +162,10 @@ public class FlowBasedServicesUtils { BigInteger[] metadataValues = IfmUtil.mergeOpenflowMetadataWriteInstructions(instructions); short sIndex = boundServiceNew.getServicePriority(); BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(lportTag, - ++sIndex, metadataValues[0]); + ++sIndex, metadataValues[0], isExternal(iface)); BigInteger metadataMask = MetaDataUtil.getMetaDataMaskForLPortDispatcher( MetaDataUtil.METADATA_MASK_SERVICE_INDEX, - MetaDataUtil.METADATA_MASK_LPORT_TAG, metadataValues[1]); + MetaDataUtil.METADATA_MASK_LPORT_TAG_SH_FLAG, metadataValues[1]); instructionSet.add(MDSALUtil.buildAndGetWriteMetadaInstruction(metadata, metadataMask, ++serviceInstructionsSize)); } @@ -217,7 +218,7 @@ public class FlowBasedServicesUtils { } public static void installLPortDispatcherFlow(BigInteger dpId, BoundServices boundService, String interfaceName, - WriteTransaction t, int interfaceTag, short currentServiceIndex, short nextServiceIndex) { + WriteTransaction t, int interfaceTag, short currentServiceIndex, short nextServiceIndex) { LOG.debug("Installing LPort Dispatcher Flows {}, {}", dpId, interfaceName); String serviceRef = boundService.getServiceName(); List matches = FlowBasedServicesUtils.getMatchInfoForDispatcherTable(dpId, @@ -375,4 +376,12 @@ public class FlowBasedServicesUtils { t.delete(LogicalDatastoreType.CONFIGURATION, flowInstanceId); } + + private static boolean isExternal(Interface iface) { + if (iface == null) { + return false; + } + IfExternal ifExternal = iface.getAugmentation(IfExternal.class); + return ifExternal != null && Boolean.TRUE.equals(ifExternal.isExternal()); + } } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/MetaDataUtil.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/MetaDataUtil.java index 16bc84aa4..f295e88e3 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/MetaDataUtil.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/MetaDataUtil.java @@ -10,7 +10,7 @@ package org.opendaylight.genius.mdsalutil; import java.math.BigInteger; public class MetaDataUtil { - public static final BigInteger METADATA_MASK_VRFID = new BigInteger("00000000FFFFFFFF", 16); + public static final BigInteger METADATA_MASK_VRFID = new BigInteger("00000000FFFFFFFE", 16); public static final BigInteger METADATA_MASK_LPORT_TAG = new BigInteger("1FFFFF0000000000", 16); public static final BigInteger METADATA_MASK_SERVICE = new BigInteger("000000FFFF000000", 16); public static final BigInteger METADATA_MASK_SERVICE_INDEX = new BigInteger("E000000000000000", 16); @@ -21,15 +21,22 @@ public class MetaDataUtil { public static final BigInteger METADATA_MASK_SERVICE_SH_FLAG = new BigInteger("000000FFFF000001", 16); public static final BigInteger METADATA_MASK_LPORT_TAG_SH_FLAG = new BigInteger("1FFFFF0000000001", 16); public static final BigInteger METADATA_MASK_ELAN_SUBNET_ROUTE = new BigInteger("0000FFFF00000000", 16); - public static final BigInteger METADATA_MASK_SUBNET_ROUTE = new BigInteger("0000FFFFFFFFFFFF", 16); + public static final BigInteger METADATA_MASK_SUBNET_ROUTE = new BigInteger("0000FFFFFFFFFFFE", 16); public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex) { return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag)); } public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex, - BigInteger serviceMetaData) { - return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag)).or(serviceMetaData); + BigInteger serviceMetaData) { + return getMetaDataForLPortDispatcher(lportTag, serviceIndex, serviceMetaData, false); + } + + public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex, + BigInteger serviceMetaData, boolean isSHFlagSet) { + int shBit = (isSHFlagSet) ? 1 : 0; + return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag)).or(serviceMetaData) + .or(BigInteger.valueOf(shBit)); } public static BigInteger getServiceIndexMetaData(int serviceIndex) { @@ -79,6 +86,6 @@ public class MetaDataUtil { return (metadata.and(METADATA_MASK_VRFID)).longValue(); } public static BigInteger getWriteMetaDataMaskForDispatcherTable() { - return new BigInteger("FFFFFFFFFFFFFFFF", 16); + return new BigInteger("FFFFFFFFFFFFFFFE", 16); } } -- 2.36.6