class Query(Composer): ''' Finds a match for the LHS. ''' def __init__(self, LHS): ''' Finds a match for the LHS. @param LHS: The pre-condition pattern (LHS + NACs). ''' super(Query, self).__init__() self.M = Matcher(condition=LHS, max=1) self.I = Iterator(max_iterations=1) def packet_in(self, packet): self.exception = None self.is_success = False # Match packet = self.M.packet_in(packet) if not self.M.is_success: self.exception = self.M.exception return packet # Choose the only match packet = self.I.packet_in(packet) if not self.I.is_success: # Clean the packet: required since there is no Rewriter in a Query if len(packet.match_sets[self.I.condition].matches) == 0: del packet.match_sets[self.I.condition] self.exception = self.I.exception return packet # Output success packet self.is_success = True return packet
class LRule(Composer): ''' Applies an inner rule for each match of the LHS. ''' def __init__(self, LHS, inner_rule, max_iterations=INFINITY): ''' Applies an inner rule for each match of the LHS. @param LHS: The pre-condition pattern (LHS + NACs). @param inner_rule: The rule to apply in the loop. @param max_iterations: The maximum number of matches of the LHS. ''' super(LRule, self).__init__() self.M = Matcher(condition=LHS, max=max_iterations) self.I = Iterator(max_iterations=max_iterations) self.inner_rule = inner_rule def packet_in(self, packet): self.exception = None self.is_success = False # Match packet = self.M.packet_in(packet) if not self.M.is_success: self.exception = self.M.exception return packet # Choose the first match packet = self.I.packet_in(packet) if not self.I.is_success: self.exception = self.I.exception return packet while True: # Apply the inner rule packet = self.inner_rule.packet_in(packet) if not self.inner_rule.is_success: if self.inner_rule.exception: self.exception = self.inner_rule.exception return packet # Clean the packet: required since there is no Rewriter in a Query if len(packet.match_sets[self.I.condition].matches) == 0: del packet.match_sets[self.I.condition] # Choose another match packet = self.I.next_in(packet) # No more iterations are left if not self.I.is_success: if self.I.exception: self.exception = self.I.exception else: # Output success packet self.is_success = True return packet
class ARule(Composer): """ Applies the transformation on one match. """ def __init__(self, LHS, RHS): """ Applies the transformation on one match. @param LHS: The pre-condition pattern (LHS + NACs). @param RHS: The post-condition pattern (RHS). """ super(ARule, self).__init__() self.M = Matcher(condition=LHS, max=1) self.I = Iterator(max_iterations=1) self.W = Rewriter(condition=RHS) def packet_in(self, packet): self.exception = None self.is_success = False # Match packet = self.M.packet_in(packet) if not self.M.is_success: self.exception = self.M.exception return packet # Choose the only match packet = self.I.packet_in(packet) if not self.I.is_success: self.exception = self.I.exception return packet # Rewrite packet = self.W.packet_in(packet) if not self.W.is_success: self.exception = self.W.exception return packet # Output success packet self.is_success = True return packet