Bug 5127 :`Need vlan member support on same tap port with customized 43/33743/1
authorFaseela K <faseela.k@ericsson.com>
Thu, 28 Jan 2016 17:10:37 +0000 (22:40 +0530)
committerFaseela K <faseela.k@ericsson.com>
Fri, 29 Jan 2016 06:20:23 +0000 (06:20 +0000)
interface name

Change-Id: I679636ed45de0c4398916d763d3420d5c2033dc9
Signed-off-by: Faseela K <faseela.k@ericsson.com>
(cherry picked from commit b41adda59b945789f39ff45a46c60e14f53f64d5)

interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/VlanMemberConfigListener.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigAddHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigRemoveHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsVlanMemberConfigAddHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java
interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java

index eacf25cab94ba7fa55c8046a33c3670c2b6d1038..7855fe17f78d08a69cb30525a23fb9314be4cc9d 100644 (file)
@@ -18,6 +18,7 @@ import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils;
 import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo;
 import org.opendaylight.vpnservice.interfacemgr.globals.VlanInterfaceInfo;
 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils;
@@ -239,6 +240,14 @@ public class IfmUtil {
         return FlowBasedServicesUtils.getNodeConnectorIdFromInterface(iface, dataBroker);
     }
 
+    public static NodeConnectorId getNodeConnectorIdFromInterface(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState){
+        if(ifState != null) {
+            List<String> ofportIds = ifState.getLowerLayerIf();
+            return new NodeConnectorId(ofportIds.get(0));
+        }
+        return null;
+    }
+
     public static InterfaceInfo.InterfaceType getInterfaceType(Interface iface) {
         InterfaceInfo.InterfaceType interfaceType =
                 org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo.InterfaceType.UNKNOWN_INTERFACE;
index 0d134849438229e3bbe07d1bf28195b03b8d51af..7cc125d3b4a93e4f2f3fc7a0b27543b65e9e30d0 100644 (file)
@@ -87,16 +87,21 @@ public class InterfaceManagerCommonUtils {
         return ifStateOptional.get();
     }
     public static void makeTunnelIngressFlow(List<ListenableFuture<Void>> futures, IMdsalApiManager mdsalApiManager,
-                                             IfTunnel tunnel, BigInteger dpnId, long portNo, Interface iface, int addOrRemoveFlow) {
+                                             IfTunnel tunnel, BigInteger dpnId, long portNo, Interface iface, int ifIndex, int addOrRemoveFlow) {
         String flowRef = InterfaceManagerCommonUtils.getTunnelInterfaceFlowRef(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, iface.getName());
         List<MatchInfo> matches = new ArrayList<MatchInfo>();
         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
         if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
             matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {
                     dpnId, BigInteger.valueOf(portNo) }));
+            mkInstructions.add(new InstructionInfo(
+                    InstructionType.write_metadata, new BigInteger[] {
+                    MetaDataUtil.getLportTagMetaData(ifIndex),
+                    MetaDataUtil.METADATA_MASK_LPORT_TAG}));
             short tableId = tunnel.getTunnelInterfaceType().isAssignableFrom(TunnelTypeMplsOverGre.class) ? NwConstants.L3_LFIB_TABLE :
                     tunnel.isInternal() ? NwConstants.INTERNAL_TUNNEL_TABLE : NwConstants.EXTERNAL_TUNNEL_TABLE;
-            mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {tableId}));}
+            mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {tableId}));
+        }
 
         BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
         FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, NwConstants.VLAN_INTERFACE_INGRESS_TABLE, flowRef,
index 1c17f9d9d253218b135c6b1a6f97e1daa5bda3b7..2e41bfb7f4524aeb7131a60d2eb3e526c8ee814a 100644 (file)
@@ -58,10 +58,6 @@ public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<In
             return;
         }
 
-        if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
-            return;
-        }
-
         ParentRefs parentRefs = interfaceOld.getAugmentation(ParentRefs.class);
         if (parentRefs == null) {
             LOG.error("Attempt to remove Vlan Trunk-Member {} without a parent interface", interfaceOld);
@@ -85,11 +81,6 @@ public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<In
         if (ifL2vlanNew == null) {
             return;
         }
-        if (ifL2vlanNew.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
-            LOG.error("Configuration Error. Attempt to modify Vlan Mode of interface: {} " +
-                    "to interface: {}", interfaceOld, interfaceNew);
-            return;
-        }
 
         ParentRefs parentRefsNew = interfaceNew.getAugmentation(ParentRefs.class);
         if (parentRefsNew == null) {
@@ -118,13 +109,8 @@ public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase<In
             return;
         }
 
-        if (ifL2vlan.getL2vlanMode() != IfL2vlan.L2vlanMode.TrunkMember) {
-            return;
-        }
-
         ParentRefs parentRefs = interfaceNew.getAugmentation(ParentRefs.class);
         if (parentRefs == null) {
-            LOG.error("Attempt to add Vlan Trunk-Member {} without a parent interface", interfaceNew);
             return;
         }
 
index 07a4709d91eaaced4740a02c99865b613537fd56..1ceaa17152689c1366640fe130d5d3382273884d 100644 (file)
@@ -182,13 +182,17 @@ public class OvsInterfaceConfigAddHelper {
                         ovsdbBridgeAugmentation, bridgeName, interfaceNew.getName(), dataBroker, futures);
 
                 // if TEP is already configured on switch, start LLDP monitoring and program tunnel ingress flow
-                NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(interfaceNew, dataBroker);
-                if(ncId != null){
-                    long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(ncId));
-                    InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, interfaceNew.getAugmentation(IfTunnel.class),
-                            dpId, portNo, interfaceNew, NwConstants.ADD_FLOW);
-                    // start LLDP monitoring for the tunnel interface
-                    AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew);
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState =
+                        InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceNew.getName(), dataBroker);
+                if(ifState != null){
+                    NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
+                    if(ncId != null) {
+                        long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(ncId));
+                        InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, interfaceNew.getAugmentation(IfTunnel.class),
+                                dpId, portNo, interfaceNew, ifState.getIfIndex(), NwConstants.ADD_FLOW);
+                        // start LLDP monitoring for the tunnel interface
+                        AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceNew);
+                    }
                 }
             }
         }
index 8a4748c66e0d6abb561361639242862580be4424..04e121074ab0550aa4dd82263f729343f4431276 100644 (file)
@@ -165,7 +165,7 @@ public class OvsInterfaceConfigRemoveHelper {
             long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(ncId));
             InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager,
                     interfaceOld.getAugmentation(IfTunnel.class),
-                    dpId, portNo, interfaceOld,
+                    dpId, portNo, interfaceOld, -1,
                     NwConstants.DEL_FLOW);
         }
 
index d9dd3762b8db2188049b5a435ab9ef957ada3bd6..6f7d6349b9d97d8a3b7b3dda290b6e5081b73f21 100644 (file)
@@ -81,12 +81,17 @@ public class OvsVlanMemberConfigAddHelper {
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifStateId =
                     IfmUtil.buildStateInterfaceId(interfaceNew.getName());
             List<String> lowerLayerIfList = new ArrayList<>();
+            lowerLayerIfList.add(ifState.getLowerLayerIf().get(0));
             lowerLayerIfList.add(parentRefs.getParentInterface());
+            Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, interfaceNew.getName());
             InterfaceBuilder ifaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus).setOperStatus(operStatus)
-                    .setPhysAddress(physAddress).setLowerLayerIf(lowerLayerIfList);
+                    .setPhysAddress(physAddress).setLowerLayerIf(lowerLayerIfList).setIfIndex(ifIndex);
             ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(interfaceNew.getName()));
             t.put(LogicalDatastoreType.OPERATIONAL, ifStateId, ifaceBuilder.build(), true);
 
+            // create lportTag Interface Map
+            InterfaceMetaUtils.createLportTagInterfaceMap(t, interfaceNew.getName(), ifIndex);
+
             // FIXME: Maybe, add the new interface to the higher-layer if of the parent interface-state.
             // That may not serve any purpose though for interface manager.... Unless some external parties are interested in it.
 
index e23fb3f64a543d60dfe1f5b7bcb54268cd072410..e14633413ea1a6cb3c912007b7ad6221ecf5418b 100644 (file)
@@ -104,7 +104,7 @@ public class OvsInterfaceStateAddHelper {
             BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
             long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
             InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, tunnel,dpId, portNo, iface,
-                    NwConstants.ADD_FLOW);
+                    ifIndex, NwConstants.ADD_FLOW);
             futures.add(transaction.submit());
             AlivenessMonitorUtils.startLLDPMonitoring(alivenessMonitorService, dataBroker, iface);
             return futures;
@@ -151,10 +151,14 @@ public class OvsInterfaceStateAddHelper {
             List<String> childLowerLayerIfList = new ArrayList<>();
             childLowerLayerIfList.add(0, nodeConnectorId.getValue());
             childLowerLayerIfList.add(1, iface.getName());
+            ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, ifaceChild.getName());
             InterfaceBuilder childIfaceBuilder = new InterfaceBuilder().setAdminStatus(adminStatus).setOperStatus(operStatus)
-                    .setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList);
+                    .setPhysAddress(physAddress).setLowerLayerIf(childLowerLayerIfList).setIfIndex(ifIndex);
             childIfaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(ifaceChild.getName()));
             transaction.put(LogicalDatastoreType.OPERATIONAL, ifChildStateId, childIfaceBuilder.build(), true);
+
+            // create lportTag Interface Map
+            InterfaceMetaUtils.createLportTagInterfaceMap(transaction, ifaceChild.getName(), ifIndex);
         }
 
         /** Below code will be needed if we want to update the vlan-trunks on the of-port
index 88af8f816baab55a01b1493aba82fb53dda93906..ee9382d58890e5aa497f283a16bb0153edbcf429 100644 (file)
@@ -75,7 +75,7 @@ public class OvsInterfaceStateRemoveHelper {
             NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
             BigInteger dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId));
             long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId));
-            InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, tunnel, dpId, portNo, iface,
+            InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, tunnel, dpId, portNo, iface, -1,
                     NwConstants.DEL_FLOW);
             futures.add(transaction.submit());
             AlivenessMonitorUtils.stopLLDPMonitoring(alivenessMonitorService, dataBroker, iface);
@@ -100,7 +100,12 @@ public class OvsInterfaceStateRemoveHelper {
         for (InterfaceChildEntry interfaceChildEntry : interfaceChildEntries) {
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> ifChildStateId =
                     IfmUtil.buildStateInterfaceId(interfaceChildEntry.getChildInterface());
-            transaction.delete(LogicalDatastoreType.OPERATIONAL, ifChildStateId);
+            /* Remove entry from if-index-interface-name map and deallocate Id from Idmanager. */
+            Interface childInterfaceState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceChildEntry.getChildInterface(), dataBroker);
+            if(interfaceState != null) {
+                InterfaceMetaUtils.removeLportTagInterfaceMap(transaction, idManager, dataBroker, childInterfaceState.getName(), childInterfaceState.getIfIndex());
+                transaction.delete(LogicalDatastoreType.OPERATIONAL, ifChildStateId);
+            }
         }
 
        /* Below code will be needed if we want to update the vlan-trunk in the of-port.