rtsock changes for multiple fibs support
Alexander V. Chernikov
melifaro at ipfw.ru
Tue Jun 7 09:13:30 UTC 2011
Hello list!
At the moment multiple fib support is completely broken in route(4)
(described in kern/134931)
Linux supports fibs via its netlink protocol. OpenBSD makes rtsock
version bump for the same for a while ago.
Since 9.0 is approaching it is a good time to make some changes to
routing socket:
Goals:
* Permit fib to be get/set via route(4) interface
* Keep existing ABI/API as much as possible
* Permit various route(4) headers changes without breaking ABI
Proposed structure changes:
add
uint16_t fib
uint16_t reserved
to rt_msghdr, if_msghdr, ifa_msghdr, ifma_msghdr, if_announcemsghdr
Proposed changes to undocumented sysctl route dump interface:
* Add (optional) .FIB.RTSOCK_VERSION to sysctl
net.route.0.ADDRESS_FAMILY.NET_RT_DUMP.FLAGS oid:
* document such interface in route(4)
Proposed ABI keeping techniques:
RTSOCK:
1) Add SO_RTSOCKVERSION to SOL_SOCKET setsockopt level
2) Determine rtsock version via __FreeBSD_version checking
3) Add net.rtsock.force_version sysctl
4) Do __FreeBSD_version && rtsock version bump
Rtsock version selection algorithm:
if
SO_RTSOCKVERSION is set on socket: => use selected version (or return -1 in
setsockopt)
else if
net.rtsock.force_version > 0 => use forced version
else
net.rtsock.force_version == 0 => use version based on __FreeBSD_version
check
Examples:
"New" binaries (build with new headers):
* have __FreeBSD_version >= X so "current" rtsock version is used
"Old" binaries (from 7.X/8.X etc..):
* have __FreeBSD_version < X so "previous" rtsock version is used
Old/New binaries with New/Old libraries using rtsock:
This is the most tricky part.
Major routing software (quagga, openbgpd, bird) do not use libraries
for rtsock interaction, however such libraries exists (libpdel, for example)
What can be done:
(required) Add explicit rtsock version request vie SO_RTSOCKVERSION in
all FreeBSD
base code (route(8), netstat(8), ...)
(optional) Add patches for SO_RTSOCKVERSION to ported versions/upstream
versions of
libpdel (and possibly for routing daemons)
If someone wants to use newly-compiled library (or binary) for which
__FreeBSD_version check happens incorrectly he can explicitly set
net.rtsock.force_version to needed value. This will not break all
software aware of SO_RTSOCKVERSION (base binaries).
Those measures can't cover all 100 percent of users, but maybe 99 is
enough? Anyway, rebuilding world/userland with this patch should not
break anything. Problems can arise only when some recompilation based on
new headers is done.
SYSCTL ROUTE DUMP:
SO_RTSOCKVERSION is replaced by more detailed sysctl request described
in the beginning, the rest approach is exactly the same (patches for
base/ports, etc..)
If this is more or less reasonable approach I can provide patch doing
all of the above till the end of this week
More information about the freebsd-net
mailing list