Linux VRF 移植遇到的無法綁定VRF interface發送單播數據包問題

起因

系統內核版本3.10.104, 然而VRF的multicast支持在4.4版本纔開始,而且版本之間很多問題也不一樣,後續導致了一些問題。

理解錯誤?

在我的理解中,如果要綁定VRF interface,在發送數據包的時候需要提供ifindex, 也就是真實的接口的ifindex,而不是VRF接口的ifindex.

VRF 作者的pdf
VRF 作者在論壇中回覆

問題

之前的移植,發送廣播的時候沒什麼問題,發送IPv6單播的時候就出現問題了。無法綁定vlan interface,或者VRF interface 發送。 之前的兩個鏈接明確回覆說是VRF可以接收所有路由到這個路由表的數據,但是發送需要通過真實的設備發送。所以綁定VRF 接口無法發送,我覺得可以理解,但是IPv4竟然工作,而且綁定到vlan接口仍然不能發送這個就讓我覺得哪裏出錯了。

解決方案

後來我在rt6_check_dev裏面找到了可以判斷數據來自哪個接口,根據這個來判斷,給這個路由查抄返回1,也可以讓其工作,在接收的地方放過也接收這個數據報文就可以了。 【拙劣的自檢】
還有一種方式,是4.9內核才實現的,4.4內核到現在也沒有同步,不知道爲什麼內核沒有測試出這個問題。就是在數據包要走vrf lookup查找之前,判斷數據報文的目的地址是不是廣播,LINK_LOCAL,組播之類的,也就是rt6_need_strict判斷。

···
struct dst_entry *ip6_route_output_flags(struct net *net, const struct sock *sk,
struct flowi6 *fl6, int flags)
{
bool any_src;

    if (rt6_need_strict(&fl6->daddr)) {
           struct dst_entry *dst;

           dst = l3mdev_link_scope_lookup(net, fl6);
           if (dst)
                   return dst;
    }

···

總結

對於VRF的整體實現,雖然通過匹配代碼方式,馬馬虎虎的讓其工作了,但是由於對這個VRF的整體實現原理,和協議棧的理解不透徹還是存在一些問題的,如果你讓我看代碼找出問題我估計除非我對這兩者再熟悉深入一層,否則還不如對着BUG解決問題。

學而時習之,不亦說乎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章