public static FlowObjectiveCompositionTree parsePolicyString(String policy) { List<FlowObjectiveCompositionTree> postfix = transformToPostfixForm(policy); return buildPolicyTree(postfix); }
while (!stack.isEmpty() && compareOperatorPriority(stack.peek(), ch)) { postfix.add(new FlowObjectiveCompositionTree(stack.pop()));
public static TrafficSelector intersectTrafficSelector(TrafficSelector ts1, TrafficSelector ts2) { TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); Set<Criterion.Type> ts1IntersectTs2 = getTypeSet(ts1); ts1IntersectTs2.retainAll(getTypeSet(ts2)); for (Criterion.Type type : ts1IntersectTs2) { Criterion criterion = intersectCriterion(ts1.getCriterion(type), ts2.getCriterion(type)); if (criterion == null) { return null; } else { selectorBuilder.add(criterion); } } Set<Criterion.Type> ts1MinusTs2 = getTypeSet(ts1); ts1MinusTs2.removeAll(getTypeSet(ts2)); for (Criterion.Type type : ts1MinusTs2) { selectorBuilder.add(ts1.getCriterion(type)); } Set<Criterion.Type> ts2MinusTs1 = getTypeSet(ts2); ts2MinusTs1.removeAll(getTypeSet(ts1)); for (Criterion.Type type : ts2MinusTs1) { selectorBuilder.add(ts2.getCriterion(type)); } return selectorBuilder.build(); }
ForwardingObjective composedFo = null; if (this.operator == FlowObjectiveCompositionManager.PolicyOperator.Parallel) { composedFo = FlowObjectiveCompositionUtil.composeParallel(fo1, fo2); } else { composedFo = FlowObjectiveCompositionUtil.composeSequential(fo1, fo2, this.priorityMultiplier); .minusForwardingObjectives(this.leftChild.forwardTable.getForwardingObjectives(), leftUpdates.addObjectives); for (ForwardingObjective fo1 : leftTableWithoutAdd) { ForwardingObjective composedFo = null; if (this.operator == FlowObjectiveCompositionManager.PolicyOperator.Parallel) { composedFo = FlowObjectiveCompositionUtil.composeParallel(fo1, fo2); } else { composedFo = FlowObjectiveCompositionUtil.composeSequential(fo1, fo2, this.priorityMultiplier); ForwardingObjective composedFo = FlowObjectiveCompositionUtil.composeOverride(fo, this.priorityAddend); addUpdates.add(composedFo); this.leftChild.forwardTable.addGeneratedParentForwardingObjective(fo, composedFo); ForwardingObjective composedFo = FlowObjectiveCompositionUtil.composeOverride(fo, 0); addUpdates.add(composedFo); this.rightChild.forwardTable.addGeneratedParentForwardingObjective(fo, composedFo);
public static ForwardingObjective composeSequential(ForwardingObjective fo1, ForwardingObjective fo2, int priorityMultiplier) { TrafficSelector revertTrafficSelector = revertTreatmentSelector(fo1.treatment(), fo2.selector()); if (revertTrafficSelector == null) { return null; } TrafficSelector trafficSelector = intersectTrafficSelector(fo1.selector(), revertTrafficSelector); if (trafficSelector == null) { return null; } TrafficTreatment trafficTreatment = unionTrafficTreatment(fo1.treatment(), fo2.treatment()); return DefaultForwardingObjective.builder() .fromApp(fo1.appId()) .makePermanent() .withFlag(ForwardingObjective.Flag.VERSATILE) .withPriority(fo1.priority() * priorityMultiplier + fo2.priority()) .withSelector(trafficSelector) .withTreatment(trafficTreatment) .add(); }
public static ForwardingObjective composeParallel(ForwardingObjective fo1, ForwardingObjective fo2) { TrafficSelector trafficSelector = intersectTrafficSelector(fo1.selector(), fo2.selector()); if (trafficSelector == null) { return null; } TrafficTreatment trafficTreatment = unionTrafficTreatment(fo1.treatment(), fo2.treatment()); return DefaultForwardingObjective.builder() .fromApp(fo1.appId()) .makePermanent() .withFlag(ForwardingObjective.Flag.VERSATILE) .withPriority(fo1.priority() + fo2.priority()) .withSelector(trafficSelector) .withTreatment(trafficTreatment) .add(); }
public static Criterion intersectCriterion(Criterion c1, Criterion c2) { switch (c1.type()) { case IPV4_SRC: { IpPrefix ipPrefix = intersectIpPrefix(((IPCriterion) c1).ip(), ((IPCriterion) c2).ip()); if (ipPrefix == null) { return null; IpPrefix ipPrefix = intersectIpPrefix(((IPCriterion) c1).ip(), ((IPCriterion) c2).ip()); if (ipPrefix == null) { return null; IpPrefix ipPrefix = intersectIpPrefix(((IPCriterion) c1).ip(), ((IPCriterion) c2).ip()); if (ipPrefix == null) { return null; IpPrefix ipPrefix = intersectIpPrefix(((IPCriterion) c1).ip(), ((IPCriterion) c2).ip()); if (ipPrefix == null) { return null;