Index: sandbox/linux/bpf_dsl/bpf_dsl.cc |
diff --git a/sandbox/linux/bpf_dsl/bpf_dsl.cc b/sandbox/linux/bpf_dsl/bpf_dsl.cc |
index ac16051ccbf4312fb4e8cbf2836c6c964b389946..6c4bd70a5950b30e42cc844ad6efaf2b642af20d 100644 |
--- a/sandbox/linux/bpf_dsl/bpf_dsl.cc |
+++ b/sandbox/linux/bpf_dsl/bpf_dsl.cc |
@@ -94,14 +94,15 @@ class PrimitiveBoolExprImpl : public internal::BoolExprImpl { |
public: |
PrimitiveBoolExprImpl(int argno, |
ErrorCode::ArgType is_32bit, |
- ErrorCode::Operation op, |
+ uint64_t mask, |
uint64_t value) |
- : argno_(argno), is_32bit_(is_32bit), op_(op), value_(value) {} |
+ : argno_(argno), is_32bit_(is_32bit), mask_(mask), value_(value) {} |
virtual ErrorCode Compile(SandboxBPF* sb, |
ErrorCode true_ec, |
ErrorCode false_ec) const OVERRIDE { |
- return sb->Cond(argno_, is_32bit_, op_, value_, true_ec, false_ec); |
+ return sb->CondMaskedEqual( |
+ argno_, is_32bit_, mask_, value_, true_ec, false_ec); |
} |
private: |
@@ -109,7 +110,7 @@ class PrimitiveBoolExprImpl : public internal::BoolExprImpl { |
int argno_; |
ErrorCode::ArgType is_32bit_; |
- ErrorCode::Operation op_; |
+ uint64_t mask_; |
uint64_t value_; |
DISALLOW_COPY_AND_ASSIGN(PrimitiveBoolExprImpl); |
@@ -177,6 +178,18 @@ class OrBoolExprImpl : public internal::BoolExprImpl { |
namespace internal { |
+uint64_t DefaultMask(size_t size) { |
+ switch (size) { |
+ case 4: |
+ return std::numeric_limits<uint32_t>::max(); |
+ case 8: |
+ return std::numeric_limits<uint64_t>::max(); |
+ default: |
+ CHECK(false) << "Unimplemented DefaultMask case"; |
+ return 0; |
+ } |
+} |
+ |
BoolExpr ArgEq(int num, size_t size, uint64_t mask, uint64_t val) { |
CHECK(num >= 0 && num < 6); |
CHECK(size >= 1 && size <= 8); |
@@ -187,27 +200,7 @@ BoolExpr ArgEq(int num, size_t size, uint64_t mask, uint64_t val) { |
const ErrorCode::ArgType arg_type = |
(size <= 4) ? ErrorCode::TP_32BIT : ErrorCode::TP_64BIT; |
- if (mask == std::numeric_limits<uint64_t>::max()) { |
- // Arg == Val |
- return BoolExpr(new const PrimitiveBoolExprImpl( |
- num, arg_type, ErrorCode::OP_EQUAL, val)); |
- } |
- |
- if (mask == val) { |
- // (Arg & Mask) == Mask |
- return BoolExpr(new const PrimitiveBoolExprImpl( |
- num, arg_type, ErrorCode::OP_HAS_ALL_BITS, mask)); |
- } |
- |
- if (val == 0) { |
- // (Arg & Mask) == 0, which is semantically equivalent to !((arg & mask) != |
- // 0). |
- return !BoolExpr(new const PrimitiveBoolExprImpl( |
- num, arg_type, ErrorCode::OP_HAS_ANY_BITS, mask)); |
- } |
- |
- CHECK(false) << "Unimplemented ArgEq case"; |
- return BoolExpr(); |
+ return BoolExpr(new const PrimitiveBoolExprImpl(num, arg_type, mask, val)); |
} |
} // namespace internal |