@ -115,6 +115,7 @@ pub enum ProgramSection {
SkSkbStreamVerdict { name : String } ,
SkSkbStreamVerdict { name : String } ,
SockOps { name : String } ,
SockOps { name : String } ,
SchedClassifier { name : String } ,
SchedClassifier { name : String } ,
CgroupSkb { name : String } ,
CgroupSkbIngress { name : String } ,
CgroupSkbIngress { name : String } ,
CgroupSkbEgress { name : String } ,
CgroupSkbEgress { name : String } ,
LircMode2 { name : String } ,
LircMode2 { name : String } ,
@ -142,6 +143,7 @@ impl ProgramSection {
ProgramSection ::SkSkbStreamVerdict { name } = > name ,
ProgramSection ::SkSkbStreamVerdict { name } = > name ,
ProgramSection ::SockOps { name } = > name ,
ProgramSection ::SockOps { name } = > name ,
ProgramSection ::SchedClassifier { name } = > name ,
ProgramSection ::SchedClassifier { name } = > name ,
ProgramSection ::CgroupSkb { name } = > name ,
ProgramSection ::CgroupSkbIngress { name } = > name ,
ProgramSection ::CgroupSkbIngress { name } = > name ,
ProgramSection ::CgroupSkbEgress { name } = > name ,
ProgramSection ::CgroupSkbEgress { name } = > name ,
ProgramSection ::LircMode2 { name } = > name ,
ProgramSection ::LircMode2 { name } = > name ,
@ -199,8 +201,26 @@ impl FromStr for ProgramSection {
"sk_skb/stream_verdict" = > SkSkbStreamVerdict { name } ,
"sk_skb/stream_verdict" = > SkSkbStreamVerdict { name } ,
"sockops" = > SockOps { name } ,
"sockops" = > SockOps { name } ,
"classifier" = > SchedClassifier { 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/ingress" = > CgroupSkbIngress { name } ,
"cgroup_skb/egress" = > CgroupSkbEgress { 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 } ,
"lirc_mode2" = > LircMode2 { name } ,
"perf_event" = > PerfEvent { name } ,
"perf_event" = > PerfEvent { name } ,
"raw_tp" | "raw_tracepoint" = > RawTracePoint { 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 ]
#[ test ]
fn test_patch_map_data ( ) {
fn test_patch_map_data ( ) {
let mut obj = fake_obj ( ) ;
let mut obj = fake_obj ( ) ;