Skip to content

Commit ddcfa1b

Browse files
committed
[datadog] runtime-rs: store netkit mode from InfoData and use it for L3 detection
Signed-off-by: Mateo Lelong <mateo.lelong@datadoghq.com>
1 parent a3d26fb commit ddcfa1b

3 files changed

Lines changed: 41 additions & 8 deletions

File tree

src/runtime-rs/crates/resource/src/network/network_with_netns.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,22 @@ async fn create_endpoint(
314314
Arc::new(ret)
315315
}
316316
"netkit" => {
317-
// L3 mode netkit devices have no MAC address and are not supported.
318-
if attrs.hardware_addr.is_empty() {
317+
let is_l3 = link
318+
.as_any()
319+
.downcast_ref::<link::Netkit>()
320+
.and_then(|n| n.mode)
321+
.map_or_else(
322+
|| {
323+
attrs.hardware_addr.is_empty()
324+
// L3 devices have no MAC address, so check for all-zero.
325+
// https://github.com/torvalds/linux/blob/master/drivers/net/netkit.c
326+
|| attrs.hardware_addr.iter().all(|&b| b == 0)
327+
},
328+
|m| m == netlink_packet_route::link::NetkitMode::L3,
329+
);
330+
if is_l3 {
319331
return Err(anyhow!(
320-
"netkit device {} has no MAC address (L3 mode not supported - use L2 mode or veth)",
332+
"netkit device {} is in L3 mode (not supported - use L2 mode or veth)",
321333
attrs.name
322334
));
323335
}

src/runtime-rs/crates/resource/src/network/utils/link/manager.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//
66

77
use netlink_packet_route::link::{
8-
InfoBridge, InfoData, InfoKind, LinkAttribute, LinkInfo, LinkMessage,
8+
InfoBridge, InfoData, InfoKind, InfoNetkit, LinkAttribute, LinkInfo, LinkMessage, NetkitMode,
99
};
1010

1111
use super::{Link, LinkAttrs};
@@ -150,8 +150,8 @@ fn link_info(mut infos: Vec<LinkInfo>) -> Box<dyn Link> {
150150
InfoData::Bridge(ibs) => {
151151
link = Some(Box::new(parse_bridge(ibs)));
152152
}
153-
InfoData::Netkit(_) => {
154-
link = Some(Box::new(Netkit::default()));
153+
InfoData::Netkit(nks) => {
154+
link = Some(Box::new(parse_netkit(nks)));
155155
}
156156
_ => {
157157
link = Some(Box::new(Device::default()));
@@ -173,6 +173,17 @@ fn link_info(mut infos: Vec<LinkInfo>) -> Box<dyn Link> {
173173
link.unwrap()
174174
}
175175

176+
fn parse_netkit(infos: Vec<InfoNetkit>) -> Netkit {
177+
let mut netkit = Netkit::default();
178+
for info in infos {
179+
if let InfoNetkit::Mode(mode) = info {
180+
netkit.mode = Some(mode);
181+
break;
182+
}
183+
}
184+
netkit
185+
}
186+
176187
fn parse_bridge(mut ibs: Vec<InfoBridge>) -> Bridge {
177188
let mut bridge = Bridge::default();
178189
while let Some(ib) = ibs.pop() {
@@ -204,6 +215,9 @@ macro_rules! impl_network_dev {
204215
fn r#type(&self) -> &'static str {
205216
$r_type
206217
}
218+
fn as_any(&self) -> &dyn std::any::Any {
219+
self
220+
}
207221
}
208222
};
209223
}
@@ -222,7 +236,13 @@ macro_rules! define_and_impl_network_dev {
222236
define_and_impl_network_dev!("device", Device);
223237
define_and_impl_network_dev!("tuntap", Tuntap);
224238
define_and_impl_network_dev!("veth", Veth);
225-
define_and_impl_network_dev!("netkit", Netkit);
239+
#[derive(Debug, PartialEq, Eq, Clone, Default)]
240+
pub struct Netkit {
241+
attrs: Option<LinkAttrs>,
242+
pub mode: Option<NetkitMode>,
243+
}
244+
245+
impl_network_dev!("netkit", Netkit);
226246
define_and_impl_network_dev!("ipvlan", IpVlan);
227247
define_and_impl_network_dev!("macvlan", MacVlan);
228248
define_and_impl_network_dev!("vlan", Vlan);

src/runtime-rs/crates/resource/src/network/utils/link/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ mod driver_info;
1010
pub use driver_info::get_driver_info;
1111
mod macros;
1212
mod manager;
13-
pub use manager::get_link_from_message;
13+
pub use manager::{get_link_from_message, Netkit};
1414

1515
use std::os::unix::io::RawFd;
1616

@@ -145,4 +145,5 @@ pub trait Link: Send + Sync {
145145
fn attrs(&self) -> &LinkAttrs;
146146
fn set_attrs(&mut self, attr: LinkAttrs);
147147
fn r#type(&self) -> &str;
148+
fn as_any(&self) -> &dyn std::any::Any;
148149
}

0 commit comments

Comments
 (0)