宏是 C 语言中最强大的语言特性,能够用来简化 eBPF 的 C 代码;毕竟 eBPF 的 C 代码是一种语法、语义都受限的 C 代码,不能像普通 C 代码那样“肆意妄为”。
写法一:带有返回值的多行宏
常见的宏定义是常量定义,如 #define VXLAN_PORT 4789
。可是如果在宏定义中包含有 if
条件判断,该如何编写该宏定义呢?不使用函数来实现,是因为函数需要带上类型,而宏定义则不需要参数的类型。
#define GET_TOS(sip, pod) \
({ \
__u8 tos; \
if (USE_TOS) \
tos = POD_TOS; \
else \
tos = __get_pod_tos(sip, pod); \
\
tos; \
})
如上代码片段,使用 ({})
包裹多行代码,且在第一行声明返回值、在最后一行提供返回值。
参考 BPF_CORE_READ
的宏定义:
#define BPF_CORE_READ(sr