support 32-bit intfilter

This commit is contained in:
cathugger 2017-10-08 21:15:08 +00:00
parent 67c5468317
commit e400912b2a
2 changed files with 28 additions and 10 deletions

View file

@ -128,14 +128,29 @@ then
CFLAGS="$CFLAGS -msse2"
fi
AC_ARG_ENABLE([intfilter],
[AS_HELP_STRING([--enable-intfilter],
[use 64bit integers for filtering. faster but limits filter length @<:@default=no@:>@])],
[use 64-bit integers for filtering. faster but limits filter length to 12 @<:@default=no@:>@])],
[], [enable_intfilter=no]
)
if test "x$enable_intfilter" = "xyes"
AC_ARG_ENABLE([intfilter32],
[AS_HELP_STRING([--enable-intfilter32],
[use 32-bit integers for filtering. even faster on 32-bit machines but limits filter length to 6 @<:@default=no@:>@])],
[], [enable_intfilter32=no]
)
if test "x$enable_intfilter32" = "xyes"
then
MYDEFS="$MYDEFS -DINTFILTER"
if test "x$enable_intfilter" = "xyes"
then
AC_MSG_WARN([both intfilter and intfilter32 specified; using intfilter32])
fi
MYDEFS="$MYDEFS -DINTFILTER -DIFT=u32"
else
if test "x$enable_intfilter" = "xyes"
then
MYDEFS="$MYDEFS -DINTFILTER"
fi
fi
AC_ARG_ENABLE([statistics],

17
main.c
View file

@ -74,8 +74,11 @@ struct binfilter {
} ;
#ifdef INTFILTER
#ifndef IFT
#define IFT u64
#endif
struct intfilter {
u64 f,m;
IFT f,m;
} ;
VEC_STRUCT(ifiltervec,struct intfilter) ifilters;
#else
@ -146,8 +149,8 @@ static void filters_add(const char *filter)
size_t ret, ret2;
#ifdef INTFILTER
union intconv {
u64 i;
u8 b[8];
IFT i;
u8 b[sizeof(IFT)];
} fc,mc;
#endif
@ -161,7 +164,7 @@ static void filters_add(const char *filter)
if (!ret)
return;
#ifdef INTFILTER
if (ret > 8)
if (ret > sizeof(IFT))
#else
if (ret > PUBLIC_LEN)
#endif
@ -177,7 +180,7 @@ static void filters_add(const char *filter)
for (size_t i = 0;i < bf.len;++i)
mc.b[i] = 0xFF;
mc.b[bf.len] = bf.mask;
memcpy(fc.b,bf.f,8);
memcpy(fc.b,bf.f,sizeof(fc.b));
fc.i &= mc.i;
struct intfilter ifltr = {.f = fc.i,.m = mc.i};
VEC_FOR(ifilters,i) {
@ -227,7 +230,7 @@ static size_t filters_count()
#ifdef INTFILTER
#define FILTERFOR(it) for (it = 0;it < VEC_LENGTH(ifilters);++it)
#define MATCHFILTER(it,pk) ((*(u64 *)(pk) & VEC_BUF(ifilters,it).m) == VEC_BUF(ifilters,it).f)
#define MATCHFILTER(it,pk) ((*(IFT *)(pk) & VEC_BUF(ifilters,it).m) == VEC_BUF(ifilters,it).f)
#else
@ -273,7 +276,7 @@ static void printfilters()
#ifdef INTFILTER
size_t len = 0;
u8 *imraw = (u8 *)&VEC_BUF(ifilters,i).m;
while (len < 8 && imraw[len] != 0x00) ++len;
while (len < sizeof(IFT) && imraw[len] != 0x00) ++len;
u8 mask = imraw[len-1];
u8 *ifraw = (u8 *)&VEC_BUF(ifilters,i).f;
#else