Skip to main content

dope_core/driver/
control.rs

1use std::io;
2use std::os::fd::BorrowedFd;
3
4use crate::backend::Backend;
5use crate::backend::ops::control::ControlBackend;
6
7use super::token::Token;
8use super::{DriverContext, OutboundReservation, PushError};
9
10pub trait ContextControl {
11    fn prepare_drop(&mut self);
12    /// # Safety
13    /// `fd` must remain open through this call.
14    unsafe fn register_shutdown_fd(&mut self, fd: BorrowedFd<'_>) -> io::Result<()>;
15    fn reserve_outbound(&mut self, count: u32) -> io::Result<OutboundReservation>;
16    fn reserve_route(&mut self, id: u8) -> bool;
17    fn release_route(&mut self, id: u8);
18    fn poison_route(&mut self, id: u8);
19    fn quiesce(&mut self, targets: &[Token]) -> bool;
20    fn set(
21        &mut self,
22        fixed_idx: u32,
23        level: u32,
24        optname: u32,
25        value: i32,
26    ) -> Result<(), PushError>;
27}
28
29impl ContextControl for DriverContext<'_, '_> {
30    fn prepare_drop(&mut self) {
31        <Backend as ControlBackend>::prepare_drop(self.backend());
32    }
33
34    unsafe fn register_shutdown_fd(&mut self, fd: BorrowedFd<'_>) -> io::Result<()> {
35        unsafe { <Backend as ControlBackend>::register_shutdown_fd(self.backend(), fd) }
36    }
37
38    fn reserve_outbound(&mut self, count: u32) -> io::Result<OutboundReservation> {
39        <Backend as ControlBackend>::reserve_outbound(self.backend(), count)
40    }
41
42    fn reserve_route(&mut self, id: u8) -> bool {
43        <Backend as ControlBackend>::reserve_route(self.backend(), id)
44    }
45
46    fn release_route(&mut self, id: u8) {
47        <Backend as ControlBackend>::release_route(self.backend(), id);
48    }
49
50    fn poison_route(&mut self, id: u8) {
51        <Backend as ControlBackend>::poison_route(self.backend(), id);
52    }
53
54    fn quiesce(&mut self, targets: &[Token]) -> bool {
55        <Backend as ControlBackend>::quiesce(self.backend(), targets)
56    }
57
58    fn set(
59        &mut self,
60        fixed_idx: u32,
61        level: u32,
62        optname: u32,
63        value: i32,
64    ) -> Result<(), PushError> {
65        <Backend as ControlBackend>::set(self.backend(), fixed_idx, level, optname, value)
66    }
67}