def shared_transit(topo, policy1, policy2): """Try to find packet in the border of policy1 and the border of policy2. Note that this is symmetric. """ p, pp, ppp, qq, qqq = Consts("p pp ppp qq qqq", Packet) o, n = Ints("o n") solv = Solver() # Predicates are focused on a packet p, all other packets are fodder for # that one. We want an input packet p or an output packet after a hop p in # each case. solv.add(Or(ingress(policy1, p, pp, o), And(egress(policy1, pp, ppp), transfer(topo, ppp, p)))) solv.add(Or(ingress(policy2, p, qq, n), And(egress(policy2, qq, qqq), transfer(topo, qqq, p)))) if solv.check() == unsat: return None else: return solv.model(), (p,), HEADER_INDEX
def shared_outputs(policy1, policy2): """Try to find packet in output of policy1 and egress of slice2.""" p, q, pp = Consts("p q pp", Packet) solv = Solver() solv.add(output(policy1, p, pp)) solv.add(egress(policy2, q, pp)) if solv.check() == unsat: return None else: return solv.model(), (p, pp), HEADER_INDEX