在bpf过滤器中,双与号有什么作用?

问题描述

我正在阅读linux内核中的bpf(伯克利数据包过滤器)核心部分,在以下内容中我有些困惑。
这是代码的一部分:

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 ++,不是吗?

非常感谢您的帮助!

解决方法

即使这是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中有更多信息(除非您知道所要查找的内容,否则几乎找不到)。

,

请参阅此文档。

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

它喜欢gcc非标准语法。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...