Esempio n. 1
0
 def set_rule(self, table, in_ports, out_ports, match, mask, rewrite):
     '''
     sets the essential infomation about a rule and automatically computes
     inverse match and rewrite.
     '''
     self.input_ports = in_ports
     self.output_ports = out_ports
     self.match = match
     self.mask = mask
     self.rewrite = rewrite
     self.table = table
     if (mask.__class__ == wildcard and rewrite.__class__ == wildcard):
         masked = wildcard_and(match, mask)
         rewritten = wildcard_or(masked, rewrite)
         self.inverse_match = rewritten
         self.inverse_rewrite = wildcard_and(wildcard_not(mask), match)
     else:
         self.mask = None
         self.rewrite = None
         self.inverse_match = match
         self.inverse_rewrite = None
     return self
Esempio n. 2
0
 def set_rule(self,table,in_ports,out_ports,match,mask,rewrite):
     '''
     sets the essential infomation about a rule and automatically computes
     inverse match and rewrite.
     '''
     self.input_ports = in_ports
     self.output_ports = out_ports
     self.match = match
     self.mask = mask
     self.rewrite = rewrite
     self.table = table
     if (mask.__class__ == wildcard and rewrite.__class__ == wildcard):
         masked = wildcard_and(match, mask)
         rewritten = wildcard_or(masked, rewrite)
         self.inverse_match = rewritten
         self.inverse_rewrite = wildcard_and(wildcard_not(mask), match)
     else:
         self.mask = None
         self.rewrite = None
         self.inverse_match = match
         self.inverse_rewrite = None
     return self
Esempio n. 3
0
def compose_standard_rules(rule1, rule2):

    mid_ports = [val for val in rule2["in_ports"] if val in rule1["out_ports"]]
    if len(mid_ports) == 0:
        return None

    # ## finding match
    # rule 2 is a link rule
    if rule2["match"] == None:
        match = wildcard_copy(rule1["match"])
    else:
        # if rule 1 is a fwd or link rule
        if rule1["mask"] == None:
            # if rule 1 is a link rule
            if rule1["match"] == None:
                match = wildcard_copy(rule2["match"])
            else:
                match = wildcard_intersect(rule2["match"], rule1["match"])
        # if rule 1 is a rewrite rule
        else:
            match_inv = wildcard_or(\
                wildcard_and(rule2["match"], rule1['mask']), \
                rule1['inverse_rewrite'])
            match = wildcard_intersect(match_inv, rule1["match"])
    if len(match) == 0:
        return None

    # ## finding mask and rewrite
    mask = None
    rewrite = None
    if rule2["mask"] == None:
        mask = rule1["mask"]
        rewrite = rule1["rewrite"]
    elif rule1["mask"] == None:
        mask = rule2["mask"]
        rewrite = rule2["rewrite"]
    else:
        # mask = mask1 & mask2
        # rewrite = (rewrite1 & mask2) | (rewrite2 & !mask2)
        mask = wildcard_and(rule1["mask"], rule2["mask"])
        rewrite = wildcard_or(wildcard_and(rule1["rewrite"], rule2["mask"]), wildcard_and(rule2["rewrite"], wildcard_not(rule2["mask"])))
    in_ports = rule1["in_ports"]
    out_ports = rule2["out_ports"]

    if rule1["file"] == rule2["file"]:
        file_name = rule1["file"]
    else:
        file_name = "%s , %s" % (rule1["file"], rule2["file"])

    lines = rule1["line"]
    lines.extend(rule2["line"])
    result_rule = TF.create_standard_rule(in_ports, match, out_ports, mask, rewrite, file_name, lines)
    return result_rule