Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Routing socket issue?
Hi Frank :)
On 31/01/2021 07:58, Frank Kardel wrote:
For example I fail to see how RTM_LOSING helps that because it won't change
how ntpd would configure itself.
Well if I read the comment right I am inclined to differ here:
In in_pcs.c we find:
/*
* Check for alternatives when higher level complains
* about service problems. For now, invalidate cached
* routing information. If the route was created dynamically
* (by a redirect), time to try a default gateway again.
*/
in_losing(struct inpcb *inp)
and the call is in tcp_time.c:
/*
* If losing, let the lower level know and try for
* a better route. Also, if we backed off this far,
* our srtt estimate is probably bogus. Clobber it
* so we'll take the next rtt measurement as our srtt;
* move the current srtt into rttvar to keep the current
* retransmit times until then.
*/
As ntpd acts after a grace period the routing engine may have corrected this
situation and routing may indeed change.
ntpd's interactions with peers can take up to 1024s so it is good to attempt in
a best effort way to keep the internal
local address/socket state close to the current state.
It is likely though that there have been routing messages like
RTM_CHANGE/ADD/DELETE before that and RTM_LOSING is not providing
additional information at the point.
Right, RTM_LOSING is just informational.
If any routing does change then we get RTM_CHANGE/ADD/DELETE etc.
As NTP doesn't bring interfaces up or down, RFM_IFANNOUNCE is useless as well.
If the interface does vanish, any addresses on it will be reported via
RTM_DELADDR.
RTM_IFINFO is also questionable as commentary in the code is that it only
cares about addresses.
Well I read
ntp_io.c
/*
* we are keen on new and deleted addresses and
* if an interface goes up and down or routing
* changes
*/
not as being interested in addresses only.
Also keep in mind that at this point routing messages are processed in a loop
and the action here
timer_interfacetimeout(current_time + UPDATE_GRACE);
just sets the variable for the next interface+local address update run. This is
very cheap. The grace period
will batch multiple routing message together. An explicit routing message flush
is from my point of view
code clutter here. as the socket is effectively drained in the loop at the cost
of examining the msg_type and setting
a variable. Not much gained here.
OK, we'll keep RTM_IFINFO but drop RTM_IFANNOUNCE.
The point is trying to eliminate the overflow message entirely.
I mean, if you want to argue against any of that then I would suggest why even
bother filtering or looking at overflow at all?
Shrink the code - any activity on the routing socket, drain it ignoring all
error, start the interface update timer.
That would be an option but we should react only on known events. There may be
one or two events that could be removed from
the list after examination as other messages can cover for them. Keep in mind
the this is a portable code section and the
code tries to be on the fail safe, robust side for the goal of address/routing
tracking so adjusting it to a particular implementation
may break on other os implementations.
Well, Dragonfly (prior to my patches there) and by extension FreeBSD (not
checked to see if that changed) both emit RMT_DELADDR before RTM_IFANNOUNCE (ie
wrong order) so when they do overflow you never see RTM_IFANNOUNCE to say the
interface vanished. Hence there is zero point is listening for it for ntp.
As for the message: IMHO it does not need to be logged at all (DPRINTF/maybe
LOGDEBUG at most) because the overflow should and does just trigger ntpd to
reevaluate the interface/routing configuration.
This information is not important at all for normal operation as the effects
are correctly mitigated.
I changed it to LOG_DEBUG as well as removing RTM_LOSING and RTM_IFANNOUNCE as
discussed above.
Great.
BTW: does the current code revert to (fail safe) periodic interface scanning
if the routing socket is being disabled (happens when an unexpected error
code is returned from read(2))?
No.
The socket is non blocking so the only error to ignore here would be EINTR.
Any other errors are due to bad programming IMO.
Could be bad programming, but I prefer the ntpd being forgiving against hiccups
by reverting to periodic scanning when we
disable to routing socket. That is a fail safe strategy and would also warrant a
log message as it is an unusual event.
EINTR is now ignored.
I'll find time to restore periodic scanning later.
Roy
Home |
Main Index |
Thread Index |
Old Index