gpt4 book ai didi

llvm-clang - Linux 的 BPF 程序中允许循环吗?

转载 作者:行者123 更新时间:2023-12-01 23:19:58 28 4
gpt4 key购买 nike

我正在考虑在内核中复制数据包并转发到 5 个主机(单播)的解决方案。计划为其使用 eBPF/XDP。

我试图循环 5 次,在循环内我计划克隆数据包,修改 DST IP 地址,更新 cksum 并在收到的同一个 intf 上发送数据包。

我读到某处循环不能在 XDP 中使用,所以不确定这是否有效?

需要专家的意见请。

最佳答案

2019 年 6 月编辑: 有界循环 现在已经登陆内核,并且是 从 Linux 5.3 开始可用 ( commit )。

原答案:

不,目前 eBPF 程序中不允许循环。后边缘是不允许的,因此内核验证器可以确保程序终止(并且不挂起内核)。

这在 future 可能会改变,因为内核开发人员正在处理 support for bounding loops .

两种可能的解决方法 值得一提。 两者都假设您知道必须“循环”多少次 在编写程序时。

首先,关于功能,后边缘有一个异常(exception)。这意味着您可以拥有函数,并多次调用它们。因此,您可以将通常放在循环中的所有内容放在一个单独的函数中,并根据循环次数调用此函数。

第二件事是您实际上可以在 C 代码中编写循环,并在编译时要求 clang 展开它们。如下所示:

#pragma clang loop unroll(full)
for (i = 0; i < 4; i++) {
/* Do stuff ... */
}

这意味着在生成的目标文件中,函数将被展开,它将被要执行的完整系列指令替换,没有实际的向后跳转。

对于具有任意循环次数的序列,目前没有解决方案。

关于llvm-clang - Linux 的 BPF 程序中允许循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56107380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com