1 个不稳定版本

使用旧Rust 2015

0.1.0 2021年9月1日

#25 in #netfilter


rsmnl-linux 中使用

自定义许可证

17KB
403

rsmnl-derive

我只是想将 rsmnl-core 的示例写得更短更紧凑,并尝试使用Rust过程宏。请参见 rsmnl-linux 中的示例。

例如,这是什么

请参阅 examples/netfilter/nfct-daemon.rs 和 src/netfilter/nfnetlink_conntrack.rs。

定义

use { Msghdr, Attr, AttrTbl, Result };

#[repr(u16)]
#[derive(..., NlaType)
pub enum Parent {
    None = 0,
    One,
    Two,
    Three,
    _MAX
}

将实现 std::convert::TryFrom 和一些 Parent 的实现。

简单类型

然后通过宏属性定义 nla_type

[#nla_type(u32, one)]
One,

将值放入 nlh:Msghdr(例如 Nlmsghdr)可以通过

use mnl:: { AttrTbl, Msghdr };
Parent::put_one(&mut nlv, 1234u32)

从读取 Msghdr 创建 tb 数据,指定其表名

#[tbname="ParentTbl"]
pub enum Parent {

然后,可以通过以下方式访问值

let tb = ParentTbl::from_nlmsg(header_offset, nlh)?;
let one: Option<u32> = tb.one()?;
let attr: Option<&Attr> = tb[Parent::One]?;

嵌套类型

有两个嵌套,它们被定义

#[repr(u16)]
#[derive(..., NlaType)
#[tbname="ChildTbl"]
pub enum Child {
    None = 0,
    [#nla_type(str, one)]
    Ichi,
    Ni,
    San,
    _MAX
}

在 enum Parent 中定义

[#nla_nest(ChildTbl, two)]
Two,

然后 Two 可以被获取和访问

let two = tb.two()?;
let ichi = two.ichi()?;

依赖项

~1.5MB
~35K SLoC