4

我正在查看ebpf验证程序代码,但无法理解以下宏:

#define offsetof(TYPE, MEMBER)  ((size_t)&((TYPE *)0)->MEMBER)
#define offsetofend(TYPE, MEMBER) \
    (offsetof(TYPE, MEMBER) + sizeof(((TYPE *)0)->MEMBER))

<...>

#define bpf_ctx_range(TYPE, MEMBER)                     \
    offsetof(TYPE, MEMBER) ... offsetofend(TYPE, MEMBER) - 1
#define bpf_ctx_range_till(TYPE, MEMBER1, MEMBER2)              \
    offsetof(TYPE, MEMBER1) ... offsetofend(TYPE, MEMBER2) - 1

我理解offsetofoffsetofend宏,但是什么...意思?

谢谢。

4

1 回答 1

4

看看它是如何使用的filter.c

    case bpf_ctx_range(struct __sk_buff, data):

这是 GCC 的案例范围扩展(clang 也支持)。有了它,单个 case 语句可以匹配一系列值,例如case 0 ... 5:. 这里有更多信息:

https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html

于 2018-02-27T15:23:48.450 回答