我试图使用eBPF内核程序对出口包产生延迟确认。我正在使用密件抄送运行python+c程序。我尝试了用delay.h函数来实现mdelay.h函数的mdelay.h函数,给出了“程序使用外部函数无法解决”的LLVM错误。
然后,我尝试实现睡眠功能:接受3个变量: tprev (在启动prog时获得当前时间)tnow(当循环启动时获得当前时间,并在每次迭代中获得当前时间的更新)定时器:这是我们希望程序延迟的持续时间。that循环是: while (( tprev)≤定时器),但是ebpf将其视为n个无限循环,并给出了检测到的无限循环的误差。而不是无限循环。
是否有一种方法在Ack中引入延迟,或者在eBPF程序中引入一般的延迟?
发布于 2022-06-09 12:29:54
简短的回答是“否”(不在eBPF中)。至少在5.18内核中没有。这是因为eBPF程序,特别是在网络堆栈中运行的程序,通常是从不应该休眠的代码中调用的。
在您的情况下,最有用的可能是TC (流量控制)程序可以要求TC为您延迟数据包。实际的延迟发生在eBPF程序之外的TC子系统中。您可以通过设置__sk_buff->tstamp请求TC在给定时间发送数据包。注意:这只适用于母线(传出)通信量,而不适用于进入(内开)通信量。这种行为也可以通过TC配置触发,而无需使用eBPF。
尝试使用delay.h库实现mdelay.h等函数,给出了“程序使用外部函数无法解决”的LLVM错误。
是的,您不能在eBPF程序中使用stdlib,因为它们使用eBPF中不可用的内核工具。
边注:
我们确实有“睡眠”程序,但是只有syscall、LSM和跟踪程序才能入睡。。“睡眠”并不意味着我们可以调用具有持续时间的某种睡眠助手,它意味着我们可以调用助手函数,这些函数反过来可能会休眠(例如,堆栈)。所以你不能控制程序的睡眠时间。
另一个与时间相关的特性是BPF定时器,它允许您设置定时器并在给定时间后执行回调。这里的限制是您不能向这个回调传递任何参数,而且它是在没有上下文的情况下调用的。因此,在设置定时器后,原始程序将继续并像往常一样返回。
https://stackoverflow.com/questions/72554292
复制相似问题