netlink_packet_route/link/sriov/
broadcast.rs
1use 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}