|  | @@ -215,14 +215,14 @@ impl SchedClassifier {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  pub struct CgroupSkb {
 | 
	
		
			
				|  |  |      item: ItemFn,
 | 
	
		
			
				|  |  | -    expected_attach_type: String,
 | 
	
		
			
				|  |  | +    expected_attach_type: Option<String>,
 | 
	
		
			
				|  |  |      name: Option<String>,
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  impl CgroupSkb {
 | 
	
		
			
				|  |  |      pub fn from_syn(mut args: Args, item: ItemFn) -> Result<CgroupSkb> {
 | 
	
		
			
				|  |  |          let name = pop_arg(&mut args, "name");
 | 
	
		
			
				|  |  | -        let expected_attach_type = pop_arg(&mut args, "attach").unwrap_or_else(|| "skb".to_owned());
 | 
	
		
			
				|  |  | +        let expected_attach_type = pop_arg(&mut args, "attach");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          Ok(CgroupSkb {
 | 
	
		
			
				|  |  |              item,
 | 
	
	
		
			
				|  | @@ -232,11 +232,16 @@ impl CgroupSkb {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      pub fn expand(&self) -> Result<TokenStream> {
 | 
	
		
			
				|  |  | -        let attach = &self.expected_attach_type;
 | 
	
		
			
				|  |  | -        let section_name = if let Some(name) = &self.name {
 | 
	
		
			
				|  |  | -            format!("cgroup_skb/{}/{}", attach, name)
 | 
	
		
			
				|  |  | +        let section_name = if let Some(attach) = &self.expected_attach_type {
 | 
	
		
			
				|  |  | +            if let Some(name) = &self.name {
 | 
	
		
			
				|  |  | +                format!("cgroup_skb/{}/{}", attach, name)
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                format!("cgroup_skb/{}", attach)
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else if let Some(name) = &self.name {
 | 
	
		
			
				|  |  | +            format!("cgroup/skb/{}", name)
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  | -            format!("cgroup_skb/{}", attach)
 | 
	
		
			
				|  |  | +            ("cgroup/skb").to_owned()
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          let fn_name = &self.item.sig.ident;
 | 
	
		
			
				|  |  |          let item = &self.item;
 | 
	
	
		
			
				|  | @@ -523,3 +528,78 @@ impl SocketFilter {
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#[cfg(test)]
 | 
	
		
			
				|  |  | +mod tests {
 | 
	
		
			
				|  |  | +    use syn::parse_quote;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    use super::*;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    #[test]
 | 
	
		
			
				|  |  | +    fn cgroup_skb_with_attach_and_name() {
 | 
	
		
			
				|  |  | +        let prog = CgroupSkb::from_syn(
 | 
	
		
			
				|  |  | +            parse_quote!(name = "foo", attach = "ingress"),
 | 
	
		
			
				|  |  | +            parse_quote!(
 | 
	
		
			
				|  |  | +                fn foo(ctx: SkBuffContext) -> i32 {
 | 
	
		
			
				|  |  | +                    0
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        .unwrap();
 | 
	
		
			
				|  |  | +        let stream = prog.expand().unwrap();
 | 
	
		
			
				|  |  | +        assert!(stream
 | 
	
		
			
				|  |  | +            .to_string()
 | 
	
		
			
				|  |  | +            .contains("[link_section = \"cgroup_skb/ingress/foo\"]"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    #[test]
 | 
	
		
			
				|  |  | +    fn cgroup_skb_with_name() {
 | 
	
		
			
				|  |  | +        let prog = CgroupSkb::from_syn(
 | 
	
		
			
				|  |  | +            parse_quote!(name = "foo"),
 | 
	
		
			
				|  |  | +            parse_quote!(
 | 
	
		
			
				|  |  | +                fn foo(ctx: SkBuffContext) -> i32 {
 | 
	
		
			
				|  |  | +                    0
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        .unwrap();
 | 
	
		
			
				|  |  | +        let stream = prog.expand().unwrap();
 | 
	
		
			
				|  |  | +        assert!(stream
 | 
	
		
			
				|  |  | +            .to_string()
 | 
	
		
			
				|  |  | +            .contains("[link_section = \"cgroup/skb/foo\"]"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    #[test]
 | 
	
		
			
				|  |  | +    fn cgroup_skb_no_name() {
 | 
	
		
			
				|  |  | +        let prog = CgroupSkb::from_syn(
 | 
	
		
			
				|  |  | +            parse_quote!(),
 | 
	
		
			
				|  |  | +            parse_quote!(
 | 
	
		
			
				|  |  | +                fn foo(ctx: SkBuffContext) -> i32 {
 | 
	
		
			
				|  |  | +                    0
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        .unwrap();
 | 
	
		
			
				|  |  | +        let stream = prog.expand().unwrap();
 | 
	
		
			
				|  |  | +        assert!(stream
 | 
	
		
			
				|  |  | +            .to_string()
 | 
	
		
			
				|  |  | +            .contains("[link_section = \"cgroup/skb\"]"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    #[test]
 | 
	
		
			
				|  |  | +    fn cgroup_skb_with_attach_no_name() {
 | 
	
		
			
				|  |  | +        let prog = CgroupSkb::from_syn(
 | 
	
		
			
				|  |  | +            parse_quote!(attach = "egress"),
 | 
	
		
			
				|  |  | +            parse_quote!(
 | 
	
		
			
				|  |  | +                fn foo(ctx: SkBuffContext) -> i32 {
 | 
	
		
			
				|  |  | +                    0
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        .unwrap();
 | 
	
		
			
				|  |  | +        let stream = prog.expand().unwrap();
 | 
	
		
			
				|  |  | +        assert!(stream
 | 
	
		
			
				|  |  | +            .to_string()
 | 
	
		
			
				|  |  | +            .contains("[link_section = \"cgroup_skb/egress\"]"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |