IPv6 Source selection is a mess!
> ICMP6 messages
> are generated with a source of, I think, the local address associated with
> the route to the recipient,
It is not that simple. Look at in6_ifawithscope() in sys/netinet6/in6.c.
/*
* At this point, we have two cases:
* 1. we are looking at a non-deprecated address,
* and ia6_best is also non-deprecated.
* 2. we are looking at a deprecated address,
* and ia6_best is also deprecated.
* Also, we do not have to consider a case where
* the scope of if_best is larger(smaller) than dst and
* the scope of the current address is smaller(larger)
* than dst. Such a case has already been covered.
* Tiebreaking is done according to the following
* items:
* - the scope comparison between the address and
* dst (dscopecmp)
* - the scope comparison between the address and
* ia6_best (bscopecmp)
* - if the address match dst longer than ia6_best
* (matchcmp)
* - if the address is on the outgoing I/F (outI/F)
*
* Roughly speaking, the selection policy is
* - the most important item is scope. The same scope
* is best. Then search for a larger scope.
* Smaller scopes are the last resort.
* - A deprecated address is chosen only when we have
* no address that has an enough scope, but is
* prefered to any addresses of smaller scopes.
* - Longest address match against dst is considered
* only for addresses that has the same scope of dst.
* - If there is no other reasons to choose one,
* addresses on the outgoing I/F are preferred.
*
* The precise decision table is as follows:
* dscopecmp bscopecmp matchcmp outI/F | replace?
* !equal equal N/A Yes | Yes (1)
* !equal equal N/A No | No (2)
* larger larger N/A N/A | No (3)
* larger smaller N/A N/A | Yes (4)
* smaller larger N/A N/A | Yes (5)
* smaller smaller N/A N/A | No (6)
* equal smaller N/A N/A | Yes (7)
* equal larger (already done)
* equal equal larger N/A | Yes (8)
* equal equal smaller N/A | No (9)
* equal equal equal Yes | Yes (a)
* equal equal equal No | No (b)
*/
Could you provide your ifconfig and route output? So we could
figure out into which path of this algorith you are running.
Once I have have added the following rule from a newer RFC. It
makes things better for many caes, but not with OSPF6. There you
may have an interface with only link-local addresses. Then this
link-local is used instead of another better scoped one.
/* RFC 3484 5. Rule 5: Prefer outgoing interface */
> 4 2001:728:0:5000::55 7.843 ms 8.236 ms 7.391 ms
How can this work? Does your AS-Boundary Router do NAT?
> What's anyone else doing? Just living with it or has anyone figured a way
> to make it nicer? I'd like to reply with either a global scope address for
> the interface, or a loopback address,
We have implemented more or less a very old RFC. There are two
newer RFCs with different algorithms. There is recommendation to
store policies from user-land into the kernel for address selection.
I have just looked at FreeBSD in6_ifawithifp(), it is quite simple.
Perhaps this is a way to go.
> I didn't get anywhere with PF
> translation though.
pf with IPv6 link-local addresses does not work properly. I think
it cannot parse the %if suffixes. The KAME hack scope id is not
handled.
bluhm