-class FragExpr:
- def __init__(self, val):
- if val == "is_fragment":
- self.rule = "(ip->frag_off & BE16(IP_MF|IP_OFFSET)) != 0"
- elif val == "first_fragment":
- self.rule = "(ip->frag_off & BE16(IP_MF)) != 0 && (ip->frag_off & BE16(IP_OFFSET)) == 0"
- elif val == "dont_fragment":
- self.rule = "(ip->frag_off & BE16(IP_DF)) != 0"
- elif val == "last_fragment":
- self.rule = "(ip->frag_off & BE16(IP_MF)) == 0 && (ip->frag_off & BE16(IP_OFFSET)) != 0"
+class FragExpr(Enum):
+ IF = 1
+ FF = 2
+ DF = 3
+ LF = 4
+
+ def write(self, ipproto, _param2):
+ if ipproto == 4:
+ if self == FragExpr.IF:
+ return "(ip->frag_off & BE16(IP_MF|IP_OFFSET)) != 0"
+ elif self == FragExpr.FF:
+ return "((ip->frag_off & BE16(IP_MF)) != 0 && (ip->frag_off & BE16(IP_OFFSET)) == 0)"
+ elif self == FragExpr.DF:
+ return "(ip->frag_off & BE16(IP_DF)) != 0"
+ elif self == FragExpr.LF:
+ return "((ip->frag_off & BE16(IP_MF)) == 0 && (ip->frag_off & BE16(IP_OFFSET)) != 0)"
+ else:
+ assert False