Hi Martin, thank you for clarification and thank you for your patch.
Your patch looks reasonably to me. I forgot RTAX_IFP and RTAX_IFA in my patch. After a first trial, the fix works for me. Today I will start nightly regression tests with it. You will get the result tomorrow. Regards Florian On 11/26/14 12:58, Martin Pieuchot wrote: > Hello Florian, > > On 26/11/14(Wed) 06:56, Florian Riehm wrote: >> since OpenBSD 5.6 route change messages can change the interface of a route >> (rt_ifa) even if a message doesn't seem to require it because of a changed >> gateway or stuff like that. >> I would like to ask if it's a regression or if the new behavior is intended. > > Since the behavior is different and it's not documented, it is a > regression, thanks for reporting it. I've just committed some new > tests in order to prevent this from happening again. > >> Example: (only for testing - it doesn't represent my network topology) >> ifconfig em0 inet6 fd88::1/64 >> ifconfig em1 inet6 fd99::1/64 >> route add -inet6 fd88::666 fd99::1 >> route get fd88::666 >> interface: em1 (as expected) >> route change fd88::666 -mtu 1500 >> route get fd88::666 >> interface: em0 (broken - trying to ping the target results in "No route >> to >> host") >> >> In the example I can workaround the problem with adding a gateway while >> changing >> the mtu: >> route change fd88::666 fd99::1 -mtu 1500 >> >> A comment in route_output (rtsock.c) says >> /* >> * new gateway could require new ifaddr, ifp; >> * flags may also be different; ifp may be specified >> * by ll sockaddr when protocol address is ambiguous >> */ >> but their is no check for a 'new gateway'. > > You're right. What's happening here is that we always call rt_geifa() in > the first place. This is a nasty function that tries to find an ifaddr > to attach a route. But if the gateway is not new or you didn't specify > any of the "-ifp" or "-ifa" argument we should not look for a different > ifaddr. > > Here's a slightly different diff, could you tell me if it fixes the > regression in your case? > > Index: net/rtsock.c > =================================================================== > RCS file: /home/ncvs/src/sys/net/rtsock.c,v > retrieving revision 1.152 > diff -u -p -r1.152 rtsock.c > --- net/rtsock.c 12 Aug 2014 13:52:08 -0000 1.152 > +++ net/rtsock.c 26 Nov 2014 11:55:25 -0000 > @@ -740,13 +740,6 @@ report: > break; > > case RTM_CHANGE: > - /* > - * new gateway could require new ifaddr, ifp; > - * flags may also be different; ifp may be specified > - * by ll sockaddr when protocol address is ambiguous > - */ > - if ((error = rt_getifa(&info, tableid)) != 0) > - goto flush; > newgate = 0; > if (info.rti_info[RTAX_GATEWAY] != NULL) > if (rt->rt_gateway == NULL || > @@ -761,7 +754,17 @@ report: > error = EDQUOT; > goto flush; > } > - ifa = info.rti_ifa; > + /* > + * new gateway could require new ifaddr, ifp; > + * flags may also be different; ifp may be specified > + * by ll sockaddr when protocol address is ambiguous > + */ > + if (newgate || info.rti_info[RTAX_IFP] != NULL || > + info.rti_info[RTAX_IFA] != NULL) { > + if ((error = rt_getifa(&info, tableid)) != 0) > + goto flush; > + ifa = info.rti_ifa; > + } > if (ifa) { > if (rt->rt_ifa != ifa) { > if (rt->rt_ifa->ifa_rtrequest) >