【问题标题】:How to tell where linux kernel is parsing MLD joins on tuntap interface?如何判断 linux 内核在哪里解析 tuntap 接口上的 MLD 连接?
【发布时间】:2020-01-27 01:23:42
【问题描述】:

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

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

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

我想弄清楚的是什么在调用 ip6_mc_input。我已经在 elixir 上看了很多可以调用它的东西,但是有很多可能性,因为它是从 rt6_info 结构中的指针调用的,由于很多东西都使用它,因此很难追踪。有谁知道任何可以帮助我搜索的内容?

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

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

【问题讨论】:

    标签: c linux-kernel multicast tun-tap


    【解决方案1】:

    我知道发生了什么。

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

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 1970-01-01
      • 2012-02-22
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2021-08-06
      相关资源
      最近更新 更多