kernel-netlink: Support parallel Netlink queries
authorMartin Willi <martin@revosec.ch>
Thu, 10 Jul 2014 14:28:44 +0000 (16:28 +0200)
committerMartin Willi <martin@revosec.ch>
Fri, 21 Nov 2014 09:55:45 +0000 (10:55 +0100)
commit3c7193f114e9dbb4f725aaf9e050fb132d9f2600
treeb9c6e31c214681a7069f265837054a475461e03a
parent02794456a9d9d81df238c7fac8aaff4dbc4c39de
kernel-netlink: Support parallel Netlink queries

Instead of locking the socket exclusively to wait for replies, use watcher
to wait for and read in responses asynchronously. This allows multiple parallel
Netlink queries, which can significantly improve performance if the kernel
Netlink layer has longer latencies and supports parallel queries.

For vanilla Linux, parallel queries don't make much sense, as it usually returns
EBUSY for the relevant dump requests. This requires a retry, and in the end
makes queries more expensive under high load.

Instead of checking the Netlink message sequence number to detect multi-part
messages, this code now relies on the NLM_F_MULTI flag to detect them. This
has previously been avoided (by 1d51abb7). It is unclear if the flag did not
work correctly on very old Linux kernels, or if the flag was not used
appropriately by strongSwan. The flag seems to work just fine back to 2.6.18,
which is a kernel still in use by RedHat/CentOS 5.
src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c