blob: ed002c8e6e8941db31e4a765b12ea435e5e8b446 [file] [log] [blame]
/*
* Copyright 2015-present 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());
}
}