keepalived uses kernel features that have been introduced over time, but in order to still allow keepalived to be built and run on older kernel versions it has many checks of what kernel features are available.
Set out below in chronological order are the features that have been added to Linux that keepalived makes use of if they are available.
If in doubt about features, grep the source tree searching for "Linux". The source (including configure.ac) attempts to document which kernel version introduced features that are used conditionally.
At the end of this file is a list of kernel configure options that affect functionality that keepalived uses.
=============================================================================
dnl ----[Check have IPV4_DEVCONF defines - since Linux 3.11]----
./keepalived/check/check_parser.c:#ifdef IP_VS_SVC_F_SCHED1 /* From Linux 3.11 */
Support for open(..., O_TMPFILE,...) added -- Linux 3.11 /* Backported into RHEL7 linux-3.10 somewhere between 3.10.0-229 and 3.10.0-1160 */
dnl --RTAX_QUICKACK dnl -- Linux 3.11 dnl --FRA_SUPPRESS_PREFIXLEN dnl -- Linux 3.12 dnl --FRA_SUPPRESS_IFGROUP dnl -- Linux 3.12
./keepalived/include/global_data.h: bool namespace_with_ipsets; /* override for namespaces with ipsets on Linux < 3.13 */
./keepalived/vrrp/vrrp_iptables_calls.c:#if defined IP_SET_OP_GET_FNAME /* Since Linux 3.13 */
./keepalived/vrrp/vrrp_ipset.c: * than Linux 3.13, since ipsets didn't understand namespaces prior to that. */
dnl - Introduced in Linux 3.14 AC_CHECK_DECLS([IFA_FLAGS], [], [], [[#include <linux/if_addr.h>]]) AC_CHECK_DECLS([NFT_META_L4PROTO], [], [], [#include <linux/netfilter/nf_tables.h>])
./keepalived/vrrp/vrrp_ipaddress.c:#ifdef IFA_F_MANAGETEMPADDR /* Linux 3.14 / ./keepalived/vrrp/vrrp_ipaddress.c:#ifdef IFA_F_NOPREFIXROUTE / Linux 3.14 */
./keepalived/vrrp/vrrp_ipaddress.c:#ifdef IFA_F_MANAGETEMPADDR /* Linux 3.14 / ./keepalived/vrrp/vrrp_ipaddress.c:#ifdef IFA_F_NOPREFIXROUTE / Linux 3.14 */
dnl ----[ Checks for kernel IFLA_INET6_ADDR_GEN_MODE support ]----
memfd_create - introduced in Linux 3.17 and glibc 2.27 /* Backported into RHEL7 linux-3.10 somewhere between 3.10.0-229 and 3.10.0-1160 */
dnl -- Since Linux 3.18 AC_CHECK_DECLS([IPVS_DEST_ATTR_ADDR_FAMILY], [add_system_opt([IPVS_DEST_ATTR_ADDR_FAMILY])], [], [#include <linux/ip_vs.h>])
dnl -- xt_set_info_match_v4 declared since Linux 3.19
./lib/rttables.c:#ifdef RTPROT_BABEL /* Since Linux 3.19 */
dnl --RTAX_CC_ALGO dnl -- Linux 4.0
./keepalived/vrrp/vrrp_ipaddress.c:#ifdef IFA_F_MCAUTOJOIN /* Linux 4.1 */
dnl -- Since Linux 4.1 IPVS_SVC_ATTR_STATS64, IPVS_DEST_ATTR_STATS64], [],
dnl --RTA_VIA dnl -- Linux 4.1 dnl --RTA_NEWDST dnl -- Linux 4.1 dnl --RTA_PREF dnl -- Linux 4.1
./keepalived/include/ip_vs.h:/* Prior to Linux 4.2 have to include linux/in.h and linux/in6.h
./keepalived/include/vrrp_iproute.h:#if HAVE_DECL_RTA_ENCAP /* Since Linux 4.3 */
dnl -- Since Linux 4.3 AC_CHECK_DECLS([ IPVS_DAEMON_ATTR_SYNC_MAXLEN, IPVS_DAEMON_ATTR_MCAST_GROUP, IPVS_DAEMON_ATTR_MCAST_GROUP6, IPVS_DAEMON_ATTR_MCAST_PORT, IPVS_DAEMON_ATTR_MCAST_TTL], [],
dnl -- Since Linux 4.3 AC_DEFINE([HAVE_IPVS_SYNCD_ATTRIBUTES], [ 1 ], [Define to 1 if have IPVS syncd attributes])
dnl --FRA_TUN_ID dnl -- Linux 4.3 dnl --RTA_ENCAP dnl -- Linux 4.3
dnl ----[ Checks for kernel IFLA_VRF_... support ]----
MCL_ONFAULT -- Linux 4.4 dnl --RTEXT_FILTER_SKIP_STATS dnl -- Linux 4.4 dnl --RTA_EXPIRES dnl -- Linux 4.5
./keepalived/vrrp/vrrp_iptables.c:/* Linux 4.5 introduced a namespace collision when including ./keepalived/vrrp/vrrp_iptables_calls.c:/* Linux 4.5 introduced a namespace collision when including
dnl --FRA_L3MDEV dnl -- Linux 4.8
dnl --IPVLAN_MODE_L3S dnl -- Linux 4.9
dnl --FRA_UID_RANGE dnl -- Linux 4.10
/* CORENAME_MAX_SIZE in kernel source include/linux/binfmts.h defines
dnl --RTA_TTL_PROPAGATE dnl -- Linux 4.12 IFLA_IPVLAN_FLAGS, IPVLAN_MODE_PRIVATE, IPVLAN_MODE_VEPA - Linux 4.15 dnl --RTAX_FASTOPEN_NO_COOKIE dnl -- Linux 4.15 dnl --FRA_PROTOCOL dnl -- Linux 4.17 dnl --FRA_IP_PROTO dnl -- Linux 4.17 dnl --FRA_SPORT_RANGE dnl -- Linux 4.17 dnl --FRA_DPORT_RANGE dnl -- Linux 4.17
./lib/rbtree.c:/* This is updated to Linux v4.18.10 lib/rbtree.c
IPV6_MULTICAST_ALL since Linux v4.20
dnl -- Linux/errqueue.h need sys/time.h before Linux < v5.1
dnl -- Since Linux 5.1 NFT_META_OIFKIND
dnl -- Since Linux 5.2 IPVS_DEST_ATTR_TUN_TYPE
dnl -- Since Linux 5.3 IP_VS_TUNNEL_ENCAP_FLAG_NOCSUM IP_VS_CONN_F_TUNNEL_TYPE_GRE
??? dnl -- RedHat backported ENCAP_IP and ENCAP_IP6 without MPLS and ILA
dnl -- Since Linux 5.6 and libnftnl 1.1.6, nft 0.9.4 NFTNL_SET_DESC_CONCAT NFTNL_SET_ELEM_KEY_END
dnl -- Since Linux 5.7 NFT_SET_CONCAT NFTNL_SET_EXPR also libnftnl 1.1.7, nft 0.9.5
dnl ----[ Is HTTP_GET regex checking wanted? ]---- $PKG_CONFIG --exists libpcre2-8
/* Defined in kernel source file include/linux/sched.h but
=============================================================================
dnl -- RLIMIT_RTTIME - not defined in musl libc until v1.2.0
libipset v6.38 Used by Debian Buster, EOL ~2022 v6.29 Used by Ubuntu 16.04, EOL 04/21
=============================================================================
The following list is probably incomplete, and will be updated as other options become known.
BPF EPOLL SIGNALFD TIMERFD SYSCTL PROC_FS INET IP_MULTICAST IPV6 IP_VS (unless --disable-lvs is specified) IP_VS suboptions to match the real_server/virtual_server configuration NETFILTER_XTABLES - if strict_mode or no_accept. NETFILTER_XT options and IP_SET IP_ADVANCED_ROUTER and various associated options if static/dynamic routes specified FIB_RULES if static or dynamic rules are specified NFTABLES CN_PROC for vrrp track_process MACVLAN IPVLAN