6个版本
0.3.3 | 2023年7月10日 |
---|---|
0.3.2 | 2023年1月29日 |
0.3.1 | 2022年6月23日 |
0.3.0 | 2021年12月29日 |
0.1.0 | 2021年9月21日 |
#2 in #family
8,205 每月下载量
用于 17 个crate (7 直接)
49KB
1K SLoC
Rust通用netlink数据包类型的crate
lib.rs
:
该crate提供了通用netlink族及其控制器的数据包。
[GenlMessage]
提供了一个通用netlink族消息,它独立于子协议。您可以将您的消息包装到该类型中,然后它可以在 netlink-proto
crate中使用。
实现通用netlink族
通用netlink族包含几个命令和头部中的一个版本号。
有效载荷通常由netlink属性组成,携带消息到对端。为了帮助您将有效载荷构建成有效的netlink数据包,此crate需要有关族ID和通用头部信息。因此,您需要在您的类型上实现一些特型。
有效载荷中的所有内容,包括所有使用的netlink属性和可选的头部,应由您的实现处理。
序列化/反序列化
为了实现您的通用netlink族,您应该处理有效载荷序列化过程,包括其特定的头部(如果有)和netlink属性。
要实现这一点,您应该为有效载荷类型实现 netlink_packet_utils::Emitable
特型。
对于反序列化,应实现netlink_packet_utils::ParseableParametrized<[u8], GenlHeader>
特质。如上所述,为了提供更好的可扩展性,我们在这里使用最简单的缓冲区类型:[u8]
。在反序列化过程中,您可以轻松将其转换为其他缓冲区类型。
GenlFamily
特质
该特质旨在提供一些必要的信息,以便构建netlink(nlmsghdr)和通用netlink(genlmsghdr)的数据包头。
family_name()
该方法使解析器能够获取内核中注册的名称。
family_id()
少数netlink家族具有静态家族ID(例如控制器)。该方法主要用于让这些家族返回它们的家族ID。
如果您不知道这是什么,请不要实现此方法。因为默认实现返回GENL_ID_GENERATE
,这意味着家族ID由内核动态分配。
command()
此方法告知通用netlink数据包的命令ID。返回值用于填充通用netlink头中的cmd
字段。
version()
此方法返回有效载荷的家族版本。返回值用于填充通用netlink头中的version
字段。
家族头
少数家族会使用特定的家族消息头。为了简化和可扩展性,此crate将其视为有效载荷的一部分,并让实现自行处理头。
如果您正在实现此类通用家族,请注意,您应该在您的有效载荷类型中定义头数据结构并处理序列化。
依赖项
~0.6–1.1MB
~24K SLoC