Skip to content

Commit 2f2bb4d

Browse files
fixup! iptunnel: add support to ipip, ipip6 and ip6ip6 tunnels
1 parent 0528db3 commit 2f2bb4d

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

src/link/link_info/iptunnel.rs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,26 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
166166
parse_u32(payload).context("invalid IFLA_IPTUN_LINK value")?,
167167
),
168168
IFLA_IPTUN_LOCAL => {
169-
let ip = parse_ip_addr(payload)
170-
.context("invalid IFLA_IPTUN_LOCAL")?;
171-
Self::Local(ip)
169+
match parse_ip_addr(payload) {
170+
Ok(ip) => Local(ip),
171+
Err(_) => {
172+
// Fallback for malformed IP addresses in SIT tunnels
173+
Other(DefaultNla::parse(buf).context(
174+
"failed to parse IFLA_IPTUN_LOCAL as fallback",
175+
)?)
176+
}
177+
}
172178
}
173179
IFLA_IPTUN_REMOTE => {
174-
let ip = parse_ip_addr(payload)
175-
.context("invalid IFLA_IPTUN_REMOTE")?;
176-
Self::Remote(ip)
180+
match parse_ip_addr(payload) {
181+
Ok(ip) => Remote(ip),
182+
Err(_) => {
183+
// Fallback for malformed IP addresses in SIT tunnels
184+
Other(DefaultNla::parse(buf).context(
185+
"failed to parse IFLA_IPTUN_REMOTE as fallback",
186+
)?)
187+
}
188+
}
177189
}
178190
IFLA_IPTUN_TTL => {
179191
Ttl(parse_u8(payload)
@@ -221,25 +233,26 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
221233
IFLA_IPTUN_6RD_PREFIX => {
222234
if payload.len() == 16 {
223235
let mut data = [0u8; 16];
224-
data.copy_from_slice(&payload[0..16]);
236+
data.copy_from_slice(payload);
225237
Self::Ipv6RdPrefix(Ipv6Addr::from(data))
226238
} else {
227-
return Err(DecodeError::from(format!(
228-
"Invalid IFLA_IPTUN_6RD_PREFIX, got unexpected length \
229-
of IPv6 address payload {payload:?}"
230-
)));
239+
// Fallback for malformed 6RD prefix data
240+
Other(DefaultNla::parse(buf).context(
241+
"failed to parse IFLA_IPTUN_6RD_PREFIX as fallback",
242+
)?)
231243
}
232244
}
233245
IFLA_IPTUN_6RD_RELAY_PREFIX => {
234246
if payload.len() == 16 {
235247
let mut data = [0u8; 16];
236-
data.copy_from_slice(&payload[0..16]);
248+
data.copy_from_slice(payload);
237249
Self::Ipv6RdRelayPrefix(Ipv6Addr::from(data))
238250
} else {
239-
return Err(DecodeError::from(format!(
240-
"Invalid IFLA_IPTUN_6RD_RELAY_PREFIX, got unexpected \
241-
length of IPv6 address payload {payload:?}"
242-
)));
251+
// Fallback for malformed 6RD relay prefix data
252+
Other(
253+
DefaultNla::parse(buf)
254+
.context("failed to parse IFLA_IPTUN_6RD_RELAY_PREFIX as fallback")?,
255+
)
243256
}
244257
}
245258
IFLA_IPTUN_6RD_PREFIXLEN => Ipv6RdPrefixLen(

0 commit comments

Comments
 (0)