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<T: AsRef<[u8]> + ?Sized> Parseable<VfInfoLinkStateBuffer<&T>>
26    for VfInfoLinkState
27{
28    fn parse(buf: &VfInfoLinkStateBuffer<&T>) -> Result<Self, DecodeError> {
29        Ok(Self::new(buf.vf_id(), buf.state().into()))
30    }
31}
32
33impl Emitable for VfInfoLinkState {
34    fn buffer_len(&self) -> usize {
35        VF_INFO_LINK_STATE_LEN
36    }
37
38    fn emit(&self, buffer: &mut [u8]) {
39        let mut buffer = VfInfoLinkStateBuffer::new(buffer);
40        buffer.set_vf_id(self.vf_id);
41        buffer.set_state(self.state.into());
42    }
43}
44
45const IFLA_VF_LINK_STATE_AUTO: u32 = 0;
46const IFLA_VF_LINK_STATE_ENABLE: u32 = 1;
47const IFLA_VF_LINK_STATE_DISABLE: u32 = 2;
48
49#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
50#[non_exhaustive]
51pub enum VfLinkState {
52    #[default]
53    Auto,
54    Enable,
55    Disable,
56    Other(u32),
57}
58
59impl From<u32> for VfLinkState {
60    fn from(d: u32) -> Self {
61        match d {
62            IFLA_VF_LINK_STATE_AUTO => Self::Auto,
63            IFLA_VF_LINK_STATE_ENABLE => Self::Enable,
64            IFLA_VF_LINK_STATE_DISABLE => Self::Disable,
65            _ => Self::Other(d),
66        }
67    }
68}
69
70impl From<VfLinkState> for u32 {
71    fn from(v: VfLinkState) -> u32 {
72        match v {
73            VfLinkState::Auto => IFLA_VF_LINK_STATE_AUTO,
74            VfLinkState::Enable => IFLA_VF_LINK_STATE_ENABLE,
75            VfLinkState::Disable => IFLA_VF_LINK_STATE_DISABLE,
76            VfLinkState::Other(d) => d,
77        }
78    }
79}