package org.batfish.z3;
import java.util.List;
import org.batfish.datamodel.Edge;
import org.batfish.datamodel.HeaderSpace;
import org.batfish.z3.node.AcceptExpr;
import org.batfish.z3.node.AndExpr;
import org.batfish.z3.node.OriginateVrfExpr;
import org.batfish.z3.node.PreInInterfaceExpr;
import org.batfish.z3.node.PreOutEdgeExpr;
import org.batfish.z3.node.QueryExpr;
import org.batfish.z3.node.QueryRelationExpr;
import org.batfish.z3.node.RuleExpr;
import org.batfish.z3.node.SaneExpr;
import com.microsoft.z3.BoolExpr;
import com.microsoft.z3.Z3Exception;
public class ReachEdgeQuerySynthesizer extends BaseQuerySynthesizer {
private Edge _edge;
private HeaderSpace _headerSpace;
private String _ingressVrf;
private String _originationNode;
private boolean _requireAcceptance;
public ReachEdgeQuerySynthesizer(String originationNode, String ingressVrf,
Edge edge, boolean requireAcceptance, HeaderSpace headerSpace) {
_originationNode = originationNode;
_ingressVrf = ingressVrf;
_edge = edge;
_requireAcceptance = requireAcceptance;
_headerSpace = headerSpace;
}
@Override
public NodProgram getNodProgram(NodProgram baseProgram) throws Z3Exception {
NodProgram program = new NodProgram(baseProgram.getContext());
OriginateVrfExpr originate = new OriginateVrfExpr(_originationNode,
_ingressVrf);
RuleExpr injectSymbolicPackets = new RuleExpr(originate);
AndExpr queryConditions = new AndExpr();
queryConditions.addConjunct(new PreOutEdgeExpr(_edge));
queryConditions.addConjunct(
new PreInInterfaceExpr(_edge.getNode2(), _edge.getInt2()));
queryConditions.addConjunct(Synthesizer.matchHeaderSpace(_headerSpace));
if (_requireAcceptance) {
queryConditions.addConjunct(AcceptExpr.INSTANCE);
}
queryConditions.addConjunct(SaneExpr.INSTANCE);
RuleExpr queryRule = new RuleExpr(queryConditions,
QueryRelationExpr.INSTANCE);
List<BoolExpr> rules = program.getRules();
BoolExpr injectSymbolicPacketsBoolExpr = injectSymbolicPackets
.toBoolExpr(baseProgram);
rules.add(injectSymbolicPacketsBoolExpr);
rules.add(queryRule.toBoolExpr(baseProgram));
QueryExpr query = new QueryExpr(QueryRelationExpr.INSTANCE);
BoolExpr queryBoolExpr = query.toBoolExpr(baseProgram);
program.getQueries().add(queryBoolExpr);
return program;
}
}