Skip to content

Commit 84989e2

Browse files
jvaclav-rhffmanceraliangwen12year
authored andcommitted
iptunnel: add support for ipip, ipip6 and ip6ip6 tunnels
All these tunnels use the IFLA_IPTUN_* netlink API. Therefore, both IFLAN_INFO_KIND "ipip" and "ip6tnl" data is serialized using the IpTunnel struct. Unit tests added. Co-authored-by: Fernando Fernandez Mancera <[email protected]> Co-authored-by: Wen Liang <[email protected]> Signed-off-by: Jan Vaclav <[email protected]>
1 parent af3a7d8 commit 84989e2

File tree

7 files changed

+698
-16
lines changed

7 files changed

+698
-16
lines changed

src/link/link_info/info_data.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
use netlink_packet_core::{
44
DecodeError, Emitable, ErrorContext, Nla, NlaBuffer, NlasIterator,
5-
Parseable,
5+
Parseable, ParseableParametrized,
66
};
77

88
use super::super::{
99
InfoBond, InfoBridge, InfoGeneve, InfoGreTap, InfoGreTap6, InfoGreTun,
10-
InfoGreTun6, InfoGtp, InfoHsr, InfoIpVlan, InfoIpVtap, InfoIpoib, InfoKind,
11-
InfoMacSec, InfoMacVlan, InfoMacVtap, InfoSitTun, InfoTun, InfoVeth,
12-
InfoVlan, InfoVrf, InfoVti, InfoVxlan, InfoXfrm,
10+
InfoGreTun6, InfoGtp, InfoHsr, InfoIpTunnel, InfoIpVlan, InfoIpVtap,
11+
InfoIpoib, InfoKind, InfoMacSec, InfoMacVlan, InfoMacVtap, InfoTun,
12+
InfoVeth, InfoVlan, InfoVrf, InfoVti, InfoVxlan, InfoXfrm,
1313
};
1414

1515
const IFLA_INFO_DATA: u16 = 2;
@@ -29,7 +29,7 @@ pub enum InfoData {
2929
MacVtap(Vec<InfoMacVtap>),
3030
GreTap(Vec<InfoGreTap>),
3131
GreTap6(Vec<InfoGreTap6>),
32-
SitTun(Vec<InfoSitTun>),
32+
SitTun(Vec<InfoIpTunnel>),
3333
GreTun(Vec<InfoGreTun>),
3434
GreTun6(Vec<InfoGreTun6>),
3535
Vti(Vec<InfoVti>),
@@ -40,6 +40,7 @@ pub enum InfoData {
4040
MacSec(Vec<InfoMacSec>),
4141
Hsr(Vec<InfoHsr>),
4242
Geneve(Vec<InfoGeneve>),
43+
IpTunnel(Vec<InfoIpTunnel>),
4344
Other(Vec<u8>),
4445
}
4546

@@ -69,6 +70,7 @@ impl Nla for InfoData {
6970
Self::Vti(nlas) => nlas.as_slice().buffer_len(),
7071
Self::Gtp(nlas) => nlas.as_slice().buffer_len(),
7172
Self::Geneve(nlas) => nlas.as_slice().buffer_len(),
73+
Self::IpTunnel(nlas) => nlas.as_slice().buffer_len(),
7274
Self::Other(v) => v.len(),
7375
}
7476
}
@@ -98,6 +100,7 @@ impl Nla for InfoData {
98100
Self::Vti(nlas) => nlas.as_slice().emit(buffer),
99101
Self::Gtp(nlas) => nlas.as_slice().emit(buffer),
100102
Self::Geneve(nlas) => nlas.as_slice().emit(buffer),
103+
Self::IpTunnel(nlas) => nlas.as_slice().emit(buffer),
101104
Self::Other(v) => buffer.copy_from_slice(v.as_slice()),
102105
}
103106
}
@@ -247,7 +250,8 @@ impl InfoData {
247250
let nla = &nla.context(format!(
248251
"invalid IFLA_INFO_DATA for {kind} {payload:?}"
249252
))?;
250-
let parsed = InfoSitTun::parse(nla)?;
253+
let parsed =
254+
InfoIpTunnel::parse_with_param(nla, kind.clone())?;
251255
v.push(parsed);
252256
}
253257
InfoData::SitTun(v)
@@ -351,6 +355,18 @@ impl InfoData {
351355
}
352356
InfoData::Hsr(v)
353357
}
358+
InfoKind::IpIp | InfoKind::Ip6Tnl => {
359+
let mut v = Vec::new();
360+
for nla in NlasIterator::new(payload) {
361+
let nla = &nla.context(format!(
362+
"invalid IFLA_INFO_DATA for {kind} {payload:?}"
363+
))?;
364+
let parsed =
365+
InfoIpTunnel::parse_with_param(nla, kind.clone())?;
366+
v.push(parsed);
367+
}
368+
InfoData::IpTunnel(v)
369+
}
354370
InfoKind::Geneve => {
355371
let mut v = Vec::new();
356372
for nla in NlasIterator::new(payload) {

src/link/link_info/infos.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const MACVTAP: &str = "macvtap";
2929
const GRETAP: &str = "gretap";
3030
const IP6GRETAP: &str = "ip6gretap";
3131
const IPIP: &str = "ipip";
32+
const IP6TNL: &str = "ip6tnl";
3233
const SIT: &str = "sit";
3334
const GRE: &str = "gre";
3435
const IP6GRE: &str = "ip6gre";
@@ -186,7 +187,8 @@ pub enum InfoKind {
186187
MacVtap,
187188
GreTap,
188189
GreTap6,
189-
IpTun,
190+
IpIp,
191+
Ip6Tnl,
190192
SitTun,
191193
GreTun,
192194
GreTun6,
@@ -223,7 +225,8 @@ impl std::fmt::Display for InfoKind {
223225
Self::MacVtap => MACVTAP,
224226
Self::GreTap => GRETAP,
225227
Self::GreTap6 => IP6GRETAP,
226-
Self::IpTun => IPIP,
228+
Self::IpIp => IPIP,
229+
Self::Ip6Tnl => IP6TNL,
227230
Self::SitTun => SIT,
228231
Self::GreTun => GRE,
229232
Self::GreTun6 => IP6GRE,
@@ -260,7 +263,8 @@ impl Nla for InfoKind {
260263
Self::MacVtap => MACVTAP.len(),
261264
Self::GreTap => GRETAP.len(),
262265
Self::GreTap6 => IP6GRETAP.len(),
263-
Self::IpTun => IPIP.len(),
266+
Self::IpIp => IPIP.len(),
267+
Self::Ip6Tnl => IP6TNL.len(),
264268
Self::SitTun => SIT.len(),
265269
Self::GreTun => GRE.len(),
266270
Self::GreTun6 => IP6GRE.len(),
@@ -317,7 +321,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoKind {
317321
MACVTAP => Self::MacVtap,
318322
GRETAP => Self::GreTap,
319323
IP6GRETAP => Self::GreTap6,
320-
IPIP => Self::IpTun,
324+
IPIP => Self::IpIp,
325+
IP6TNL => Self::Ip6Tnl,
321326
SIT => Self::SitTun,
322327
GRE => Self::GreTun,
323328
IP6GRE => Self::GreTun6,

0 commit comments

Comments
 (0)