如何判断 linux 内核在哪里解析 tuntap 接口上的 MLD 连接?

How to tell where linux kernel is parsing MLD joins on tuntap interface?

我一直在开发一个程序,该程序在运行于 Linux 内核之上的路由设备上使用 TUNTAP 接口(在 TUN 模式下)。它是一种多播隧道协议,我正在尝试通过我的应用程序将 MLD 连接发送到内核,以便它可以在其他地方接收。然而,即使我已经四重检查了我在接口上发送的数据包,linux 内核在数据包被传递之前就丢弃了它。

我一直在通过 linux 内核跟踪数据包的路径,试图找出它被丢弃的原因,我想我已经在某种程度上弄清楚了为什么它没有被处理。 Hop-by-Hop 选项(包含 MLD 所必需的 Router-Alert 选项)正在 ipv6_rcv 函数的 net/ipv6/ip6_input.c 中被解析,而不是继续在 ipv6_rcv 中处理数据包=26=],数据包被丢弃,因为 ipv6_rcv 函数末尾的 NF_HOOK 以某种方式将数据包解释为正在由其他东西处理。 (NF_STOLEN 而不是 NF_ACCEPT)

一旦 ipv6_rcv 函数完成执行,其他的东西会执行 ip6_mc_input,(仍然在 net/ipv6/ip6_input.c 中)但是从这里开始 Hop-by-Hop 选项不会被处理,这意味着当内核结束处理第 4 层协议时,它无需处理协议,因为 Hop-by-Hop 选项本来是要预先处理的。这意味着内核由于未知协议而丢弃数据包。

我想弄清楚的是调用 ip6_mc_input 的内容。我在 elixir 上看了很多关于它的称呼,但是有很多可能性,因为它是从 rt6_info 结构中的指针调用的,由于有很多东西使用它,所以很难追踪。有谁知道可以帮助我搜索的信息吗?

IGMP 连接工作正常,但 IPv4 内容可能非常相似,因此来自该上下文的信息也可能有帮助。

作为参考,使用的linux内核版本是v4.4.6

我明白是怎么回事了。

使用打印出 ip6_mc_input 调用者文件位置的宏,我发现数据包来自我的 ipt_netmap.c 文件。看起来数据包被 IPTables 接收,而 IPTables 没有被编程来处理跃点选项。原来我设置了一个不需要设置的配置选项,所以禁用它解决了我的问题。