netlink_packet_route/link/sriov/
broadcast.rs

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