From 4277205e9d4f6a28a1f38aa8a990bdd97e683af1 Mon Sep 17 00:00:00 2001 From: Dan Everton Date: Thu, 18 Nov 2021 16:41:34 +1000 Subject: [PATCH 1/2] Use current kernel version as default if not specified When a BPF program doesn't specify the target kernel version, the most compatible option is to set the program kernel version to match the currently running kernel. --- aya/src/programs/mod.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 7696c07f..9664ce3d 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -88,7 +88,7 @@ pub use xdp::{Xdp, XdpError, XdpFlags}; use crate::{ generated::{bpf_attach_type, bpf_prog_info, bpf_prog_type}, maps::MapError, - obj::{self, Function}, + obj::{self, Function, KernelVersion}, sys::{bpf_load_program, bpf_pin_object, bpf_prog_detach, bpf_prog_query, BpfLoadProgramAttrs}, }; @@ -397,6 +397,14 @@ fn load_program(prog_type: bpf_prog_type, data: &mut ProgramData) -> Result<(), .. } = obj; + let target_kernel_version = match *kernel_version { + KernelVersion::Any => { + let (major, minor, patch) = crate::sys::kernel_version().unwrap(); + KernelVersion::Version((major << 16) + (minor << 8) + patch) + } + _ => *kernel_version, + }; + let mut log_buf = VerifierLog::new(); let mut retries = 0; let mut ret; @@ -405,7 +413,7 @@ fn load_program(prog_type: bpf_prog_type, data: &mut ProgramData) -> Result<(), ty: prog_type, insns: instructions, license, - kernel_version: (*kernel_version).into(), + kernel_version: target_kernel_version.into(), expected_attach_type: data.expected_attach_type, attach_btf_obj_fd: data.attach_btf_obj_fd, attach_btf_id: data.attach_btf_id, From 3dff6e855521a3bdbf11f6d4da98d1ea5d7536a3 Mon Sep 17 00:00:00 2001 From: Dan Everton Date: Fri, 19 Nov 2021 07:37:05 +1000 Subject: [PATCH 2/2] Updates based on feedback --- aya/src/programs/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 9664ce3d..4964aa66 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -400,9 +400,9 @@ fn load_program(prog_type: bpf_prog_type, data: &mut ProgramData) -> Result<(), let target_kernel_version = match *kernel_version { KernelVersion::Any => { let (major, minor, patch) = crate::sys::kernel_version().unwrap(); - KernelVersion::Version((major << 16) + (minor << 8) + patch) + (major << 16) + (minor << 8) + patch } - _ => *kernel_version, + _ => (*kernel_version).into(), }; let mut log_buf = VerifierLog::new(); @@ -413,7 +413,7 @@ fn load_program(prog_type: bpf_prog_type, data: &mut ProgramData) -> Result<(), ty: prog_type, insns: instructions, license, - kernel_version: target_kernel_version.into(), + kernel_version: target_kernel_version, expected_attach_type: data.expected_attach_type, attach_btf_obj_fd: data.attach_btf_obj_fd, attach_btf_id: data.attach_btf_id,