From 1b5c1e301efd0dba9da38375c614d18df011eeff Mon Sep 17 00:00:00 2001 From: Faseela K Date: Thu, 28 Jan 2016 22:40:37 +0530 Subject: [PATCH] Bug 5127 :`Need vlan member support on same tap port with customized interface name Change-Id: I679636ed45de0c4398916d763d3420d5c2033dc9 Signed-off-by: Faseela K (cherry picked from commit b41adda59b945789f39ff45a46c60e14f53f64d5) --- .../vpnservice/interfacemgr/IfmUtil.java | 9 +++++++++ .../commons/InterfaceManagerCommonUtils.java | 9 +++++++-- .../listeners/VlanMemberConfigListener.java | 14 -------------- .../OvsInterfaceConfigAddHelper.java | 18 +++++++++++------- .../OvsInterfaceConfigRemoveHelper.java | 2 +- .../OvsVlanMemberConfigAddHelper.java | 7 ++++++- .../OvsInterfaceStateAddHelper.java | 8 ++++++-- .../OvsInterfaceStateRemoveHelper.java | 9 +++++++-- 8 files changed, 47 insertions(+), 29 deletions(-) diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java index eacf25ca..7855fe17 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java @@ -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 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; diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java index 0d134849..7cc125d3 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/commons/InterfaceManagerCommonUtils.java @@ -87,16 +87,21 @@ public class InterfaceManagerCommonUtils { return ifStateOptional.get(); } public static void makeTunnelIngressFlow(List> 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 matches = new ArrayList(); List mkInstructions = new ArrayList(); 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, diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/VlanMemberConfigListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/VlanMemberConfigListener.java index 1c17f9d9..2e41bfb7 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/VlanMemberConfigListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/VlanMemberConfigListener.java @@ -58,10 +58,6 @@ public class VlanMemberConfigListener extends AsyncDataTreeChangeListenerBase ifStateId = IfmUtil.buildStateInterfaceId(interfaceNew.getName()); List 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. diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java index e23fb3f6..e1463341 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateAddHelper.java @@ -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 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 diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java index 88af8f81..ee9382d5 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/statehelpers/OvsInterfaceStateRemoveHelper.java @@ -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 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. -- 2.36.6