Skip to content

Commit b3e49c6

Browse files
ffmanceracathay4t
authored andcommitted
iptun: add support to 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 IpTun struct. Unit tests added.
1 parent d44d500 commit b3e49c6

File tree

7 files changed

+632
-13
lines changed

7 files changed

+632
-13
lines changed

src/link/link_info/info_data.rs

+17-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ use netlink_packet_utils::{
99

1010
use super::super::{
1111
InfoBond, InfoBridge, InfoGeneve, InfoGreTap, InfoGreTap6, InfoGreTun,
12-
InfoGreTun6, InfoGtp, InfoHsr, InfoIpVlan, InfoIpVtap, InfoIpoib, InfoKind,
13-
InfoMacSec, InfoMacVlan, InfoMacVtap, InfoSitTun, InfoTun, InfoVeth,
14-
InfoVlan, InfoVrf, InfoVti, InfoVxlan, InfoXfrm,
12+
InfoGreTun6, InfoGtp, InfoHsr, InfoIpTun, InfoIpVlan, InfoIpVtap,
13+
InfoIpoib, InfoKind, InfoMacSec, InfoMacVlan, InfoMacVtap, InfoSitTun,
14+
InfoTun, InfoVeth, InfoVlan, InfoVrf, InfoVti, InfoVxlan, InfoXfrm,
1515
};
1616

1717
const IFLA_INFO_DATA: u16 = 2;
@@ -42,6 +42,7 @@ pub enum InfoData {
4242
MacSec(Vec<InfoMacSec>),
4343
Hsr(Vec<InfoHsr>),
4444
Geneve(Vec<InfoGeneve>),
45+
IpTun(Vec<InfoIpTun>),
4546
Other(Vec<u8>),
4647
}
4748

@@ -71,6 +72,7 @@ impl Nla for InfoData {
7172
Self::Vti(nlas) => nlas.as_slice().buffer_len(),
7273
Self::Gtp(nlas) => nlas.as_slice().buffer_len(),
7374
Self::Geneve(nlas) => nlas.as_slice().buffer_len(),
75+
Self::IpTun(nlas) => nlas.as_slice().buffer_len(),
7476
Self::Other(v) => v.len(),
7577
}
7678
}
@@ -100,6 +102,7 @@ impl Nla for InfoData {
100102
Self::Vti(nlas) => nlas.as_slice().emit(buffer),
101103
Self::Gtp(nlas) => nlas.as_slice().emit(buffer),
102104
Self::Geneve(nlas) => nlas.as_slice().emit(buffer),
105+
Self::IpTun(nlas) => nlas.as_slice().emit(buffer),
103106
Self::Other(v) => buffer.copy_from_slice(v.as_slice()),
104107
}
105108
}
@@ -353,6 +356,17 @@ impl InfoData {
353356
}
354357
InfoData::Hsr(v)
355358
}
359+
InfoKind::IpIp | InfoKind::Ip6Tnl => {
360+
let mut v = Vec::new();
361+
for nla in NlasIterator::new(payload) {
362+
let nla = &nla.context(format!(
363+
"invalid IFLA_INFO_DATA for {kind} {payload:?}"
364+
))?;
365+
let parsed = InfoIpTun::parse(nla)?;
366+
v.push(parsed);
367+
}
368+
InfoData::IpTun(v)
369+
}
356370
InfoKind::Geneve => {
357371
let mut v = Vec::new();
358372
for nla in NlasIterator::new(payload) {

src/link/link_info/infos.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const MACVTAP: &str = "macvtap";
3131
const GRETAP: &str = "gretap";
3232
const IP6GRETAP: &str = "ip6gretap";
3333
const IPIP: &str = "ipip";
34+
const IP6TNL: &str = "ip6tnl";
3435
const SIT: &str = "sit";
3536
const GRE: &str = "gre";
3637
const IP6GRE: &str = "ip6gre";
@@ -189,7 +190,8 @@ pub enum InfoKind {
189190
MacVtap,
190191
GreTap,
191192
GreTap6,
192-
IpTun,
193+
IpIp,
194+
Ip6Tnl,
193195
SitTun,
194196
GreTun,
195197
GreTun6,
@@ -226,7 +228,8 @@ impl std::fmt::Display for InfoKind {
226228
Self::MacVtap => MACVTAP,
227229
Self::GreTap => GRETAP,
228230
Self::GreTap6 => IP6GRETAP,
229-
Self::IpTun => IPIP,
231+
Self::IpIp => IPIP,
232+
Self::Ip6Tnl => IP6TNL,
230233
Self::SitTun => SIT,
231234
Self::GreTun => GRE,
232235
Self::GreTun6 => IP6GRE,
@@ -263,7 +266,8 @@ impl Nla for InfoKind {
263266
Self::MacVtap => MACVTAP.len(),
264267
Self::GreTap => GRETAP.len(),
265268
Self::GreTap6 => IP6GRETAP.len(),
266-
Self::IpTun => IPIP.len(),
269+
Self::IpIp => IPIP.len(),
270+
Self::Ip6Tnl => IP6TNL.len(),
267271
Self::SitTun => SIT.len(),
268272
Self::GreTun => GRE.len(),
269273
Self::GreTun6 => IP6GRE.len(),
@@ -320,7 +324,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoKind {
320324
MACVTAP => Self::MacVtap,
321325
GRETAP => Self::GreTap,
322326
IP6GRETAP => Self::GreTap6,
323-
IPIP => Self::IpTun,
327+
IPIP => Self::IpIp,
328+
IP6TNL => Self::Ip6Tnl,
324329
SIT => Self::SitTun,
325330
GRE => Self::GreTun,
326331
IP6GRE => Self::GreTun6,

0 commit comments

Comments
 (0)