X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=elanmanager%2Felanmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Felan%2Finternal%2FElanInterfaceManager.java;h=95460af6a37a1720e16c12cdcfbc099356c4b7e0;hb=3fc4a718a28c45f10a3589adaf256f28f6a60210;hp=b933578d701e89efc5b3454c179252de2c811fed;hpb=6d7c74377513c46aaca9618c8b84750ea46f05a6;p=vpnservice.git diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java index b933578d..95460af6 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java @@ -8,35 +8,23 @@ package org.opendaylight.vpnservice.elan.internal; import com.google.common.base.Optional; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.elan.utils.ElanConstants; -import org.opendaylight.vpnservice.elan.utils.ElanConstants; import org.opendaylight.vpnservice.elan.utils.ElanUtils; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo.InterfaceType; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; -import org.opendaylight.vpnservice.itm.api.IITMProvider; + +import org.opendaylight.vpnservice.mdsalutil.NwConstants; import org.opendaylight.vpnservice.itm.globals.ITMConstants; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.ExtensionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.reg.grouping.NxmNxRegBuilder; - +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServices; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.vpnservice.mdsalutil.*; @@ -65,13 +53,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.f import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; -import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,8 +63,6 @@ import java.math.BigInteger; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; public class ElanInterfaceManager extends AbstractDataChangeListener implements AutoCloseable { @@ -93,7 +75,7 @@ public class ElanInterfaceManager extends AbstractDataChangeListener> unProcessedElanInterfaces = new ConcurrentHashMap> (); @@ -128,10 +110,6 @@ public class ElanInterfaceManager extends AbstractDataChangeListener elanInterfaces = elanState.getElanInterfaces(); elanInterfaces.remove(interfaceName); - removeStaticELanFlows(elanInfo, interfaceInfo); + if(elanInterfaces.isEmpty()) { ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInstanceOperationalDataPath(elanName)); ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnOperationDataPath(elanName)); @@ -441,10 +418,10 @@ public class ElanInterfaceManager extends AbstractDataChangeListener mkMatches = new ArrayList(); - MatchBuilder mb = new MatchBuilder(); - addNxRegMatch(mb, RegMatch.of(NxmNxReg1.class, ifTag)); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, ifTag), - 9, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)), getMatchesForFilterEqualsReg1LPortTag(ifTag), - getInstructionsInPortForOutGroup(interfaceInfo.getInterfaceName())); + int ifTag = interfaceInfo.getInterfaceTag(); + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, ifTag), + 9, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)), getTunnelIdMatchForFilterEqualsLPortTag(ifTag), ElanUtils.getInstructionsInPortForOutGroup(interfaceInfo.getInterfaceName())); - mdsalManager.installFlow(flowEntity); + mdsalManager.installFlow(interfaceInfo.getDpId(), flow); - FlowEntity flowEntity1 = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, 1000+ifTag), + Flow flowEntry = MDSALUtil.buildFlowNew(ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, 1000+ifTag), 10, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)), getMatchesForFilterEqualsLPortTag(ifTag), getInstructionsDrop()); - mdsalManager.installFlow(flowEntity1); + mdsalManager.installFlow(interfaceInfo.getDpId(), flowEntry); } + public void removeFilterEqualsTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + int ifTag = interfaceInfo.getInterfaceTag(); + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, ifTag), + 9, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)), getTunnelIdMatchForFilterEqualsLPortTag(ifTag), ElanUtils.getInstructionsInPortForOutGroup(interfaceInfo.getInterfaceName())); - protected List getEgressActionsForInterface(String ifName) { - List listActionInfo = new ArrayList(); - try { - Future> result = - interfaceManagerRpcService.getEgressActionsForInterface( - new GetEgressActionsForInterfaceInputBuilder().setIntfName(ifName).build()); - RpcResult rpcResult = result.get(); - System.out.println("Data is populated"); - if(!rpcResult.isSuccessful()) { - logger.warn("RPC Call to Get egress actions for interface {} returned with Errors {}", ifName, rpcResult.getErrors()); - } else { - List actions = - rpcResult.getResult().getAction(); - for (Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionClass = action.getAction(); - if (actionClass instanceof OutputActionCase) { - System.out.println("Data "); - listActionInfo.add(new ActionInfo(ActionType.output, - new String[] {((OutputActionCase)actionClass).getOutputAction() - .getOutputNodeConnector().getValue()})); - } else if (actionClass instanceof PushVlanActionCase) { - listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {})); - } else if (actionClass instanceof SetFieldCase) { - if (((SetFieldCase)actionClass).getSetField().getVlanMatch() != null) { - int vlanVid = ((SetFieldCase)actionClass).getSetField().getVlanMatch().getVlanId().getVlanId().getValue(); - listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid, - new String[] { Long.toString(vlanVid) })); - } - } - } - } - } catch (InterruptedException | ExecutionException e) { - logger.warn("Exception when egress actions for interface {}", ifName, e); - } - return listActionInfo; - } + mdsalManager.removeFlow(interfaceInfo.getDpId(), flow); + Flow flowEntity = MDSALUtil.buildFlowNew(ElanConstants.ELAN_FILTER_EQUALS_TABLE, getFlowRef(ElanConstants.ELAN_FILTER_EQUALS_TABLE, 1000+ifTag), + 10, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)), getMatchesForFilterEqualsLPortTag(ifTag), + getInstructionsDrop()); - private List getRemoteBCGroupBucketInfos(ElanInstance elanInfo, - InterfaceInfo interfaceInfo) { + mdsalManager.removeFlow(interfaceInfo.getDpId(), flowEntity); + } + + private List getRemoteBCGroupBucketInfos(ElanInstance elanInfo, + int bucketKeyStart, InterfaceInfo interfaceInfo) { BigInteger dpnId = interfaceInfo.getDpId(); int elanTag = elanInfo.getElanTag().intValue(); - List listBucketInfo = new ArrayList(); + int bucketId = bucketKeyStart; + List listBuckets = new ArrayList(); ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); if(elanDpns != null) { List dpnInterfaceses = elanDpns.getDpnInterfaces(); for(DpnInterfaces dpnInterface : dpnInterfaceses) { if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && dpnInterface.getDpId() != dpnId && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List listActionInfo = itmManager.ITMIngressGetActions(dpnId, dpnInterface.getDpId(), (int) elanTag); - //listBucketInfo.add(new BucketInfo(listActionInfo)); + List listAction = ElanUtils.getItmEgressAction(dpnId, dpnInterface.getDpId(), (int) elanTag); + listBuckets.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnId, dpnInterface.getDpId() ); } } } } - List listActionInfo = new ArrayList(); - listActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()))})); - listBucketInfo.add(new BucketInfo(listActionInfo)); - return listBucketInfo; + return listBuckets; } - public ActionInfo getReg1ActionInfo(int interfaceTag) { - return new ActionInfo(ActionType.set_field_reg, new String[] {String.valueOf(interfaceTag)}); + private List getRemoteBCGroupBuckets(ElanInstance elanInfo, + InterfaceInfo interfaceInfo, int bucketId) { + BigInteger dpnId = interfaceInfo.getDpId(); + int elanTag = elanInfo.getElanTag().intValue(); + List listBucketInfo = new ArrayList(); + ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); + if(elanDpns != null) { + List dpnInterfaceses = elanDpns.getDpnInterfaces(); + for(DpnInterfaces dpnInterface : dpnInterfaceses) { + if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && dpnInterface.getDpId() != dpnId && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { + try { + List listActionInfo = ElanUtils.getItmEgressAction(dpnId, dpnInterface.getDpId(), (int) elanTag); + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, 0, bucketId, 0xffffffffL, 0xffffffffL)); + bucketId++; + } catch (Exception ex) { + logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnId, dpnInterface.getDpId() ); + } + } + } + } + return listBucketInfo; } - private void setRemoteBCGrouponOtherDpns(ElanInstance elanInfo, - InterfaceInfo interfaceInfo) { + private void setElanBCGrouponOtherDpns(ElanInstance elanInfo, + InterfaceInfo interfaceInfo) { BigInteger dpnId = interfaceInfo.getDpId(); int elanTag = elanInfo.getElanTag().intValue(); long groupId = ElanUtils.getElanRemoteBCGID(elanTag); + List listBucket = new ArrayList(); + int bucketId = 0; ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); if(elanDpns != null) { List dpnInterfaceses = elanDpns.getDpnInterfaces(); for(DpnInterfaces dpnInterface : dpnInterfaceses) { - List remoteListBucketInfo = new ArrayList(); + List remoteListBucketInfo = new ArrayList(); if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && !dpnInterface.getDpId().equals(dpnId) && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { + for(String ifName : dpnInterface.getInterfaces()) { + // In case if there is a InterfacePort in the cache which is not in + // operational state, skip processing it + InterfaceInfo ifInfo = interfaceManager.getInterfaceInfoFromOperationalDataStore(ifName, interfaceInfo.getInterfaceType()); + if (!isOperational(ifInfo)) { + continue; + } + + listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + remoteListBucketInfo.addAll(listBucket); for(DpnInterfaces otherFes : dpnInterfaceses) { if (ElanUtils.isDpnPresent(otherFes.getDpId()) && otherFes.getDpId() != dpnInterface.getDpId() && otherFes.getInterfaces() != null && ! otherFes.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List remoteListActionInfo = itmManager.ITMIngressGetActions(dpnInterface.getDpId(), otherFes.getDpId(), (int) elanTag); - //remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); + List remoteListActionInfo = ElanUtils.getItmEgressAction(dpnInterface.getDpId(), otherFes.getDpId(), (int) elanTag); + remoteListBucketInfo.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT,MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnInterface.getDpId(), otherFes.getDpId() ); return; } } } - List remoteListActionInfo = new ArrayList(); - remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))})); - remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnInterface.getDpId(), groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, remoteListBucketInfo); - mdsalManager.installGroup(groupEntity); + if(remoteListBucketInfo.size() == 0) { + logger.debug( "No ITM is present on Dpn - {} " ,dpnInterface.getDpId()); + continue; + } + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(remoteListBucketInfo)); + mdsalManager.syncInstallGroup(dpnInterface.getDpId(), group, ElanConstants.DELAY_TIME_IN_MILLISECOND); } } } @@ -585,21 +564,22 @@ public class ElanInterfaceManager extends AbstractDataChangeListener elanDpns = ElanUtils.getInvolvedDpnsInElan(elanInfo.getElanInstanceName()); if(elanDpns != null) { for(DpnInterfaces dpnInterface : elanDpns) { - List remoteListBucketInfo = new ArrayList(); + int bucketId = 0; + List remoteListBucket = new ArrayList(); if(ElanUtils.isDpnPresent(dstDpId) && dpnInterface.getDpId().equals(dstDpId) && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List remoteListActionInfo = itmManager.ITMIngressGetActions(interfaceInfo.getDpId(), dstDpId, (int) elanTag); - //remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); + List remoteListActionInfo = ElanUtils.getItmEgressAction(interfaceInfo.getDpId(), dstDpId, (int) elanTag); + remoteListBucket.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnInterface.getDpId(), dstDpId); return; } - List remoteListActionInfo = new ArrayList(); - remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))})); - remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(interfaceInfo.getDpId(), groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, remoteListBucketInfo); - mdsalManager.installGroup(groupEntity); + List remoteListActionInfo = new ArrayList(); + remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))}).buildAction()); + remoteListBucket.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(remoteListBucket)); + mdsalManager.syncInstallGroup(interfaceInfo.getDpId(), group, ElanConstants.DELAY_TIME_IN_MILLISECOND); break; } } @@ -610,8 +590,8 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getLocalBCGroupBucketInfo(InterfaceInfo interfaceInfo) { - return Lists.newArrayList(new BucketInfo(getInterfacePortActionInfos(interfaceInfo))); + private Bucket getLocalBCGroupBucketInfo(InterfaceInfo interfaceInfo, int bucketIdStart) { + return MDSALUtil.buildBucket(getInterfacePortActions(interfaceInfo), MDSALUtil.GROUP_WEIGHT, bucketIdStart, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP); } private List getMatchesForElanTag(Long elanTag) { @@ -623,12 +603,12 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getInstructionsForOutGroup( + private List getInstructionsForOutGroup( long groupId) { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(groupId)})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + List mkInstructions = new ArrayList(); + List actions = new ArrayList (); + actions.add(new ActionInfo(ActionType.group, new String[]{Long.toString(groupId)}).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actions)); return mkInstructions; } @@ -696,10 +676,11 @@ public class ElanInterfaceManager extends AbstractDataChangeListener listBucketInfo = new ArrayList(); + public void setupElanBroadcastGroups(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + List listBucket = new ArrayList(); + int bucketId = 0; BigInteger dpnId = interfaceInfo.getDpId(); - long groupId = ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()); + long groupId = ElanUtils.getElanRemoteBCGID(elanInfo.getElanTag()); DpnInterfaces dpnInterfaces = ElanUtils.getElanInterfaceInfoByElanDpn(elanInfo.getElanInstanceName(), dpnId); for(String ifName : dpnInterfaces.getInterfaces()) { @@ -710,56 +691,82 @@ public class ElanInterfaceManager extends AbstractDataChangeListener listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, interfaceInfo, bucketId); + listBucket.addAll(listBucketInfoRemote); + + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBucket)); + logger.trace("installing the localBroadCast Group:{}", group); + mdsalManager.syncInstallGroup(dpnId, group, ElanConstants.DELAY_TIME_IN_MILLISECOND); } - public void removeLocalBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + public void setupLocalBroadcastGroups(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + List listBucket = new ArrayList(); + int bucketId = 0; BigInteger dpnId = interfaceInfo.getDpId(); long groupId = ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnId, groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, getLocalBCGroupBucketInfo(interfaceInfo)); - logger.trace("deleted the localBroadCast GroupEntity:{}", groupEntity); - mdsalManager.syncRemoveGroup(groupEntity); - } + DpnInterfaces dpnInterfaces = ElanUtils.getElanInterfaceInfoByElanDpn(elanInfo.getElanInstanceName(), dpnId); + for(String ifName : dpnInterfaces.getInterfaces()) { + // In case if there is a InterfacePort in the cache which is not in + // operational state, skip processing it + InterfaceInfo ifInfo = interfaceManager.getInterfaceInfoFromOperationalDataStore(ifName, interfaceInfo.getInterfaceType()); + if (!isOperational(ifInfo)) { + continue; + } - public void setupRemoteBroadcastGroups(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { - List listBucketInfo = getRemoteBCGroupBucketInfos(elanInfo, interfaceInfo); - BigInteger dpnId = interfaceInfo.getDpId(); - long groupId = ElanUtils.getElanRemoteBCGID(elanInfo.getElanTag()); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnId, groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, listBucketInfo); - mdsalManager.syncInstallGroup(groupEntity, ElanConstants.DELAY_TIME_IN_MILLISECOND); + listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBucket)); + logger.trace("installing the localBroadCast Group:{}", group); + mdsalManager.syncInstallGroup(dpnId, group, ElanConstants.DELAY_TIME_IN_MILLISECOND); } - public void removeRemoteBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { - List listBucketInfo = getRemoteBCGroupBucketInfos(elanInfo, interfaceInfo); + public void removeLocalBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + BigInteger dpnId = interfaceInfo.getDpId(); + long groupId = ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()); + List listBuckets = new ArrayList<>(); + int bucketId = 0; + listBuckets.add(getLocalBCGroupBucketInfo(interfaceInfo, bucketId)); + //listBuckets.addAll(getRemoteBCGroupBucketInfos(elanInfo, 1, interfaceInfo)); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBuckets)); + logger.trace("deleted the localBroadCast Group:{}", group); + mdsalManager.syncRemoveGroup(dpnId, group); + } + + public void removeElanBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + int bucketId = 0; + List listBuckets = new ArrayList<>(); + listBuckets.add(getLocalBCGroupBucketInfo(interfaceInfo, bucketId)); + bucketId++; + listBuckets.addAll(getRemoteBCGroupBucketInfos(elanInfo, bucketId, interfaceInfo)); BigInteger dpnId = interfaceInfo.getDpId(); long groupId = ElanUtils.getElanRemoteBCGID(elanInfo.getElanTag()); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnId, groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, listBucketInfo); - logger.trace("deleting the remoteBroadCast GroupEntity:{}", groupEntity); - mdsalManager.syncRemoveGroup(groupEntity); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBuckets)); + logger.trace("deleting the remoteBroadCast group:{}", group); + mdsalManager.syncRemoveGroup(dpnId, group); } public void setupTerminateServiceTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { long elanTag = elanInfo.getElanTag(); - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. -// FlowEntity flowEntity = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ITMConstants.TERMINATING_SERVICE_TABLE, getFlowRef(ITMConstants.TERMINATING_SERVICE_TABLE, elanTag), -// 5, elanInfo.getElanInstanceName(), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(elanTag)), itmManager.getTunnelMatchesForServiceId(elanTag), -// getInstructionsForOutGroup(ElanUtils.getElanLocalBCGID(elanTag))); -// -// mdsalManager.installFlow(flowEntity); + Flow flowEntity = MDSALUtil.buildFlowNew(NwConstants.INTERNAL_TUNNEL_TABLE, getFlowRef(NwConstants.INTERNAL_TUNNEL_TABLE, elanTag), + 5, String.format("%s:%d","ITM Flow Entry ",elanTag), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(elanTag)), ElanUtils.getTunnelMatchesForServiceId((int)elanTag), + getInstructionsForOutGroup(ElanUtils.getElanRemoteBCGID(elanTag))); + + mdsalManager.installFlow(interfaceInfo.getDpId(), flowEntity); } public void setupUnknownDMacTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { long elanTag = elanInfo.getElanTag(); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), + Flow flowEntity = MDSALUtil.buildFlowNew(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), 5, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_UNKNOWN_DMAC.add(BigInteger.valueOf(elanTag)), getMatchesForElanTag(elanTag), - getInstructionsForOutGroup(ElanUtils.getElanLocalBCGID(elanTag))); + getInstructionsForOutGroup(ElanUtils.getElanRemoteBCGID(elanTag))); - mdsalManager.installFlow(flowEntity); + mdsalManager.installFlow(interfaceInfo.getDpId(), flowEntity); } private void removeStaticELanFlows(final ElanInstance elanInfo, final InterfaceInfo interfaceInfo) { @@ -779,21 +786,23 @@ public class ElanInterfaceManager extends AbstractDataChangeListener mkMatches = new ArrayList(); // Matching metadata @@ -833,38 +842,35 @@ public class ElanInterfaceManager extends AbstractDataChangeListener mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(ElanUtils.getElanRemoteBCGID(elanTag))})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); + actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(ElanUtils.getElanRemoteBCGID(elanTag))}, 0).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actionsInfos)); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), 5, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_UNKNOWN_DMAC.add(BigInteger.valueOf(elanTag)), mkMatches, mkInstructions); - return flowEntity; + return flow; } private String getFlowRef(long tableId, long elanTag) { return new StringBuffer().append(tableId).append(elanTag).toString(); } - private List getInterfacePortActionInfos(InterfaceInfo interfaceInfo) { - List listActionInfo = new ArrayList(); - listActionInfo.add(getReg1ActionInfo(interfaceInfo.getInterfaceTag())); - listActionInfo.add(new ActionInfo(ActionType.nx_resubmit, new String[]{})); - return listActionInfo; + private List getInterfacePortActions(InterfaceInfo interfaceInfo) { + List listAction = new ArrayList(); + int actionKey = 0; + listAction.add((new ActionInfo(ActionType.set_field_tunnel_id, new BigInteger[] {BigInteger.valueOf(interfaceInfo.getInterfaceTag())}, actionKey)).buildAction()); + actionKey++; + listAction.add((new ActionInfo(ActionType.nx_resubmit, new BigInteger[] {BigInteger.valueOf(55)}, actionKey)).buildAction()); + return listAction; } private void updateElanDpnInterfacesList(String elanInstanceName, BigInteger dpId, List interfaceNames) { - if(!interfaceNames.isEmpty()) { - DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId) - .setInterfaces(interfaceNames).setKey(new DpnInterfacesKey(dpId)).build(); - MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), - dpnInterface); - } else { - MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId)); - } - + DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId) + .setInterfaces(interfaceNames).setKey(new DpnInterfacesKey(dpId)).build(); + MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), + dpnInterface); } private List createElanInterfacesList(String elanInstanceName, String interfaceName, BigInteger dpId) { @@ -1028,105 +1034,32 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getMatchesForFilterEqualsLPortTag(Long LportTag) { + private List getMatchesForFilterEqualsLPortTag(int LportTag) { List mkMatches = new ArrayList(); // Matching metadata mkMatches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[] { - ElanUtils.getElanMetadataLabel(LportTag), - MetaDataUtil.METADATA_MASK_SERVICE })); - mkMatches.add(new MatchInfo(MatchFieldType.reg1, new long[] {LportTag.longValue()})); + MetaDataUtil.getLportTagMetaData(LportTag), + MetaDataUtil.METADATA_MASK_LPORT_TAG })); + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] {BigInteger.valueOf(LportTag)})); return mkMatches; } - private List getMatchesForFilterEqualsReg1LPortTag(Long LportTag) { + private List getTunnelIdMatchForFilterEqualsLPortTag(int LportTag) { List mkMatches = new ArrayList(); // Matching metadata - mkMatches.add(new MatchInfo(MatchFieldType.reg1, new long[] { - (LportTag.longValue())})); + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] { + BigInteger.valueOf(LportTag)})); return mkMatches; } - public static class RegMatch { - - final Class reg; - final Long value; - - public RegMatch(Class reg, Long value) { - super(); - this.reg = reg; - this.value = value; - } - - public static RegMatch of(Class reg, Long value) { - return new RegMatch(reg, value); - } - } - - public static void addNxRegMatch(MatchBuilder match, RegMatch... matches) { - ArrayList extensions = new ArrayList<>(); - for (RegMatch rm : matches) { - Class key; - if (NxmNxReg0.class.equals(rm.reg)) { - key = NxmNxReg0Key.class; - } else if (NxmNxReg1.class.equals(rm.reg)) { - key = NxmNxReg1Key.class; - } else if (NxmNxReg2.class.equals(rm.reg)) { - key = NxmNxReg2Key.class; - } else if (NxmNxReg3.class.equals(rm.reg)) { - key = NxmNxReg3Key.class; - } else if (NxmNxReg4.class.equals(rm.reg)) { - key = NxmNxReg4Key.class; - } else if (NxmNxReg5.class.equals(rm.reg)) { - key = NxmNxReg5Key.class; - } else if (NxmNxReg6.class.equals(rm.reg)) { - key = NxmNxReg6Key.class; - } else { - key = NxmNxReg7Key.class; - } - NxAugMatchNodesNodeTableFlow am = new NxAugMatchNodesNodeTableFlowBuilder().setNxmNxReg( - new NxmNxRegBuilder().setReg(rm.reg).setValue(rm.value).build()).build(); - extensions.add(new ExtensionListBuilder().setExtensionKey(key) - .setExtension(new ExtensionBuilder().addAugmentation(NxAugMatchNodesNodeTableFlow.class, am).build()) - .build()); - } - GeneralAugMatchNodesNodeTableFlow m = new GeneralAugMatchNodesNodeTableFlowBuilder().setExtensionList( - extensions).build(); - match.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, m); - - } - - - private List getInstructionsInPortForOutGroup( - long GroupId) { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.nx_resubmit, new String[]{ "123"})); - actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(GroupId)})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); - return mkInstructions; - } - - private List getInstructionsInPortForOutGroup( - String ifName) { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - //TODO: modify in-port action - //actionsInfos.add(new ActionInfo(ActionType.set_source_port_field, new String[]{ "255"})); - actionsInfos.addAll(getEgressActionsForInterface(ifName)); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); - return mkInstructions; - } - - - - private List getInstructionsDrop() { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + private List getInstructionsDrop() { + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); + actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{}).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actionsInfos)); return mkInstructions; }