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<T: AsRef<[u8]> + ?Sized> Parseable<VfInfoBroadcastBuffer<&T>>
30    for VfInfoBroadcast
31{
32    fn parse(buf: &VfInfoBroadcastBuffer<&T>) -> Result<Self, DecodeError> {
33        Ok(Self::new(buf.addr()))
34    }
35}
36
37impl Emitable for VfInfoBroadcast {
38    fn buffer_len(&self) -> usize {
39        VF_INFO_BROADCAST_LEN
40    }
41
42    fn emit(&self, buffer: &mut [u8]) {
43        let mut buffer = VfInfoBroadcastBuffer::new(buffer);
44        buffer.addr_mut().copy_from_slice(&self.addr);
45    }
46}