netlink_packet_route/rtnl/link/nlas/
af_spec_inet.rs

1// SPDX-License-Identifier: MIT
2
3use anyhow::Context;
4
5use super::{inet, inet6};
6use crate::{
7    constants::*,
8    nlas::{self, DefaultNla, NlaBuffer, NlasIterator},
9    traits::{Emitable, Parseable},
10    DecodeError,
11};
12
13#[derive(Clone, Eq, PartialEq, Debug)]
14pub enum AfSpecInet {
15    Unspec(Vec<u8>),
16    Unix(Vec<u8>),
17    Ax25(Vec<u8>),
18    Ipx(Vec<u8>),
19    AppleTalk(Vec<u8>),
20    Netrom(Vec<u8>),
21    Bridge(Vec<u8>),
22    AtmPvc(Vec<u8>),
23    X25(Vec<u8>),
24    Inet(Vec<inet::Inet>),
25    Inet6(Vec<inet6::Inet6>),
26    Rose(Vec<u8>),
27    DecNet(Vec<u8>),
28    NetbEui(Vec<u8>),
29    Security(Vec<u8>),
30    Key(Vec<u8>),
31    Netlink(Vec<u8>),
32    Packet(Vec<u8>),
33    Ash(Vec<u8>),
34    EcoNet(Vec<u8>),
35    AtmSvc(Vec<u8>),
36    Rds(Vec<u8>),
37    Sna(Vec<u8>),
38    Irda(Vec<u8>),
39    Pppox(Vec<u8>),
40    WanPipe(Vec<u8>),
41    Llc(Vec<u8>),
42    Can(Vec<u8>),
43    Tipc(Vec<u8>),
44    Bluetooth(Vec<u8>),
45    Iucv(Vec<u8>),
46    RxRpc(Vec<u8>),
47    Isdn(Vec<u8>),
48    Phonet(Vec<u8>),
49    Ieee802154(Vec<u8>),
50    Caif(Vec<u8>),
51    Alg(Vec<u8>),
52    Other(DefaultNla),
53}
54
55impl nlas::Nla for AfSpecInet {
56    #[rustfmt::skip]
57    fn value_len(&self) -> usize {
58        use self::AfSpecInet::*;
59        match *self {
60            Unspec(ref bytes)
61                | Unix(ref bytes)
62                | Ax25(ref bytes)
63                | Ipx(ref bytes)
64                | AppleTalk(ref bytes)
65                | Netrom(ref bytes)
66                | Bridge(ref bytes)
67                | AtmPvc(ref bytes)
68                | X25(ref bytes)
69                | Rose(ref bytes)
70                | DecNet(ref bytes)
71                | NetbEui(ref bytes)
72                | Security(ref bytes)
73                | Key(ref bytes)
74                | Netlink(ref bytes)
75                | Packet(ref bytes)
76                | Ash(ref bytes)
77                | EcoNet(ref bytes)
78                | AtmSvc(ref bytes)
79                | Rds(ref bytes)
80                | Sna(ref bytes)
81                | Irda(ref bytes)
82                | Pppox(ref bytes)
83                | WanPipe(ref bytes)
84                | Llc(ref bytes)
85                | Can(ref bytes)
86                | Tipc(ref bytes)
87                | Bluetooth(ref bytes)
88                | Iucv(ref bytes)
89                | RxRpc(ref bytes)
90                | Isdn(ref bytes)
91                | Phonet(ref bytes)
92                | Ieee802154(ref bytes)
93                | Caif(ref bytes)
94                | Alg(ref bytes)
95                => bytes.len(),
96            Inet6(ref nlas) => nlas.as_slice().buffer_len(),
97            Inet(ref nlas) =>  nlas.as_slice().buffer_len(),
98            Other(ref nla) => nla.value_len(),
99        }
100    }
101
102    #[rustfmt::skip]
103    fn emit_value(&self, buffer: &mut [u8]) {
104        use self::AfSpecInet::*;
105        match *self {
106            Unspec(ref bytes)
107                | Unix(ref bytes)
108                | Ax25(ref bytes)
109                | Ipx(ref bytes)
110                | AppleTalk(ref bytes)
111                | Netrom(ref bytes)
112                | Bridge(ref bytes)
113                | AtmPvc(ref bytes)
114                | X25(ref bytes)
115                | Rose(ref bytes)
116                | DecNet(ref bytes)
117                | NetbEui(ref bytes)
118                | Security(ref bytes)
119                | Key(ref bytes)
120                | Netlink(ref bytes)
121                | Packet(ref bytes)
122                | Ash(ref bytes)
123                | EcoNet(ref bytes)
124                | AtmSvc(ref bytes)
125                | Rds(ref bytes)
126                | Sna(ref bytes)
127                | Irda(ref bytes)
128                | Pppox(ref bytes)
129                | WanPipe(ref bytes)
130                | Llc(ref bytes)
131                | Can(ref bytes)
132                | Tipc(ref bytes)
133                | Bluetooth(ref bytes)
134                | Iucv(ref bytes)
135                | RxRpc(ref bytes)
136                | Isdn(ref bytes)
137                | Phonet(ref bytes)
138                | Ieee802154(ref bytes)
139                | Caif(ref bytes)
140                | Alg(ref bytes)
141                => buffer[..bytes.len()].copy_from_slice(bytes.as_slice()),
142            Inet6(ref nlas) => nlas.as_slice().emit(buffer),
143            Inet(ref nlas) => nlas.as_slice().emit(buffer),
144            Other(ref nla)  => nla.emit_value(buffer),
145        }
146    }
147
148    fn kind(&self) -> u16 {
149        use self::AfSpecInet::*;
150        match *self {
151            Inet(_) => AF_INET,
152            Unspec(_) => AF_UNSPEC,
153            Unix(_) => AF_UNIX,
154            Ax25(_) => AF_AX25,
155            Ipx(_) => AF_IPX,
156            AppleTalk(_) => AF_APPLETALK,
157            Netrom(_) => AF_NETROM,
158            Bridge(_) => AF_BRIDGE,
159            AtmPvc(_) => AF_ATMPVC,
160            X25(_) => AF_X25,
161            Inet6(_) => AF_INET6,
162            Rose(_) => AF_ROSE,
163            DecNet(_) => AF_DECNET,
164            NetbEui(_) => AF_NETBEUI,
165            Security(_) => AF_SECURITY,
166            Key(_) => AF_KEY,
167            Netlink(_) => AF_NETLINK,
168            Packet(_) => AF_PACKET,
169            Ash(_) => AF_ASH,
170            EcoNet(_) => AF_ECONET,
171            AtmSvc(_) => AF_ATMSVC,
172            Rds(_) => AF_RDS,
173            Sna(_) => AF_SNA,
174            Irda(_) => AF_IRDA,
175            Pppox(_) => AF_PPPOX,
176            WanPipe(_) => AF_WANPIPE,
177            Llc(_) => AF_LLC,
178            Can(_) => AF_CAN,
179            Tipc(_) => AF_TIPC,
180            Bluetooth(_) => AF_BLUETOOTH,
181            Iucv(_) => AF_IUCV,
182            RxRpc(_) => AF_RXRPC,
183            Isdn(_) => AF_ISDN,
184            Phonet(_) => AF_PHONET,
185            Ieee802154(_) => AF_IEEE802154,
186            Caif(_) => AF_CAIF,
187            Alg(_) => AF_ALG,
188            Other(ref nla) => nla.kind(),
189        }
190    }
191}
192
193impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for AfSpecInet {
194    fn parse(buf: &NlaBuffer<&'a T>) -> Result<Self, DecodeError> {
195        use self::AfSpecInet::*;
196
197        let payload = buf.value();
198        Ok(match buf.kind() {
199            AF_UNSPEC => Unspec(payload.to_vec()),
200            AF_INET => {
201                let mut nlas = vec![];
202                for nla in NlasIterator::new(payload) {
203                    let nla = nla.context("invalid AF_INET value")?;
204                    nlas.push(inet::Inet::parse(&nla).context("invalid AF_INET value")?);
205                }
206                Inet(nlas)
207            }
208            AF_INET6 => {
209                let mut nlas = vec![];
210                for nla in NlasIterator::new(payload) {
211                    let nla = nla.context("invalid AF_INET6 value")?;
212                    nlas.push(inet6::Inet6::parse(&nla).context("invalid AF_INET6 value")?);
213                }
214                Inet6(nlas)
215            }
216            AF_UNIX => Unix(payload.to_vec()),
217            AF_AX25 => Ax25(payload.to_vec()),
218            AF_IPX => Ipx(payload.to_vec()),
219            AF_APPLETALK => AppleTalk(payload.to_vec()),
220            AF_NETROM => Netrom(payload.to_vec()),
221            AF_BRIDGE => Bridge(payload.to_vec()),
222            AF_ATMPVC => AtmPvc(payload.to_vec()),
223            AF_X25 => X25(payload.to_vec()),
224            AF_ROSE => Rose(payload.to_vec()),
225            AF_DECNET => DecNet(payload.to_vec()),
226            AF_NETBEUI => NetbEui(payload.to_vec()),
227            AF_SECURITY => Security(payload.to_vec()),
228            AF_KEY => Key(payload.to_vec()),
229            AF_NETLINK => Netlink(payload.to_vec()),
230            AF_PACKET => Packet(payload.to_vec()),
231            AF_ASH => Ash(payload.to_vec()),
232            AF_ECONET => EcoNet(payload.to_vec()),
233            AF_ATMSVC => AtmSvc(payload.to_vec()),
234            AF_RDS => Rds(payload.to_vec()),
235            AF_SNA => Sna(payload.to_vec()),
236            AF_IRDA => Irda(payload.to_vec()),
237            AF_PPPOX => Pppox(payload.to_vec()),
238            AF_WANPIPE => WanPipe(payload.to_vec()),
239            AF_LLC => Llc(payload.to_vec()),
240            AF_CAN => Can(payload.to_vec()),
241            AF_TIPC => Tipc(payload.to_vec()),
242            AF_BLUETOOTH => Bluetooth(payload.to_vec()),
243            AF_IUCV => Iucv(payload.to_vec()),
244            AF_RXRPC => RxRpc(payload.to_vec()),
245            AF_ISDN => Isdn(payload.to_vec()),
246            AF_PHONET => Phonet(payload.to_vec()),
247            AF_IEEE802154 => Ieee802154(payload.to_vec()),
248            AF_CAIF => Caif(payload.to_vec()),
249            AF_ALG => Alg(payload.to_vec()),
250            kind => Other(DefaultNla::parse(buf).context(format!("Unknown NLA type {}", kind))?),
251        })
252    }
253}