netlink_packet_route/link/sriov/
mac.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::{DecodeError, Emitable, Parseable};
4
5const MAX_ADDR_LEN: usize = 32;
6
7const VF_INFO_MAC_LEN: usize = MAX_ADDR_LEN + 4;
8
9#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
10#[non_exhaustive]
11pub struct VfInfoMac {
12    pub vf_id: u32,
13    pub mac: [u8; MAX_ADDR_LEN],
14}
15
16impl VfInfoMac {
17    pub fn new(vf_id: u32, mac: &[u8]) -> Self {
18        let mut ret = Self { vf_id, ..Default::default() };
19        if mac.len() >= MAX_ADDR_LEN {
20            ret.mac.copy_from_slice(&mac[..MAX_ADDR_LEN]);
21        } else {
22            ret.mac[..mac.len()].copy_from_slice(mac);
23        }
24        ret
25    }
26}
27
28buffer!(VfInfoMacBuffer(VF_INFO_MAC_LEN) {
29    vf_id: (u32, 0..4),
30    mac: (slice, 4..VF_INFO_MAC_LEN),
31});
32
33impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<VfInfoMacBuffer<&'a T>> for VfInfoMac {
34    type Error = DecodeError;
35    fn parse(buf: &VfInfoMacBuffer<&T>) -> Result<Self, DecodeError> {
36        Ok(Self::new(buf.vf_id(), buf.mac()))
37    }
38}
39
40impl Emitable for VfInfoMac {
41    fn buffer_len(&self) -> usize {
42        VF_INFO_MAC_LEN
43    }
44
45    fn emit(&self, buffer: &mut [u8]) {
46        let mut buffer = VfInfoMacBuffer::new(buffer);
47        buffer.set_vf_id(self.vf_id);
48        buffer.mac_mut().copy_from_slice(&self.mac);
49    }
50}