Skip to content

Instantly share code, notes, and snippets.

@a-gavin
Created July 9, 2024 06:21
Show Gist options
  • Save a-gavin/15c4f64d7f0ea2c8e0956f271bbefdbe to your computer and use it in GitHub Desktop.
Save a-gavin/15c4f64d7f0ea2c8e0956f271bbefdbe to your computer and use it in GitHub Desktop.
use neli::{
consts::{nl::NlmF, socket::NlFamily},
genl::{AttrTypeBuilder, Genlmsghdr, GenlmsghdrBuilder, NlattrBuilder, NoUserHeader},
neli_enum,
nl::NlPayload,
router::synchronous::NlRouter,
types::GenlBuffer,
utils::Groups,
};
#[neli_enum(serialized_type = "u8")]
pub enum Nl80211Cmd {
GetWiphy = 1,
}
impl neli::consts::genl::Cmd for Nl80211Cmd {}
#[neli_enum(serialized_type = "u16")]
pub enum Nl80211Attr {
Wiphy = 1,
SplitWiphyDump = 174,
}
impl neli::consts::genl::NlAttrType for Nl80211Attr {}
fn main() {
// Open control socket
let (nl80211_sd, _) = NlRouter::connect(NlFamily::Generic, Some(0), Groups::empty()).unwrap();
let nl80211_family_id = nl80211_sd.resolve_genl_family("nl80211").unwrap();
// Build NL80211_CMD_GET_WIPHY command with the NL80211_ATTR_WIPHY and
// NL80211_ATTR_SPLIT_WIPHY_DUMP attributes set
let attrs = vec![
NlattrBuilder::default()
.nla_type(
AttrTypeBuilder::default()
.nla_type(Nl80211Attr::Wiphy)
.build()
.unwrap(),
)
.nla_payload(0)
.build()
.unwrap(),
NlattrBuilder::default()
.nla_type(
AttrTypeBuilder::default()
.nla_type(Nl80211Attr::SplitWiphyDump)
.build()
.unwrap(),
)
.nla_payload(0)
.build()
.unwrap(),
];
let attrs = attrs.into_iter().collect::<GenlBuffer<_, _>>();
let genl_msg = GenlmsghdrBuilder::<Nl80211Cmd, Nl80211Attr, NoUserHeader>::default()
.attrs(attrs)
.version(0)
.cmd(Nl80211Cmd::GetWiphy)
.build()
.unwrap();
// Send command
_ = nl80211_sd
.send::<_, _, u16, Genlmsghdr<Nl80211Cmd, Nl80211Attr>>(
nl80211_family_id,
NlmF::REQUEST | NlmF::DUMP | NlmF::ACK,
NlPayload::Payload(genl_msg),
)
.unwrap();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment