netlink_packet_route/link/sriov/
link_state.rs

1// SPDX-License-Identifier: MIT
2
3use 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}