diff options
Diffstat (limited to 'framework/src/onos/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/ForwardTable.java')
-rw-r--r-- | framework/src/onos/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/ForwardTable.java | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/framework/src/onos/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/ForwardTable.java b/framework/src/onos/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/ForwardTable.java new file mode 100644 index 00000000..1384bbe2 --- /dev/null +++ b/framework/src/onos/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/ForwardTable.java @@ -0,0 +1,109 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.net.flowobjective.impl.composition; + +import org.onosproject.net.flowobjective.DefaultForwardingObjective; +import org.onosproject.net.flowobjective.ForwardingObjective; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Provides a table to store Forward. + */ +public class ForwardTable { + + protected Map<Integer, ForwardingObjective> forwardMap; + protected Map<Integer, List<ForwardingObjective>> generatedParentForwardingObjectiveMap; + + public ForwardTable() { + this.forwardMap = new HashMap<>(); + this.generatedParentForwardingObjectiveMap = new HashMap<>(); + } + + public ForwardUpdateTable updateForward(ForwardingObjective forwardingObjective) { + ForwardUpdateTable updates = new ForwardUpdateTable(); + switch (forwardingObjective.op()) { + case ADD: + this.forwardMap.put(forwardingObjectiveHash(forwardingObjective), forwardingObjective); + this.generatedParentForwardingObjectiveMap + .put(forwardingObjectiveHash(forwardingObjective), new ArrayList<>()); + updates.addObjectives.add(forwardingObjective); + break; + case REMOVE: + if (this.forwardMap.remove(forwardingObjectiveHash(forwardingObjective)) != null) { + updates.removeObjectives.add(forwardingObjective); + } + break; + default: + break; + } + return updates; + } + + public ForwardUpdateTable updateForward(List<ForwardingObjective> forwardingObjectives) { + ForwardUpdateTable updates = new ForwardUpdateTable(); + for (ForwardingObjective forwardingObjective : forwardingObjectives) { + updates.addUpdateTable(this.updateForward(forwardingObjective)); + } + return updates; + } + + public void addGeneratedParentForwardingObjective(ForwardingObjective child, ForwardingObjective parent) { + this.generatedParentForwardingObjectiveMap.get(forwardingObjectiveHash(child)).add(parent); + } + + public void deleteGeneratedParentForwardingObjective(List<ForwardingObjective> children) { + for (ForwardingObjective fo : children) { + this.generatedParentForwardingObjectiveMap.remove(forwardingObjectiveHash(fo)); + } + } + + private List<ForwardingObjective> getGeneratedParentForwardingObjective(ForwardingObjective child) { + return this.generatedParentForwardingObjectiveMap.get(forwardingObjectiveHash(child)); + } + + public List<ForwardingObjective> getGeneratedParentForwardingObjectiveForRemove(ForwardingObjective child) { + List<ForwardingObjective> fos = this.generatedParentForwardingObjectiveMap.get(forwardingObjectiveHash(child)); + List<ForwardingObjective> removeFos = new ArrayList<>(); + for (ForwardingObjective fo : fos) { + removeFos.add(DefaultForwardingObjective.builder() + .fromApp(fo.appId()) + .makePermanent() + .withFlag(fo.flag()) + .withPriority(fo.priority()) + .withSelector(fo.selector()) + .withTreatment(fo.treatment()) + .remove()); + } + return removeFos; + } + + public Collection<ForwardingObjective> getForwardingObjectives() { + return this.forwardMap.values(); + } + + public static int forwardingObjectiveHash(ForwardingObjective forwardingObjective) { + return Objects.hash(forwardingObjective.selector(), forwardingObjective.flag(), + forwardingObjective.permanent(), forwardingObjective.timeout(), + forwardingObjective.appId(), forwardingObjective.priority(), + forwardingObjective.nextId(), forwardingObjective.treatment()); + } +} |