* Re: [tcpdump-workers] Modular arithmetic
[not found] ` <20120907074910.2df46817@arrowsmith>
@ 2012-09-08 3:03 ` Andi Kleen
2012-09-08 8:03 ` [PATCH net-next] filter: add MOD operation Eric Dumazet
2012-09-10 8:41 ` [tcpdump-workers] Modular arithmetic David Laight
0 siblings, 2 replies; 13+ messages in thread
From: Andi Kleen @ 2012-09-08 3:03 UTC (permalink / raw)
To: George Bakos; +Cc: Jay Schulist, netdev
On Fri, Sep 07, 2012 at 07:49:10AM +0000, George Bakos wrote:
> Gents,
> Any fundamental reason why the following (, etc.) shouldn't be
> included in net/core/filter.c?
>
> case BPF_S_ALU_MOD_X:
> if (X == 0)
> return 0;
> A %= X;
> continue;
Copying netdev.
In principle no reason against it, but you may need to update
the various BPF JITs too that Linux now has too.
-Andi
>
> Cheers,
> g
>
> On Thu, 6 Sep 2012 01:02:32 -0700
> Guy Harris <guy@alum.mit.edu> wrote:
>
> >
> > On Sep 6, 2012, at 12:36 AM, George Bakos wrote:
> >
> > > $ tcpdump -nvr /tmp/DG2-test2 '(ip[2:2] - 20) % 5 != 0 && ip[6] &
> > > 0x20 = 0x20'
> > >
> > > reading from file /tmp/DG2-test2, link-type EN10MB (Ethernet)
> > > 19:01:51.270202 IP (tos 0x0, ttl 64, id 1, offset 40, flags [+],
> > > proto ICMP (1), length 61) 192.168.11.5 > 192.168.11.46: ip-proto-1
> > >
> > > (000) ldh [12]
> > > (001) jeq #0x800 jt 2 jf 10
> > > (002) ldh [16]
> > > (003) sub #20
> > > (004) mod #5
> > > (005) jeq #0x0 jt 10 jf 6
> >
> > OK, so you presumably added a BPF_MOD instruction to the BPF interpreter as part of your changes, right? There's none in libpcap's bpf_filter.c nor in a fairly recent FreeBSD kernel's bpf_filter.c nor in Linux 3.0.4's net/core/filter.c, so that code won't work with at least those interpreters.
> >
> > _______________________________________________
> > tcpdump-workers mailing list
> > tcpdump-workers@lists.tcpdump.org
> > https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
>
>
> --
--
ak@linux.intel.com -- Speaking for myself only
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next] filter: add MOD operation
2012-09-08 3:03 ` [tcpdump-workers] Modular arithmetic Andi Kleen
@ 2012-09-08 8:03 ` Eric Dumazet
2012-09-08 20:31 ` George Bakos
2012-09-10 19:45 ` David Miller
2012-09-10 8:41 ` [tcpdump-workers] Modular arithmetic David Laight
1 sibling, 2 replies; 13+ messages in thread
From: Eric Dumazet @ 2012-09-08 8:03 UTC (permalink / raw)
To: Andi Kleen; +Cc: George Bakos, Jay Schulist, netdev
From: Eric Dumazet <edumazet@google.com>
On Fri, 2012-09-07 at 20:03 -0700, Andi Kleen wrote:
> On Fri, Sep 07, 2012 at 07:49:10AM +0000, George Bakos wrote:
> > Gents,
> > Any fundamental reason why the following (, etc.) shouldn't be
> > included in net/core/filter.c?
> >
> > case BPF_S_ALU_MOD_X:
> > if (X == 0)
> > return 0;
> > A %= X;
> > continue;
>
> Copying netdev.
>
> In principle no reason against it, but you may need to update
> the various BPF JITs too that Linux now has too.
Hi Andi, thanks for the forward
In recent commit ffe06c17afbb was added ALU_XOR_X,
so we could add ALU_MOD_X as well.
ALU_MOD_K is a bit more complex as we cant use an ancillary, and must
instead use a new BPF_OP code :
/* alu/jmp fields */
#define BPF_OP(code) ((code) & 0xf0)
#define BPF_ADD 0x00
#define BPF_SUB 0x10
#define BPF_MUL 0x20
#define BPF_DIV 0x30
#define BPF_OR 0x40
#define BPF_AND 0x50
#define BPF_LSH 0x60
#define BPF_RSH 0x70
#define BPF_NEG 0x80
So I guess we could use
#define BPF_MOD 0x90
About the various arches JIT, there is no hurry :
We can update them later.
At JIT 'compile' time, if we find a not yet handled instruction, we fall
back to the net/core/filter.c interpreter.
If the following patch is accepted, I'll do the x86 part as a followup.
Thanks !
[PATCH net-next] filter: add MOD operation
Add a new ALU opcode, to compute a modulus.
Commit ffe06c17afbbb used an ancillary to implement XOR_X,
but here we reserve one of the available ALU opcode to implement both
MOD_X and MOD_K
Signed-off-by: Eric Dumazet <edumazet@google.com>
Suggested-by: George Bakos <gbakos@alpinista.org>
Cc: Jay Schulist <jschlst@samba.org>
Cc: Jiri Pirko <jpirko@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
---
include/linux/filter.h | 4 ++++
net/core/filter.c | 15 +++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/include/linux/filter.h b/include/linux/filter.h
index 82b0135..3cf5fd5 100644
--- a/include/linux/filter.h
+++ b/include/linux/filter.h
@@ -74,6 +74,8 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */
#define BPF_LSH 0x60
#define BPF_RSH 0x70
#define BPF_NEG 0x80
+#define BPF_MOD 0x90
+
#define BPF_JA 0x00
#define BPF_JEQ 0x10
#define BPF_JGT 0x20
@@ -196,6 +198,8 @@ enum {
BPF_S_ALU_MUL_K,
BPF_S_ALU_MUL_X,
BPF_S_ALU_DIV_X,
+ BPF_S_ALU_MOD_K,
+ BPF_S_ALU_MOD_X,
BPF_S_ALU_AND_K,
BPF_S_ALU_AND_X,
BPF_S_ALU_OR_K,
diff --git a/net/core/filter.c b/net/core/filter.c
index 907efd2..fbe3a8d 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -167,6 +167,14 @@ unsigned int sk_run_filter(const struct sk_buff *skb,
case BPF_S_ALU_DIV_K:
A = reciprocal_divide(A, K);
continue;
+ case BPF_S_ALU_MOD_X:
+ if (X == 0)
+ return 0;
+ A %= X;
+ continue;
+ case BPF_S_ALU_MOD_K:
+ A %= K;
+ continue;
case BPF_S_ALU_AND_X:
A &= X;
continue;
@@ -469,6 +477,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
[BPF_ALU|BPF_MUL|BPF_K] = BPF_S_ALU_MUL_K,
[BPF_ALU|BPF_MUL|BPF_X] = BPF_S_ALU_MUL_X,
[BPF_ALU|BPF_DIV|BPF_X] = BPF_S_ALU_DIV_X,
+ [BPF_ALU|BPF_MOD|BPF_K] = BPF_S_ALU_MOD_K,
+ [BPF_ALU|BPF_MOD|BPF_X] = BPF_S_ALU_MOD_X,
[BPF_ALU|BPF_AND|BPF_K] = BPF_S_ALU_AND_K,
[BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X,
[BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K,
@@ -531,6 +541,11 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
return -EINVAL;
ftest->k = reciprocal_value(ftest->k);
break;
+ case BPF_S_ALU_MOD_K:
+ /* check for division by zero */
+ if (ftest->k == 0)
+ return -EINVAL;
+ break;
case BPF_S_LD_MEM:
case BPF_S_LDX_MEM:
case BPF_S_ST:
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH net-next] filter: add MOD operation
2012-09-08 8:03 ` [PATCH net-next] filter: add MOD operation Eric Dumazet
@ 2012-09-08 20:31 ` George Bakos
2012-09-10 19:45 ` David Miller
1 sibling, 0 replies; 13+ messages in thread
From: George Bakos @ 2012-09-08 20:31 UTC (permalink / raw)
To: Eric Dumazet; +Cc: netdev, Jay Schulist, Andi Kleen, tcpdump-workers
[-- Attachment #1: Type: text/plain, Size: 4516 bytes --]
Here's a patch to libpcap-1.3 to test against. I still need to
include changes to man pages.
g
On Sat, 08 Sep 2012 10:03:35 +0200
Eric Dumazet <eric.dumazet@gmail.com> wrote:
> From: Eric Dumazet <edumazet@google.com>
>
> On Fri, 2012-09-07 at 20:03 -0700, Andi Kleen wrote:
> > On Fri, Sep 07, 2012 at 07:49:10AM +0000, George Bakos wrote:
> > > Gents,
> > > Any fundamental reason why the following (, etc.) shouldn't be
> > > included in net/core/filter.c?
> > >
> > > case BPF_S_ALU_MOD_X:
> > > if (X == 0)
> > > return 0;
> > > A %= X;
> > > continue;
> >
> > Copying netdev.
> >
> > In principle no reason against it, but you may need to update
> > the various BPF JITs too that Linux now has too.
>
> Hi Andi, thanks for the forward
>
> In recent commit ffe06c17afbb was added ALU_XOR_X,
> so we could add ALU_MOD_X as well.
>
> ALU_MOD_K is a bit more complex as we cant use an ancillary, and must
> instead use a new BPF_OP code :
>
> /* alu/jmp fields */
> #define BPF_OP(code) ((code) & 0xf0)
> #define BPF_ADD 0x00
> #define BPF_SUB 0x10
> #define BPF_MUL 0x20
> #define BPF_DIV 0x30
> #define BPF_OR 0x40
> #define BPF_AND 0x50
> #define BPF_LSH 0x60
> #define BPF_RSH 0x70
> #define BPF_NEG 0x80
>
> So I guess we could use
>
> #define BPF_MOD 0x90
>
> About the various arches JIT, there is no hurry :
> We can update them later.
>
> At JIT 'compile' time, if we find a not yet handled instruction, we fall
> back to the net/core/filter.c interpreter.
>
> If the following patch is accepted, I'll do the x86 part as a followup.
>
> Thanks !
>
> [PATCH net-next] filter: add MOD operation
>
> Add a new ALU opcode, to compute a modulus.
>
> Commit ffe06c17afbbb used an ancillary to implement XOR_X,
> but here we reserve one of the available ALU opcode to implement both
> MOD_X and MOD_K
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Suggested-by: George Bakos <gbakos@alpinista.org>
> Cc: Jay Schulist <jschlst@samba.org>
> Cc: Jiri Pirko <jpirko@redhat.com>
> Cc: Andi Kleen <ak@linux.intel.com>
> ---
> include/linux/filter.h | 4 ++++
> net/core/filter.c | 15 +++++++++++++++
> 2 files changed, 19 insertions(+)
>
> diff --git a/include/linux/filter.h b/include/linux/filter.h
> index 82b0135..3cf5fd5 100644
> --- a/include/linux/filter.h
> +++ b/include/linux/filter.h
> @@ -74,6 +74,8 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */
> #define BPF_LSH 0x60
> #define BPF_RSH 0x70
> #define BPF_NEG 0x80
> +#define BPF_MOD 0x90
> +
> #define BPF_JA 0x00
> #define BPF_JEQ 0x10
> #define BPF_JGT 0x20
> @@ -196,6 +198,8 @@ enum {
> BPF_S_ALU_MUL_K,
> BPF_S_ALU_MUL_X,
> BPF_S_ALU_DIV_X,
> + BPF_S_ALU_MOD_K,
> + BPF_S_ALU_MOD_X,
> BPF_S_ALU_AND_K,
> BPF_S_ALU_AND_X,
> BPF_S_ALU_OR_K,
> diff --git a/net/core/filter.c b/net/core/filter.c
> index 907efd2..fbe3a8d 100644
> --- a/net/core/filter.c
> +++ b/net/core/filter.c
> @@ -167,6 +167,14 @@ unsigned int sk_run_filter(const struct sk_buff *skb,
> case BPF_S_ALU_DIV_K:
> A = reciprocal_divide(A, K);
> continue;
> + case BPF_S_ALU_MOD_X:
> + if (X == 0)
> + return 0;
> + A %= X;
> + continue;
> + case BPF_S_ALU_MOD_K:
> + A %= K;
> + continue;
> case BPF_S_ALU_AND_X:
> A &= X;
> continue;
> @@ -469,6 +477,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
> [BPF_ALU|BPF_MUL|BPF_K] = BPF_S_ALU_MUL_K,
> [BPF_ALU|BPF_MUL|BPF_X] = BPF_S_ALU_MUL_X,
> [BPF_ALU|BPF_DIV|BPF_X] = BPF_S_ALU_DIV_X,
> + [BPF_ALU|BPF_MOD|BPF_K] = BPF_S_ALU_MOD_K,
> + [BPF_ALU|BPF_MOD|BPF_X] = BPF_S_ALU_MOD_X,
> [BPF_ALU|BPF_AND|BPF_K] = BPF_S_ALU_AND_K,
> [BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X,
> [BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K,
> @@ -531,6 +541,11 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen)
> return -EINVAL;
> ftest->k = reciprocal_value(ftest->k);
> break;
> + case BPF_S_ALU_MOD_K:
> + /* check for division by zero */
> + if (ftest->k == 0)
> + return -EINVAL;
> + break;
> case BPF_S_LD_MEM:
> case BPF_S_LDX_MEM:
> case BPF_S_ST:
>
>
--
[-- Attachment #2: libpcap-1.3.0-with-modulus.patch --]
[-- Type: text/x-patch, Size: 4452 bytes --]
diff -Naur libpcap-1.3.0/bpf/net/bpf_filter.c libpcap-1.3.0-with-modulus/bpf/net/bpf_filter.c
--- libpcap-1.3.0/bpf/net/bpf_filter.c 2012-03-29 12:57:32.000000000 +0000
+++ libpcap-1.3.0-with-modulus/bpf/net/bpf_filter.c 2012-08-31 01:36:53.206825554 +0000
@@ -469,6 +469,12 @@
A /= X;
continue;
+ case BPF_ALU|BPF_MOD|BPF_X:
+ if (X == 0)
+ return 0;
+ A %= X;
+ continue;
+
case BPF_ALU|BPF_AND|BPF_X:
A &= X;
continue;
@@ -501,6 +507,10 @@
A /= pc->k;
continue;
+ case BPF_ALU|BPF_MOD|BPF_K:
+ A %= pc->k;
+ continue;
+
case BPF_ALU|BPF_AND|BPF_K:
A &= pc->k;
continue;
@@ -621,6 +631,13 @@
*/
if (BPF_SRC(p->code) == BPF_K && p->k == 0)
return 0;
+ break;
+ case BPF_MOD:
+ /*
+ * Check for illegal modulus 0.
+ */
+ if (BPF_SRC(p->code) == BPF_K && p->k == 0)
+ return 0;
break;
default:
return 0;
diff -Naur libpcap-1.3.0/bpf_image.c libpcap-1.3.0-with-modulus/bpf_image.c
--- libpcap-1.3.0/bpf_image.c 2012-03-29 12:57:32.000000000 +0000
+++ libpcap-1.3.0-with-modulus/bpf_image.c 2012-08-31 01:36:53.225825770 +0000
@@ -216,6 +216,11 @@
fmt = "x";
break;
+ case BPF_ALU|BPF_MOD|BPF_X:
+ op = "mod";
+ fmt = "x";
+ break;
+
case BPF_ALU|BPF_AND|BPF_X:
op = "and";
fmt = "x";
@@ -256,6 +261,11 @@
fmt = "#%d";
break;
+ case BPF_ALU|BPF_MOD|BPF_K:
+ op = "mod";
+ fmt = "#%d";
+ break;
+
case BPF_ALU|BPF_AND|BPF_K:
op = "and";
fmt = "#0x%x";
diff -Naur libpcap-1.3.0/grammar.y libpcap-1.3.0-with-modulus/grammar.y
--- libpcap-1.3.0/grammar.y 2012-03-29 12:57:32.000000000 +0000
+++ libpcap-1.3.0-with-modulus/grammar.y 2012-08-31 01:36:53.196825439 +0000
@@ -617,6 +617,7 @@
| arth '*' arth { $$ = gen_arth(BPF_MUL, $1, $3); }
| arth '/' arth { $$ = gen_arth(BPF_DIV, $1, $3); }
| arth '&' arth { $$ = gen_arth(BPF_AND, $1, $3); }
+ | arth '%' arth { $$ = gen_arth(BPF_MOD, $1, $3); }
| arth '|' arth { $$ = gen_arth(BPF_OR, $1, $3); }
| arth LSH arth { $$ = gen_arth(BPF_LSH, $1, $3); }
| arth RSH arth { $$ = gen_arth(BPF_RSH, $1, $3); }
diff -Naur libpcap-1.3.0/optimize.c libpcap-1.3.0-with-modulus/optimize.c
--- libpcap-1.3.0/optimize.c 2012-03-29 12:57:32.000000000 +0000
+++ libpcap-1.3.0-with-modulus/optimize.c 2012-08-31 01:36:53.188825347 +0000
@@ -666,6 +666,12 @@
a /= b;
break;
+ case BPF_MOD:
+ if (b == 0)
+ bpf_error("illegal modulus 0");
+ a %= b;
+ break;
+
case BPF_AND:
a &= b;
break;
@@ -1044,6 +1050,7 @@
case BPF_ALU|BPF_SUB|BPF_K:
case BPF_ALU|BPF_MUL|BPF_K:
case BPF_ALU|BPF_DIV|BPF_K:
+ case BPF_ALU|BPF_MOD|BPF_K:
case BPF_ALU|BPF_AND|BPF_K:
case BPF_ALU|BPF_OR|BPF_K:
case BPF_ALU|BPF_LSH|BPF_K:
@@ -1079,6 +1086,7 @@
case BPF_ALU|BPF_SUB|BPF_X:
case BPF_ALU|BPF_MUL|BPF_X:
case BPF_ALU|BPF_DIV|BPF_X:
+ case BPF_ALU|BPF_MOD|BPF_X:
case BPF_ALU|BPF_AND|BPF_X:
case BPF_ALU|BPF_OR|BPF_X:
case BPF_ALU|BPF_LSH|BPF_X:
@@ -1112,7 +1120,7 @@
vstore(s, &val[A_ATOM], val[X_ATOM], alter);
break;
}
- else if (op == BPF_MUL || op == BPF_DIV ||
+ else if (op == BPF_MUL || op == BPF_DIV || op == BPF_MOD ||
op == BPF_AND || op == BPF_LSH || op == BPF_RSH) {
s->code = BPF_LD|BPF_IMM;
s->k = 0;
diff -Naur libpcap-1.3.0/pcap/bpf.h libpcap-1.3.0-with-modulus/pcap/bpf.h
--- libpcap-1.3.0/pcap/bpf.h 2012-06-12 16:55:36.000000000 +0000
+++ libpcap-1.3.0-with-modulus/pcap/bpf.h 2012-08-31 01:36:53.199825471 +0000
@@ -1235,6 +1235,7 @@
#define BPF_LSH 0x60
#define BPF_RSH 0x70
#define BPF_NEG 0x80
+#define BPF_MOD 0x90
#define BPF_JA 0x00
#define BPF_JEQ 0x10
#define BPF_JGT 0x20
diff -Naur libpcap-1.3.0/scanner.l libpcap-1.3.0-with-modulus/scanner.l
--- libpcap-1.3.0/scanner.l 2012-03-29 12:57:32.000000000 +0000
+++ libpcap-1.3.0-with-modulus/scanner.l 2012-08-31 01:36:53.225825770 +0000
@@ -329,7 +329,7 @@
sls return SLS;
[ \r\n\t] ;
-[+\-*/:\[\]!<>()&|=] return yytext[0];
+[+\-*/:\[\]!<>()&|=%] return yytext[0];
">=" return GEQ;
"<=" return LEQ;
"!=" return NEQ;
@@ -387,7 +387,7 @@
[A-Za-z0-9]([-_.A-Za-z0-9]*[.A-Za-z0-9])? {
yylval.s = sdup((char *)yytext); return ID; }
"\\"[^ !()\n\t]+ { yylval.s = sdup((char *)yytext + 1); return ID; }
-[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=]+ {
+[^ \[\]\t\n\-_.A-Za-z0-9!<>()&|=%]+ {
bpf_error("illegal token: %s", yytext); }
. { bpf_error("illegal char '%c'", *yytext); }
%%
[-- Attachment #3: Type: text/plain, Size: 171 bytes --]
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [tcpdump-workers] Modular arithmetic
2012-09-08 3:03 ` [tcpdump-workers] Modular arithmetic Andi Kleen
2012-09-08 8:03 ` [PATCH net-next] filter: add MOD operation Eric Dumazet
@ 2012-09-10 8:41 ` David Laight
2012-09-10 9:25 ` Eric Dumazet
2012-09-10 14:49 ` [tcpdump-workers] " Andi Kleen
1 sibling, 2 replies; 13+ messages in thread
From: David Laight @ 2012-09-10 8:41 UTC (permalink / raw)
To: Andi Kleen, George Bakos, tcpdump-workers; +Cc: Jay Schulist, netdev
> On Fri, Sep 07, 2012 at 07:49:10AM +0000, George Bakos wrote:
> > Gents,
> > Any fundamental reason why the following (, etc.) shouldn't be
> > included in net/core/filter.c?
> >
> > case BPF_S_ALU_MOD_X:
> > if (X == 0)
> > return 0;
> > A %= X;
> > continue;
>
> Copying netdev.
>
> In principle no reason against it, but you may need to update
> the various BPF JITs too that Linux now has too.
What about the other OS - eg all the BSDs?
I had a vague idea that BPF was supposed to be reasonable portable.
David (dsl@netbsd.org)
^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [tcpdump-workers] Modular arithmetic
2012-09-10 8:41 ` [tcpdump-workers] Modular arithmetic David Laight
@ 2012-09-10 9:25 ` Eric Dumazet
2012-09-10 10:41 ` David Laight
2012-09-10 14:49 ` [tcpdump-workers] " Andi Kleen
1 sibling, 1 reply; 13+ messages in thread
From: Eric Dumazet @ 2012-09-10 9:25 UTC (permalink / raw)
To: David Laight
Cc: Andi Kleen, George Bakos, tcpdump-workers, Jay Schulist, netdev
On Mon, 2012-09-10 at 09:41 +0100, David Laight wrote:
> > On Fri, Sep 07, 2012 at 07:49:10AM +0000, George Bakos wrote:
> > > Gents,
> > > Any fundamental reason why the following (, etc.) shouldn't be
> > > included in net/core/filter.c?
> > >
> > > case BPF_S_ALU_MOD_X:
> > > if (X == 0)
> > > return 0;
> > > A %= X;
> > > continue;
> >
> > Copying netdev.
> >
> > In principle no reason against it, but you may need to update
> > the various BPF JITs too that Linux now has too.
>
> What about the other OS - eg all the BSDs?
> I had a vague idea that BPF was supposed to be reasonable portable.
Yes, does it mean BPF is frozen ?
Or is BSD so hard to update these days ?
modulus can be implemented using fallback to div and sub, I am not sure
libpcap should sense kernel support or not.
George, make sure libpcap optimizer correctly replaces MOD X by AND (X
- 1) if X is a power of two.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Modular arithmetic
2012-09-10 9:25 ` Eric Dumazet
@ 2012-09-10 10:41 ` David Laight
2012-09-10 11:49 ` [tcpdump-workers] " Daniel Borkmann
2012-09-10 17:50 ` Guy Harris
0 siblings, 2 replies; 13+ messages in thread
From: David Laight @ 2012-09-10 10:41 UTC (permalink / raw)
To: Eric Dumazet; +Cc: netdev, Jay Schulist, Andi Kleen, tcpdump-workers
> > What about the other OS - eg all the BSDs?
> > I had a vague idea that BPF was supposed to be reasonable portable.
>
> Yes, does it mean BPF is frozen ?
>
> Or is BSD so hard to update these days ?
Not really - but it some other places that need updating in order
to make this useful for cross-platform tools (like tcpdump).
The 'real fun (tm)' happens when NetBSD tries to run Linux binaries
that include the Linux libpcap.
David
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [tcpdump-workers] Modular arithmetic
2012-09-10 10:41 ` David Laight
@ 2012-09-10 11:49 ` Daniel Borkmann
2012-09-10 17:50 ` Guy Harris
1 sibling, 0 replies; 13+ messages in thread
From: Daniel Borkmann @ 2012-09-10 11:49 UTC (permalink / raw)
To: David Laight
Cc: Eric Dumazet, Andi Kleen, George Bakos, tcpdump-workers,
Jay Schulist, netdev
On Mon, Sep 10, 2012 at 12:41 PM, David Laight <David.Laight@aculab.com> wrote:
>> > What about the other OS - eg all the BSDs?
>> > I had a vague idea that BPF was supposed to be reasonable portable.
>>
>> Yes, does it mean BPF is frozen ?
>>
>> Or is BSD so hard to update these days ?
>
> Not really - but it some other places that need updating in order
> to make this useful for cross-platform tools (like tcpdump).
>
> The 'real fun (tm)' happens when NetBSD tries to run Linux binaries
> that include the Linux libpcap.
Correct me if I'm wrong, but if you want to run the _Linux_ version of
libpcap, then you would also need PF_PACKET's RX_RING API in NetBSD.
Otherwise, it doesn't run either. Probably then this BPF instruction
is the smaller problem for NetBSD.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [tcpdump-workers] Modular arithmetic
2012-09-10 8:41 ` [tcpdump-workers] Modular arithmetic David Laight
2012-09-10 9:25 ` Eric Dumazet
@ 2012-09-10 14:49 ` Andi Kleen
1 sibling, 0 replies; 13+ messages in thread
From: Andi Kleen @ 2012-09-10 14:49 UTC (permalink / raw)
To: David Laight; +Cc: George Bakos, tcpdump-workers, Jay Schulist, netdev
> What about the other OS - eg all the BSDs?
> I had a vague idea that BPF was supposed to be reasonable portable.
Linux already has a variety of BPF extensions I believe.
But most of them were not targetted for tcpdump, but for other tools.
-Andi
--
ak@linux.intel.com -- Speaking for myself only
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Modular arithmetic
2012-09-10 10:41 ` David Laight
2012-09-10 11:49 ` [tcpdump-workers] " Daniel Borkmann
@ 2012-09-10 17:50 ` Guy Harris
2014-05-18 18:26 ` Guy Harris
1 sibling, 1 reply; 13+ messages in thread
From: Guy Harris @ 2012-09-10 17:50 UTC (permalink / raw)
To: David Laight
Cc: netdev, Jay Schulist, Andi Kleen, tcpdump-workers, Eric Dumazet
On Sep 10, 2012, at 3:41 AM, "David Laight" <David.Laight@ACULAB.COM> wrote:
>>> What about the other OS - eg all the BSDs?
>>> I had a vague idea that BPF was supposed to be reasonable portable.
>>
>> Yes, does it mean BPF is frozen ?
>>
>> Or is BSD so hard to update these days ?
>
> Not really - but it some other places that need updating in order
> to make this useful for cross-platform tools (like tcpdump).
>
> The 'real fun (tm)' happens when NetBSD tries to run Linux binaries
> that include the Linux libpcap.
Additional fun happens when a Linux system with a kernel that doesn't have the mod instruction tries to run Linux binaries that include a Linux libpcap that generates code using the mod instruction; this is not a BSD-vs.-Linux issue, it's a "kernel that lacks the mod instruction vs. libpcap that generates code that includes the mod instruction" issue.
BSD/OS X, Linux, Solaris, and the WinPcap driver need, if they adopt new BPF instructions, to have a mechanism by which libpcap (or anything else using BPF filtering) can inquire about the capabilities of the OS BPF interpreter; libpcap would use that to determine what code to generate if generating code for the in-kernel BPF interpreter.
(Please reply to tcpdump-workers@lists.tcpdump.org as well as to netdev@vger.kernel.org, so that people not on both of those lists can follow the discussion. Messages from non-members of tcpdump-workers to tcpdump-workers shouldn't bounce, but they do need to be approved by a moderator; Michael, if you want to at least temporarily turn the flood on for my e-mail address, so I can help moderate, go ahead.)
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next] filter: add MOD operation
2012-09-08 8:03 ` [PATCH net-next] filter: add MOD operation Eric Dumazet
2012-09-08 20:31 ` George Bakos
@ 2012-09-10 19:45 ` David Miller
2012-09-10 20:48 ` [PATCH net-next] x86 bpf_jit: support " Eric Dumazet
1 sibling, 1 reply; 13+ messages in thread
From: David Miller @ 2012-09-10 19:45 UTC (permalink / raw)
To: eric.dumazet; +Cc: ak, gbakos, jschlst, netdev
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Sat, 08 Sep 2012 10:03:35 +0200
> From: Eric Dumazet <edumazet@google.com>
...
> [PATCH net-next] filter: add MOD operation
>
> Add a new ALU opcode, to compute a modulus.
>
> Commit ffe06c17afbbb used an ancillary to implement XOR_X,
> but here we reserve one of the available ALU opcode to implement both
> MOD_X and MOD_K
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> Suggested-by: George Bakos <gbakos@alpinista.org>
> Cc: Jay Schulist <jschlst@samba.org>
> Cc: Jiri Pirko <jpirko@redhat.com>
> Cc: Andi Kleen <ak@linux.intel.com>
Applied to net-next, thanks.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next] x86 bpf_jit: support MOD operation
2012-09-10 19:45 ` David Miller
@ 2012-09-10 20:48 ` Eric Dumazet
2012-09-10 21:09 ` David Miller
0 siblings, 1 reply; 13+ messages in thread
From: Eric Dumazet @ 2012-09-10 20:48 UTC (permalink / raw)
To: David Miller; +Cc: ak, gbakos, netdev
From: Eric Dumazet <edumazet@google.com>
commit b6069a9570 (filter: add MOD operation) added generic
support for modulus operation in BPF.
This patch brings JIT support for x86_64
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: George Bakos <gbakos@alpinista.org>
---
arch/x86/net/bpf_jit_comp.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 33643a8..106c578 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -280,6 +280,31 @@ void bpf_jit_compile(struct sk_filter *fp)
}
EMIT4(0x31, 0xd2, 0xf7, 0xf3); /* xor %edx,%edx; div %ebx */
break;
+ case BPF_S_ALU_MOD_X: /* A %= X; */
+ seen |= SEEN_XREG;
+ EMIT2(0x85, 0xdb); /* test %ebx,%ebx */
+ if (pc_ret0 > 0) {
+ /* addrs[pc_ret0 - 1] is start address of target
+ * (addrs[i] - 6) is the address following this jmp
+ * ("xor %edx,%edx; div %ebx;mov %edx,%eax" being 6 bytes long)
+ */
+ EMIT_COND_JMP(X86_JE, addrs[pc_ret0 - 1] -
+ (addrs[i] - 6));
+ } else {
+ EMIT_COND_JMP(X86_JNE, 2 + 5);
+ CLEAR_A();
+ EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 6)); /* jmp .+off32 */
+ }
+ EMIT2(0x31, 0xd2); /* xor %edx,%edx */
+ EMIT2(0xf7, 0xf3); /* div %ebx */
+ EMIT2(0x89, 0xd0); /* mov %edx,%eax */
+ break;
+ case BPF_S_ALU_MOD_K: /* A %= K; */
+ EMIT2(0x31, 0xd2); /* xor %edx,%edx */
+ EMIT1(0xb9);EMIT(K, 4); /* mov imm32,%ecx */
+ EMIT2(0xf7, 0xf1); /* div %ecx */
+ EMIT2(0x89, 0xd0); /* mov %edx,%eax */
+ break;
case BPF_S_ALU_DIV_K: /* A = reciprocal_divide(A, K); */
EMIT3(0x48, 0x69, 0xc0); /* imul imm32,%rax,%rax */
EMIT(K, 4);
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH net-next] x86 bpf_jit: support MOD operation
2012-09-10 20:48 ` [PATCH net-next] x86 bpf_jit: support " Eric Dumazet
@ 2012-09-10 21:09 ` David Miller
0 siblings, 0 replies; 13+ messages in thread
From: David Miller @ 2012-09-10 21:09 UTC (permalink / raw)
To: eric.dumazet; +Cc: ak, gbakos, netdev
From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 10 Sep 2012 22:48:33 +0200
> From: Eric Dumazet <edumazet@google.com>
>
> commit b6069a9570 (filter: add MOD operation) added generic
> support for modulus operation in BPF.
>
> This patch brings JIT support for x86_64
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied, thanks Eric.
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Modular arithmetic
2012-09-10 17:50 ` Guy Harris
@ 2014-05-18 18:26 ` Guy Harris
0 siblings, 0 replies; 13+ messages in thread
From: Guy Harris @ 2014-05-18 18:26 UTC (permalink / raw)
To: Guy Harris
Cc: Andi Kleen, Eric Dumazet, netdev, tcpdump-workers, Jay Schulist
On Sep 10, 2012, at 10:50 AM, Guy Harris <guy@alum.mit.edu> wrote:
>
> On Sep 10, 2012, at 3:41 AM, "David Laight" <David.Laight@ACULAB.COM> wrote:
>
>>>> What about the other OS - eg all the BSDs?
>>>> I had a vague idea that BPF was supposed to be reasonable portable.
>>>
>>> Yes, does it mean BPF is frozen ?
>>>
>>> Or is BSD so hard to update these days ?
>>
>> Not really - but it some other places that need updating in order
>> to make this useful for cross-platform tools (like tcpdump).
>>
>> The 'real fun (tm)' happens when NetBSD tries to run Linux binaries
>> that include the Linux libpcap.
>
> Additional fun happens when a Linux system with a kernel that doesn't have the mod instruction tries to run Linux binaries that include a Linux libpcap that generates code using the mod instruction; this is not a BSD-vs.-Linux issue, it's a "kernel that lacks the mod instruction vs. libpcap that generates code that includes the mod instruction" issue.
>
> BSD/OS X, Linux, Solaris, and the WinPcap driver need, if they adopt new BPF instructions, to have a mechanism by which libpcap (or anything else using BPF filtering) can inquire about the capabilities of the OS BPF interpreter; libpcap would use that to determine what code to generate if generating code for the in-kernel BPF interpreter.
In this particular case, there's no choice about what to generate - either you have mod and XOR instructions or you don't.
Furthermore, if the kernel rejects a particular BPF program, libpcap just falls back on filtering in userland, so we can support % and ^ operators in libpcap on all platforms, albeit with a performance hit on Linux prior to 3.7 and, currently, on other platforms. I don't think there's anything inherently troublesome about BPF_MOD and BPF_XOR, so I'll file bugs against the various BSDs and OS X suggesting that they be added.
So I've checked in a change to libpcap to implement BPF_MOD and BPF_XOR and to add % and ^ operators (yes, the same zero-divide checks in bpf_validate() done for BPF_DIV are done for BPF_MOD, and the optimizer was updated to handle BPF_MOD like BPF_DIV and to handle BPF_XOR like BPF_OR). The pcap-filter man page documents it, but warns that filters using them might be run in userland on pre-3.7 Linux and non-Linux platforms.
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2014-05-18 18:26 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20120905213941.03c85968@arrowsmith>
[not found] ` <C71A36A8-08D2-4D3D-AF2B-EF89FEECE1A6@alum.mit.edu>
[not found] ` <20120906073615.693d14e0@arrowsmith>
[not found] ` <46AB14E3-73F4-41FA-8086-F1D663AF4549@alum.mit.edu>
[not found] ` <20120907074910.2df46817@arrowsmith>
2012-09-08 3:03 ` [tcpdump-workers] Modular arithmetic Andi Kleen
2012-09-08 8:03 ` [PATCH net-next] filter: add MOD operation Eric Dumazet
2012-09-08 20:31 ` George Bakos
2012-09-10 19:45 ` David Miller
2012-09-10 20:48 ` [PATCH net-next] x86 bpf_jit: support " Eric Dumazet
2012-09-10 21:09 ` David Miller
2012-09-10 8:41 ` [tcpdump-workers] Modular arithmetic David Laight
2012-09-10 9:25 ` Eric Dumazet
2012-09-10 10:41 ` David Laight
2012-09-10 11:49 ` [tcpdump-workers] " Daniel Borkmann
2012-09-10 17:50 ` Guy Harris
2014-05-18 18:26 ` Guy Harris
2012-09-10 14:49 ` [tcpdump-workers] " Andi Kleen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).