netlink_packet_route/link/sriov/
link_state.rs
1use netlink_packet_utils::{DecodeError, Emitable, Parseable};
4
5const VF_INFO_LINK_STATE_LEN: usize = 8;
6
7#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
8#[non_exhaustive]
9pub struct VfInfoLinkState {
10 pub vf_id: u32,
11 pub state: VfLinkState,
12}
13
14impl VfInfoLinkState {
15 pub fn new(vf_id: u32, state: VfLinkState) -> Self {
16 Self { vf_id, state }
17 }
18}
19
20buffer!(VfInfoLinkStateBuffer(VF_INFO_LINK_STATE_LEN) {
21 vf_id: (u32, 0..4),
22 state: (u32, 4..8),
23});
24
25impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<VfInfoLinkStateBuffer<&'a T>> for VfInfoLinkState {
26 type Error = DecodeError;
27 fn parse(buf: &VfInfoLinkStateBuffer<&T>) -> Result<Self, DecodeError> {
28 Ok(Self::new(buf.vf_id(), buf.state().into()))
29 }
30}
31
32impl Emitable for VfInfoLinkState {
33 fn buffer_len(&self) -> usize {
34 VF_INFO_LINK_STATE_LEN
35 }
36
37 fn emit(&self, buffer: &mut [u8]) {
38 let mut buffer = VfInfoLinkStateBuffer::new(buffer);
39 buffer.set_vf_id(self.vf_id);
40 buffer.set_state(self.state.into());
41 }
42}
43
44const IFLA_VF_LINK_STATE_AUTO: u32 = 0;
45const IFLA_VF_LINK_STATE_ENABLE: u32 = 1;
46const IFLA_VF_LINK_STATE_DISABLE: u32 = 2;
47
48#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
49#[non_exhaustive]
50pub enum VfLinkState {
51 #[default]
52 Auto,
53 Enable,
54 Disable,
55 Other(u32),
56}
57
58impl From<u32> for VfLinkState {
59 fn from(d: u32) -> Self {
60 match d {
61 IFLA_VF_LINK_STATE_AUTO => Self::Auto,
62 IFLA_VF_LINK_STATE_ENABLE => Self::Enable,
63 IFLA_VF_LINK_STATE_DISABLE => Self::Disable,
64 _ => Self::Other(d),
65 }
66 }
67}
68
69impl From<VfLinkState> for u32 {
70 fn from(v: VfLinkState) -> u32 {
71 match v {
72 VfLinkState::Auto => IFLA_VF_LINK_STATE_AUTO,
73 VfLinkState::Enable => IFLA_VF_LINK_STATE_ENABLE,
74 VfLinkState::Disable => IFLA_VF_LINK_STATE_DISABLE,
75 VfLinkState::Other(d) => d,
76 }
77 }
78}