#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct DpdkBus(NonNull<rte_bus>);
impl PrintAllInformation for DpdkBus
{
#[inline(always)]
fn print_information_to_stream(stream: *mut FILE)
{
unsafe { rte_bus_dump(stream) };
}
}
impl DpdkBus
{
#[inline(always)]
pub fn register(&self)
{
unsafe { rte_bus_register(self.0.as_ptr()) }
}
#[inline(always)]
pub fn unregister(&self)
{
unsafe { rte_bus_register(self.0.as_ptr()) }
}
#[inline(always)]
pub fn next(&self) -> Option<Self>
{
let next = unsafe { self.0.as_ref().next.tqe_next };
if next.is_null()
{
None
}
else
{
Some(DpdkBus(unsafe { NonNull::new_unchecked(next) }))
}
}
#[inline(always)]
pub fn name<'a>(&'a self) -> &'a CStr
{
unsafe { CStr::from_ptr(self.0.as_ref().name) }
}
#[inline(always)]
pub fn scan_mode(&self) -> rte_bus_scan_mode
{
(unsafe { &self.0.as_ref().conf }).scan_mode
}
#[inline(always)]
pub fn get_iommu_class(&self) -> rte_iova_mode
{
unsafe { (self.0.as_ref().get_iommu_class)() }
}
#[inline(always)]
pub fn get_common_iommu_class() -> rte_iova_mode
{
unsafe { rte_bus_get_iommu_class() }
}
#[inline(always)]
pub fn scan_for_all_buses() -> Result<(), ()>
{
if unsafe { rte_bus_scan() } == 0
{
Ok(())
}
else
{
Err(())
}
}
#[inline(always)]
pub fn probe_and_initialize_all_buses() -> Result<(), ()>
{
if unsafe { rte_bus_probe() } == 0
{
Ok(())
}
else
{
Err(())
}
}
#[inline(always)]
pub fn find_bus_by_name(name: ConstCStr) -> Option<Self>
{
let result = unsafe { rte_bus_find_by_name(name.as_ptr() )};
if unlikely!(result.is_null())
{
None
}
else
{
Some(DpdkBus(unsafe { NonNull::new_unchecked(result) }))
}
}
#[inline(always)]
pub fn find_bus_by_comparator<DpdkBusComparator: PartialOrd<NonNull<rte_bus>>>(comparator: &DpdkBusComparator, start_from: Option<Self>) -> Option<Self>
{
unsafe extern "C" fn callback<DpdkBusComparator: PartialOrd<NonNull<rte_bus>>>(bus: *const rte_bus, data: *const c_void) -> i32
{
use self::Ordering::*;
debug_assert!(!bus.is_null(), "bus is null");
debug_assert!(!data.is_null(), "data is null");
let comparator = & * (data as *const DpdkBusComparator);
match comparator.partial_cmp(&(NonNull::new_unchecked(bus as *mut _)))
{
None => !0,
Some(Less) => -1,
Some(Equal) => 0,
Some(Greater) => 1,
}
}
let start = match start_from
{
None => null(),
Some(DpdkBus(non_null)) => non_null.as_ptr() as *const _,
};
let x: rte_bus_cmp_t = callback::<DpdkBusComparator>;
let result = unsafe { rte_bus_find(start, x, comparator as *const _ as
*const c_void) };
if result.is_null()
{
None
}
else
{
Some(DpdkBus(unsafe { NonNull::new_unchecked(result) }))
}
}
}