eBPF: понять два макроса в коде верификатора

Я смотрю в код верификатора 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

Я понимаю макросы offsetof и offsetofend, но что означает ...?

Спасибо.


person Mark    schedule 27.02.2018    source источник


Ответы (1)


Посмотрите, как это используется в filter.c:

    case bpf_ctx_range(struct __sk_buff, data):

Это расширение case range GCC (оно также поддерживается clang). С его помощью один оператор case может соответствовать диапазону значений, например case 0 ... 5:. Здесь больше информации:

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

person Mike Andrews    schedule 27.02.2018
comment
Большое спасибо за разъяснения. - person Mark; 27.02.2018