Subject: Re: gif/gre configuration
To: Greg Troxel <gdt@ir.bbn.com>
From: Chris Ross <cross+netbsd@distal.com>
List: netbsd-users
Date: 03/22/2005 18:36:59
Greg Troxel wrote:
> I don't think so.  But you could put them in rc.local instead of
> ifconfig.gif0

   Okay.  I wrote up a network-late script, as a modification of
rc.d/network.  It brings up ifconfig-late.xxN interfaces, and
I've moved my gif0 and gre0 there.

   But, I'm having a different problem.  Both when configured
by that script, and when I try to configure the interface
by hand on the machine, it isn't working.  This is gif0 I'm
talking about.

   I have:

# gif0 config
create
tunnel MY.EXTERNAL.IP4.ADDR OTHER.SIDE.OF.TUNNEL
inet6 2001:0408:1010:ffff::1:1/112 2001:0408:1010:ffff::1:2

   For some reason, this doesn't work.  I can do:

# ifconfig gif0 create
# ifconfig gif0 tunnel MY.EXTERNAL.IP4.ADDR OTHER.SIDE.OF.TUNNEL
# ifconfig gif0
gif0: flags=8050<POINTOPOINT,RUNNING,MULTICAST> mtu 1280
         tunnel inet MY.EXTERNAL.IP4.ADDR --> OTHER.SIDE.OF.TUNNEL
# ifconfig gif0 inet6 2001:0408:1010:ffff::1:1/112 2001:0408:1010:ffff::1:2
ifconfig: SIOCAIFADDR: Invalid argument
# ifconfig gif0 inet6 2001:0408:1010:ffff::1:1 2001:0408:1010:ffff::1:2
ifconfig: SIOCAIFADDR: Invalid argument
#

   No matter what I do, I can't seem to get rid of that error.
Now, I looked at the source to ifconfig, and it is a little
naive about what it prints.  In the case of an IPv6 addr, it's
actually using the SIOCAIFADDR_IN6 ioctl, it just doesn't put
that in the warn().  And, if I look in sys/netinet6/in6.c, I
see a small number of places where EINVAL could be returned.

   The one I think is most likely is:

netinet6/in6.c, rev 1.86, line 628-:
         case SIOCAIFADDR_IN6:
         {
                 int i, error = 0;
                 struct nd_prefix pr0, *pr;

                 /* reject read-only flags */
                 if ((ifra->ifra_flags & IN6_IFF_DUPLICATED) != 0 ||
                     (ifra->ifra_flags & IN6_IFF_DETACHED) != 0 ||
                     (ifra->ifra_flags & IN6_IFF_NODAD) != 0 ||
                     (ifra->ifra_flags & IN6_IFF_AUTOCONF) != 0) {
                         return (EINVAL);
                 }

   Now, I'm not sure if any of these flags are set.  But, in
theory, it wouldn't be unreasonable if IFF_NODAD was set,
because this is the first address being set, which is when
you'd expect NODAD to be set.

   But, more than that, I didn't *used* to have this problem.
Running 2.0 or 2.0.1 on this same machine, I was able to
set this tunnel up earlier.

   Does anyone have any suggestions as to things I could try to
better diagnose the problem I'm having?

   Thanks...

                               - Chris