]> The Tcpdump Group git mirrors - libpcap/commitdiff
Factor gen_mcmp_ne() out.
authorDenis Ovsienko <[email protected]>
Thu, 27 Mar 2025 11:07:13 +0000 (11:07 +0000)
committerDenis Ovsienko <[email protected]>
Fri, 28 Mar 2025 11:56:20 +0000 (11:56 +0000)
This generates exactly the same filter program, so there isn't any
change to the tests.

gencode.c

index 3f0bb6b5417f9acc359b759101709efd23ab3466..c3ecb74ec1f63a7c90c4a5d62fb1a1e54b63c13d 100644 (file)
--- a/gencode.c
+++ b/gencode.c
@@ -639,6 +639,8 @@ static struct block *gen_cmp_ne(compiler_state_t *, enum e_offrel, u_int,
     u_int size, bpf_u_int32);
 static struct block *gen_mcmp(compiler_state_t *, enum e_offrel, u_int,
     u_int, bpf_u_int32, bpf_u_int32);
+static struct block *gen_mcmp_ne(compiler_state_t *, enum e_offrel, u_int,
+    u_int, bpf_u_int32, bpf_u_int32);
 static struct block *gen_bcmp(compiler_state_t *, enum e_offrel, u_int,
     u_int, const u_char *);
 static struct block *gen_ncmp(compiler_state_t *, enum e_offrel, u_int,
@@ -1459,6 +1461,13 @@ gen_mcmp(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
        return gen_ncmp(cstate, offrel, offset, size, mask, BPF_JEQ, 0, v);
 }
 
+static struct block *
+gen_mcmp_ne(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
+    u_int size, bpf_u_int32 v, bpf_u_int32 mask)
+{
+       return gen_ncmp(cstate, offrel, offset, size, mask, BPF_JEQ, 1, v);
+}
+
 static struct block *
 gen_bcmp(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
     u_int size, const u_char *v)
@@ -4874,15 +4883,12 @@ gen_wlanhostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
                /*
                 * Not present in CTS or ACK control frames.
                 */
-               b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
+               b0 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
                        IEEE80211_FC0_TYPE_MASK);
-               gen_not(b0);
-               b1 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
+               b1 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
                        IEEE80211_FC0_SUBTYPE_MASK);
-               gen_not(b1);
-               b2 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
+               b2 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
                        IEEE80211_FC0_SUBTYPE_MASK);
-               gen_not(b2);
                gen_and(b1, b2);
                gen_or(b0, b2);
                b1 = gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
@@ -4893,9 +4899,8 @@ gen_wlanhostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
                /*
                 * Not present in control frames.
                 */
-               b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
+               b0 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
                        IEEE80211_FC0_TYPE_MASK);
-               gen_not(b0);
                b1 = gen_bcmp(cstate, OR_LINKHDR, 16, 6, eaddr);
                gen_and(b0, b1);
                return b1;
@@ -4949,15 +4954,12 @@ gen_wlanhostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
                /*
                 * Not present in CTS or ACK control frames.
                 */
-               b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
+               b0 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
                        IEEE80211_FC0_TYPE_MASK);
-               gen_not(b0);
-               b1 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
+               b1 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
                        IEEE80211_FC0_SUBTYPE_MASK);
-               gen_not(b1);
-               b2 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
+               b2 = gen_mcmp_ne(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
                        IEEE80211_FC0_SUBTYPE_MASK);
-               gen_not(b2);
                gen_and(b1, b2);
                gen_or(b0, b2);