C 如何判断linux内核在tuntap接口上解析MLD连接的位置?

C 如何判断linux内核在tuntap接口上解析MLD连接的位置?,c,linux-kernel,multicast,tun-tap,C,Linux Kernel,Multicast,Tun Tap,我一直在开发一个程序,该程序在Linux内核上运行的路由设备上使用TUNTAP接口(在TUN模式下)。这是一个多播隧道协议,我正试图通过我的应用程序将MLD连接发送到内核,以便它可以在其他地方接收。然而,即使我已经对接口上发送的数据包进行了四次检查,linux内核仍会在数据包传递之前丢弃数据包 乏味的是,我一直在通过linuxkernel跟踪数据包的路径,试图找出它被丢弃的原因,我想我已经在某种程度上找到了它没有被处理的原因。逐跳选项(包含MLD所需的路由器警报选项)正在ipv6_rcv函数的n

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

乏味的是,我一直在通过linuxkernel跟踪数据包的路径,试图找出它被丢弃的原因,我想我已经在某种程度上找到了它没有被处理的原因。逐跳选项(包含MLD所需的路由器警报选项)正在ipv6_rcv函数的net/ipv6/ip6_input.c中解析,但不是继续在ip6_rcv_finish中处理数据包,由于ipv6_rcv函数末尾的NF_钩子以某种方式将数据包解释为正在被其他对象处理,因此数据包被丢弃。(NF_被盗而非NF_接受)

一旦ipv6_rcv函数完成执行,其他程序将执行ip6_mc_输入(在net/ipv6/ip6_input.c中),但从这里不处理逐跳选项,这意味着当内核最终处理第4层协议时,它不需要处理协议,因为逐跳选项是预先处理的。这意味着内核由于未知协议而丢弃数据包

我想弄清楚的是什么叫ip6_mc_输入。我已经在elixir上寻找了很多可以称之为elixir的东西,但是有太多的可能性,因为它是从rt6_信息结构中的指针调用的,因为有太多东西使用它,所以很难跟踪它。有人知道什么能帮我搜索的吗

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


作为参考,目前使用的linux内核版本是v4.4.6,我知道了发生了什么

使用一个宏打印出ip6_mc_输入调用方的文件位置,我发现数据包来自我的ipt_netmap.c文件。看起来数据包是由IPTables获取的,IPTables没有被编程来处理hop选项。结果是我设置了一个配置选项,但不需要设置,所以禁用该选项为我解决了这个问题