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