github.com/cilium/cilium@v1.16.2/pkg/datapath/linux/requirements.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package linux 5 6 import ( 7 "errors" 8 "log/slog" 9 "os" 10 11 "github.com/vishvananda/netlink" 12 "golang.org/x/sys/unix" 13 14 "github.com/cilium/cilium/pkg/datapath/linux/probes" 15 "github.com/cilium/cilium/pkg/logging/logfields" 16 "github.com/cilium/cilium/pkg/option" 17 ) 18 19 // CheckRequirements checks that minimum kernel requirements are met for 20 // configuring the BPF datapath. 21 func CheckRequirements(log *slog.Logger) error { 22 _, err := netlink.RuleList(netlink.FAMILY_V4) 23 if errors.Is(err, unix.EAFNOSUPPORT) { 24 log.Error("Policy routing:NOT OK. "+ 25 "Please enable kernel configuration item CONFIG_IP_MULTIPLE_TABLES", 26 logfields.Error, err, 27 ) 28 } 29 30 if option.Config.EnableIPv6 { 31 if _, err := os.Stat("/proc/net/if_inet6"); os.IsNotExist(err) { 32 return errors.New("kernel: ipv6 is enabled in agent but ipv6 is either disabled or not compiled in the kernel") 33 } 34 } 35 36 // bpftool checks 37 if !option.Config.DryMode { 38 probeManager := probes.NewProbeManager() 39 40 if probes.HaveDeadCodeElim() != nil { 41 return errors.New("Require support for dead code elimination (Linux 5.1 or newer)") 42 } 43 44 if probes.HaveLargeInstructionLimit() != nil { 45 return errors.New("Require support for large programs (Linux 5.2.0 or newer)") 46 } 47 48 if err := probeManager.SystemConfigProbes(); err != nil { 49 // TODO(vincentmli): revisit log when GH#14314 has been resolved 50 // Warn missing required kernel config option 51 log.Warn("BPF system config check: NOT OK.", logfields.Error, err) 52 } 53 } 54 return nil 55 }