You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:27:03