From 5ee13217652216a3a01c82dd7d8a79ea8502ca12 Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Wed, 9 Feb 2022 15:40:58 +0000 Subject: [PATCH] aya: Fix Loading from cgroup/skb sections fa037a88e2f0820d2a64bbaae12464bf5dce083d allowed for cgroup skb programs that did not specify an attach direction to use the cgroup/skb section name per the convention established in libbpf. It did not add the necessary code to load programs from those sections which is added in this commit Signed-off-by: Dave Tucker --- aya/src/bpf.rs | 4 ++ aya/src/obj/mod.rs | 104 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index afedf3ed..0b27cc44 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -450,6 +450,10 @@ impl<'a> BpfLoader<'a> { }, }) } + ProgramSection::CgroupSkb { .. } => Program::CgroupSkb(CgroupSkb { + data, + expected_attach_type: None, + }), ProgramSection::CgroupSkbIngress { .. } => Program::CgroupSkb(CgroupSkb { data, expected_attach_type: Some(CgroupSkbAttachType::Ingress), diff --git a/aya/src/obj/mod.rs b/aya/src/obj/mod.rs index a8a07e81..bcacfd79 100644 --- a/aya/src/obj/mod.rs +++ b/aya/src/obj/mod.rs @@ -115,6 +115,7 @@ pub enum ProgramSection { SkSkbStreamVerdict { name: String }, SockOps { name: String }, SchedClassifier { name: String }, + CgroupSkb { name: String }, CgroupSkbIngress { name: String }, CgroupSkbEgress { name: String }, LircMode2 { name: String }, @@ -142,6 +143,7 @@ impl ProgramSection { ProgramSection::SkSkbStreamVerdict { name } => name, ProgramSection::SockOps { name } => name, ProgramSection::SchedClassifier { name } => name, + ProgramSection::CgroupSkb { name } => name, ProgramSection::CgroupSkbIngress { name } => name, ProgramSection::CgroupSkbEgress { name } => name, ProgramSection::LircMode2 { name } => name, @@ -199,8 +201,26 @@ impl FromStr for ProgramSection { "sk_skb/stream_verdict" => SkSkbStreamVerdict { name }, "sockops" => SockOps { name }, "classifier" => SchedClassifier { name }, + "cgroup_skb" => match &*name { + "ingress" => CgroupSkbIngress { name }, + "egress" => CgroupSkbEgress { name }, + _ => { + return Err(ParseError::InvalidProgramSection { + section: section.to_owned(), + }) + } + }, "cgroup_skb/ingress" => CgroupSkbIngress { name }, "cgroup_skb/egress" => CgroupSkbEgress { name }, + "cgroup/skb" => CgroupSkb { name }, + "cgroup" => match &*name { + "skb" => CgroupSkb { name }, + _ => { + return Err(ParseError::InvalidProgramSection { + section: section.to_owned(), + }) + } + }, "lirc_mode2" => LircMode2 { name }, "perf_event" => PerfEvent { name }, "raw_tp" | "raw_tracepoint" => RawTracePoint { name }, @@ -1434,6 +1454,90 @@ mod tests { ); } + #[test] + fn test_parse_section_cgroup_skb_ingress_unnamed() { + let mut obj = fake_obj(); + + assert_matches!( + obj.parse_section(fake_section( + BpfSectionKind::Program, + "cgroup_skb/ingress", + bytes_of(&fake_ins()) + )), + Ok(()) + ); + assert_matches!( + obj.programs.get("ingress"), + Some(Program { + section: ProgramSection::CgroupSkbIngress { .. }, + .. + }) + ); + } + + #[test] + fn test_parse_section_cgroup_skb_ingress_named() { + let mut obj = fake_obj(); + + assert_matches!( + obj.parse_section(fake_section( + BpfSectionKind::Program, + "cgroup_skb/ingress/foo", + bytes_of(&fake_ins()) + )), + Ok(()) + ); + assert_matches!( + obj.programs.get("foo"), + Some(Program { + section: ProgramSection::CgroupSkbIngress { .. }, + .. + }) + ); + } + + #[test] + fn test_parse_section_cgroup_skb_no_direction_unamed() { + let mut obj = fake_obj(); + + assert_matches!( + obj.parse_section(fake_section( + BpfSectionKind::Program, + "cgroup/skb", + bytes_of(&fake_ins()) + )), + Ok(()) + ); + assert_matches!( + obj.programs.get("skb"), + Some(Program { + section: ProgramSection::CgroupSkb { .. }, + .. + }) + ); + } + + #[test] + fn test_parse_section_cgroup_skb_no_direction_named() { + let mut obj = fake_obj(); + + assert_matches!( + obj.parse_section(fake_section( + BpfSectionKind::Program, + "cgroup/skb/foo", + bytes_of(&fake_ins()) + )), + Ok(()) + ); + assert_matches!( + obj.programs.get("foo"), + Some(Program { + section: ProgramSection::CgroupSkb { .. }, + .. + }) + ); + } + #[test] fn test_patch_map_data() { let mut obj = fake_obj();