@ -6,7 +6,6 @@ use std::{
path ::Path ,
} ;
use log ::debug ;
use thiserror ::Error ;
use super ::FdLink ;
@ -101,8 +100,8 @@ pub enum TcError {
#[ error( " tcx links can only be attached to ingress or egress, custom attachment: {0} is not supported " ) ]
InvalidTcxAttach ( u32 ) ,
/// program was loaded via tcx not netlink
#[ error( " program wa s loaded via tcx not netlink " ) ]
InvalidLink ,
#[ error( " operation not supported for programs loaded via tcx" ) ]
InvalidLink Operation ,
}
impl TcAttachType {
@ -114,11 +113,11 @@ impl TcAttachType {
}
}
pub ( crate ) fn tcx_attach ( & self ) -> Result < bpf_attach_type , TcError > {
pub ( crate ) fn tcx_attach _type ( & self ) -> Result < bpf_attach_type , TcError > {
match self {
Self ::Ingress = > Ok ( BPF_TCX_INGRESS ) ,
Self ::Egress = > Ok ( BPF_TCX_EGRESS ) ,
Self ::Custom ( i ) = > Err ( TcError ::InvalidTcxAttach ( i . to_owned ( ) ) ) ,
Self ::Custom ( i ) = > Err ( TcError ::InvalidTcxAttach ( * i ) ) ,
}
}
}
@ -127,8 +126,8 @@ impl TcAttachType {
///
/// The options vary based on what is supported by the current kernel. Kernels
/// older than 6.6.0 must utilize netlink for attachments, while newer kernels
/// can utilize the modern TCX eBPF link type which support ' s the kernel's
/// multi-prog api .
/// can utilize the modern TCX eBPF link type which support s the kernel's
/// multi-prog API .
#[ derive(Debug) ]
pub enum TcAttachOptions {
/// Netlink attach options.
@ -137,7 +136,7 @@ pub enum TcAttachOptions {
TcxOrder ( LinkOrder ) ,
}
/// Options for SchedClassifier attach via netlink
/// Options for SchedClassifier attach via netlink .
#[ derive(Debug, Default, Hash, Eq, PartialEq) ]
pub struct NlOptions {
/// Priority assigned to tc program with lower number = higher priority.
@ -167,7 +166,7 @@ impl SchedClassifier {
/// # Errors
///
/// When attaching fails, [`ProgramError::SyscallError`] is returned for
/// kernels `>= 6.6.0`, and instead [`TcError::NetlinkError`] is returned for
/// kernels `>= 6.6.0`, and [`TcError::NetlinkError`] is returned for
/// older kernels. A common cause of netlink attachment failure is not having added
/// the `clsact` qdisc to the given interface, see [`qdisc_add_clsact`]
///
@ -177,14 +176,12 @@ impl SchedClassifier {
attach_type : TcAttachType ,
) -> Result < SchedClassifierLinkId , ProgramError > {
if KernelVersion ::current ( ) . unwrap ( ) > = KernelVersion ::new ( 6 , 6 , 0 ) {
debug ! ( "attaching schedClassifier program via tcx link API" ) ;
self . attach_with_options (
interface ,
attach_type ,
TcAttachOptions ::TcxOrder ( LinkOrder ::default ( ) ) ,
)
} else {
debug ! ( "attaching SchedClassifier program via netlink API" ) ;
self . attach_with_options (
interface ,
attach_type ,
@ -296,7 +293,7 @@ impl SchedClassifier {
let link_fd = bpf_link_create (
prog_fd ,
LinkTarget ::IfIndex ( if_index ) ,
attach_type . tcx_attach ( ) ? ,
attach_type . tcx_attach _type ( ) ? ,
None ,
options . flags . bits ( ) ,
Some ( & options . link_ref ) ,
@ -436,7 +433,6 @@ impl TryFrom<FdLink> for SchedClassifierLink {
type Error = LinkError ;
fn try_from ( fd_link : FdLink ) -> Result < Self , Self ::Error > {
// unwrap of fd_link.fd will not panic since it's only None when being dropped.
let info = bpf_link_get_info_by_fd ( fd_link . fd . as_fd ( ) ) ? ;
if info . type_ = = ( bpf_link_type ::BPF_LINK_TYPE_TCX as u32 ) {
return Ok ( Self ::new ( TcLinkInner ::FdLink ( fd_link ) ) ) ;
@ -506,7 +502,7 @@ impl SchedClassifierLink {
if let TcLinkInner ::NlLink ( n ) = self . inner ( ) {
Ok ( n . attach_type )
} else {
Err ( TcError ::InvalidLink . into ( ) )
Err ( TcError ::InvalidLink Operation . into ( ) )
}
}
@ -515,7 +511,7 @@ impl SchedClassifierLink {
if let TcLinkInner ::NlLink ( n ) = self . inner ( ) {
Ok ( n . priority )
} else {
Err ( TcError ::InvalidLink . into ( ) )
Err ( TcError ::InvalidLink Operation . into ( ) )
}
}
@ -524,7 +520,7 @@ impl SchedClassifierLink {
if let TcLinkInner ::NlLink ( n ) = self . inner ( ) {
Ok ( n . handle )
} else {
Err ( TcError ::InvalidLink . into ( ) )
Err ( TcError ::InvalidLink Operation . into ( ) )
}
}
}