Linux 5内核中dst_entry的input与output函数指针作用问询
问题确认
首先你对Linux 2.x版本dst_entry两个函数指针的理解完全正确:2.x内核的路由缓存支持双向复用,当出方向判定报文目标为本地时,会将对应rtable的output指针设为ip_output、input指针设为ip_local_deliver,报文loopback进入入方向流程时可直接复用该缓存条目调用input,避免二次路由查找。
5.x内核保留input/output指针的核心原因
即便当前IPv4单播路由已经拆分了nhc_pcpu_rth_output(egress缓存)和nhc_rth_input(ingress缓存),两个指针依然有不可替代的作用,核心场景包括:
- 多协议兼容需求:
dst_entry是所有三层协议的通用路由抽象,不止服务于IPv4单播路由,IPv6、MPLS、XFRM(IPsec)等协议的路径逻辑依然存在双向调用需求。比如IPsec隧道解封装场景,入方向拿到的dst条目在解封装后如果判定需要转发,可直接调用output指针完成出方向处理,无需重新查路由。 - 特殊路径优化:loopback接口流量、tun/tap虚拟设备流量、netfilter重定向(REDIRECT/DNAT到本地)等场景下,报文会在同一条路径上切换转发方向。比如出方向的报文被netfilter规则重定向到本地监听端口,无需重新查入方向路由,直接调用当前dst的
input指针即可完成本地投递,大幅降低处理开销。 - eBPF扩展场景:eBPF程序对报文路径做修改时(比如
bpf_redirect接口转发、eBPF自定义路由转发逻辑),可直接复用已持有dst的input/output指针完成报文处理,无需重新发起路由查找,满足高转发性能要求。 - 分层抽象设计要求:
input/output是dst_entry抽象定义的标准执行入口,整个网络栈的转发逻辑通过这两个统一指针调用,无需适配不同三层协议的私有处理函数,大幅简化了网络栈的代码结构,降低了扩展新协议的成本。
内容的提问来源于stack exchange,提问作者user42768
相关产品推荐
相关产品推荐

