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  }