Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/target
/Cargo.lock
*.swp
tags
2 changes: 2 additions & 0 deletions .rustfmt.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ max_width = 80
wrap_comments = true
reorder_imports = true
format_strings = true
group_imports = "StdExternalCrate"
imports_granularity = "Crate"
edition = "2024"
8 changes: 7 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ path = "src/ip/main.rs"
[dependencies]
clap = { version = "4.5.40", features = ["cargo"] }
futures-util = "0.3.31"
rtnetlink = { git = "https://github.com/rust-netlink/rtnetlink", branch = "use_git" }
rtnetlink = { git = "https://github.com/rust-netlink/rtnetlink" }
serde = { version = "1.0", default-features = false, features = ["derive"] }
serde_json = "1.0.140"
serde_yaml = "0.9.34"
Expand All @@ -28,3 +28,9 @@ tokio = { version = "1.30", features = ["rt", "net", "time", "macros"] }
[dev-dependencies]
pretty_assertions = "1.4.1"
ctor = "0.5.0"

[patch.crates-io.rtnetlink]
git = "https://github.com/rust-netlink/rtnetlink"

[patch.crates-io.netlink-packet-route]
git = "https://github.com/rust-netlink/netlink-packet-route"
62 changes: 7 additions & 55 deletions src/ip/link/link_details.rs → src/ip/link/detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,13 @@

use std::ffi::CStr;

use rtnetlink::packet_core::DefaultNla;
use rtnetlink::{
packet_core::Nla as _,
packet_core::{DefaultNla, Nla as _},
packet_route::link::{AfSpecInet6, AfSpecUnspec, LinkAttribute},
};
use serde::Serialize;

use crate::link::link_info::{CliLinkInfoData, CliLinkInfoKindNData};

#[derive(Serialize)]
struct CliLinkInfoCombined {
info_kind: String,
#[serde(skip_serializing_if = "Option::is_none")]
info_data: Option<CliLinkInfoData>,
#[serde(skip_serializing_if = "Option::is_none")]
info_slave_kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
info_slave_data: Option<CliLinkInfoData>,
}

impl std::fmt::Display for CliLinkInfoCombined {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "\n ")?;
write!(f, "{} ", self.info_kind)?;
if let Some(data) = &self.info_data {
write!(f, "{data} ")?;
}

if let Some(slave_kind) = &self.info_slave_kind {
write!(f, "\n {}_slave ", slave_kind)?;
if let Some(slave_data) = &self.info_slave_data {
write!(f, "{slave_data} ")?;
}
}
Ok(())
}
}
use crate::link::link_info::CliLinkInfo;

// Use constants until support is added to netlink-packet-route
const IFLA_PARENT_DEV_NAME: u16 = 56;
Expand Down Expand Up @@ -83,13 +53,13 @@ fn default_nla_to_string(default_nla: &DefaultNla) -> String {
}

#[derive(Serialize)]
pub(crate) struct CliLinkInfoDetails {
pub(crate) struct CliLinkInfoDetail {
promiscuity: u32,
allmulti: u32,
min_mtu: u32,
max_mtu: u32,
#[serde(skip_serializing_if = "Option::is_none")]
linkinfo: Option<CliLinkInfoCombined>,
linkinfo: Option<CliLinkInfo>,
#[serde(skip_serializing_if = "String::is_empty")]
inet6_addr_gen_mode: String,
num_tx_queues: u32,
Expand All @@ -107,7 +77,7 @@ pub(crate) struct CliLinkInfoDetails {
parentdev: String,
}

impl CliLinkInfoDetails {
impl CliLinkInfoDetail {
pub fn new(nl_attrs: &[LinkAttribute]) -> Self {
let mut linkinfo = None;
let mut promiscuity = 0;
Expand Down Expand Up @@ -179,25 +149,7 @@ impl CliLinkInfoDetails {
_ => { /* println!("Remains {:?}", default_nla); */ }
},
LinkAttribute::LinkInfo(info) => {
let main_info = CliLinkInfoKindNData::new(info);
let slave_info = CliLinkInfoKindNData::new_slave(info);

// Combine main info and slave info into one structure
if let Some(main) = main_info {
let (slave_kind, slave_data) =
if let Some(slave) = slave_info {
(Some(slave.info_kind), slave.info_data)
} else {
(None, None)
};

linkinfo = Some(CliLinkInfoCombined {
info_kind: main.info_kind,
info_data: main.info_data,
info_slave_kind: slave_kind,
info_slave_data: slave_data,
});
}
linkinfo = info.as_slice().try_into().ok();
}
_ => {
// println!("Remains {:?}", nl_attr);
Expand Down Expand Up @@ -227,7 +179,7 @@ impl CliLinkInfoDetails {
}
}

impl std::fmt::Display for CliLinkInfoDetails {
impl std::fmt::Display for CliLinkInfoDetail {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
Expand Down
Loading
Loading