netlink_packet_route/neighbour/
address.rs

1// SPDX-License-Identifier: MIT
2
3use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
4
5use netlink_packet_core::{DecodeError, Emitable};
6
7use crate::{
8    ip::{
9        emit_ip_to_buffer, parse_ipv4_addr, parse_ipv6_addr, IPV4_ADDR_LEN,
10        IPV6_ADDR_LEN,
11    },
12    AddressFamily,
13};
14
15#[derive(Debug, PartialEq, Eq, Clone)]
16#[non_exhaustive]
17pub enum NeighbourAddress {
18    Inet(Ipv4Addr),
19    Inet6(Ipv6Addr),
20    Other(Vec<u8>),
21}
22
23impl NeighbourAddress {
24    pub(crate) fn parse_with_param(
25        address_family: AddressFamily,
26        payload: &[u8],
27    ) -> Result<Self, DecodeError> {
28        Ok(match address_family {
29            AddressFamily::Inet => Self::Inet(parse_ipv4_addr(payload)?),
30            AddressFamily::Inet6 => Self::Inet6(parse_ipv6_addr(payload)?),
31            _ => Self::Other(payload.to_vec()),
32        })
33    }
34}
35
36impl Emitable for NeighbourAddress {
37    fn buffer_len(&self) -> usize {
38        match self {
39            Self::Inet(_) => IPV4_ADDR_LEN,
40            Self::Inet6(_) => IPV6_ADDR_LEN,
41            Self::Other(v) => v.len(),
42        }
43    }
44
45    fn emit(&self, buffer: &mut [u8]) {
46        match self {
47            Self::Inet(v) => emit_ip_to_buffer(&((*v).into()), buffer),
48            Self::Inet6(v) => emit_ip_to_buffer(&((*v).into()), buffer),
49            Self::Other(v) => buffer.copy_from_slice(v.as_slice()),
50        }
51    }
52}
53
54impl From<IpAddr> for NeighbourAddress {
55    fn from(v: IpAddr) -> Self {
56        match v {
57            IpAddr::V4(a) => a.into(),
58            IpAddr::V6(a) => a.into(),
59        }
60    }
61}
62
63impl From<Ipv4Addr> for NeighbourAddress {
64    fn from(v: Ipv4Addr) -> Self {
65        Self::Inet(v)
66    }
67}
68
69impl From<Ipv6Addr> for NeighbourAddress {
70    fn from(v: Ipv6Addr) -> Self {
71        Self::Inet6(v)
72    }
73}