if we produce a lot of rtsock messages it is possible we will hit a
authordlg <dlg@openbsd.org>
Wed, 14 Jul 2010 00:42:57 +0000 (00:42 +0000)
committerdlg <dlg@openbsd.org>
Wed, 14 Jul 2010 00:42:57 +0000 (00:42 +0000)
commit692f0c3bd1f1307d7fcf2e437d044f27864c38c0
tree764a460873826fa42bb2561c9346ac7378399347
parent41db8c970cf69267082a8ed23c930b12b3840d39
if we produce a lot of rtsock messages it is possible we will hit a
condition that prevents us from queuing it, which in turn means that
processes listening on the routing socket for changes to the kernel state
will get out of sync. currently this is handled by the following comment:

/* should notify about lost packet */

this change introduces a new rtsock message called RTM_DESYNC that
notifies about lost packets and uses it instead of this comment.

when we detect loss we flush all the message in the routing socket and
attempt to queue an RTM_DESYNC message instead. to guarantee that we will
enqueue DESYNC we keep trying it when an attempt to enqueue or dequeue
any messages is made, and in the worst case a timeout tries to guarantee
that desync is added to the socket.

ive been running this in production for 2 or 3 weeks.
tested by sthen@
ok sthen@ claudio@ deraadt@
code written by andrew sallaway at the univeristy of queensland.
sys/net/route.h
sys/net/rtsock.c