Hi,

When an ospf route already exists, ospf6d doesn't update the nexthop.
I have 6 routers (4 with openbsd 5.0, 2 with openbsd 4.9) running ospfd,
ospf6d and bgpd, routeur id is on lo1.

For some reason (see at end for a way to reproduce it), one of the router
(openbsd 5.0 one) have multiple ospf ipv6 routes still in fib (even if no more
ospf6d or bgpd process is running). For exemple:

root@core3: route -n get -inet6 XXXX:YYYY::a
   route to: XXXX:YYYY::a
destination: XXXX:YYYY::a
    gateway: fe80::5054:60ff:fe60:3a1%vlan216
  interface: vlan216
 if address: fe80::5054:60ff:fe60:348%vlan216
   priority: 32 (ospf)
      flags: <UP,GATEWAY,HOST,DONE>
     use       mtu    expire
    4200         0         0

XXXX:YYYY::a is the loopback address of another router (the gateway is
obviously wrong as I've killed ospf6d and bgpd on the referenced host).

when starting ospf6d, a new route for XXXX:YYYY::a is found but ospf6d
find the previous one and don't change the nexthop. And when killing
ospf6d it doesn't remove it.

If I "route delete -inet6 -host XXXX:YYYY::a
fe80::5054:60ff:fe60:3a1%vlan216", and restart ospf6d the problem disappear.

I've took a look at ospf6d/kroute.c and found this route is processed like
that:

kr_change(struct kroute *kroute)
{
        struct kroute_node      *kr;
        int                      action = RTM_ADD;

        kroute->rtlabel = rtlabel_tag2id(kroute->ext_tag);

        if ((kr = kroute_find(&kroute->prefix, kroute->prefixlen)) !=
            NULL) {
===> goes here

                if (!(kr->r.flags & F_KERNEL))
                        action = RTM_CHANGE;
                else {  /* a non-ospf route already exists. not a problem */
===> goes here
                        if (!(kr->r.flags & F_BGPD_INSERTED)) {
===> goes here
                                do {
                                        kr->r.flags |= F_OSPFD_INSERTED;
                                        kr = kr->next;
                                } while (kr);
===> exit (nexthop is unchanged)
                                return (0);
                        }



This problem occurs when the prefix is announced by different
ospf peers with a different nexthop. Exemple:

When starting ospf6d a first route is added learned from one ospf6d peer:

root@core3: route -n get -inet6 XXXX:YYYY::8
   route to: XXXX:YYYY::8
destination: XXXX:YYYY::8
    gateway: fe80::5054:60ff:fe60:365%vlan222
  interface: vlan222
 if address: fe80::5054:60ff:fe60:345%vlan222
   priority: 32 (ospf)
      flags: <UP,GATEWAY,HOST,DONE>
     use       mtu    expire
       0         0         0

Next a second route is learned (gateway on fe80::5054:60ff:fe60:321%vlan213
which is the most direct route) but ospf6d doesn't update it.

Here some traces I've added in ospf6d:
MG kr_change:  prefix XXXX:YYYY::8/128
MG send_rtmsg1: action 1, prefix XXXX:YYYY::8/128
MG send_rtmsg2: action 1, nexthop: fe80::5054:60ff:fe60:365
...
MG kr_change:  prefix XXXX:YYYY::8/128
MG kr_change2: found prefix XXXX:YYYY::8/128
MG kr_change:  prefix XXXX:YYYY::8/128 !FKERNEL
MG send_rtmsg1: action 3, prefix XXXX:YYYY::8/128
MG send_rtmsg2: action 3, nexthop: fe80::5054:60ff:fe60:321
send_rtmsg: action 1, prefix XXXX:YYYY::8/128: File exists


After killing ospf6d, (first/bad) route is still here:
root@core3:usr.sbin$ route -n get -inet6 XXXX:YYYY::8
   route to: XXXX:YYYY::8
destination: XXXX:YYYY::8
    gateway: fe80::5054:60ff:fe60:365%vlan222
  interface: vlan222
 if address: fe80::5054:60ff:fe60:345%vlan222
   priority: 32 (ospf)
      flags: <UP,GATEWAY,HOST,DONE>
     use       mtu    expire
      28         0         0

I've retried multiple times and when the 1st learned route is the good one
(via vlan213) the route is well deleted when killing ospf6d.


I've tried to compare with ospfd and found that the following chnage seems to
handle nexthop change case:
 
http://www.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/ospfd/kroute.c.diff?r1=1.52;r2=1.53;f=h

May be common changes in ospfd weren't ported to ospf6d ?


Manuel 

Reply via email to