Re: interface metric & quagga
- From: Eugene Grosbein <eugen@xxxxxxxxxxxxxxxxxxxxxxx>
- Date: Sat, 27 Jan 2007 16:48:29 +0700
On Fri, Jan 26, 2007 at 06:38:53PM +0000, Bruce M. Simpson wrote:
RTM_NEWADDR contains 'metric 0' regardless of interface metric
value set with ifconfig before. quagga, since version 0.99.3,
takes metric value from RTM_NEWADDR message and this value overrides
right interface metric learned by quagga a milisecond before.
Then it passes zero interface metric to ripd that uses interface
metric as hop count increment for RIP-learned routes.
This effectively breaks RIPv2 for FreeBSD (quagga-0.99.2 and older
versions do not use metric from RTM_NEWADDR and work), perhaps RIPv1 too.
It's a mixed issue.
FreeBSD does not use the interface metric, so routing daemons shouldn't
use that field.
However, many routing implementations use a metric or distance of 0 to
indicate a directly-connected route or interface route, so it has
special meaning.
We could deal with this situation better by explicitly setting the
metric to an invalid value.
Quagga checks if metric is zero and changes zero to one for itself
in first place. Sadly, it does not perform such sanity check
in second place, when it processes RTM_NEWADDR.
If/when we implemented equal-cost multipath, or source address selection
policies, then we should use this field.
Verified with RELENG_4 and RELENG_6.I'd rewrite the patch to wrap the assignment in #ifndef __FreeBSD__ so
Is it kernel bug or quagga bug?
I also suggest to include next patch to the Ports tree
if no objections. It restores RIP support.
that it can be taken upstream more easily. If/when we do equal-cost
multipath or source policy we can bump __FreeBSD_version.
Here is version that does not need #ifndef __FreeBSD__
Now (ifam->ifam_metric) is always zero for all FreeBSD versions.
--- zebra/kernel_socket.c.orig Fri Jan 26 10:55:03 2007
+++ zebra/kernel_socket.c Fri Jan 26 10:55:35 2007
@@ -585,6 +585,7 @@
if (ifnlen && strncmp (ifp->name, ifname, INTERFACE_NAMSIZ))
isalias = 1;
+ if (ifam->ifam_metric)
ifp->metric = ifam->ifam_metric;
/* Add connected address. */
I currently run this patch in production for relatively large RIPv2 network
of FreeBSD routers (versions 4.11 and 6.x).
Eugene Grosbein
_______________________________________________
freebsd-net@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe@xxxxxxxxxxx"
- References:
- interface metric & quagga
- From: Eugene Grosbein
- Re: interface metric & quagga
- From: Bruce M. Simpson
- interface metric & quagga
- Prev by Date: Re: About NAT Traversal
- Next by Date: Re: Re[2]: reproducible watchdog timeout in bge
- Previous by thread: Re: interface metric & quagga
- Next by thread: About NAT Traversal
- Index(es):
Relevant Pages
|