Esempio n. 1
0
    def create_output_action_list(self, pkt, output_filter):
        ret = []
        if self.after_trivially_unsat(pkt):
            # TODO: somethign
            pass
        else:
            if self.before_output is not None:
                before_output = self.before_output.instantiate_fvs(
                    MapFVValue(None, pkt)).apply(pkt)
                choose_before = before_output.associate([(1, self.id, 0)])
                ret.append(choose_before)

            if self.after_output is not None:
                after_output = self.after_output.instantiate_fvs(
                    MapFVValue(None, pkt))
                bplist = after_output.bplist
                for i, bp in enumerate(bplist):
                    if i != after_output.index:
                        ret.append(
                            OutputAction([bp.negate().apply(pkt)],
                                         [(1, self.id, 1)]))
                    else:
                        ret.append(
                            OutputAction([], [(1, self.id, 1)], output_filter))
            else:
                if self.before is None:
                    assert False, "We're doomed! "
Esempio n. 2
0
 def after_trivially_unsat(self, pkt):
     # type:(MapInputValue) -> bool
     conf = MapFVValue(self.fvs, pkt)
     if not self.after_input.instantiate_fvs(MapFVValue(conf,
                                                        pkt)).apply(pkt):
         return True
     return False
Esempio n. 3
0
    def before_trivially_satisfied(self, pkt):
        # type:(MapInputValue) -> bool
        conf = MapFVValue(self.fvs, pkt)
        if self.before_output is None:
            if self.before_input.instantiate_fvs(MapFVValue(conf,
                                                            pkt)).apply(pkt):
                return True

        return False
Esempio n. 4
0
    def create_output_action_list(self, pkt):
        ret = []
        if self.after_trivially_unsat(pkt):
            # TODO: somethign
            print "if after is trivially unsatisfiable, we can choose between setting setting before to true or not"
            if self.before_trivially_satisfied(pkt):
                assert False, "should have been checked up front at record"
            else:
                before_output = self.before_output.instantiate_fvs(
                    MapFVValue(None, pkt))
                bplist = before_output.bplist
                for bp in bplist:
                    if isinstance(bp, BoundedEQ):
                        ret.append(
                            OutputAction([], [(0, self.id, 1)],
                                         bp.negate().get_filter()))
                    else:
                        ret.append(
                            OutputAction([bp.negate().apply(pkt)],
                                         [(0, self.id, 1)]))

                ret.append(OutputAction([], [(0, self.id, 0)], Filter(
                    {})))  # Choose 0 by negating result

            return OutputActionList(ret, False)
        else:
            if self.before_output is not None:
                before_output = self.before_output.instantiate_fvs(
                    MapFVValue(None, pkt)).apply(pkt)
                choose_before = before_output.associate([(0, self.id, 0)])
                ret.append(choose_before)
            if self.after_output is not None:
                after_output = self.after_output.instantiate_fvs(
                    MapFVValue(None, pkt))
                bplist = after_output.bplist
                for bp in bplist:
                    if isinstance(bp, BoundedEQ):
                        ret.append(
                            OutputAction([], [(0, self.id, 1)],
                                         bp.negate().get_filter()))
                    else:
                        ret.append(
                            OutputAction([bp.negate().apply(pkt)],
                                         [(0, self.id, 1)]))
            else:
                if self.before is None:
                    assert False, "We're doomed! "

            return OutputActionList(ret, False)
Esempio n. 5
0
    def after_trivially_unsat(self, pkt):
        if self.after_input is not None:
            try:
                if not self.after_input.instantiate_fvs(MapFVValue(
                        None, pkt)).apply(pkt).is_true():
                    return True
            except UnsatisfiableActionException:
                return True

        return False
Esempio n. 6
0
    def before_trivially_satisfied(self, pkt):
        # type:(MapInputValue) -> bool
        if self.before_output is None:
            try:
                if self.before_input.instantiate_fvs(MapFVValue(
                        None, pkt)).apply(pkt).is_true():
                    return True
            except UnsatisfiableActionException:
                pass

        return False
Esempio n. 7
0
def get_fv_value_mapping(fvs, pkt):
    return MapFVValue(fvs, pkt)
Esempio n. 8
0
def get_filter(self, pkt):
    conf = MapFVValue(self.fvs, pkt)
    return self.after.instantiate_fvs(conf).get_filter()
Esempio n. 9
0
    def apply(self, pkt):
        # type: (MapInput,Value) -> OutputActionList
        conf = MapFVValue(self.fvs, pkt)
        ret = self.expr.instantiate_fvs(conf).apply(pkt)

        return ret
Esempio n. 10
0
    def get_filter(self):
        pkt = MapInputValue(None, 0, [])
        return self.after.instantiate_fvs(MapFVValue(
            None, pkt)).apply(pkt).get_filter()

        pass
Esempio n. 11
0
 def get_fv_value_mapping(self, pkt):
     # type: (MapInputValue) ->  MapFVValue
     return MapFVValue(self.fvs, pkt)