funny ECMP

Ingo Flaschberger if at xip.at
Tue Aug 24 00:33:06 UTC 2010


Dear Li,

nice to hear from you.

1st: i have send in a bugfix:
http://www.freebsd.org/cgi/query-pr.cgi?pr=149917

>>
>> I have changed the route selection code of ecmp to
>> balance only between routes of the same weight.
>> (see attached file)
>
>> As Qing Li mentioned months ago, there are problems with static routes
>> and interfaces.
>>
>
>  Do you have the exact link to the email thread?
>  There were no pending ECMP related issues since my last round of
> commits
>  as far as I can remember.

http://lists.freebsd.org/pipermail/freebsd-net/2010-January/024420.html
http://lists.freebsd.org/pipermail/freebsd-net/2010-February/024539.html

>> Example 1:
>> ifconfig em1 alias 10.13.13.90/24
>>  	ping 10.13.13.95 ok
>> route add 10.13.13.0/24 10.11.11.1 -weight 2
>>  	ping 10.13.13.95 broken (arpresolve: can't allocate llinfo for
>>  				10.13.13.95)
>>
>
>  Could you please explain a bit on exactly what you try to
>  accomplish here with this configuration?

rebuilding my core-routers.
it's a very special setup:

2 redundat core routers, connected via ospf (quagga),
vrrp to server-side.
currently I use a very modfied ucarp version because freebsd 6 only allows 
on route.
problem is with standard freebsd and carp, that there is at the failover 
router a via ospf received route 
to the server-side interface. when now carp tries to add the route during 
failover, it fails. and seconds later the ospf route times out.

so, i hoped to use carp, quagga and freebsd ecmp to be able to avoid this 
problems now.
so I need route-merics (weights?) to prefer direct interface routes 
(connected) before static ones.
perhaps I also need to change quagga to send also the merics to the 
kernel, as in differnce to, for example, cisco router, connected and 
static routes have the same weight.

>> deleting the last static multipath routes seems to affect?, destroy?
>> the interface route.
>> system crashes in:
>> /usr/src/sys/net/route.c:370
>>          rn = rnh->rnh_matchaddr(dst, rnh);
>>          if (rn && ((rn->rn_flags & RNF_ROOT) == 0)) {
>>                  newrt = rt = RNTORT(rn);
>> here ->         RT_LOCK(newrt);
>>                  RT_ADDREF(newrt);
>>                  if (needlock)
>>
>
>  I will take a look.

thanks.

Kind regards,
 	Ingo Flaschberger



More information about the freebsd-net mailing list