簡體   English   中英

如何判斷 linux 內核在哪里解析 tuntap 接口上的 MLD 連接?

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

我一直在開發一個程序,該程序在運行在 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 中)但從這里開始,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 沒有被編程來處理跳躍選項。 事實證明我有一個不需要設置的配置選項集,所以禁用它為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM