How to set the IPv6 linklocal scope id for an interface?
prabhakar lakhera
prabhakar.lakhera at gmail.com
Thu May 17 22:07:52 UTC 2012
Hi,
Is there any way for the administrator to set an interface's scope if for
link local scope?
I see that in6_domifattach calls scope6_ifattach which sets the interface
local scope and link local scope for the interface equal to the ifp index.
scope6_ifattach(struct ifnet *ifp)
{
.....
.....
/*
* XXX: IPV6_ADDR_SCOPE_xxx macros are not standard.
* Should we rather hardcode here?
*/
sid->s6id_list[IPV6_ADDR_SCOPE_INTFACELOCAL] = ifp->if_index;
sid->s6id_list[IPV6_ADDR_SCOPE_LINKLOCAL] = ifp->if_index;
.....
.....
}
I am trying to avoid the following:
Here's the problem. I have two interfaces A and B on same link. Both learn
RA for the link. One of these is used to add a default route entry in the
routing table. Lets say default router entry for A is picked, we have the
following default route entry:
destination: ::/0
gw: fe80:<A's link local scope id embedded>::<identifier>
route_ifp: A
I used IPv6 address hosted on interface B to send a packet to destination X
and I got back a neighbor redirect from gw destined for B for X.
However the redirect is dropped. Below is the code from
icmp6_redirect_input that fails a check:
2346 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2346>
2347 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2347>
gw6 = &(((struct sockaddr_in6
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=sockaddr_in6>
*)rt <http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=rt>->rt_gateway)->sin6_addr);
2348 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2348>
if (bcmp
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=bcmp>(&src6,
gw6, sizeof(struct in6_addr
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=in6_addr>))
!= 0) {
2349 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2349>
nd6log
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=nd6log>((LOG_ERR
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=LOG_ERR>,
2350 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2350>
*"ICMP6 redirect rejected; "*
2351 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2351>
*"not equal to gw-for-src=%s (must be
same): "*
2352 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2352>
*"%s\n"*,
2353 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2353>
ip6_sprintf
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=ip6_sprintf>(ip6buf,
gw6),
2354 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2354>
icmp6_redirect_diag
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=icmp6_redirect_diag>(&src6,
&reddst6, &redtgt6)));
2355 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2355>
RTFREE_LOCKED
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=RTFREE_LOCKED>(rt
<http://fxr.watson.org/fxr/ident?v=FREEBSD8;im=bigexcerpts;i=rt>);
2356 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2356>
goto bad;
2357 <http://fxr.watson.org/fxr/source/netinet6/icmp6.c?v=FREEBSD8#L2357>
}
src6 is the router's LLA but since it's received on B, it's embedded
with B's link scope embedded id. So we end up comparing:
fe80:<A's link local scope id embedded>::<identifier> with
fe80:<B's link local scope id embedded>::<identifier>
Since ids are different the comparison fails and the redirect is dropped.
More information about the freebsd-net
mailing list