Re: Multiple Fibs and INET6

From: Santiago Martinez <sm_at_codenetworks.net>
Date: Thu, 18 Jul 2024 17:23:53 UTC
Indeed, ping does work if I ping the "fe80::1%lo1" on FIB 1, which is 
correct.

My script was getting the address from the routing table output (F1) 
which is returning "%lo0" instead of the correct loopback number (lo6 in 
my case) and as a result it was failing.

The routing table should return the correct loop-back interface instead 
of lo0. Not sure how difficult or easy it, i will take a look ( ENOCLUE).

Best regards.

Santi


On 7/18/24 18:15, Zhenlei Huang wrote:
>
>
>> On Jul 19, 2024, at 12:11 AM, Santiago Martinez <sm@codenetworks.net> 
>> wrote:
>>
>> Interesting, I'm running 14.1p2.
>>
>>
>
> Yes, I'm running exactly the same version with you.
>>
>> how does your routing table looks for fib1 ?
>>
>>
>
> ```
> # netstat -6rnF 1
> Routing tables (fib: 1)
>
> Internet6:
> Destination                       Gateway     Flags     Netif Expire
> fe80::%lo1/64                     link#5      U           lo1
> fe80::1%lo0                       link#2      UHS         lo0
> ```
>>
>> Santi
>>
>>
>> On 7/18/24 18:09, Zhenlei Huang wrote:
>>>
>>>
>>>> On Jul 13, 2024, at 1:06 AM, Santiago Martinez 
>>>> <sm@codenetworks.net> wrote:
>>>>
>>>> Hi Everyone.
>>>>
>>>> While adding -F ( fib as used in netstat ) to ping and ping6 I have 
>>>> found something that from my understanding is not correct.
>>>> Please can you advise?
>>>>
>>>> I have the following setup :
>>>>
>>>> -- two fibs (0 and 1)
>>>> -- two  loop-backs (lo0 and lo1).
>>>> -- Lo1 has been assigned to fib1
>>>> --net.add_addr_allfibs = 0
>>>>
>>>> My interface output looks like this:
>>>>
>>>>
>>>> ifconfig lo0 | grep inet6
>>>>        inet6 ::1 prefixlen 128
>>>>        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
>>>>
>>>> ifconfig lo1 | grep inet6
>>>>        inet6 fe80::1%lo1 prefixlen 64 scopeid 0x3
>>>>
>>>> If I do a netstat -rn -6  -F0 I get the following which is was i 
>>>> expected.
>>>>
>>>> Internet6:
>>>> Destination                       Gateway 
>>>>                       Flags     Netif Expire
>>>> ::/96                             link#2                        URS 
>>>>         lo0
>>>> ::1                               link#2                        UHS 
>>>>         lo0
>>>> ::ffff:0.0.0.0/96                 link#2                        URS 
>>>>         lo0
>>>> fe80::%lo0/10                     link#2                        URS 
>>>>         lo0
>>>> fe80::%lo0/64                     link#2                        U 
>>>>           lo0
>>>> fe80::1%lo0                       link#2                        UHS 
>>>>         lo0
>>>> ff02::/16                         link#2                        URS 
>>>>         lo0
>>>>
>>>> Now,  netstat -rn -6  -F1 shows  "fe80::1%lo0" which should not be 
>>>> there and "fe80::1%lo1" is missing which should be there.
>>>>
>>>> Internet6:
>>>> Destination                       Gateway 
>>>>                       Flags     Netif Expire
>>>> fe80::%lo1/64                     link#3                        U 
>>>>           lo1
>>>> *fe80::1%lo0                       link#2 
>>>>                        UHS         lo0*
>>>>
>>> That seems wrong from my first glance. IIRC, there's HACK ( I'd 
>>> prefer this ) for loopback route. For example
>>> ```
>>> # sysctl net.fibs=3
>>> net.fibs: 2 -> 3
>>> # ifconfig epair create
>>> # epair0a
>>> # ifconfig epair0a fib 2
>>> # ifconfig epair0a inet6 -ifdisabled up
>>> # netstat -6rnF 2
>>> Routing tables (fib: 2)
>>>
>>> Internet6:
>>> Destination                       Gateway     Flags     Netif Expire
>>> fe80::%epair0a/64                 link#5                        U   
>>>     epair0a
>>> fe80::3b:b3ff:fe8f:9a0a%lo0       link#1                        UHS lo0
>>> ```
>>>
>>> The loopback route always refer the first loop interface, aka lo0.
>>>>
>>>>
>>>> What output I was expecting was:
>>>>
>>>> Internet6:
>>>> Destination                       Gateway 
>>>>                       Flags     Netif Expire
>>>> fe80::%lo1/64                     link#3                        U 
>>>>           lo1
>>>> *fe80::1%lo1                       link#3                        
>>>> UHS         lo1*
>>>>
>>>>
>>>> This makes the ping -6 -F0 fe80::1%lo0  to work but ping -6 -F1 
>>>> fe80::1%l01 to fail which I wanted to use as test case.
>>>>
>>> That is interesting. I can ping without failure.
>>>
>>> ```
>>> # setfib 1 ping6 -c3 fe80::1%lo1
>>> PING(56=40+8+8 bytes) fe80::1%lo1 --> fe80::1%lo1
>>> 16 bytes from fe80::1%lo1, icmp_seq=0 hlim=64 time=0.050 ms
>>> 16 bytes from fe80::1%lo1, icmp_seq=1 hlim=64 time=0.067 ms
>>> 16 bytes from fe80::1%lo1, icmp_seq=2 hlim=64 time=0.096 ms
>>>
>>> --- fe80::1%lo1 ping statistics ---
>>> 3 packets transmitted, 3 packets received, 0.0% packet loss
>>> round-trip min/avg/max/stddev = 0.050/0.071/0.096/0.019 ms
>>> ```
>>>
>>> Best regards,
>>> Zhenlei
>>>
>>>>
>>>> Thanks in advance.
>>>>
>>>> Santiago
>>>>
>>>>
>>>
>>>
>>>
>
>
>