bpf 过滤器中的双符号有什么作用?
What does double ampersand do in bpf filter?
我正在阅读 linux 内核中的 bpf(berkeley packet filter) 核心部分,但我对以下内容有点困惑。
这是代码的一部分:
static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,
u64 *stack)
{
u64 tmp;
static const void *jumptable[256] = {
[0 ... 255] = &&default_label,
/* Now overwrite non-defaults ... */
/* 32 bit ALU operations */
[BPF_ALU | BPF_ADD | BPF_X] = &&ALU_ADD_X,
[BPF_ALU | BPF_ADD | BPF_K] = &&ALU_ADD_K,
[BPF_ALU | BPF_SUB | BPF_X] = &&ALU_SUB_X,
[BPF_ALU | BPF_SUB | BPF_K] = &&ALU_SUB_K,
所以,我想知道的是双符号的作用。我已经知道 C++ 中的右值引用,但它是 C,而不是 C++,不是吗?
非常感谢您的帮助!
查看此文档。
http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
它喜欢 gcc non-standard 语法。
即使这是 C++,&&ALU_ADD_X
等也是表达式,而不是类型,因此 &&
不能表示右值引用。
如果向下滚动一点,您会发现所有 ALU_*
和 default_label
都是标签。
您还会找到一个 goto *jumptable[op];
,其中 op
是一个数字。
GCC 有一个扩展,您可以在其中将标签的“地址”作为值并将其用作 goto
的目标。
&&
是产生这样一个值的运算符。
一个较短的例子:
void example()
{
void* where = test_stuff() ? &&here : &&there;
goto *where;
here:
do_something();
return;
there:
do_something_else();
}
the documentation 中有更多信息(除非您知道自己在寻找什么,否则几乎不可能找到)。
我正在阅读 linux 内核中的 bpf(berkeley packet filter) 核心部分,但我对以下内容有点困惑。
这是代码的一部分:
static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,
u64 *stack)
{
u64 tmp;
static const void *jumptable[256] = {
[0 ... 255] = &&default_label,
/* Now overwrite non-defaults ... */
/* 32 bit ALU operations */
[BPF_ALU | BPF_ADD | BPF_X] = &&ALU_ADD_X,
[BPF_ALU | BPF_ADD | BPF_K] = &&ALU_ADD_K,
[BPF_ALU | BPF_SUB | BPF_X] = &&ALU_SUB_X,
[BPF_ALU | BPF_SUB | BPF_K] = &&ALU_SUB_K,
所以,我想知道的是双符号的作用。我已经知道 C++ 中的右值引用,但它是 C,而不是 C++,不是吗?
非常感谢您的帮助!
查看此文档。
http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
它喜欢 gcc non-standard 语法。
即使这是 C++,&&ALU_ADD_X
等也是表达式,而不是类型,因此 &&
不能表示右值引用。
如果向下滚动一点,您会发现所有 ALU_*
和 default_label
都是标签。
您还会找到一个 goto *jumptable[op];
,其中 op
是一个数字。
GCC 有一个扩展,您可以在其中将标签的“地址”作为值并将其用作 goto
的目标。
&&
是产生这样一个值的运算符。
一个较短的例子:
void example()
{
void* where = test_stuff() ? &&here : &&there;
goto *where;
here:
do_something();
return;
there:
do_something_else();
}
the documentation 中有更多信息(除非您知道自己在寻找什么,否则几乎不可能找到)。