TGTGInsighttelegram intelligenceLIVE / telegram public index
Post content
Post content
bpf map 的数据 expiration 一直很困扰我. 比如我用 XDP + TC 实现了一个 ICMP SNAT, 其中最重要的一步就是维护状态, icmp echo出去的时候记录 (icmp id, dst ipv4) -> (src ipv4) 这条映射, icmp reply 回来的时候查一下 bpf hash 才能找到原始 src ipv4. 那么问题来了, 记录在 map 里的数据多久 expire? 像我这么懒得思考的直接照抄内核参数 net.netfilter.nf_conntrack_tcp_timeout_established = 432000, 默认 5 天, 我知道这是 TCP SNAT 的, 不重要, 重要的是, 怎么实现计时器? 在用户态轮询 map 当然可以, 但是太愚蠢了, 能不能远离中世纪, 30 多年前的人类都已经不再用轮询的方式等事件了啊. 那就用一个额外的 ring buf 事件通知用户态 start / refresh 计时器来避免轮询, 但是这个额外的 daemon 也非常不美好. 你能想象 TCP 四大计时器跑在用户态吗? 我连想都不敢想. 更何况 ring buf 事件的丢失也总是带来惊喜. 搜了一下 bpf timer, 有几个 patch 都是试图在内核态注册 timer 和回调, 正是我想要的, 但是似乎都没有合并. 也不知道当前状态下有没有什么更好的办法.