netlink_packet_route/rtnl/link/nlas/
af_spec_inet.rs1use 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}