Hi Mike,
On Mon, Nov 23, 2009 at 02:00:04PM +0300, Mike Lykov wrote:
> By the way, L7-filter have two types of filter:
> "The first speed shown for a pattern in the tables below is the speed when
> used in the kernel (with the old V8 regular expression library). The second
> is the speed when used in userspace (with the modern GNU library). "
>
> i.e.userspace version uses GNU regex(7) library. Are pmacct using it also?
pmacct only embeds the first one. I've written for you a quick patch
(attached) which leverages regex coming with the SO (typically POSIX
compliant). It works for me on a Linux (x86_64) and a Solaris (sparc)
with the http classifier from L7-filter project - but it's also true
everything was working fine at some quick testing before.
Let me know if you see any improvements. If this is the case, i can
either replace the current implementation or add a knob in the coming
release. The patch should apply fine to 0.12.0rc3; if not, please use
code in the CVS.
Cheers,
Paolo
diff -ur pmacct/src/classifier.c pmacct.class/src/classifier.c
--- pmacct/src/classifier.c 2009-10-31 12:46:10.000000000 +0100
+++ pmacct.class/src/classifier.c 2009-11-23 13:57:11.000000000 +0100
@@ -157,7 +157,13 @@
payload[y] = '\0';
while (class[j].id && j < max) {
- if (class[j].pattern) ret = pm_regexec(class[j].pattern, payload);
+ char match;
+
+ if (class[j].pattern.buffer) {
+ ret = regexec(&class[j].pattern, payload, 0, (regmatch_t *) &match, 0);
+ if (!ret) ret = 1;
+ else ret = 0;
+ }
else if (*class[j].func) {
cc_node = search_context_chain(fp, idx, class[j].protocol);
cc_rev_node = search_context_chain(fp, reverse, class[j].protocol);
@@ -370,11 +376,12 @@
Log(LOG_ERR, "ERROR: Pattern in %s too long. A maximum of %d chars is allowed.\n", fname, MAX_PATTERN_LEN);
return 0;
}
- css->pattern = pm_regcomp(pre_process(line), &linelen);
- if (!css->pattern) {
- Log(LOG_ERR, "ERROR: Failed compiling regular expression for protocol '%s'\n", css->protocol);
- return 0;
- }
+ memset(&css->pattern, 0, sizeof(css->pattern));
+ ret = regcomp(&css->pattern, pre_process(line), REG_EXTENDED|REG_ICASE|REG_NOSUB);
+ if (ret) {
+ Log(LOG_ERR, "ERROR: Failed compiling regular expression for protocol '%s' (%u)\n", css->protocol, ret);
+ return 0;
+ }
datatype = done;
break;
@@ -452,7 +459,7 @@
}
link_conntrack_helper(css);
- css->pattern = NULL;
+ memset(&css->pattern, 0, sizeof(css->pattern));
return 1;
#else
return 0;
diff -ur pmacct/src/classifier.h pmacct.class/src/classifier.h
--- pmacct/src/classifier.h 2006-11-19 16:16:07.000000000 +0100
+++ pmacct.class/src/classifier.h 2009-11-23 13:57:41.000000000 +0100
@@ -1,5 +1,5 @@
#include <dirent.h>
-#include "regexp.h"
+#include <regex.h>
#include "conntrack.h"
/* defines */
@@ -27,7 +27,7 @@
struct pkt_classifier {
pm_class_t id;
char protocol[MAX_PROTOCOL_LEN];
- regexp *pattern;
+ regex_t pattern;
pm_class_t (*func)(struct pkt_classifier_data *, int, void **, void **, void **);
conntrack_helper ct_helper;
void *extra;
_______________________________________________
pmacct-discussion mailing list
http://www.pmacct.net/#mailinglists